Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 196

 
Vitaly Muzichenko:

Это макет, здесь нет разницы между 4 и 5

Хендл должен создаваться один раз в OnInit(), а не на каждом шаге. Вы этого до сих пор не знаете?

 
удалил, нужно додумать
 
Vitaly Muzichenko:

А так?

А так Вы всё равно на каждом тике создаёте хендл. Используйте Стилизатор и будут сразу видны ошибки построения логики:

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

А так Вы всё равно на каждом тике создаёте хендл. Используйте Стилизатор и будут сразу видны ошибки построения логики:

Вроде так

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
 }
Далее весь остальной код поиска пиковых значений пишем кроссплатформенно
 
Vitaly Muzichenko:

Вроде так

Далее весь остальной код поиска пиковых значений пишем кроссплатформенно

Да, теперь

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

явно лучшею. Но этот блок не на своём месте - его нужно поместить сразу после создания хендла.

 
Vladimir Karputov:

Да, теперь

явно лучшею. Но этот блок не на своём месте - его нужно поместить сразу после создания хендла.

Оптимально скорее всего вот так, ну принтанёт разок ошибку создания, зато дальше меньше проверок на 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:

Оптимально скорее всего вот так, ну принтанёт разок ошибку создания, зато дальше меньше проверок на if(...)

Не могу ничего разглядеть в Вашей каше - всё сливается. 

Используйте Стилизатор.
 
Vladimir Karputov:

Не могу ничего разглядеть в Вашей каше - всё сливается. 

Используйте Стилизатор.

Если что, то моего стиля не увидел в стилизаторе, а их ох как много

Файлы:
cc.PNG  100 kb
 

К сожалению  мой индекатор на MQL4  а эта функция только малая его часть. 

Потому внедрять туда MQL5 не так чтоб эффективно, а переписывать полностью, долго и проблематично. 

 
GlaVredFX:

К сожалению  мой индекатор на MQL4  а эта функция только малая его часть. 

Потому внедрять туда MQL5 не так чтоб эффективно, а переписывать полностью, долго и проблематично. 

Индикатор переписывается на MQL5 в среднем за полчаса. С чашечкой кофе.

Причина обращения: