오류, 버그, 질문 - 페이지 2737

 

MT4에서 표시기를 디버깅 할 때 차트로 전환하면 디버거가 단단히 멈춥니다.

예를 들어 표준 CCI 표시기 디버깅 시작 중에 재생됩니다.

1. 중단점을 설정합니다.

2. F5를 누르십시오.

3. 차트로 전환합니다.

그 결과 디버거 그래프가 정지됩니다.

디버깅하는 동안 F5 키를 여러 번 누를 수도 있습니다. 그래프가 멈춥니다.

빌드 1260.

디버거 설정:


 
이 주제와 관련이 없는 댓글은 " MQL4 MT4 MetaTrader 4 초보자의 질문 "으로 이동되었습니다.
 

검색 결과 는 텍스트의 일부를 제거합니다.


여기 원본이 있습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MetaTrader 5 전략 테스터: 오류, 버그, 개선 제안

fxsaber , 2020.05.11 20:31

테스터가 Header.passes _passed == 0을 사용하여 opt-file을 생성하는 것은 아마도 의미가 없을 것입니다.
 
매우 드물게 그래픽 개체로 작업 하므로 OBJ_LABLE (set OBJPROP_BGCOLOR)에 대한 배경 위에 페인트해야 합니다.
결과적으로 OBJ_LABLE 유형의 객체는 배경색을 설정할 수 없으므로 OBJ_EDIT를 사용해야 합니다.
OBJ_EDIT를 사용할 때 모든 텍스트가 개체의 적절한 치수에 맞도록 OBJPROP_XSIZE 및 OBJPROP_YSIZE의 크기를 설정해야 하는 새로운 문제가 발생했습니다.

질문: 모든 텍스트가 거기에 맞도록 OBJPROP_XSIZE 및 OBJPROP_YSIZE의 크기를 결정하는 방법은 무엇입니까?
두 가지 옵션을 고려했습니다.
1. OBJ_LABLE 개체를 만들고, 차원을 읽고, OBJ_LABLE 개체를 삭제합니다.
치수 읽기는 개체가 실제로 생성된 후에만 가능하고 개체가 ChartRedraw에 대해 대기열에 있을 때는 불가능하기 때문에 적합하지 않습니다.

2. TextSetFont 다음에 TextGetSize 사용.
1번 방법의 결과와 근본적으로 다르기 때문에 글자 크기에 따라 2.5~2.9배 차이가 나므로 적합하지 않다.
아마도 그 이유는 4K 모니터와 175% DPI일 것입니다.

 #define PRINT(x) ; Print ( #x, ":" , string (x))
          
void SetLabel( long achart, string name, int wnd, string text, color clr, int x, int y, int corn= 0 , int fontsize= 8 , string font= "Tahoma" )
{
   ObjectCreate (achart, name, OBJ_LABEL , wnd, 0 , 0 ); 
   ObjectSetInteger (achart, name, OBJPROP_CORNER , corn); 
   ObjectSetString (achart, name, OBJPROP_TEXT , text); ObjectSetInteger (achart, name, OBJPROP_COLOR , clr); 
   ObjectSetInteger (achart, name, OBJPROP_FONTSIZE , fontsize); ObjectSetString (achart, name, OBJPROP_FONT , font);
   ObjectSetInteger (achart, name, OBJPROP_SELECTABLE , false ); 
   ObjectSetInteger (achart, name, OBJPROP_BORDER_TYPE , 0 );
   ObjectSetInteger (achart, name, OBJPROP_XDISTANCE , x); ObjectSetInteger (achart, name, OBJPROP_YDISTANCE , y);
}

void OnStart (){     
   string obj_name = "test_obj" ;   
   string text = "AAAA::BBBB" ;
   int font_size = 7 ;
   string font_name = "Tahoma" ;
   
   SetLabel( 0 , obj_name, 0 , text, clrWhite , 100 , 100 , 0 , font_size, font_name);
   ChartRedraw ( 0 );
   Sleep ( 1000 );
   
   uint dx_fixed_0 = int ( ObjectGetInteger ( 0 , obj_name, OBJPROP_XSIZE ));
   uint dy_fixed_0 = int ( ObjectGetInteger ( 0 , obj_name, OBJPROP_YSIZE ));
   ObjectDelete ( 0 , obj_name);
   
   PRINT(dx_fixed_0);
   PRINT(dy_fixed_0);
   
   
   uint dx_fixed_1;
   uint dy_fixed_1;
   TextSetFont (font_name, -10 * font_size);
   TextGetSize (text, dx_fixed_1, dy_fixed_1);
   
   PRINT( 1.0 * dx_fixed_0 / dx_fixed_1);  	// Result: 1.0
   PRINT( 1.0 * dy_fixed_0 / dy_fixed_1);  	// Result: 1.0
}  


솔루션 에 대해 Geess 에게 감사드립니다.
TextSetFont 에 전달할 때 글꼴 크기에 -10을 곱해야 합니다.

 
Sergey Dzyublik :
매우 드물게 그래픽 개체로 작업 하므로 OBJ_LABLE (set OBJPROP_BGCOLOR)에 대한 배경 위에 페인트해야 합니다.
결과적으로 OBJ_LABLE 유형의 객체는 배경색을 설정할 수 없으므로 OBJ_EDIT를 사용해야 합니다.
OBJ_EDIT를 사용할 때 모든 텍스트가 개체의 적절한 치수에 맞도록 OBJPROP_XSIZE 및 OBJPROP_YSIZE의 크기를 설정해야 하는 새로운 문제가 발생했습니다.

질문: 모든 텍스트가 거기에 맞도록 OBJPROP_XSIZE 및 OBJPROP_YSIZE의 크기를 결정하는 방법은 무엇입니까?
두 가지 옵션을 고려했습니다.
1. OBJ_LABLE 개체를 만들고, 차원을 읽고, OBJ_LABLE 개체를 삭제합니다.
치수 읽기는 개체가 실제로 생성된 후에만 가능하고 개체가 ChartRedraw에 대해 대기열에 있을 때는 불가능하기 때문에 적합하지 않습니다.

2. TextSetFont 다음에 TextGetSize 사용.
1번 방법의 결과와 근본적으로 다르기 때문에 글자 크기에 따라 2.5~2.9배 차이가 나므로 적합하지 않다.
아마도 그 이유는 4K 모니터와 175% DPI 때문일 것입니다.

첫째, 텍스트 크기와 개체 크기는 같은 것이 아닙니다. 최소한 경계는 있어야 합니다. 따라서 이러한 값은 일치할 수 없습니다.
둘째, 제한이 없는 OBJ_BITMAP_LABEL을 사용하는 것이 좋다.
그리고 실제로 사용한다면 CCanvas 클래스를 사용하는 것이 좋습니다.

 #include <Canvas\Canvas.mqh>
          
void SetLabel(CCanvas &c, long achart, string name, int wnd, string text, color clr_text, color clr_bckgrnd, int x, int y, int corn= 0 , int fontsize= 8 , int border= 2 , string font= "Tahoma" , uchar transparency= 0xFF )
{
   uint w,h;
   c.FontSet(font, fontsize);
   c.TextSize(text, w, h);
   if (!c.CreateBitmapLabel(achart,wnd,name,x,y,w+border* 2 ,h+border* 2 , COLOR_FORMAT_ARGB_NORMALIZE ))
       Print ( "Error creating canvas object: " , GetLastError ());
   c.Erase( ColorToARGB (clr_bckgrnd,transparency));
   c. TextOut (border,border,text, ColorToARGB (clr_text,transparency));
   c.Update();
}

void OnStart (){     
   string obj_name = "test_obj" ;   
   string text = "AAAA::BBBB" ;
   int font_size = 17 ;
   string font_name = "Tahoma" ;
   CCanvas Can;
   SetLabel(Can, 0 , obj_name, 0 , text, clrYellow , clrBlue , 100 , 100 , 0 , font_size, 3 , font_name, 0x80 );
   Sleep ( 10000 );
   Can.Destroy();
}  

결과적으로 더 많은 기능만 포함된 동일한 객체를 얻습니다. 예를 들어 텍스트 레이블에 투명도를 추가합니다.


 
Geess :

첫째, 텍스트 크기와 개체 크기는 같은 것이 아닙니다. 최소한 경계는 있어야 합니다. 따라서 이러한 값은 일치할 수 없습니다.

도와 주셔서 정말로 고맙습니다.
기성 솔루션은 자체 요구 사항에 맞게 조정되므로 라이브러리를 도입할 필요가 없습니다.
원래 솔루션은 다음과 같이 나타낼 수 있습니다.

 void SetBitmapLabel( long achart, string name, int wnd, string text, color clr, color bgclr, int x, int y, int corn= 0 , int fontsize= 8 , string font= "Tahoma" , int border= 2 )
{
   uint w,h;
   TextSetFont (font, -10* fontsize, 0 , 0 );
   TextGetSize (text,w,h);
   w = w+border* 2 ;
   h = h+border* 2 ;
   
   uint pixels[];
   ArrayResize (pixels,w*h);
   ArrayInitialize (pixels, 0 );
   ENUM_COLOR_FORMAT color_format = COLOR_FORMAT_XRGB_NOALPHA ;
   string resource_name= "::" +name+( string ) ChartID ()+( string )( GetTickCount ()+ MathRand ());
   
   ResourceCreate (resource_name,pixels,w,h, 0 , 0 , 0 ,color_format);
   ObjectCreate (achart,name, OBJ_BITMAP_LABEL ,wnd, 0 , 0 );
   ObjectSetInteger (achart,name, OBJPROP_XDISTANCE ,x);
   ObjectSetInteger (achart,name, OBJPROP_YDISTANCE ,y);
   ObjectSetString (achart,name, OBJPROP_BMPFILE ,resource_name);
   ArrayInitialize (pixels, ColorToARGB (bgclr));
   TextOut (text,border,border, 0 ,pixels,w,h, ColorToARGB (clr),color_format);
   ResourceCreate (resource_name,pixels,w,h, 0 , 0 , 0 ,color_format);
}

void SetLabel( long achart, string name, int wnd, string text, color clr, int x, int y, int corn= 0 , int fontsize= 8 , string font= "Tahoma" )
{
         ObjectCreate (achart, name, OBJ_LABEL , wnd, 0 , 0 ); 
         ObjectSetInteger (achart, name, OBJPROP_CORNER , corn); 
         ObjectSetString (achart, name, OBJPROP_TEXT , text); ObjectSetInteger (achart, name, OBJPROP_COLOR , clr); 
         ObjectSetInteger (achart, name, OBJPROP_FONTSIZE , fontsize); ObjectSetString (achart, name, OBJPROP_FONT , font);
         ObjectSetInteger (achart, name, OBJPROP_SELECTABLE , false ); 
         ObjectSetInteger (achart, name, OBJPROP_BORDER_TYPE , 0 );
         ObjectSetInteger (achart, name, OBJPROP_XDISTANCE , x); ObjectSetInteger (achart, name, OBJPROP_YDISTANCE , y);
}

void OnStart (){     
   string obj_name = "test_obj" ;   
   string text = "AAAA::BBBB" ;
   int font_size = 50 ;
   string font_name = "Tahoma" ;
   
   SetBitmapLabel( 0 , "BL" + obj_name, 0 , text, clrRed , clrWhite , 100 , 100 , 0 , font_size, font_name);
   SetLabel      ( 0 , "L"   + obj_name, 0 , text, clrRed ,           100 , 200 , 0 , font_size, font_name);
   ChartRedraw ( 0 );
   Sleep ( 10000 );
}  


안타깝게도 MT5의 결함 으로 인해 제안된 솔루션을 정상적으로 사용할 수 없습니다.
텍스트 크기는 Windows DPI가 175%인 4K 모니터에서 필요한 것보다 3배 작습니다.
글꼴 크기 에 DPI / 100% * [1.6 ... 1.8]을 곱해야 합니다.

솔루션 에 대해 Geess 에게 감사드립니다 .
TextSetFont 에 전달할 때 글꼴 크기에 -10을 곱해야 합니다 .




 
Sergey Dzyublik :

도와 주셔서 정말로 고맙습니다.
기성 솔루션은 자체 요구 사항에 맞게 조정되므로 라이브러리를 도입할 필요가 없습니다.
원래 솔루션은 다음과 같이 나타낼 수 있습니다.


안타깝게도 MT5의 결함으로 인해 제안된 솔루션을 정상적으로 사용할 수 없습니다.
텍스트 크기는 Windows DPI가 175%인 4K 모니터에서 필요한 것보다 3배 작습니다.
글꼴 크기 에 DPI / 100% * [1.6 ... 1.8]을 곱해야 합니다.

https://www.mql5.com/ru/docs/objects/textsetfont


당신은 이것을 할 필요가 있습니다:

 void SetBitmapLabel( long achart, string name, int wnd, string text, color clr, color bgclr, int x, int y, int corn= 0 , int fontsize= 8 , string font= "Tahoma" , int border= 2 , uchar transparency= 0xFF )
{
   uint w,h;
   TextSetFont (font, - 10 *fontsize , 0 , 0 );
   TextGetSize (text,w,h);
   w = w+border* 2 ;
   h = h+border* 2 ;
   
   uint pixels[];
   ArrayResize (pixels,w*h);
   ArrayInitialize (pixels, 0 );
   ENUM_COLOR_FORMAT color_format = COLOR_FORMAT_ARGB_NORMALIZE ;
   string resource_name= "::" +name+( string ) ChartID ()+( string )( GetTickCount ()+ MathRand ());
   
   ResourceCreate (resource_name,pixels,w,h, 0 , 0 , 0 ,color_format);
   ObjectCreate (achart,name, OBJ_BITMAP_LABEL ,wnd, 0 , 0 );
   ObjectSetInteger (achart,name, OBJPROP_XDISTANCE ,x);
   ObjectSetInteger (achart,name, OBJPROP_YDISTANCE ,y);
   ObjectSetString (achart,name, OBJPROP_BMPFILE ,resource_name);
   ObjectSetInteger (achart,name, OBJPROP_BACK , false );
   ArrayInitialize (pixels, ColorToARGB (bgclr, transparency));
   TextOut (text,border,border, 0 ,pixels,w,h, ColorToARGB (clr, transparency),color_format);
   ResourceCreate (resource_name,pixels,w,h, 0 , 0 , 0 ,color_format);
}

void SetLabel( long achart, string name, int wnd, string text, color clr, int x, int y, int corn= 0 , int fontsize= 8 , string font= "Tahoma" )
{
         ObjectCreate (achart, name, OBJ_LABEL , wnd, 0 , 0 ); 
         ObjectSetInteger (achart, name, OBJPROP_CORNER , corn); 
         ObjectSetString (achart, name, OBJPROP_TEXT , text); ObjectSetInteger (achart, name, OBJPROP_COLOR , clr); 
         ObjectSetInteger (achart, name, OBJPROP_FONTSIZE , fontsize); ObjectSetString (achart, name, OBJPROP_FONT , font);
         ObjectSetInteger (achart, name, OBJPROP_SELECTABLE , false ); 
         ObjectSetInteger (achart, name, OBJPROP_BORDER_TYPE , 0 );
         ObjectSetInteger (achart, name, OBJPROP_XDISTANCE , x); ObjectSetInteger (achart, name, OBJPROP_YDISTANCE , y);
}

void OnStart (){     
   string obj_name = "test_obj" ;   
   string text = "AAAA::BBBB" ;
   int font_size = 50 ;
   string font_name = "Tahoma" ;
   
   SetBitmapLabel( 0 , "BL" + obj_name, 0 , text, clrRed , clrBlue , 100 , 100 , 0 , font_size, font_name, 2 , 0xA0 );
   SetLabel      ( 0 , "L"   + obj_name, 0 , text, clrBlue ,         100 , 200 , 0 , font_size, font_name);
   ChartRedraw ( 0 );
   Sleep ( 10000 );
}



OBJ_LABEL이 왜 그렇게 많이 필요한지 모르겠습니다. OBJ_BITMAP_LABEL을 사용하여 라이브러리 없이 옵션을 구현했습니다. 장점은 무엇입니까? 한계만 보입니다.

 
표적
Geess :

https://www.mql5.com/ru/docs/objects/textsetfont
OBJ_LABEL이 왜 그렇게 많이 필요한지 모르겠습니다. OBJ_BITMAP_LABEL을 사용하여 라이브러리 없이 옵션을 구현했습니다. 장점은 무엇입니까? 한계만 보입니다.

다시 한 번 진심으로 감사드립니다.
몰랐고, 본 적도, -10을 곱하는 방법에 대해 읽지도 않았습니다. 문제 해결됨.
OBJ_LABEL은 문제를 가시적이고 재현 가능하게 만드는 데 사용되었습니다.

 
안녕하세요!

무엇이 문제인지 알려주세요.

올바르게 작동하고 동기식으로 업데이트되는 다른 표시기는 기본 창에 표시된 가격 차트를 기반으로 하지 않고 다른 것을 표시하기 시작합니다. 매일이 아니라 가끔 발생합니다.

처음에는 표시기에 죄를 지었지만 기본 MT 5를 포함하여 다른 표시기를 시도한 후 터미널 자체를 의심하기 시작합니다. 작년부터 다른 버전의 터미널에서 오랫동안 문제를 관찰해 왔습니다. 처음에는 Alpari의 사용자 정의 버전에서 보았지만 이제는 원본 버전에서도 동일합니다. 데모 계정 과 실제 ecn 계정 모두에서.

브로커 알파리. 2020년 3월 13일부터 MT 5 빌드 2363. 다른 기간에는 기억나지 않지만 이것이 정확히 M 1에서 일어나는 일입니다.

스크린샷:

"비행" 옵션. 지그재그를 제외한 모든 인디케이터가 내장되어 있습니다. 역사와 함께 올바른 작업으로 지그재그. 표시기 판독값은 서로 일치합니다. 가격에 동의하지 않습니다.

업데이트 후.

MT5 버전

 

안녕하세요.

나는 내가 이해하지 못하고 무슨 일이 일어나고 있는지 모르는 것을 우연히 발견했습니다.

서로 다른 전략에 사용되는 두 가지 기능이 있습니다. 논리적으로 유형 검사의 코드는

 if (m_position.PositionType()== POSITION_TYPE_SELL   && m_position.Magic()==magic)

조건 중 하나가 참이 아닌 경우 실행되지 않아야 합니다. 그러나 어떤 이유로 위치의 매직 넘버와 함수에 전달된 매직 넘버가 같지 않으면 실행됩니다.

정수 유형의 비교와 같이 발생합니다. 왜, 이해할 수 없습니다. 아래 로그 스크린샷에서 확인할 수 있습니다.


 void OpenNextBuyPositionBySignal(CTrade &m_trade, long magic, double ExtDP, double iuv, double imv, int itp, int isl, double etp, double esl, double ev, double &rev, string numstr, ulong &last_pt)
{
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
     if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
       if (m_position. Symbol ()==m_symbol.Name())
       {
           if (m_position.PositionType()== POSITION_TYPE_SELL   && m_position.Magic()==magic)
          {
             if ((m_position.Profit()+m_position.Swap()+m_position.Commission())< 0 )
             {
                 if (IsSetBuy(magic,ExtDP)== true )
                {
                     double cdist= MathFloor ( MathAbs ((m_position.PriceOpen()-m_position.PriceCurrent())/ExtDP));
                     Print ( "#1122 cdist " ,numstr, ": " ,cdist);
                     Print ( "#2211! m_position.PriceOpen(): " ,m_position.PriceOpen());
                     Print ( "#2212! m_position.PriceCurrent(): " ,m_position.PriceCurrent());
                     Print ( "#2213! ExtDP: " ,ExtDP);
                     Print ( "#2214! magic: " ,magic);
                     Print ( "#2215! ev: " ,ev);
                     Print ( "#2216! iuv: " ,iuv);
                     Print ( "#2217! m_position.Volume(): " ,m_position.Volume());
                     Print ( "#2218! m_position.Magic(): " ,m_position.Magic());
                    
                   
                     if ( NormalizeDouble (m_position.Volume()+iuv*cdist, 2 )<=imv)
                       ev= NormalizeDouble (m_position.Volume()+iuv*cdist, 2 );
                     if ( NormalizeDouble (m_position.Volume()+iuv*cdist, 2 )>imv)
                        ev= NormalizeDouble (imv, 2 );
                     rev=ev;
                     double sl= 0.0 ;
                     double tp= 0.0 ;
                     if (itp> 0 ) tp=m_symbol.Ask()+etp;
                     if (isl> 0 ) sl=m_symbol.Bid()-esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if (OpenBuy(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt= POSITION_TYPE_BUY ;
                         FileWrite (filehandle,numstr+ ", " , TimeCurrent (), ", " ,GetLastPositionsType(magic), ", " ,GetPositionTicket(magic, POSITION_TYPE_BUY )); 
                         Print ( "#516! Position BUY after down SELL " +numstr);                                 
                         //Sleep(3000);
                         continue ;
                     }
                  }
               }
            }
             if (m_position.PositionType()== POSITION_TYPE_BUY   && m_position.Magic()==magic)
            {
               if ((m_position.Profit()+m_position.Swap()+m_position.Commission())< 0 )
               {
                   if (IsSetBuy(magic,ExtDP)== true )
                  {
                     double cdist= MathFloor ( MathAbs ((m_position.PriceOpen()-m_position.PriceCurrent())/ExtDP));
                     Print ( "#1123 cdist " , numstr, " : " ,cdist);
                     Print ( "#3211! m_position.PriceOpen(): " ,m_position.PriceOpen());
                     Print ( "#3212! m_position.PriceCurrent(): " ,m_position.PriceCurrent());
                     Print ( "#3213! ExtDP: " ,ExtDP);
                     Print ( "#3214! magic: " ,magic);
                     Print ( "#3215! ev: " ,ev);
                     Print ( "#3216! iuv: " ,iuv);
                     Print ( "#3217! m_position.Volume(): " ,m_position.Volume());
                     Print ( "#3218! m_position.Magic(): " ,m_position.Magic());
                    
                     if ( NormalizeDouble (m_position.Volume()+iuv*cdist, 2 )<=imv)
                        ev= NormalizeDouble (m_position.Volume()+iuv*cdist, 2 );
                     if ( NormalizeDouble (m_position.Volume()+iuv*cdist, 2 )>imv)
                        ev= NormalizeDouble (imv, 2 ); 
                     rev=ev;                          
                     double sl= 0.0 ;
                     double tp= 0.0 ;
                     if (itp> 0 ) tp=m_symbol.Ask()+etp;
                     if (isl> 0 ) sl=m_symbol.Bid()-esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if (OpenBuy(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt= POSITION_TYPE_BUY ;
                         FileWrite (filehandle,numstr+ ", " , TimeCurrent (), ", " ,GetLastPositionsType(magic), ", " ,GetPositionTicket(magic, POSITION_TYPE_BUY )); 
                         Print ( "#517! Position BUY After down BUY " +numstr);                                 
                         //Sleep(3000);
                         continue ;
                     }
                  }
               } 
            }
         }
}


void OpenNextSellPositionBySignal(CTrade &m_trade, long magic, double ExtDP, double iuv, double imv, int itp, int isl, double etp, double esl, double ev, double &rev, string numstr, ulong &last_pt)
{
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
       if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name())
         {
             if (m_position.PositionType()== POSITION_TYPE_BUY   && m_position.Magic()==magic)
            {
               if ((m_position.Profit()+m_position.Swap()+m_position.Commission())< 0 )
               {
                   if (IsSetSell(magic,ExtDP)== true )
                  {
                     double cdist= MathFloor ( MathAbs ((m_position.PriceCurrent()-m_position.PriceOpen())/ExtDP));
                     Print ( "#1124 cdist " , numstr, " : " ,cdist);
                     Print ( "#4211! m_position.PriceOpen(): " ,m_position.PriceOpen());
                     Print ( "#4212! m_position.PriceCurrent(): " ,m_position.PriceCurrent());
                     Print ( "#4213! ExtDP: " ,ExtDP);
                     Print ( "#4214! magic: " ,magic);
                     Print ( "#4215! ev: " ,ev);
                     Print ( "#4216! iuv: " ,iuv);
                     Print ( "#4217! m_position.Volume(): " ,m_position.Volume());
                     Print ( "#4218! m_position.Magic(): " ,m_position.Magic());
                   
                     if ( NormalizeDouble (m_position.Volume()+iuv*cdist, 2 )<=imv)
                        ev= NormalizeDouble (m_position.Volume()+iuv*cdist, 2 );
                     if ( NormalizeDouble (m_position.Volume()+iuv*cdist, 2 )>imv)
                        ev= NormalizeDouble (imv, 2 );
                     rev=ev;
                     double sl= 0.0 ;
                     double tp= 0.0 ;
                     if (itp> 0 ) tp=m_symbol.Bid()-etp;
                     if (isl> 0 ) sl=m_symbol.Ask()+esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if (OpenSell(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt= POSITION_TYPE_SELL ;
                         FileWrite (filehandle,numstr+ ", " , TimeCurrent (), ", " ,GetLastPositionsType(magic), ", " ,GetPositionTicket(magic, POSITION_TYPE_SELL )); 
                         Print ( "#518! Position SELL After down BUY " +numstr);                             
                         //Sleep(3000);
                         continue ;
                      }
                   }
                }
             }
             if (m_position.PositionType()== POSITION_TYPE_SELL   && m_position.Magic()==magic)
             {
                 if ((m_position.Profit()+m_position.Swap()+m_position.Commission())< 0 )
                {
                   if (IsSetSell(magic,ExtDP)== true )
                   {
                       double cdist= MathFloor ( MathAbs ((m_position.PriceCurrent()-m_position.PriceOpen())/ExtDP));
                       Print ( "#1125 cdist " , numstr, " : " ,cdist);
                       Print ( "#5211! m_position.PriceOpen(): " ,m_position.PriceOpen());
                       Print ( "#5212! m_position.PriceCurrent(): " ,m_position.PriceCurrent());
                       Print ( "#5213! ExtDP: " ,ExtDP);
                       Print ( "#5214! magic: " ,magic);
                       Print ( "#5215! ev: " ,ev);
                       Print ( "#5216! iuv: " ,iuv);
                       Print ( "#5217! m_position.Volume(): " ,m_position.Volume());
                       Print ( "#5218! m_position.Magic(): " ,m_position.Magic());
                    
                       if ( NormalizeDouble (m_position.Volume()+iuv*cdist, 2 )<=imv)
                         ev= NormalizeDouble (m_position.Volume()+iuv*cdist, 2 );
                       if ( NormalizeDouble (m_position.Volume()+iuv*cdist, 2 )>imv)
                         ev= NormalizeDouble (imv, 2 ); 
                      rev=ev;                             
                       double sl= 0.0 ;
                       double tp= 0.0 ;
                       if (itp> 0 ) tp=m_symbol.Bid()-etp;
                       if (isl> 0 ) sl=m_symbol.Ask()+esl;
                       //m_trade.SetExpertMagicNumber(magic);
                       if (OpenSell(m_trade,ev,sl,tp,numstr))
                      {
                        last_pt= POSITION_TYPE_SELL ;
                         FileWrite (filehandle,numstr+ ", " , TimeCurrent (), ", " ,GetLastPositionsType(magic), ", " ,GetPositionTicket(magic, POSITION_TYPE_SELL )); 
                         Print ( "#519! Position SELL After down SELL " +numstr);                                 
                         //Sleep(3000);
                         continue ;
                      }
                   }
                }
             }
          }
}


잡지
Заранее спасибо за ответ.