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

 

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

Причем подобное наблюдается исключительно в биржевом терминале MT5, в MT4 такого не наблюдается.

 
Eugene Myzrov:

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

Причем подобное наблюдается исключительно в терминале MT5, в MT4 такого не наблюдается.

 
Предлагаете гадание устраивать? Обращайтесь ;)
 
Vitalie PostolacheПредлагаете гадание устраивать? Обращайтесь ;)

Нет, просто поиск не дал ответ на интересующий меня вопрос.
Может быть Вы знаете, почему мерцание наблюдается только в биржевом терминале MT5, в форексном терминале MT5 мерцание не происходит?

 
Eugene Myzrov:

Нет, просто поиск не дал ответ на интересующий меня вопрос.
Может быть Вы знаете, почему мерцание наблюдается только в биржевом терминале MT5, в форексном терминале MT5 мерцание не происходит?


Что прямо-таки все-все индикаторы мерцают? МТ5 один вроде, только тип счёта может отличаться - биржа или форекс.
 
Vitalie PostolacheЧто прямо-таки все-все индикаторы мерцают? МТ5 один вроде, только тип счёта может отличаться - биржа или форекс.

Я это и имел ввиду, говоря для краткости о форексном и биржевом терминале MT5. Более полно проблема звучит так. При подключении к форексному брокеру индикаторы в терминале MT5 не мерцают, а при подключении к биржевому брокеру наблюдается мерцание, кроме того в окне данных на секунду или две исчезают метки и значения буферов индикаторов.

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

 
Это индикатор «AOM» полученный из индикатора «AO» с небольшими обобщениями.
//+-----------------------------------------------------------------------------------------------------+
//| AOM = Awesome Oscillator Modernized (индикатор AO Модернизированный)
//+-----------------------------------------------------------------------------------------------------+
#property copyright  "Copyright© 2014, Scriptolog® [ myzrov@mail.ru ]"
#property link       "mailto:myzrov@mail.ru"
#property version    "2.0" // текущая версия

#property description "«AOM» - индикатор «AO» модернизированный.\n"

#property description "Предупреждение о рисках. Торговля на рынке Forex с использованием"
#property description "кредитного плеча несёт в себе значительные финансовые риски."

//#property icon "\\Images\\Constructor.ico" // путь к файлу заставки
#property strict

#property   indicator_separate_window
#property   indicator_buffers 2
#property   indicator_plots   2

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#property   indicator_label1  "AOM UP"
#property   indicator_color1  clrGreen
#property   indicator_width1  3
#property   indicator_style1  STYLE_SOLID
#property   indicator_type1   DRAW_HISTOGRAM

#property   indicator_label2  "AOM DN"
#property   indicator_color2  clrRed
#property   indicator_width2  3
#property   indicator_style2  STYLE_SOLID
#property   indicator_type2   DRAW_HISTOGRAM

#property   indicator_level1  0.0000 // Горизонтальный уровень в отдельном окне индикатора

   input int                  AOM_PERIOD_FACTOR  =   1;           // AOM. Коэф-т повышения периода усреднения
   input int                  AOM_PERIOD_FAST    =   5;           // AOM. Период усреднения MA быстрой 
   input int                  AOM_PERIOD_SLOW    =  34;           // AOM. Период усреднения MA медленной
   input int                  AOM_SHIFT          =   0;           // AOM. Сдвиг по горизонтали
   input ENUM_MA_METHOD       AOM_METHOD         =  MODE_SMA;     // AOM. Метод усреднения
   input ENUM_APPLIED_PRICE   AOM_PRICE          =  PRICE_MEDIAN; // AOM. Цена   усреднения

