Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 196

 
Vitaly Muzichenko:

Questo è il layout, non c'è differenza tra il 4 e il 5

L'handle dovrebbe essere creato una volta sola a OnInit(), non ad ogni passo. Ancora non lo sai?

 
cancellato, ho bisogno di pensarci.
 
Vitaly Muzichenko:

Che ne dite di questo?

E in questo modo si crea ancora una maniglia su ogni tick. Usate lo Styler e vedrete immediatamente gli errori di logica:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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:

Ma state comunque creando una maniglia su ogni tick. Usate lo Styler e vedrete immediatamente gli errori di logica:

Come questo

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
 }
Poi il resto del codice di ricerca del picco è multipiattaforma
 
Vitaly Muzichenko:

Credo di sì.

Poi il resto del codice di ricerca del picco è multipiattaforma

Sì, è...

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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
  }

chiaramente meglio. Ma questo blocco è fuori posto - dovrebbe essere messo immediatamente dopo la creazione del gestore.

 
Vladimir Karputov:

Sì, ora

chiaramente meglio. Ma questo blocco è nel posto sbagliato - dovrebbe essere messo subito dopo la creazione della maniglia.

Il modo migliore è probabilmente questo, stamperà un errore di creazione una volta, ma poi ci saranno meno controlli per 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:

Il modo migliore è probabilmente questo, stamperà un errore di creazione una volta, ma poi ci saranno meno controlli su if(...).

Non riesco a vedere nulla nel tuo disordine - è tutto sfocato.

Usa lo Styler.
 
Vladimir Karputov:

Non riesco a vedere nulla nel tuo disordine - tutto si confonde.

Usa lo Styler.

Semmai, non ho visto il mio stile nello styler, e ce ne sono oh così tanti

File:
cc.PNG  100 kb
 

Purtroppo, il mio indicizzatore è basato su MQL4 e questa funzione è solo una piccola parte di esso.

Ecco perché non è così efficiente implementare MQL5, e sarebbe lungo e problematico riscrivere il tutto.

 
GlaVredFX:

Purtroppo, il mio indicizzatore è basato su MQL4 e questa funzione è solo una piccola parte di esso.

Ecco perché non è così efficiente implementare MQL5, e sarebbe lungo e problematico riscrivere il tutto.

Un indicatore viene riscritto in MQL5 in media in mezz'ora. Con una tazza di caffè.