Работа с индикаторами портированными с MQL4

 
Добрый день.

Портировала эксперта из MQL4, используя соответствующие статьи из форума, и все в принципе работает, но при использовании таймфреймов нестандартных (например М2, H8 и т.д.) индикатор машки выдает значение: MA = 1.797693134862316e+308

Код:
ENUM_TIMEFRAMES TFMigrate(int tf)
  {
   switch(tf)
     {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);
      
      case 2: return(PERIOD_M2);
      case 3: return(PERIOD_M3);
      case 4: return(PERIOD_M4);      
      case 6: return(PERIOD_M6);
      case 10: return(PERIOD_M10);
      case 12: return(PERIOD_M12);
      case 16385: return(PERIOD_H1);
      case 16386: return(PERIOD_H2);
      case 16387: return(PERIOD_H3);
      case 16388: return(PERIOD_H4);
      case 16390: return(PERIOD_H6);
      case 16392: return(PERIOD_H8);
      case 16396: return(PERIOD_H12);
      case 16408: return(PERIOD_D1);
      case 32769: return(PERIOD_W1);
      case 49153: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
     }
  }
И сам индикатор:

double iMAMQL4(string symbol,
               int tf,
               int period,
               int ma_shift,
               int method,
               int price,
               int shift)
{
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   ENUM_MA_METHOD ma_method=MethodMigrate(method);
   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);
   int handle=iMA(symbol,timeframe,period,ma_shift,
                  ma_method,applied_price);
   if(handle<0)
     {
      Print("ERROR: Object iMA doesn't created. Code:", GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,0,shift));
}

Не могу понять, почему со стандартными оно работает, а с нестандартными нет. Помогите найти ошибку пожалуйста


 
Недостаточно информации. Предположительно, надо очищать буферы при prev_calculated==0, или более аккуратно - инициализировать начальный элемент буфера.
 
Dmitry Fedoseev:
Недостаточно информации. Предположительно, надо очищать буферы при prev_calculated==0, или более аккуратно - инициализировать начальный элемент буфера.

Если бы это было нужно, то остальные таймфреймы бы глючили. А тут именно стандартные работают ровно, а нестандартные выдают билеберду. Мне кажется ошибка закралась где-то в этих функциях, хотя я ее не вижу

 
Проверьте, что в переменной timeframe при вызове iMA()
 
Dmitry Fedoseev:
Проверьте, что в переменной timeframe при вызове iMA()

При вызове с H8 в переменной 16392, все как надо в общем. И дальше оно поидее должно работать, как в случае с H4.

 

Смотрите в логах, нет ли сообщение "ERROR: Object iMA doesn't created. Code:".

Если нет, то надо смотреть функцию CopyBufferMQL4(), что там в ней творится. Там в ней должно быть вызывается CopyBuffer(), но результат не проверяется.

Вообще подход странный - при каждом вызове функции загружать индикатор и получать хэндл.

 

история точно есть по этим периодам? если есть, то достаточно ли её? (например, чтобы посчитать экспонентное сглаживание, нужно начать глубже по истории, иначе подхватятся EMPTY_VALUE - для double это как раз число, порядка обозначенного вами)

а вообще не правильно это при каждом вызове новый хэндл создавать. пишите сразу "по-пятёрошному" - создайте хэндл в OnInit(), а в остальном коде только обращайтесь к значениям буфера по хэндлу.

 
Dmitry Fedoseev:

Смотрите в логах, нет ли сообщение "ERROR: Object iMA doesn't created. Code:".

Если нет, то надо смотреть функцию CopyBufferMQL4(), что там в ней творится. Там в ней должно быть вызывается CopyBuffer(), но результат не проверяется.

Вообще подход странный - при каждом вызове функции загружать индикатор и получать хэндл.

Ошибок нету вообще, оно все вычисляет (просто неправильно - см. выше). Даже предупреждений нету

 
Igor Zakharov:

история точно есть по этим периодам? если есть, то достаточно ли её? (например, чтобы посчитать экспонентное сглаживание, нужно начать глубже по истории, иначе подхватятся EMPTY_VALUE - для double это как раз число, порядка обозначенного вами)

а вообще не правильно это при каждом вызове новый хэндл создавать. пишите сразу "по-пятёрошному" - создайте хэндл в OnInit(), а в остальном коде только обращайтесь к значениям буфера по хэндлу.

Истории достаточно. Я в инициализации загружаю историю, если она отсутствует, по логам - загрузка проходит успешно. И опять же, остальные таймфреймы работают прекрасно, даже если я использую символ, ранее не использовавшийся в терминале, т.е инициирую загрузку с нуля. Такие значения у меня кривые все, даже на последние бары, причем баров 3 тыс, а период машки всего 5

 
Вам будет проще посмотреть пример использования IMA в mql5
 
Aleksei Beliakov:
Вам будет проще посмотреть пример использования IMA в mql5

У меня по сути тоже самое, только создается доп функция iMAMQL4, а из нее вызывается iMA (который по всем правилам MQL5). И вызов вроде правильный и хендл правильный и оно, что интересно работает везде, кроме нестандартных таймфреймов. Я уже 3 дня перед тем как спросить на форуме сидела с этим кодом и за**лась уже)

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