//+------------------------------------------------------------------+
//| Глобальные переменные
//+------------------------------------------------------------------+

   double   aUP[], aDN[]; // INDICATOR_DATA

   double   aom, last_aom;  // текущее и предыдущее значения индикатора AO

   int      ma_fast_handle; // =iMA(_Symbol, PERIOD_CURRENT, AOM_PERIOD_FAST, AOM_SHIFT, AOM_METHOD, AOM_PRICE);
   int      ma_slow_handle; // =iMA(_Symbol, PERIOD_CURRENT, AOM_PERIOD_SLOW, AOM_SHIFT, AOM_METHOD, AOM_PRICE);
 
   int      MAX_PERIOD;

// периоды усреднения быстрой и медленной MA (в барах)
   int      AOM1_PERIOD_FAST;    // =AOM_PERIOD_FAST*AOM_PERIOD_FACTOR;
   int      AOM1_PERIOD_SLOW;    // =AOM_PERIOD_SLOW*AOM_PERIOD_FACTOR;
  
//+------------------------------------------------------------------+
//| Custom indicator initialization function
//+------------------------------------------------------------------+
int OnInit()
{
// Подготовить периоды усреднения быстрой и медленной MA (в барах)
   AOM1_PERIOD_FAST=AOM_PERIOD_FAST*AOM_PERIOD_FACTOR;
   AOM1_PERIOD_SLOW=AOM_PERIOD_SLOW*AOM_PERIOD_FACTOR;

   MAX_PERIOD=(int)MathMax(AOM1_PERIOD_FAST, AOM1_PERIOD_SLOW)+1;

// Распределяет память под буферы, используемые для вычислений пользовательского индикатора
   ArraySetAsSeries(aUP, true); SetIndexBuffer(0, aUP, INDICATOR_DATA);
   ArraySetAsSeries(aDN, true); SetIndexBuffer(1, aDN, INDICATOR_DATA);

// Номер позиции начала отрисовки линии индикатора // sets drawing line empty value
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, MAX_PERIOD); PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, MAX_PERIOD); PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

// set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits+1);
   string short_name; StringConcatenate(short_name, "AOM [", AOM_PERIOD_FACTOR, "]  (", AOM_PERIOD_FAST, ",", AOM_PERIOD_SLOW, ")");

   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

   ResetLastError();

// Инициализация 2-х индикаторов MA
   ma_fast_handle=iMA(_Symbol, PERIOD_CURRENT, AOM1_PERIOD_FAST, AOM_SHIFT, AOM_METHOD, AOM_PRICE);
   ma_slow_handle=iMA(_Symbol, PERIOD_CURRENT, AOM1_PERIOD_SLOW, AOM_SHIFT, AOM_METHOD, AOM_PRICE);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Функция деинициализации является обработчиком события Deinit
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Удалить хэндлы индикаторов и освобождить расчетную часть индикатора
   if (ma_slow_handle!=INVALID_HANDLE) IndicatorRelease(ma_slow_handle);
   if (ma_fast_handle!=INVALID_HANDLE) IndicatorRelease(ma_fast_handle);
   return;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове 
                 const datetime& time[],     // Time 
                 const double&   open[],     // Open 
                 const double&   high[],     // High 
                 const double&   low [],     // Low 
                 const double&   close[],    // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& real_volume[],  // Real Volume 
                 const int&  spread[])       // Spread 
{
   int N=rates_total-prev_calculated; if (N>MAX_PERIOD) N-=MAX_PERIOD;

   for (int i=N; i>0 && !IsStopped(); i--) {
      double ma_fast=getMA(ma_fast_handle, i);
      double ma_slow=getMA(ma_slow_handle, i);;
      aom=ma_fast-ma_slow;
      if (aom>last_aom) {aUP[i]=aom; aDN[i]=EMPTY_VALUE;}
      else              {aDN[i]=aom; aUP[i]=EMPTY_VALUE;}
      last_aom=aom;
   }
   aUP[0]=EMPTY_VALUE; aDN[0]=EMPTY_VALUE;
   return(rates_total);
}
//+-------------------------------------------------------+
//| Возвращает значение индикатора «MA»
//+-------------------------------------------------------+
double getMA(int handle, int i) // откуда начнем копирование
{
   double aMA[1]; // массив для получения значениz индикатора
   double nMA=0;
   int k=CopyBuffer(handle, 0, i, 1, aMA); nMA=aMA[0];
   if (k<1) {int err=GetLastError(); Print("*** MA=", handle, " CopyBuffer error #", err);}
   return(nMA);
}
 
Сейчас немного понаблюдал за работой этого индикатора при подключении к биржевому брокеру (инструмент RTS-6.17), пока заметил за ним только одну из двух обозначенных проблем. На какое-то время пропадают данные в окне данных, т.е. метки и значения двух буферов индикатора AOM.
 

Наблюдаю такое поведение, когда есть много объектов. Когда объектов нет, все более или менее нормально. Буфера индикаторов иногда тоже могут моргнуть при приходе тика (при наличии обновляющихся объектов).

Полагаю, это фича МТ5, связанная с тем, что индикаторы теперь в отдельных потоках по каждому символу/таймфрему, и для обновления картинки в потоке GUI требуется синхронизация, а это добавляет тормозов по сравнению с однопотоковой моделью МТ4. Работа с объектами - самая ресурсоемкая операция, потому на ней такое вылезает. Если проблема наблюдается без объектов, вероятно, есть какая-то прочая загрузка в коде индикатора. Если её попробовать локализовать и исключить, должно стать получше.

 
Stanislav Korotky: Наблюдаю такое поведение, когда есть много объектов. Когда объектов нет, все более или менее нормально. Буфера индикаторов иногда тоже могут моргнуть при приходе тика (при наличии обновляющихся объектов). Полагаю, это фича МТ5, связанная с тем, что индикаторы теперь в отдельных потоках по каждому символу/таймфрему, и для обновления картинки в потоке GUI требуется синхронизация, а это добавляет тормозов по сравнению с однопотоковой моделью МТ4. Работа с объектами - самая ресурсоемкая операция, потому на ней такое вылезает. Если проблема наблюдается без объектов, вероятно, есть какая-то прочая загрузка в коде индикатора. Если её попробовать локализовать и исключить, должно стать получше.

Индикатор с объектами не работает, поэтому эту причину можно исключить. Допускаю, что это м.б. связано с программным кодом, но я привел код чуть выше, он очень простой и я просто не вижу места, где бы он мог сбоить. Главные вопросы пока так и остаются без ответа - кто виноват и что делать? Можно с этим как-нибудь бороться или это неисправимо в принципе? М.б. разработчики скажут здесь свое веское слово?!

Кстати, сейчас утро, биржа еще не открылась, поэтому все индикаторы стоят как вкопанные, буфера в "Окне данных" не перерисовываются, линии не мерцают.

 

Ну вот биржа открылась, и опять все тоже кино. Ну я могу еще понять, что данные индикаторов пересчитываются с приходом каждого тика, но зачем удалять целиком все индикаторные буфера из таблицы окна данных? Не достаточно ли просто обновить их значения на месте? Например, так, как это делается с ценой Close. Ведь с приходом нового тика цена закрытия Close не исчезает из окна данных, чтобы появиться вновь с обновленным значением? Почему же тогда на какое-то исчезают индикаторные буфера? Кроме того, некоторые индикаторы не пересчитываются на текущем нулевом баре, но почему то и они тоже перерисовываются в "Окне данных"?

Все еще надеюсь на ответ знающих людей, или хотя бы ссылку.

 

Похоже, что-то не так. Или мой вопрос перестал быть актуальным и решение давно уже найдено, или я задал его не в той ветке. Может быть на форуме перевелись знающие люди, или разработчики не мониторят этот раздел форума?
Почему в "Окне данных" на какое-то время исчезают индикаторные буфера? Это принципиально не лечится или это устранимо? Что не так в приведенном выше коде? Причем индикатор не пересчитывает свое значение на текущем баре.

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