Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 196

 
Vitaly Muzichenko:

Esta es la disposición, no hay diferencia entre el 4 y el 5

El manejador debe ser creado una vez en OnInit(), no en cada paso. ¿Todavía no lo sabes?

 
borrado, necesito pensarlo.
 
Vitaly Muzichenko:

¿Qué te parece esto?

Y de esta forma sigues creando un asidero en cada tic. Usa el Styler y verás los errores lógicos inmediatamente:

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

Pero aún así estás creando una manija en cada tic. Usa el Styler y verás los errores lógicos inmediatamente:

Así

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
 }
Entonces el resto del código de búsqueda de picos es multiplataforma
 
Vitaly Muzichenko:

Creo que sí.

Entonces el resto del código de búsqueda de picos es multiplataforma

Sí, es...

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

claramente mejor. Pero este bloque está fuera de lugar - debería ser colocado inmediatamente después de la creación del manejador.

 
Vladimir Karputov:

Sí, ahora

claramente mejor. Pero este bloque está en el lugar incorrecto - debería colocarse inmediatamente después de crear el asa.

La mejor manera es probablemente así, imprimirá un error de creación una vez, pero entonces habrá menos comprobaciones para 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 mejor manera es probablemente así, imprimirá un error de creación una vez, pero entonces habrá menos comprobaciones en if(...).

No puedo ver nada en tu desorden - todo está borroso.

Usa el Styler.
 
Vladimir Karputov:

No veo nada en tu papilla, todo se mezcla.

Usa el Styler.

En todo caso, no vi mi estilo en el estilista, y hay tantos de ellos

Archivos adjuntos:
cc.PNG  100 kb
 

Desafortunadamente, mi indexador está basado en MQL4 y esta función es sólo una pequeña parte de él.

Por eso no es tan eficiente implementar MQL5, y sería largo y problemático reescribirlo todo.

 
GlaVredFX:

Desafortunadamente, mi indexador está basado en MQL4 y esta función es sólo una pequeña parte de él.

Por eso no es tan eficiente implementar MQL5, y sería largo y problemático reescribirlo todo.

Un indicador se reescribe en MQL5 en una media de media hora. Con una taza de café.