CustomRatesUpdate и пересчёт индикаторов

 

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

по крайней мере iFractals из поставки весьма ощутимо и назойливо моргает ;-(

Как-нибудь можно обновлять/добавлять последнюю минутку не вызывая полный перерасчёт ?

 

Fractals из Example? 

запустил, нормально все 2605

из готовых на каждом тике считает 5-7 баров, который в Example код на новом баре обновляет, можно еще добавить ему

//--- проверка на новый бар

   if(prev_calculated==rates_total)

      return(rates_total);


(готовый и код без изменений)

 
Fast235:

Fractals из Example? 

запустил, нормально все 2605

из готовых на каждом тике считает 5-7 баров, который в Example код на новом баре обновляет, можно еще добавить ему


(готовый и код без изменений)

тема не про то как оформить цикл пересчёта внутри индикатора.

имелся в виду про CustomSymbol который пополняется самостоятельно через CustomRatesUpdate. То есть iFractals запущеный только на очень нестандартом тайм-фрейме моргает.

---

Когда терминалу отдаётся обновление свечи, он запускает в полный пересчёт индикаторы Custom-чарта :-( По iFractals это просто хорошо заметно.

довольно неожиданное поведение и как с ним обновлять/добавлять свечи не вызывая пересчёта (довольно тяжёлых) индикаторов не ясно :-(

 
Maxim Kuznetsov:

тема не про то как оформить цикл пересчёта внутри индикатора.

имелся в виду про CustomSymbol который пополняется самостоятельно через CustomRatesUpdate. То есть iFractals запущеный только на очень нестандартом тайм-фрейме моргает.

---

Когда терминалу отдаётся обновление свечи, он запускает в полный пересчёт индикаторы Custom-чарта :-( По iFractals это просто хорошо заметно.

довольно неожиданное поведение и как с ним обновлять/добавлять свечи не вызывая пересчёта (довольно тяжёлых) индикаторов не ясно :-(

тихо, сам с собою, я веду беседу :-) Может кому пригодится:

Единственное найденное решение - вместо обновлений последней свечи через CustomRatesUpdate, пытаться поделить её на псевдо-тики обновляющие High,Low,Close и передавать их через CustomTickAdd. Тогда всё проходит гладко

но это не самый короткий/быстрый код, и он рушит последовательность тиков и вообще не всегда применим. 

 

А только моргает или реально пересчитывается? Что принты в индикаторе скажут (прев_калкулейтд)?

Просто моргание было еще с древних времен даже на обычном графике и без изменения истории. Уж не помню, чем закончилось, но, может, это та же история.

 
Andrey Khatimlianskii:

А только моргает или реально пересчитывается? Что принты в индикаторе скажут (прев_калкулейтд)?

Просто моргание было еще с древних времен даже на обычном графике и без изменения истории. Уж не помню, чем закончилось, но, может, это та же история.

к сожалению, пересчитывается

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[])
{
   ArraySetAsSeries(time,true);
   if (prev_calculated==0) {
      PrintFormat("Full recalc time[0]=%s ArraySize(time)=%d rates_total=%d",TimeToString(time[0],TIME_MINUTES|TIME_SECONDS),ArraySize(time),rates_total);
   }
   return(rates_total);
}

и результат:

каждый раз когда вызывается CustomSymbolUpdate, все индикаторы на чартах получают prev_calculated=0. Даже если обновляется только единственная последняя свечка.

 

В четверке с оффлайн-графиками та же самая беда. Но там хоть имеем дело с недокументированными возможностями. А тут уже все документировано.

Для обхода нужно делать свои nPrevCalculated и nRatesTotal. Например, в MTF-индикаторах именно так и приходится поступать, там нельзя ориентироваться на стандартные nPrevCalculated, т. к. они для текущего периода графика.

Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
Графики в торговой платформе отображают изменение котировок финансовых инструментов во времени. Они необходимы для проведения технического анализа и работы советников. Они позволяют трейдерам наглядно следить за котировками валют и акций в режиме реального времени и моментально реагировать на любое изменение ситуации на финансовых рынках...
 
Maxim Kuznetsov:

Как-нибудь можно обновлять/добавлять последнюю минутку не вызывая полный перерасчёт ?

CustomTicksAdd.

 
Maxim Kuznetsov:

к сожалению, пересчитывается

и результат:

каждый раз когда вызывается CustomSymbolUpdate, все индикаторы на чартах получают prev_calculated=0. Даже если обновляется только единственная последняя свечка.

Может так?

input int Length = 5;  /*Длина индикатора*/


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(rates_total < Length)
      return(0);
   
   //---------------------------------------------
   //Объявление локальных переменных
   int limit, bar;
      
   //----------------------------------------------
   //Расчёт стартового номера limit для цикла пересчёта баров
   if(prev_calculated > rates_total || prev_calculated <= 0)   //проверка на первый старт расчёта индикатора
      limit = rates_total - (rates_total - Length);            //стартовый индекс для расчёта всех баров
   else 
      limit = rates_total - prev_calculated;                   //стартовый индекс для расчёта новых баров    
   
   
   //----------------------------------------------
   //Основной цикл расчёта индикатора
   for(bar = limit; bar >= 0 && !_StopFlag; bar--) 
   {
      PrintFormat("Full recalc time[0]=%s rates_total=%d", TimeToString(TimeLocal(), TIME_MINUTES|TIME_SECONDS), bar);
   }
   
   return(rates_total);
}
 
Постараемся пофиксить пересчет индикаторов при обновлении или добавлении последнего бара.
Причина обращения: