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

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:

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

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

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

ок. смотрите тогда в другую сторону.

Вы можете искусственно запараллелить - поместив второй индикатор на чарт.

И обращаясь к Глобальной переменной GlobalVariableSetOnCondition из обоих.

[Удален]
o_O:

ок. смотрите тогда в другую сторону.

Вы можете искусственно запараллелить - поместив второй индикатор на чарт.

И обращаясь к Глобальной переменной GlobalVariableSetOnCondition из обоих.

Не понял.
comp:
Не понял.

ставите второй индикатор сигнальщик, который посылает вам в основной индикатор события от ЧартЕвент как пользовательское + меняет состояние глобальной переменное например на время в мс

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

Если в ней время поменялось, значит пришло новое событие - и вы обрываете свой текущий расчет.

как то так.

---

Или в сигнальщике просто при каждом чартевенте меняете мс в гп, а в основном лишь контролируете его

вобщем - второй индикатор распараллелит