Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 196

 
Vitaly Muzichenko:

Este é o layout, não há diferença entre 4 e 5

O cabo deve ser criado uma vez no OnInit(), não a cada passo. Você ainda não sabe disso?

 
apagado, precisa pensar sobre isso.
 
Vitaly Muzichenko:

Que tal isso?

E assim você ainda cria um cabo em cada tic-tac. Use o Styler e você verá os erros lógicos imediatamente:

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

Mas você ainda está criando um cabo em cada carrapato. Use o Styler e você verá os erros lógicos imediatamente:

Assim

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
 }
Então o resto do código de busca de picos é cruzado
 
Vitaly Muzichenko:

Eu acho que sim.

Então o resto do código de busca de picos é cruzado

Sim, é...

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 melhor. Mas este bloco está fora de lugar - ele deve ser colocado imediatamente após a criação do cabo.

 
Vladimir Karputov:

Sim, agora

claramente melhor. Mas este bloco está no lugar errado - ele deve ser colocado imediatamente após a criação do cabo.

A melhor maneira é provavelmente assim, imprimirá um erro de criação uma vez, mas então haverá menos cheques para se(...)

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:

A melhor maneira é provavelmente assim, imprimirá um erro de criação uma vez, mas então haverá menos checagens no if(...).

Não consigo ver nada em sua confusão - tudo isso está embaçado.

Use o Styler.
 
Vladimir Karputov:

Não consigo ver nada em sua confusão - tudo se mistura.

Use o Styler.

Se alguma coisa, eu não vi meu estilo no modelador, e há oh tantos deles

Arquivos anexados:
cc.PNG  100 kb
 

Infelizmente, meu indexador é baseado na MQL4 e esta função é apenas uma pequena parte dela.

É por isso que não é tão eficiente implementar a MQL5, e seria longo e problemático reescrever tudo isso.

 
GlaVredFX:

Infelizmente, meu indexador é baseado na MQL4 e esta função é apenas uma pequena parte dela.

É por isso que não é tão eficiente implementar a MQL5, e seria longo e problemático reescrever tudo isso.

Um indicador é reescrito em MQL5 em média em meia hora. Com uma xícara de café.

Razão: