как в индикаторе MT5 форсировать OnCalculate ?

 

чтобы даже при отсутствии тиков функция была вызвана, буферы перевычислены и линии индикаторов перечерчены ? 

причём главное даже не вызов OnCalculate - а просто указать терминалу, что данные в буферах (например в OnTimer, OnChartEvent), поменялись от момента X и их надо перевывести. Например пользователь ткнул OBJ_BUTTON и параметры изменились

ChartRedraw() не предлагать :-) он про объекты, а с буферами наискосок работает, то да то нет. 

 
В  OnTimer/OnChartEvent и вызвать OnCalculate, передав в нее нужное значение prev_calculate...
 
Ihor Herasko #:
В  OnTimer/OnChartEvent и вызвать OnCalculate, передав в нее нужное значение prev_calculate...

отличная мысль, кроме двух моментов: как передать const &double open[] c прочими и как принудить терминал перерисовать индикаторные буферы до получения тика

 
Maxim Kuznetsov:

чтобы даже при отсутствии тиков функция была вызвана, буферы перевычислены и линии индикаторов перечерчены ? 

причём главное даже не вызов OnCalculate - а просто указать терминалу, что данные в буферах (например в OnTimer, OnChartEvent), поменялись от момента X и их надо перевывести. Например пользователь ткнул OBJ_BUTTON и параметры изменились

ChartRedraw() не предлагать :-) он про объекты, а с буферами наискосок работает, то да то нет. 

ChartSetSymbolPeriod() с указанием текущего символа и периода эмулирует тик (примечание в справке).

Правда в индикаторах очень не рекомендуется устанавливать им текущие символ и период графика - может вызвать клинч.

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

отличная мысль, кроме двух моментов: как передать const &double open[] c прочими и как принудить терминал перерисовать индикаторные буферы до получения тика

Передавать пустышки:

double open[];   

OnCalculate(open, ...);

А в OnCalculate не использовать их. Я уже давно не использую массивы-таймсерии, т. к. в одно время был баг в МТ4, когда количество баров выдавалось одно, а размеры массивов-таймсерий не соответствовали им (вроде исправили). В итоге нарывался на out of range и проверить было невозможно. При использовании iTime и прочих вылета, как минимум, не будет.

 
Maxim Kuznetsov:

чтобы даже при отсутствии тиков функция была вызвана, буферы перевычислены и линии индикаторов перечерчены ? 

причём главное даже не вызов OnCalculate - а просто указать терминалу, что данные в буферах (например в OnTimer, OnChartEvent), поменялись от момента X и их надо перевывести. Например пользователь ткнул OBJ_BUTTON и параметры изменились

ChartRedraw() не предлагать :-) он про объекты, а с буферами наискосок работает, то да то нет. 

Вот здесь https://www.mql5.com/ru/code/16210

индикатор перерисовывается, при любом изменении стакана

Лента всех сделок
Лента всех сделок
  • www.mql5.com
Индикатор показывает общее количество сделок по символу в реальном времени.
 
prostotrader #:

Вот здесь https://www.mql5.com/ru/code/16210

индикатор перерисовывается, при любом изменении стакана

в выходные он будет перерисовываться ? вот юзер взял и жмакнул кнопку и коэффициенты стали другими..

кстати и интерфейс OnCalculate там старый, и похоже что deprecated. Вроде уже нельзя вызывать OnCalc от 4-х параметров (как индикатор от буфера), поэтому Medium Average в терминале как памятник уходящей эпохе - когда-то можно было и так :-)

 

Я не заморачиваюсь и делаю так:

int OnCalculate(const int rates_total,...
{
priv = prev_calculated;

return(rates_total);
}
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(priv <= 0)//если выходные или нет новых тиков
      ChartSetSymbolPeriod(0, _Symbol, PERIOD_CURRENT);
   else
      EventKillTimer();
  }
//+------------------------------------------------------------------+

Нормально в выходные запускает индикаторы, которые не рассчитываются с первого раза.

 
Maxim Kuznetsov #:

в выходные он будет перерисовываться ? вот юзер взял и жмакнул кнопку и коэффициенты стали другими..

В OnCalculate нет никакой магии, никто там ему глазом не подмигивает, типа - перерисуйся. Нужно всего лишь записать данные в буфер, а дальше все автоматически произойдет. Это и есть ChartRedraw для индикатора.

 
Aleksandr Slavskii #:

Я не заморачиваюсь и делаю так:

Нормально в выходные запускает индикаторы, которые не рассчитываются с первого раза.

O ! наверное это шаманство должно сработать, 

ChartSetSymbolPeriod(0, _Symbol, PERIOD_CURRENT);

(почти) точно принудит чарт перерисоваться полностью

спасибо !

 
Maxim Kuznetsov #:

в выходные он будет перерисовываться ? вот юзер взял и жмакнул кнопку и коэффициенты стали другими..

кстати и интерфейс OnCalculate там старый, и похоже что deprecated. Вроде уже нельзя вызывать OnCalc от 4-х параметров (как индикатор от буфера), поэтому Medium Average в терминале как памятник уходящей эпохе - когда-то можно было и так :-)

Похоже Вам ничего не нужно.

Вам дали готовое работающее решение, а Вам даже лень потратить ровно 40 секунд чтобы скачать и скомпелить.

Ковыряйтесь дальше!