Почему происходит мерцание индикаторов (линий, стрелок, гистограмм) в биржевом терминале MT5? - страница 2

 

Попробуйте распечатать prev_calculated в самом начале ОнКалкулейт.

И сравните с каким-то стандартным индикатором — мигает ли он.

 
Andrey Khatimlianskii: Попробуйте распечатать prev_calculated в самом начале ОнКалкулейт. И сравните с каким-то стандартным индикатором — мигает ли он.
Добавил в функцию OnCalculate()  две статические переменные, чтобы сравнивать текущие значения с предыдущими значениями:

   static int last_rates_total=0;        // предыдущее значение "размер входных таймсерий на предыдущем"
   static int last_prev_calculated=0; // предыдущее значение "обработано баров на предыдущем вызове"

и проверочный код с выводом в журнал

//+------------------------------------------------------------------+
//| Custom indicator iteration function
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове 
...

{
   int N=rates_total-prev_calculated; if (N>MAX_PERIOD) N-=MAX_PERIOD;

   static int last_rates_total=0;     // размер входных таймсерий 
   static int last_prev_calculated=0; // обработано баров на предыдущем вызове 
   if (rates_total!=last_rates_total || prev_calculated!=last_prev_calculated) {
      Print("N=", N,  ", rates_total=", rates_total, ", prev_calculated=", prev_calculated);
      last_rates_total=rates_total; last_prev_calculated=prev_calculated;
   }

   for (int i=N; i>0 && !IsStopped(); i--) {
...
   }
   aUP[0]=EMPTY_VALUE; aDN[0]=EMPTY_VALUE;
   return(rates_total);
}

Запустил индикатор AOM на минутке, и получил вот такой отчет

FH      0       12:38:02.271    AOM (Si-6.17,M1)        N=41934, rates_total=41969, prev_calculated=0
FN      0       12:38:02.275    AOM (Si-6.17,M1)        N=0, rates_total=41969, prev_calculated=41969
DE      0       12:38:51.845    AOM (Si-6.17,M1)        N=1, rates_total=41970, prev_calculated=41969
GH      0       12:38:51.845    AOM (Si-6.17,M1)        N=0, rates_total=41970, prev_calculated=41970
PO      0       12:39:51.207    AOM (Si-6.17,M1)        N=1, rates_total=41971, prev_calculated=41970
EE      0       12:39:51.215    AOM (Si-6.17,M1)        N=0, rates_total=41971, prev_calculated=41971
MH      0       12:40:52.423    AOM (Si-6.17,M1)        N=1, rates_total=41972, prev_calculated=41971
IO      0       12:40:52.700    AOM (Si-6.17,M1)        N=0, rates_total=41972, prev_calculated=41972
CR      0       12:41:51.214    AOM (Si-6.17,M1)        N=1, rates_total=41973, prev_calculated=41972
OH      0       12:41:51.214    AOM (Si-6.17,M1)        N=0, rates_total=41973, prev_calculated=41973
RO      0       12:42:51.207    AOM (Si-6.17,M1)        N=1, rates_total=41974, prev_calculated=41973
HR      0       12:42:51.207    AOM (Si-6.17,M1)        N=0, rates_total=41974, prev_calculated=41974
NI      0       12:43:51.439    AOM (Si-6.17,M1)        N=1, rates_total=41975, prev_calculated=41974
RO      0       12:43:51.446    AOM (Si-6.17,M1)        N=0, rates_total=41975, prev_calculated=41975
RR      0       12:44:51.373    AOM (Si-6.17,M1)        N=1, rates_total=41976, prev_calculated=41975
DI      0       12:44:51.373    AOM (Si-6.17,M1)        N=0, rates_total=41976, prev_calculated=41976
ML      0       12:45:51.449    AOM (Si-6.17,M1)        N=1, rates_total=41977, prev_calculated=41976
GR      0       12:45:51.902    AOM (Si-6.17,M1)        N=0, rates_total=41977, prev_calculated=41977
II      0       12:46:51.541    AOM (Si-6.17,M1)        N=1, rates_total=41978, prev_calculated=41977
GL      0       12:46:51.541    AOM (Si-6.17,M1)        N=0, rates_total=41978, prev_calculated=41978
PS      0       12:47:51.286    AOM (Si-6.17,M1)        N=1, rates_total=41979, prev_calculated=41978
PI      0       12:47:51.303    AOM (Si-6.17,M1)        N=0, rates_total=41979, prev_calculated=41979
QL      0       12:48:51.395    AOM (Si-6.17,M1)        N=1, rates_total=41980, prev_calculated=41979
IS      0       12:48:51.408    AOM (Si-6.17,M1)        N=0, rates_total=41980, prev_calculated=41980
DF      0       12:49:51.790    AOM (Si-6.17,M1)        N=1, rates_total=41981, prev_calculated=41980
PL      0       12:49:51.790    AOM (Si-6.17,M1)        N=0, rates_total=41981, prev_calculated=41981

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



 
Eugene Myzrov:
Добавил в функцию OnCalculate()  две статические переменные, чтобы сравнивать текущие значения с предыдущими значениями:

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

