Ошибки, баги, вопросы - страница 1547

 
Комбинатор:
Теперь внимание вопрос -- как заставить терминал тотчас же перерисовать данные которые были рассчитаны таким образом?

У него рисует данные из буферов, которые находятся не в OnCalculate

в  OnCalculate минимальное время отрисоки 1 минута

Тиковые индикаторы рисуют каждый тик

 
comp:
Похоже, никак.

Хотя, в четверке ChartRedraw 100% сделает то, что надо.

Да и в пятерке, как оказалось, нормально.

Так что ChartRedraw в обеих платформах отработает норм. 

 

Когда приходит CHARTEVENT_CHART_CHANGE, делаю расчет, длящийся иногда секунду/другую. Если во время расчета, например, подвинуть чарт, то после расчета будет вызван из очереди снова CHARTEVENT_CHART_CHANGE.

А можно ли во время расчета узнать, что в событийной очереди что-то имеется? Тогда бы мог не делать уже не актуальный расчет, прерывать его и начинать новый расчет?

Например, если даже в очень тяжелую расчетную часть запихнуть всюду проверку на IsStopped(), то закрытие советника будет происходить мгновенно - не дожидаясь расчета.

Вот бы что-то подобное, но не с событие закрытия, а с ChartEvent. 

 
comp:

Когда приходит CHARTEVENT_CHART_CHANGE, делаю расчет, длящийся иногда секунду/другую. Если во время расчета, например, подвинуть чарт, то после расчета будет вызван из очереди снова CHARTEVENT_CHART_CHANGE.

А можно ли во время расчета узнать, что в событийной очереди что-то имеется? Тогда бы мог не делать уже не актуальный расчет, прерывать его и начинать новый расчет?

Например, если даже в очень тяжелую расчетную часть запихнуть всюду проверку на IsStopped(), то закрытие советника будет происходить мгновенно - не дожидаясь расчета.

Вот бы что-то подобное, но не с событие закрытия, а с ChartEvent. 


делать второй поток обработки (в виде ms таймера например)

и именно в нём выполнять расчет, при условии что стоит флаг счётчик==XXX, инкрементированный при CHARTEVENT_CHART_CHANGE.

таким образом вы очень быстро выгребаете всю очередь ChartEvent, ставите флаг, а паралелльно с этим таймер этот флаг дергает и расчитывает.

---

При этом в этом же таймере проверять значение флага-счётчика. Можно оборвать расчёт при текущем значении счётчика больше чем то значение, при котором начинали расчёт.  То есть такой себе IsNewChanged

 
o_O:

таким образом вы очень быстро выгребаете всю очередь ChartEvent, ставите флаг, а паралелльно с этим таймер этот флаг дергает и расчитывает.

Вы хотите сказать, что события ChartEvent и Timer выполняются параллельно?
 

В Сервисдеске сделали такое заявление

SetIndexBuffer делается однократно на вызове OnInit

Кто-нибудь использует SetIndexBuffer не в OnInit и/или неоднократно? В MT4 использую постоянно. В MT5 этого сделать нельзя, к огромному сожалению.

 
comp:
Вы хотите сказать, что события ChartEvent и Timer выполняются параллельно?

даже если они выполняются последовательно - вам не мешает пользоваться хотя бы этим.

вы моментально забираете весь ChartEvent и ставите только один приказ.

---

про параллельность таймера и чартовых событий вопрос уместный.

Спросите в сервисдеске.

 
o_O:

даже если они выполняются последовательно - вам не мешает пользоваться хотя бы этим.

вы моментально забираете весь ChartEvent и ставите только один приказ.

---

про параллельность таймера и чартовых событий вопрос уместный.

Спросите в сервисдеске.

Никто не читает документацию...

Клиентский терминал отсылает возникающие события в соответствующие открытые графики. Также события могут генерироваться графиками (события графика) либо mql5-программами (пользовательские события).  Генерацию событий создания и удаления графических объектов на графике можно включать и отключать заданием свойств графика CHART_EVENT_OBJECT_CREATE и CHART_EVENT_OBJECT_DELETE. Каждая mql5-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события.

Программа получает события только от графика, на котором она запущена. Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql5-программы не ставится. Аналогично, если в очереди mql5-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь. Обработка событий таймера производится по такой же схеме – если в очереди находится или уже обрабатывается событие Timer, то новое событие таймера не ставится в очередь.

 
Slawa:

Никто не читает документацию...

Тогда прерывание расчета по событию не сделать.
 
Slawa:

Никто не читает документацию...

давно это было

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