Почему происходит мерцание индикаторов (линий, стрелок, гистограмм) в биржевом терминале MT5?
С чем может быть связано мерцание индикаторов (линий, стрелок, гистограмм) как в основном окне графика, так и в отдельном окне? Такое впечатление, что индикатор перерисовывается, причем в окне данных в это время на секунду из списка исчезают метки и значения буферов, и потом вновь появляются в списке. Что-то не так в программном коде?
Причем подобное наблюдается исключительно в терминале MT5, в MT4 такого не наблюдается.
Предлагаете гадание устраивать? Обращайтесь ;)
Нет, просто поиск не дал ответ на интересующий меня вопрос.
Может быть Вы знаете, почему мерцание наблюдается только в биржевом терминале MT5, в форексном терминале MT5 мерцание не происходит?
Нет, просто поиск не дал ответ на интересующий меня вопрос.
Может быть Вы знаете, почему мерцание наблюдается только в биржевом терминале MT5, в форексном терминале MT5 мерцание не происходит?
Что прямо-таки все-все индикаторы мерцают? МТ5 один вроде, только тип счёта может отличаться - биржа или форекс.
Я это и имел ввиду, говоря для краткости о форексном и биржевом терминале MT5. Более полно проблема звучит так. При подключении к форексному брокеру индикаторы в терминале MT5 не мерцают, а при подключении к биржевому брокеру наблюдается мерцание, кроме того в окне данных на секунду или две исчезают метки и значения буферов индикаторов.
Что же касается вопроса о том, все ли индикаторы ведут себя так, то не могу утверждать. Давайте я сейчас опубликую один, чтобы не быть голословным.
//+-----------------------------------------------------------------------------------------------------+ //| 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); }
Наблюдаю такое поведение, когда есть много объектов. Когда объектов нет, все более или менее нормально. Буфера индикаторов иногда тоже могут моргнуть при приходе тика (при наличии обновляющихся объектов).
Полагаю, это фича МТ5, связанная с тем, что индикаторы теперь в отдельных потоках по каждому символу/таймфрему, и для обновления картинки в потоке GUI требуется синхронизация, а это добавляет тормозов по сравнению с однопотоковой моделью МТ4. Работа с объектами - самая ресурсоемкая операция, потому на ней такое вылезает. Если проблема наблюдается без объектов, вероятно, есть какая-то прочая загрузка в коде индикатора. Если её попробовать локализовать и исключить, должно стать получше.
Индикатор с объектами не работает, поэтому эту причину можно исключить. Допускаю, что это м.б. связано с программным кодом, но я привел код чуть выше, он очень простой и я просто не вижу места, где бы он мог сбоить. Главные вопросы пока так и остаются без ответа - кто виноват и что делать? Можно с этим как-нибудь бороться или это неисправимо в принципе? М.б. разработчики скажут здесь свое веское слово?!
Кстати, сейчас утро, биржа еще не открылась, поэтому все индикаторы стоят как вкопанные, буфера в "Окне данных" не перерисовываются, линии не мерцают.
Ну вот биржа открылась, и опять все тоже кино. Ну я могу еще понять, что данные индикаторов пересчитываются с приходом каждого тика, но зачем удалять целиком все индикаторные буфера из таблицы окна данных? Не достаточно ли просто обновить их значения на месте? Например, так, как это делается с ценой Close. Ведь с приходом нового тика цена закрытия Close не исчезает из окна данных, чтобы появиться вновь с обновленным значением? Почему же тогда на какое-то исчезают индикаторные буфера? Кроме того, некоторые индикаторы не пересчитываются на текущем нулевом баре, но почему то и они тоже перерисовываются в "Окне данных"?
Все еще надеюсь на ответ знающих людей, или хотя бы ссылку.
Похоже, что-то не так. Или мой вопрос перестал быть актуальным и решение давно уже найдено, или я задал его не в той ветке. Может быть на форуме перевелись знающие люди, или разработчики не мониторят этот раздел форума?
Почему в "Окне данных" на какое-то время исчезают индикаторные буфера? Это принципиально не лечится или это устранимо? Что не так в приведенном выше коде? Причем индикатор не пересчитывает свое значение на текущем баре.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
С чем может быть связано мерцание индикаторов (линий, стрелок, гистограмм) как в основном окне графика, так и в отдельном окне? Такое впечатление, что индикатор перерисовывается, причем в окне данных в это время на секунду из списка исчезают метки и значения буферов, и потом вновь появляются в списке. Что-то не так в программном коде?
Причем подобное наблюдается исключительно в биржевом терминале MT5, в MT4 такого не наблюдается.