Erreurs, bugs, questions - page 2737

 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL4 MT4 MetaTrader 4".
 

Le résultat de la recherche supprime une partie du texte.


Voici l'original.

Forum sur le trading, les systèmes de trading automatisés et le testeur de stratégie

Testeur de stratégie MetaTrader 5 : bugs, anomalies, suggestions d'amélioration

fxsaber, 2020.05.11 20:31

Il n'est probablement pas judicieux pour Tester de créer des fichiers opt-files qui ont Header.passes_passed== 0.
 
En travaillant très rarement avec des objets graphiques, la nécessité de colorer le fond pour OBJ_LABLE (set OBJPROP_BGCOLOR) est apparue.
Il s'est avéré que le réglage de la couleur de fond n'est pas possible pour un objet de type OBJ_LABLE, il est nécessaire d'utiliser OBJ_EDIT.
Lors de l'utilisation de OBJ_EDIT, un nouveau problème est apparu : la nécessité de définir la taille de OBJPROP_XSIZE et OBJPROP_YSIZE de manière à ce que tout le texte s'inscrive dans les dimensions correspondantes de l'objet.

Question : comment déterminer les tailles OBJPROP_XSIZE et OBJPROP_YSIZE pour adapter le texte entier ?
J'ai envisagé deux options :
1. Création de l'objet OBJ_LABLE, lecture de ses dimensions, suppression de l'objet OBJ_LABLE.
Ne convient pas car la cotation n'est possible qu'après la création effective de l'objet et n'est pas possible lorsque l'objet se trouve dans la file d'attente ChartRedraw.

2. en utilisant TextSetFont suivi de TextGetSize.
Ne convient pas, car le résultat est radicalement différent de celui de la méthode n°1, la différence étant de 2,5 à 2,9 fois, selon la taille de la police.
La raison en est probablement un écran 4K et un DPI de 175 %.

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


Merci àGeess pour lasolution.
Il est nécessaire de multiplier par -10 la taille du mélange lorsqu'on le passe à TextSetFont.

 
Sergey Dzyublik:
Je travaille rarement avec des objets graphiques, j'ai besoin de peindre la couleur de fond pour OBJ_LABLE (set OBJPROP_BGCOLOR).
Il s'est avéré que le réglage de la couleur de fond n'est pas possible pour un objet de type OBJ_LABLE, il est nécessaire d'utiliser OBJ_EDIT.
Lors de l'utilisation de OBJ_EDIT, un nouveau problème est apparu : la nécessité de définir la taille de OBJPROP_XSIZE et OBJPROP_YSIZE de manière à ce que tout le texte s'inscrive dans les dimensions correspondantes de l'objet.

Question : comment déterminer les tailles OBJPROP_XSIZE et OBJPROP_YSIZE pour adapter le texte entier ?
J'ai envisagé deux options :
1. créer l'objet OBJ_LABLE, lire les dimensions, supprimer l'objet OBJ_LABLE.
Ne convient pas car la cotation n'est possible qu'après la création effective de l'objet et n'est pas possible lorsque l'objet se trouve dans la file d'attente ChartRedraw.

2. en utilisant TextSetFont suivi de TextGetSize.
Ne convient pas, car le résultat est radicalement différent de celui de la méthode n° 1, la différence étant de 2,5 à 2,9 fois, selon la taille de la police.
La raison en est probablement un écran 4K et un DPI de 175 %.

Tout d'abord, la taille du texte et la taille de l'objet ne sont pas la même chose. Il faut au moins qu'il y ait une frontière. Et donc ces valeurs ne peuvent pas coïncider.
Deuxièmement, il est préférable d'utiliser OBJ_BITMAP_LABEL qui n'a aucune limitation.
Et si vous l'utilisez, il est préférable d'utiliser la classe 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();
}  

Le résultat est le même objet, mais avec plus de possibilités. Par exemple, en ajoutant de la transparence à l'étiquette de texte.


 
Geess:

Tout d'abord, la taille du texte et la taille de l'objet ne sont pas la même chose. Au minimum, il doit y avoir une frontière. Et donc ces valeurs ne peuvent pas coïncider.

Merci beaucoup pour votre aide.
Vous adaptez une solution toute faite à vos propres besoins, je ne vois donc pas la nécessité d'implémenter des bibliothèques.
La solution que vous avez proposée à l'origine peut être représentée comme suit :

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