Индикаторы из стандартной поставки мигают?
 
Andrey Khatimlianskii: Индикаторы из стандартной поставки мигают?

Нет, поставил на график пару штатных индикаторов "Moving Average", "Awesome Oscillator". Понаблюдал. Нет, не было замечено ни мерцания, ни пропадания значений в "Окне данных".

 
Eugene Myzrov:

Нет, поставил на график пару штатных индикаторов "Moving Average", "Awesome Oscillator". Понаблюдал. Нет, не было замечено ни мерцания, ни пропадания значений в "Окне данных".

Я про те индикаторы, что есть в исходниках (mq5).

Если и они не мерцают, то проблема явно в вашем коде. Упрощайте его до тех пор, пока не перестанет мерцать. Или наоборот — дорабатывайте стандартный код до вашего состояния, пока не начнет мерцать.

 
Это фича МТ5, имхо.
 
Stanislav Korotky: Это фича МТ5, имхо.

т.е. с этим надо смириться, принять как должное и перестать искать причину?


 
Andrey Khatimlianskii: Я про те индикаторы, что есть в исходниках (mq5). Если и они не мерцают, то проблема явно в вашем коде. Упрощайте его до тех пор, пока не перестанет мерцать. Или наоборот — дорабатывайте стандартный код до вашего состояния, пока не начнет мерцать.
Но я и так упростил код донельзя. Хорошо, попробую пойти обратным путем.


Кстати, пока не встретил универсальную "обертку" для  функции OnCalculate(), даже среди штатных индикаторов, чтобы использовать ее раз и навсегда.
Может быть Вы подскажите какой-нибудь индикатор, в котором есть такая "обертка", чтобы использовать ее в качестве эталона?

 
Eugene Myzrov:

т.е. с этим надо смириться, принять как должное и перестать искать причину?

Пишите в сервис-деск.
 
Eugene Myzrov:
Но я и так упростил код донельзя. Хорошо, попробую пойти обратным путем.

Дело может быть в любой мелочи.


Eugene Myzrov:

Кстати, пока не встретил универсальную "обертку" для  функции OnCalculate(), даже среди штатных индикаторов, чтобы использовать ее раз и навсегда.
Может быть Вы подскажите какой-нибудь индикатор, в котором есть такая "обертка", чтобы использовать ее в качестве эталона?

Я видел несколько вариантов. Можно поискать и выбрать.
Сам пользуюсь примерно таким:

        //---
        if ( rates_total < MinBars ) return(0);

        //--- last counted bar will be recounted
        int limit=rates_total-prev_calculated-1;
        if(prev_calculated>0) limit++;

        //---
        for( int i=limit; i>=0; i--)
        {
           IndBuffer[i] = Add your code here
        }

        //---
        return(rates_total);
Причина обращения: