Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 850

 
Artyom Trishkin:
Править кривой индикатор. Он у вас может отрисовывать линию только при полном пересчёте, что и происходит по команде контекстного меню.
Alexey Viktorov:

В mql4 тоже есть.

Спасибо.

 
Выкрутился с помощью костыля). Мне нужно было, чтобы индикатор обновлялся после ручного перетаскивания вертикальной линии, с которой он брал время. Использовал функцию события перетаскивания объекта и в неё заложил функцию изменения ТФ с возвратом на исходный. Только почему то с задержкой срабатывает обновление, порядка нескольких секунд. Функция переключения ТФ что ли так медленно работает, не понял.
 
khorosh:
Выкрутился с помощью костыля). Мне нужно было, чтобы индикатор обновлялся после ручного перетаскивания вертикальной линии, с которой он брал время. Использовал функцию события перетаскивания объекта и в неё заложил функцию изменения ТФ с возвратом на исходный. Только почему то с задержкой срабатывает обновление, порядка нескольких секунд. Функция переключения ТФ что ли так медленно работает, не понял.

Эта функция асинхронная. Она лишь возвращает результат постановки команды в очередь событий.

Для немедленного обновления нужно после команды переключения графика выполнить команду ChartRedraw()

А вообще конечно неправильный подход. Если нужно обновлять график лишь после завершения перемещения линии, то и цикл пересчёта индикатора нужно вызывать не из OnCalculate(), а из ChartEvent() - поймали смещение линии - вызвали ф-цию пересчёта индикатора, которая выполнит полный цикл перерасчёта линии с новыми данными (линия же нужна для каких-то данных?)

Или индикатор просто не правильно сделан, и на текущих данных не обновляет нулевой бар, и вы ему накостыляли?

 
ilyav:

Может кто нибудь поможет подправить код советника на МТ5?

Читал мануалы, но не могу победить 2 варнинга при компиляции.

declaration of 'ххх ' hides global declaration

и

possible loss of data due to type conversion

Советник прикладываю

Просто тупо исправил имена глобальных переменных и привёл типы в соответствие.

С вас 10 000 000 можно рублей - за преодоление вашей лени.

Файлы:
 
Artyom Trishkin:

Просто тупо исправил имена глобальных переменных и привёл типы в соответствие.

С вас 10 000 000 можно рублей - за преодоление вашей лени.

Спасибо огромное.

Мне стыдно показывать как я исправил)

int CountTrades(long PositionID1) 

 
Artyom Trishkin:

Эта функция асинхронная. Она лишь возвращает результат постановки команды в очередь событий.

Для немедленного обновления нужно после команды переключения графика выполнить команду ChartRedraw()

А вообще конечно неправильный подход. Если нужно обновлять график лишь после завершения перемещения линии, то и цикл пересчёта индикатора нужно вызывать не из OnCalculate(), а из ChartEvent() - поймали смещение линии - вызвали ф-цию пересчёта индикатора, которая выполнит полный цикл перерасчёта линии с новыми данными (линия же нужна для каких-то данных?)

Или индикатор просто не правильно сделан, и на текущих данных не обновляет нулевой бар, и вы ему накостыляли?

Индикатор считает последние не посчитанные бары. А после перетаскивания вертикали должен полностью пересчитаться после считывания нового времени вертикали. Вот здесь я про него написал и скрины выложил как работает.

Спасибо, попробую вашу идею реализовать. Вообще я в индикаторах слаб, всё время в основном советниками занимался.

 
Artyom Trishkin:

Эта функция асинхронная. Она лишь возвращает результат постановки команды в очередь событий.

Для немедленного обновления нужно после команды переключения графика выполнить команду ChartRedraw()

А вообще конечно неправильный подход. Если нужно обновлять график лишь после завершения перемещения линии, то и цикл пересчёта индикатора нужно вызывать не из OnCalculate(), а из ChartEvent() - поймали смещение линии - вызвали ф-цию пересчёта индикатора, которая выполнит полный цикл перерасчёта линии с новыми данными (линия же нужна для каких-то данных?)

Или индикатор просто не правильно сделан, и на текущих данных не обновляет нулевой бар, и вы ему накостыляли?

Сделал как вы посоветовали. Все получилось отлично. Теперь мгновенно после перетаскивания индикатор полностью перерисовывается. Ещё раз спасибо.

 
khorosh:

Сделал как вы посоветовали. Все получилось отлично. Теперь мгновенно после перетаскивания индикатор полностью перерисовывается. Ещё раз спасибо.

Не за что. Но он и в OnCalculate() должен рисовать, или-таки нет?

Ведь при набрасывании его на график, он ещё ни о каких перемещениях линии не в курсе, но отрисовать-то линию должен.

 
Artyom Trishkin:

Не за что. Но он и в OnCalculate() должен рисовать, или-таки нет?

Ведь при набрасывании его на график, он ещё ни о каких перемещениях линии не в курсе, но отрисовать-то линию должен.

При установке на график индикатора в init() создаётся вертикаль и первоначально ей задаётся какое-то время, например Time[10]. Я продублировал код в OnChartEvent() и в OnCalculate(). Только в OnChartEvent пересчёт сделал по всем барам.

 
khorosh:

При установке на график индикатора в init() создаётся вертикаль и первоначально ей задаётся какое-то время, например Time[10]. Я продублировал код в OnChartEvent() и в OnCalculate(). Только в OnChartEvent пересчёт сделал по всем барам.

А не лучше ли сделать просто функцию Refresh(), например, с нужными формальными параметрами, и вызывать её при необходимости?

И, кстати, при получении rates_total в индикаторе вне функции OnCalculate() при помощи Bars() с диапазоном дат, можно нарваться на зависание индикатора:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Аналог iBarShift

Nikolai Semko, 2018.04.05 23:47

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

Суть этого бага в том, что если в функции Bars  оба времени start_time и stop_time  находятся внутри одного бара или находятся в будущем (правее нулевого бара), то эта функция подвисает на более чем 10 секунд.

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


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