Malheureusement, en raison d'un défaut dans MT5 - la solution proposée ne peut pas être utilisée normalement.
La taille du texte s'avère être 3 fois plus petite que nécessaire sur un moniteur 4K avec 175% de DPI Windows.
Je dois multiplier la taille de la police par DPI / 100% * [1,6 ... 1,8].

MerciGeesspour lasolution.
Vous devez multiplier la taille de la police par -10 lorsque vous la transmettez àTextSetFont.




 
Sergey Dzyublik:

Merci beaucoup pour votre aide.
Vous adaptez une solution toute faite à vos propres besoins, je ne vois donc pas la nécessité d'implémenter des bibliothèques.
La solution que vous avez proposée à l'origine peut être représentée comme suit :


Malheureusement, en raison d'un défaut dans MT5 - la solution proposée ne peut pas être utilisée normalement.
La taille du texte s'avère être 3 fois plus petite que nécessaire sur un moniteur 4K avec 175% de DPI Windows.
Je dois multiplier la taille de la police par DPI / 100% * [1.6 ... 1.8].

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


tu dois le faire comme ça :

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



Je ne comprends pas pourquoi vous avez tant besoin de OBJ_LABEL ? Vous avez implémenté une variante sans bibliothèques avec OBJ_BITMAP_LABEL. Quel est son avantage ? Je ne vois qu'une limitation.

 
Cible
Geess:

https://www.mql5.com/ru/docs/objects/textsetfont
Je ne comprends pas pourquoi vous avez tant besoin de OBJ_LABEL ? Vous avez implémenté une variante sans bibliothèques avec OBJ_BITMAP_LABEL. Quel est son avantage ? Je ne vois qu'une limitation.

Encore une fois, merci beaucoup.
Je ne savais pas, je n'ai pas vu, je n'ai pas lu, à propos de la multiplication par -10. Problème résolu.
OBJ_LABEL a été utilisé pour illustrer le problème et pouvoir le reproduire.

 
Bonjour !

Veuillez me dire quel est le problème.

Différents indicateurs, qui fonctionnent correctement et se mettent à jour, commencent à montrer quelque chose de différent en synchronisation, non basé sur le graphique des prix affiché dans la fenêtre principale. Cela arrive occasionnellement, pas tous les jours.

Au début, j'ai blâmé les indicateurs, mais après en avoir essayé différents, y compris les indicateurs natifs de MT5, je me méfie du terminal. J'observe le problème depuis longtemps, depuis l'année dernière, sur différentes versions du terminal. D'abord c'était sur la version personnalisée d'Alpari, maintenant c'est la même chose sur la version originale. Tant sur le compte de démonstration que sur le compte réel .

Courtier Alpari. MT5 build 2363 du 13.03.2020. Je ne m'en souviens pas pour les autres périodes, mais cela se produit certainement sur le M1.

Captures d'écran :

Variante "glissé". À l'exception du zigzag, tous les indicateurs sont intégrés. Le zigzag avec le travail correct avec l'histoire. Les lectures des indicateurs sont convergentes entre elles. Ils ne correspondent pas aux prix.

Après la mise à jour.

Version MT5

Dossiers :
 

Après-midi.

Je suis tombé sur une chose incompréhensible et je ne comprends pas ce que c'est.

Il existe deux fonctions qui sont utilisées dans différentes stratégies. Logiquement, le code dans les contrôles comme

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

Il ne doit pas être exécuté si l'une des conditions est fausse. Mais pour une raison quelconque, elle est exécutée si le nombre magique et le nombre magique passé dans la fonction ne sont PAS EGAUX.

Il semble s'agir d'une comparaison de type entier. Je ne comprends pas pourquoi. Vous pouvez le voir dans la capture d'écran ci-dessous.


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


magazine
Заранее спасибо за ответ.
 
shev1404:

Après-midi.

Je suis tombé sur une chose incompréhensible et je ne comprends pas ce que c'est.

Il existe deux fonctions qui sont utilisées dans différentes stratégies. Logiquement, le code dans les contrôles comme

Il ne doit pas être exécuté si l'une des conditions est fausse. Mais pour une raison quelconque, elle est exécutée si le nombre magique et le nombre magique passé dans la fonction ne sont PAS EGAUX.

Il semble s'agir d'une comparaison de type entier. Je ne comprends pas pourquoi. Vous pouvez le voir dans la capture d'écran ci-dessous.


IsSetSell(magic,ExtDP)
Que fait cette fonction ?