Мультитаймфреймовые индикаторы - страница 1224

 

Тик эмулируется при помощи ChartSetSymbolPeriod() с указанием текущего символа и периода графика:

ChartSetSymbolPeriod(0,Symbol(),Period());

Из справки:

Примечание

Смена символа/периода влечет за собой переинициализацию эксперта, прикрепленного к соответствующему графику.

Вызов ChartSetSymbolPeriod с тем же символом и таймфреймом можно использовать для обновления графика (аналогично команде Refresh в терминале). Обновление графика в свою очередь запускает перерасчет индикаторов, прикрепленных к нему. Таким образом, вы можете рассчитать индикатор на графике даже при отсутствии тиков (например, в выходные дни).

Документация по MQL5: Операции с графиками / ChartSetSymbolPeriod
Документация по MQL5: Операции с графиками / ChartSetSymbolPeriod
  • www.mql5.com
ChartSetSymbolPeriod - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin #:

Тик эмулируется при помощи ChartSetSymbolPeriod() с указанием текущего символа и периода графика:

Из справки:

Артём, а как для индикатора?

 
Vitaly Muzichenko #:

Артём, а как для индикатора?

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

Тут нужно проверять сколько баров уже просчитано и, если 0, то буферы не инициализировать, а сразу заполнять из массива мультипериодного индикатора, ранее заполненного из CopyBuffer. С учётом смещения баров для "неродного" периода.

 

Сейчас на выходных решил попробовать функцию ChartSetSymbolPeriod() в индикаторе, чтобы эмулировать дополнительный тик.

Увидел, что в справке написано следующее:

ChartSetSymbolPeriod

Вызов ChartSetSymbolPeriod с тем же символом и таймфреймом можно использовать для обновления графика (аналогично команде Refresh в терминале). Обновление графика в свою очередь запускает перерасчет индикаторов, прикрепленных к нему. Таким образом, вы можете рассчитать индикатор на графике даже при отсутствии тиков (например, в выходные дни).


В индикаторе запрашиваю по CopyTime() время открытия с М15. Если данные не получены, то дергаем ChartSetSymbolPeriod().

int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[],
                const double &open[], const double &high[], const double &low[], const double &close[],
                const long &tick_volume[], const long &volume[], const int &spread[])
{
  
  if(getBarsTimeFrame(PERIOD_M15) <= 0)
  {
    ChartSetSymbolPeriod(0, NULL, 0);
    return 0;
  }

  Print(__FUNCTION__, " successed");

  return rates_total;
}


//+------------------------------------------------------------------------------------------------------------------+
int getBarsTimeFrame(ENUM_TIMEFRAMES tf)
{
  datetime dt[];
  int barsTF = Bars(Symbol(), tf);
 
  int copied = CopyTime(Symbol(), tf, 0, barsTF, dt);
  
  Print(__FUNCTION__, " tf=", EnumToString(tf), " barsTF=", barsTF, " copied=", copied);
  
  return copied;
}

Запуск такого индикатора почему-то зацикливается. Вот вывод в журнал:


Я не совсем понимаю почему так. Если исторические данные уже в какой-то момент получены и доступны по CopyTime(), почему зацикливает и потом CopyTime() возвращает -1?
В справке написано, что функция ассинхронная? Это как-то с этим связано?

Файлы:
Причина обращения: