Fehler, Irrtümer, Fragen - Seite 2737

 

In MT4 bleibt der Debugger beim Debuggen von Indikatoren permanent hängen, wenn Sie zu einem Chart wechseln.

Wird z.B. beim Start der Fehlersuche des Standard-CCI-Indikators reproduziert.

1. Setzen Sie einen Haltepunkt;

2. Drücken Sie F5;

3. Wechseln Sie zum Diagramm.

Ergebnis: Der Debugger-Graph bleibt hängen.

Sie können während des Debuggens auch einfach mehrmals F5 drücken - das Diagramm bleibt hängen.

Build 1260.

Debugger-Einstellungen:


 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL4 MT4 MetaTrader 4 Anfängern" verschoben.
 

Das Suchergebnis löscht einen Teil des Textes.


Hier ist das Original.

Forum zum Thema Handel, automatische Handelssysteme und Strategietester

MetaTrader 5 Strategy Tester: Bugs, Bugs, Verbesserungsvorschläge

fxsaber, 2020.05.11 20:31

Es macht wahrscheinlich keinen Sinn für Tester, opt-Dateien zu erstellen, die Header.passes_passed== 0 haben.
 
Bei der sehr seltenen Arbeit mit grafischen Objekten ergab sich die Notwendigkeit, den Hintergrund für OBJ_LABLE einzufärben (OBJPROP_BGCOLOR setzen).
Wie sich herausstellte, ist es nicht möglich, die Hintergrundfarbe für ein Objekt des Typs OBJ_LABLE einzustellen; es ist notwendig, OBJ_EDIT zu verwenden.
Bei der Verwendung von OBJ_EDIT ist ein neues Problem aufgetreten - die Notwendigkeit, die Größe von OBJPROP_XSIZE und OBJPROP_YSIZE so einzustellen, dass der gesamte Text in die entsprechenden Objektabmessungen passt.

Frage: Wie bestimmt man die Größen OBJPROP_XSIZE und OBJPROP_YSIZE, damit der gesamte Text passt?
Ich habe zwei Möglichkeiten in Betracht gezogen:
1. Erstellen des Objekts OBJ_LABLE, Auslesen seiner Abmessungen, Löschen des Objekts OBJ_LABLE.
Nicht geeignet, da die Bemaßung erst möglich ist, nachdem das Objekt tatsächlich erstellt wurde, und nicht möglich ist, wenn sich das Objekt in der ChartRedraw-Warteschlange befindet.

2. mit TextSetFont, gefolgt von TextGetSize.
Ungeeignet, weil das Ergebnis sich radikal von den Ergebnissen der Methode Nr. 1 unterscheidet, und zwar um das 2,5- bis 2,9-fache, je nach Größe der Schrift.
Wahrscheinlich ist der Grund 4K Monitor und 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
}  


Danke anGeess für dieLösung.
Bei der Übergabe an TextSetFont muss die Größe des Shuffle mit -10 multipliziert werden.

 
Sergey Dzyublik:
Ich arbeite selten mit grafischen Objekten, ich muss die Hintergrundfarbe für OBJ_LABLE malen (OBJPROP_BGCOLOR setzen).
Wie sich herausstellte, ist es nicht möglich, die Hintergrundfarbe für ein Objekt des Typs OBJ_LABLE einzustellen; es ist notwendig, OBJ_EDIT zu verwenden.
Bei der Verwendung von OBJ_EDIT ist ein neues Problem aufgetreten - die Notwendigkeit, die Größe von OBJPROP_XSIZE und OBJPROP_YSIZE so einzustellen, dass der gesamte Text in die entsprechenden Objektabmessungen passt.

Frage: Wie bestimmt man die Größen OBJPROP_XSIZE und OBJPROP_YSIZE, damit der gesamte Text passt?
Ich habe zwei Möglichkeiten in Betracht gezogen:
1. das Objekt OBJ_LABLE erstellen, die Abmessungen ablesen, das Objekt OBJ_LABLE löschen.
Nicht geeignet, da die Bemaßung erst möglich ist, nachdem das Objekt tatsächlich erstellt wurde, und nicht möglich ist, wenn sich das Objekt in der ChartRedraw-Warteschlange befindet.

2. mit TextSetFont, gefolgt von TextGetSize.
Ungeeignet, weil das Ergebnis sich radikal von den Ergebnissen der Methode Nr. 1 unterscheidet, und zwar um das 2,5- bis 2,9-fache, je nach Größe der Schrift.
Vielleicht ist der Grund der 4K-Monitor und 175% DPI.

Erstens sind Textgröße und Objektgröße nicht dasselbe. Zumindest muss es eine Grenze geben. Und deshalb können diese Werte nicht übereinstimmen.
Zweitens ist es besser, OBJ_BITMAP_LABEL zu verwenden, das keine Einschränkungen hat.
Und wenn Sie es verwenden, ist es besser, die CCanvas-Klasse zu verwenden.

#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();
}  

Das Ergebnis ist das gleiche Objekt, nur mit mehr Möglichkeiten. Zum Beispiel durch Hinzufügen von Transparenz zur Textbeschriftung.


 
Geess:

Erstens sind Textgröße und Objektgröße nicht dasselbe. Zumindest muss es eine Grenze geben. Diese Werte können also nicht übereinstimmen.

Herzlichen Dank für Ihre Hilfe.
Sie passen eine fertige Lösung an Ihre eigenen Bedürfnisse an, daher sehe ich keine Notwendigkeit, Bibliotheken zu implementieren.
Die von Ihnen ursprünglich vorgeschlagene Lösung kann wie folgt dargestellt werden:

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);
}  


Leider kann die vorgeschlagene Lösung aufgrund eines Fehlers im MT5 nicht normal verwendet werden.
Die Textgröße ist auf einem 4K-Monitor mit 175 % Windows-DPI dreimal kleiner als erforderlich.
Ich muss die Schriftgröße mit DPI / 100% * [1,6 ... 1,8] multiplizieren.

DankeGeessfür dieLösung.
Sie müssen die Schriftgröße mit -10 multiplizieren, wenn Sie sie anTextSetFontübergeben.




 
Sergey Dzyublik:

Herzlichen Dank für Ihre Hilfe.
Sie passen eine fertige Lösung an Ihre eigenen Bedürfnisse an, daher sehe ich keine Notwendigkeit, Bibliotheken zu implementieren.
Die von Ihnen ursprünglich vorgeschlagene Lösung kann wie folgt dargestellt werden:


Leider kann die vorgeschlagene Lösung aufgrund eines Fehlers im MT5 nicht normal verwendet werden.
Die Textgröße ist auf einem 4K-Monitor mit 175 % Windows-DPI dreimal kleiner als erforderlich.
Ich muss die Schriftgröße mit DPI / 100% * [1,6 ... 1,8] multiplizieren.

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


müssen Sie es so machen:

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);
}



Ich verstehe nicht, warum Sie OBJ_LABEL so sehr brauchen? Sie haben mit OBJ_BITMAP_LABEL eine Variante ohne Bibliotheken implementiert. Worin besteht der Vorteil? Ich sehe nur eine Einschränkung.

 
Ziel
Geess:

https://www.mql5.com/ru/docs/objects/textsetfont
Ich verstehe nicht, warum Sie OBJ_LABEL so sehr brauchen? Sie haben mit OBJ_BITMAP_LABEL eine Variante ohne Bibliotheken implementiert. Worin besteht der Vorteil? Ich sehe nur eine Einschränkung.

Nochmals herzlichen Dank.
Ich wusste nichts von der Multiplikation mit -10, habe nichts gesehen und nichts gelesen. Problem gelöst.
OBJ_LABEL wurde verwendet, um das Problem zu veranschaulichen und es reproduzieren zu können.

 
Hallo!

Bitte sagen Sie mir, was das Problem ist.

Verschiedene Indikatoren, die korrekt funktionieren und aktualisiert werden, zeigen etwas anderes an, das nicht auf dem im Hauptfenster angezeigten Preisdiagramm basiert. Das passiert gelegentlich, nicht jeden Tag.

Zuerst habe ich die Schuld auf Indikatoren geschoben, aber nachdem ich verschiedene ausprobiert habe, darunter auch MT5-eigene, bin ich misstrauisch gegenüber dem Terminal. Ich beobachte das Problem schon seit langem, seit letztem Jahr, auf verschiedenen Versionen des Terminals. Zuerst war es bei der benutzerdefinierten Version von Alpari, jetzt ist es auch bei der Originalversion der Fall. Sowohl auf dem Demokonto als auch auf dem echten ecn.

Alpari-Makler. MT5 Build 2363 vom 13.03.2020. Ich kann mich nicht an andere Zeiträume erinnern, aber es passiert definitiv auf M1.

Screenshots:

Variante "Ausgerutscht". Bis auf den Zickzackkurs sind alle Indikatoren eingebaut. Der Zickzackkurs mit korrekter Arbeit mit der Geschichte. Die Messwerte der Indikatoren sind untereinander konvergent. Sie korrespondieren nicht mit den Preisen.

Nach der Aktualisierung.

MT5-Version

 

Nachmittags.

Ich bin über ein unverständliches Ding gestolpert und verstehe nicht, was es ist.

Es gibt zwei Funktionen, die in verschiedenen Strategien verwendet werden. Logischerweise ist der Code in Prüfungen wie

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

Sie sollte nicht ausgeführt werden, wenn eine der Bedingungen falsch ist. Aber aus irgendeinem Grund wird sie ausgeführt, wenn die magische Zahl und die in die Funktion übergebene magische Zahl NICHT GLEICH sind.

Es scheint ein Integer-Vergleich zu sein. Ich kann nicht verstehen, warum. Sie können es auf dem nachstehenden Screenshot sehen.


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;
                      }
                   }
                }
             }
          }
}


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