Questions des débutants MQL4 MT4 MetaTrader 4 - page 196

 
Vitaly Muzichenko:

C'est la disposition, il n'y a pas de différence entre 4 et 5.

Le handle doit être créé une fois à OnInit(), et non à chaque étape. Tu ne le sais toujours pas ?

 
supprimé, je dois y réfléchir.
 
Vitaly Muzichenko:

Que pensez-vous de ça ?

Et de cette façon, vous créez toujours une poignée à chaque tic. Utilisez le stylet et vous verrez immédiatement les erreurs de logique :

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
          ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index)
  {
#ifdef __MQL4__
   return(iMA(symb,tf,period,ma_shift,method,price,index));
#else
   double buf[1];
   static int hMA=-1;
   int handle=iMA(symb,tf,period,ma_shift,method,price);
   if(handle<hMA)
     {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(handle,0,index,1,buf)<0)
        {
         PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
         return(WRONG_VALUE);
        }
     }
   hMA=handle;
   return(buf[0]);
#endif
  }
 
Vladimir Karputov:

Mais vous créez toujours une poignée sur chaque tique. Utilisez le stylet et vous verrez immédiatement les erreurs de logique :

Comme ceci

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  static int handle=-1;
   if(handle<0) {
    handle=iMA(symb,tf,period,ma_shift,method,price);
   }
   if(handle<0) {
    PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
Ensuite, le reste du code de recherche de pointe est multiplateforme.
 
Vitaly Muzichenko:

Je pense que oui.

Ensuite, le reste du code de recherche de pointe est multiplateforme.

Oui, c'est...

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
          ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index)
  {
#ifdef __MQL4__
   return(iMA(symb,tf,period,ma_shift,method,price,index));
#else
   double buf[1];
   static int handle=-1;
   if(handle<0)
     {
      handle=iMA(symb,tf,period,ma_shift,method,price);
     }
   if(handle<0)
     {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(handle,0,index,1,buf)<0)
        {
         PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
         return(WRONG_VALUE);
        }
     }
   return(buf[0]);
#endif
  }

clairement mieux. Mais ce bloc n'est pas à sa place - il devrait être placé immédiatement après la création du gestionnaire.

 
Vladimir Karputov:

Oui, maintenant.

clairement mieux. Mais ce bloc est au mauvais endroit - il devrait être placé immédiatement après la création de la poignée.

La meilleure façon de procéder est probablement la suivante, elle imprimera une erreur de création une fois, mais il y aura moins de vérifications pour if(...)

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  static int handle=-1;
   if(handle<0) {
    handle=iMA(symb,tf,period,ma_shift,method,price);
    PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
 
Vitaly Muzichenko:

La meilleure façon est probablement comme ceci, cela imprimera une erreur de création une fois, mais il y aura moins de vérifications sur if(...).

Je ne vois rien dans ton désordre - tout est flou.

Utilisez le stylet.
 
Vladimir Karputov:

Je ne vois rien dans ton désordre, tout se fond dans le décor.

Utilisez le stylet.

En fait, je n'ai pas vu mon style dans le styler, et il y en a tellement...

Dossiers :
cc.PNG  100 kb
 

Malheureusement, mon indexeur est basé sur MQL4 et cette fonction n'en est qu'une petite partie.

C'est pourquoi il n'est pas si efficace de mettre en œuvre MQL5, et il serait long et problématique de tout réécrire.

 
GlaVredFX:

Malheureusement, mon indexeur est basé sur MQL4 et cette fonction n'en est qu'une petite partie.

C'est pourquoi il n'est pas si efficace de mettre en œuvre MQL5, et il serait long et problématique de tout réécrire.

Un indicateur est réécrit en MQL5 en moyenne en une demi-heure. Avec une tasse de café.

Raison: