Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1256

 
Vladimir Pastushak:

Comment puis-je connaître le type de paramètre d'entrée ?

le compilateur substitue lui-même les types au moment de l'appel de la fonction template, si cet appel n'était pas encore dans le code, alors le compilateur va créer une autre copie de la fonction et définir les types lui-même - bien, comme si c'était logique - un template


si la question est de savoir comment définir le type dans une telle fonction, utilisez

typename

UPD : ajout à l'exemple ci-dessus du paramètre type imprimantes :

#define  PRINT(VAL) Print(#VAL," = ",VAL, ", typename = ", typename(VAL))
template<typename T1, typename T2>
int myfunc(T1 val1=0, T2 val2=0)
{
   Print(__FUNCSIG__);
   PRINT(val1);
   PRINT(val2);
   return((int) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart()
{
   int i1 = 2, i2 = 3;
   Print(myfunc(i1, i2));
   double d1 = 10.0, d2 = 30.0;
   Print(myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD : ajout de__FUNCSIG__ à cet exemple

 

Après-midi.
Je suis confronté à un phénomène étrange lors de l'écriture d'un indicateur dans MQL5 (indicateur dans une sous-fenêtre séparée, 4 lignes).

Les descriptions des tampons initiaux sont les suivantes :

//------------------------------------------------------------------
#property indicator_buffers   6
#property indicator_plots     4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3   DRAW_COLOR_LINE
#property indicator_color3  clrWhite, clrBlack
#property indicator_style3  STYLE_SOLID
#property indicator_width3  3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4   DRAW_COLOR_LINE
#property indicator_color4  clrYellow, clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//------------------------------------------------------------------
//--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double      RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double      MAr1_fast[];                                                   // буфер под быструю МА
double      MAr2_slow[];                                                   // буфер под медленную МА
double      MAr2_slowColor[];                                              // буфер под цвета медленной МА
//--------------------------------------------------------------------
double      MAr3_slow_glob[];                                              // буфер под глобальную медленную МА
double      MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

Suivant dans OnInit :

   //--------------------------------------------------------------------
   SetIndexBuffer       (0,   RSI,                 INDICATOR_DATA);
   ArraySetAsSeries     (     RSI,                 true);
   PlotIndexSetString   (0,   PLOT_LABEL,          "RSI(" + IntegerToString(RSI_per) + ")");
   PlotIndexSetInteger  (0,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (0,   PLOT_DRAW_BEGIN,     RSI_per);
   PlotIndexSetDouble   (0,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (1,   MAr1_fast,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr1_fast,           true);
   PlotIndexSetString   (1,   PLOT_LABEL,          "MA (" + IntegerToString(MA_fast_period) + "), EMA");
   PlotIndexSetInteger  (1,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (1,   PLOT_DRAW_BEGIN,     MA_fast_period);
   PlotIndexSetDouble   (1,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (2,   MAr2_slow,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr2_slow,           true);
   PlotIndexSetString   (2,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_period) + "), SMA");
   PlotIndexSetInteger  (2,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (2,   PLOT_DRAW_BEGIN,     MA_slow_period);
   PlotIndexSetDouble   (2,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (3,   MAr2_slowColor,      INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr2_slowColor,      true);
   PlotIndexSetDouble   (3,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (4,   MAr3_slow_glob,      INDICATOR_DATA);
   ArraySetAsSeries     (     MAr3_slow_glob,      true);
   PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
   PlotIndexSetInteger  (4,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (4,   PLOT_DRAW_BEGIN,     MA_slow_glob_period);
   PlotIndexSetDouble   (4,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (5,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr3_slow_globColor, true);
   PlotIndexSetDouble   (5,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------

En gros, l'indicateur trace 4 lignes : les deux premières sont unicolores, les deux suivantes sont bicolores (elles changent de couleur sur les nœuds).

Le bicolore est dû à la manière de dessiner DRAW_COLOR_LINE.

Question : la première ligne (tampons 2 et 3 dans le code ci-dessus) est parfaitement dessinée et tout le code écrit pour elle dans OnInit fonctionne ;
la deuxième ligne apparaît pour une raison quelconque, par exemple la ligne ne fonctionne pas :

PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
C'est-à-dire qu'au lieu du texte que j'ai défini dans la fenêtre de données, seul le nom de l'indicateur est affiché à la place du tampon. Bien que la ligne elle-même soit tracée, et qu'elle soit, comme il se doit, multicolore.
Je pense que le truc est dans le changement de numérotation ? Par exemple, je ne sais pas pourquoi dans la partie supérieure du code, lorsque je déclare la dernière ligne avec la directive #property, l'index devrait être 4 et non 5, car 4 tampons ont déjà été utilisés auparavant. Y a-t-il une quelconque relation entre la numérotation des lignes lors de la déclaration avec #property et la numérotation des tampons lors de la liaison avec des tableaux dans OnInit ?

Veuillez me dire ce qui ne va pas dans le code ci-dessus. Peut-être que quelqu'un peut trouver un exemple d'indicateur où au moins deux lignes sont dessinées en utilisant la méthode de dessin DRAW_COLOR_LINE....
.

Une autre question connexe : comment les tampons de ligne colorés sont-ils reliés entre eux ? Je veux dire, comment le code compilé sait-il que si je mets une valeur dans un tampon de couleur, cette couleur doit être utilisée pour colorer une ligne d'un autre tampon ?

 
satorifx:

Après-midi.
Je suis confronté à un phénomène étrange lors de l'écriture d'un indicateur dans MQL5 (indicateur dans une sous-fenêtre séparée, 4 lignes).

Les descriptions des tampons initiaux sont les suivantes :

Suivant dans OnInit :

En gros, l'indicateur trace 4 lignes : les deux premières sont unicolores, les deux suivantes sont bicolores (elles changent de couleur sur les nœuds).

Le bicolore est dû à la façon de dessiner DRAW_COLOR_LINE.

Question : la première ligne (tampons 2 et 3 dans le code ci-dessus) est parfaitement dessinée et tout le code écrit pour elle dans OnInit fonctionne ;
la deuxième ligne apparaît pour une raison quelconque, par exemple la ligne ne fonctionne pas :

C'est-à-dire qu'au lieu du texte que j'ai défini dans la fenêtre de données, seul le nom de l'indicateur est affiché à la place du tampon. Bien que la ligne elle-même soit tracée, et qu'elle soit, comme il se doit, multicolore.
Je pense que le truc est dans le changement de numérotation ? Par exemple, je ne sais pas pourquoi dans la partie supérieure du code, lorsque je déclare la dernière ligne avec la directive #property, l'index devrait être 4 et non 5, car 4 tampons ont déjà été utilisés auparavant. Y a-t-il une quelconque relation entre la numérotation des lignes lors de la déclaration avec #property et la numérotation des tampons lors de la liaison avec des tableaux dans OnInit ?

Veuillez me dire ce qui ne va pas dans le code ci-dessus. Peut-être que quelqu'un peut trouver un exemple d'indicateur où au moins deux lignes sont dessinées en utilisant la méthode de dessin DRAW_COLOR_LINE....
.

Une autre question connexe : comment les tampons de ligne colorés sont-ils reliés entre eux ? Je veux dire, comment le code compilé sait-il que si je mets une valeur dans un tampon de couleur, cette couleur doit être utilisée pour colorer une ligne d'un autre tampon ?

Les mappings sont numérotés différemment des tampons.

PlotIndexSetString   (3,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");

Cela devrait fonctionner.

 

Bonjour à tous !

J'ai créé une fonction pour modifier le stoploss. Mais quand il fonctionne, il donne EURUSD,H1 : OrderModify error 130.

Et le prix est loin de l'endroit où le stoploss devrait être fixé.

Voici la fonction :

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
Bonne journée. Je veux écrire un EA basé sur la mesure de l'angle de pente d'une moyenne mobile (ou mieux un ensemble d'entre elles, à savoir l'Alligator), de sorte que l'EA donne une alerte sur une forte impulsion de prix, de préférence avec un petit décalage. Veuillez indiquer comment mesurer l'angle de la MA ou "dire à l'EA" que l'impulsion s'est produite. Peut-être existe-t-il déjà des moyens connus de le faire. Ou par exemple un indicateur gratuit basé sur le calcul des impulsions ?
 

J'ai écrit une fonction pour trouver le numéro de barre d'une fractale à partir de 3 barres. Sur le tableau en ligne, il semble le trouver correctement. Mais pendant le test visuel dans le testeur, il ment. L'un des professionnels peut-il jeter un coup d'œil au code et trouver des erreurs ?

Je vous en serais très reconnaissant.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
 if(sy=="" || sy=="0") sy=Symbol();
 int nlext=0,k=iBars(sy,tf);
 nlext=0;
 if(mode==MODE_UPPER)
   {
    for (int i=2; i<=k; i++)
     {
      if(High[i]>High[i+1] && High[i]>High[i-1])
        {
         nlext++;
         
         if(nlext>ne) return(i);
        }
     }    
   }        
 if(mode==MODE_LOWER)
   {
    for (i=2; i<=k; i++)
     {
      if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
        {
         nlext++;
         if(nlext>ne) 
           {
            //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
            return(i); 
           }
        }
     }    
   }       
    Print("Бар локального экстремума не найден");
    return(-1);     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

Bon après-midi. QUEL CODE DOIS-JE AJOUTER POUR QUE L'INDICATEUR CESSE DE FONCTIONNER DANS LE TESTEUR APRÈS UN MOIS ? C'EST-À-DIRE QUE J'AI ÉCRIT TOUT CE QUI EST CORRECT ! MAIS LORSQUE JE FAIS UN BACKTEST, CELA FONCTIONNE À NOUVEAU. (mgl4)

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  datetime data=D'2020.09.16 20:07';  // Time Block
    if(TimeCurrent()>data)  
      {
       Print("Демонстрационный период закончился, покупайте индикатор :)");
       Alert("Демонстрационный период закончился, покупайте индикатор :)");
       return(INIT_FAILED);
     } 
  
  
  if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
    Comment("Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)");
    return(0);
}    
     
Dossiers :
 

Bonjour !

Je voulais mettre une condition dans le cycle de clôture des ordres lejour de l'ouverture des ordres, afin que ceux qui ont été ouverts le vendredi ne soient pas fermés.

while (OrdersTotal()>0)
    { 
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 
 
Tabazhan_Dajhiov:

Bon après-midi. QUEL CODE DOIS-JE AJOUTER POUR QUE L'INDICATEUR CESSE DE FONCTIONNER DANS LE TESTEUR APRÈS UN MOIS ? C'EST-À-DIRE QUE J'AI ÉCRIT TOUT CE QUI EST CORRECT ! MAIS LORSQUE JE FAIS UN BACKTEST, CELA FONCTIONNE À NOUVEAU. (mgl4)

Vous devez écrire ce code non pas dans OnInit, mais dans OnTick().

 
Yerkin Sagandykov:

Bonjour !

Je voulais mettre une condition dans le cycle de clôture des ordres lejour de l'ouverture des ordres, afin que ceux ouverts le vendredi ne soient pas clôturés.

Essayez de cette façon :

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     }