самое простое избавиться от пересчета на каждом тике
//--- проверка на новый бар if(prev_calculated==rates_total) return(rates_total);
К сожалению в некоторых индикаторах мне нужно чтобы он каждый тик считал. В данном же варианте на 0м баре у нас может зигзаг перерисовывать свой экстремум и нужно обновлять данные в моменте.
Ваш костыль, это временное решение, но оно подходит не для всех случаев. И мигание все равно будет при формировании новых баров.это стандартный зигзаг из терминала + метки.
но для правильного отображения метки на 0м баре при обновлении надо пересчитывать последние экстремумы.
Справедливости ради стоит пофиксить для начала кое-какие баги представленного исходника (без этого у меня ваш зигзаг вообще не рисовался, только метки).
Цикл от start:
... bool bfirst=true; for(i=/*0*/start; i<rates_total && !IsStopped(); i++) ...
Последний бар не 0, т.к. направление индексации в МТ5 обратное (если явно не установить ArraySetAsSeries(...true)).
if(i==/*0*/rates_total - 1) //если перерисовка на 0 баре, сместим метку и обновим текст { g_label.Price(1,dzz[j]); g_label.Description(StringFormat("%d",(int)ddelta)); }
В принципе, идея источника мигания (предположительно) в том, что работа с объектами занимает слишком много времени. Пока MQ не исправит, можно попробовать работу с объектами выполнять отложенным образом по таймеру, например раз в секунду.
это стандартный зигзаг из терминала + метки.
но для правильного отображения метки на 0м баре при обновлении надо пересчитывать последние экстремумы.
зачем создавать метки там где их не видно. Полмиллиона меток - это жесть!
Еще раз - обратите внимание на канвас. Кода будет меньше, работать будет быстрее. Вместо десятков или сотен тысяч объектов будет только один.
зачем создавать метки там где их не видно. Полмиллиона меток - это жесть!
Еще раз - обратите внимание на канвас. Кода будет меньше, работать будет быстрее. Вместо десятков или сотен тысяч объектов будет только один.
например так
это стандартный зигзаг из терминала + метки.
но для правильного отображения метки на 0м баре при обновлении надо пересчитывать последние экстремумы.
чем больше объектов, тем больше тормозов. Причем вы не можете оптимизировать поиск и он происходит простым перебором таблицы объектов с начала таблицы объектов, а надо с конца.
У меня этот поиск реализован максимально оптимально:
while (size_labels>0 && labels[size_labels-1].time>=time[i]) size_labels--;
Именно поэтому мой вариант индикатора на canvas расчитывается достаточно быстро даже на unlimited bars на M1, а ваш на объектах в такой же ситуации безнадежно виснет.
Ваши главные тормоза:
чем больше объектов, тем больше тормозов. Причем вы не можете оптимизировать поиск и он происходит простым перебором таблицы объектов с начала таблицы объектов, а надо с конца.
У меня этот поиск реализован максимально оптимально:
Именно поэтому мой вариант индикатора на canvas расчитывается достаточно быстро даже на unlimited bars на M1, а ваш на объектах в такой же ситуации безнадежно виснет.
спасибо за советы, но это код был взят тот что в примерах терминала.
Решение через канвас изучу, спасибо.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В МТ4 такой проблемы не обнаружено, но в МТ5, если индикатор рисует ZigZag с помощью DRAW_SECTION и на графике используются объекты (текстовые метки), то начинает ZigZag мигать!
В Тестере стратегий он не мигает, только когда на графике.
Когда будет решена данная проблема в МТ5? Или можно как-то эту проблему обойти? Еще раз повторю, что в мт4 такой проблемы нет. И эта проблема только с индикаторами , которые реализуются через DRAW_SECTION с линиями такой проблемы нет.
Дополню еще вот какой момент заметил: Если запустить в тестере стратегий данный индикатор, то на графиках он вообще перестает рисовать. Это че за чудеса???
За основу взят стандартный зигзаг и добавлены метки к его экстремумам. Проблема видна в любой день когда идет поток тиков.