Ошибки, баги, вопросы - страница 1547
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Когда приходит CHARTEVENT_CHART_CHANGE, делаю расчет, длящийся иногда секунду/другую. Если во время расчета, например, подвинуть чарт, то после расчета будет вызван из очереди снова CHARTEVENT_CHART_CHANGE.
А можно ли во время расчета узнать, что в событийной очереди что-то имеется? Тогда бы мог не делать уже не актуальный расчет, прерывать его и начинать новый расчет?
Например, если даже в очень тяжелую расчетную часть запихнуть всюду проверку на IsStopped(), то закрытие советника будет происходить мгновенно - не дожидаясь расчета.
Вот бы что-то подобное, но не с событие закрытия, а с ChartEvent.
делать второй поток обработки (в виде ms таймера например)
и именно в нём выполнять расчет, при условии что стоит флаг счётчик==XXX, инкрементированный при CHARTEVENT_CHART_CHANGE.
таким образом вы очень быстро выгребаете всю очередь ChartEvent, ставите флаг, а паралелльно с этим таймер этот флаг дергает и расчитывает.
---
При этом в этом же таймере проверять значение флага-счётчика. Можно оборвать расчёт при текущем значении счётчика больше чем то значение, при котором начинали расчёт. То есть такой себе IsNewChanged
таким образом вы очень быстро выгребаете всю очередь ChartEvent, ставите флаг, а паралелльно с этим таймер этот флаг дергает и расчитывает.
В Сервисдеске сделали такое заявление
SetIndexBuffer делается однократно на вызове OnInit
Кто-нибудь использует SetIndexBuffer не в OnInit и/или неоднократно? В MT4 использую постоянно. В MT5 этого сделать нельзя, к огромному сожалению.
Вы хотите сказать, что события ChartEvent и Timer выполняются параллельно?
даже если они выполняются последовательно - вам не мешает пользоваться хотя бы этим.
вы моментально забираете весь ChartEvent и ставите только один приказ.
---
про параллельность таймера и чартовых событий вопрос уместный.
Спросите в сервисдеске.
даже если они выполняются последовательно - вам не мешает пользоваться хотя бы этим.
вы моментально забираете весь ChartEvent и ставите только один приказ.
---
про параллельность таймера и чартовых событий вопрос уместный.
Спросите в сервисдеске.
Никто не читает документацию...
Клиентский терминал отсылает возникающие события в соответствующие открытые графики. Также события могут генерироваться графиками (события графика) либо mql5-программами (пользовательские события). Генерацию событий создания и удаления графических объектов на графике можно включать и отключать заданием свойств графика CHART_EVENT_OBJECT_CREATE и CHART_EVENT_OBJECT_DELETE. Каждая mql5-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события.
Программа получает события только от графика, на котором она запущена. Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql5-программы не ставится. Аналогично, если в очереди mql5-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь. Обработка событий таймера производится по такой же схеме – если в очереди находится или уже обрабатывается событие Timer, то новое событие таймера не ставится в очередь.
Никто не читает документацию...
Никто не читает документацию...
давно это было
Тогда прерывание расчета по событию не сделать.
ок. смотрите тогда в другую сторону.
Вы можете искусственно запараллелить - поместив второй индикатор на чарт.
И обращаясь к Глобальной переменной GlobalVariableSetOnCondition из обоих.
ок. смотрите тогда в другую сторону.
Вы можете искусственно запараллелить - поместив второй индикатор на чарт.
И обращаясь к Глобальной переменной GlobalVariableSetOnCondition из обоих.
Не понял.
ставите второй индикатор сигнальщик, который посылает вам в основной индикатор события от ЧартЕвент как пользовательское + меняет состояние глобальной переменное например на время в мс
В основном индикаторе отлавливаете это событие и начинаете расчет, + смотрите на глобальную переменную, чтоб в ней время мс было равным тому, с которым вы начали расчет.
Если в ней время поменялось, значит пришло новое событие - и вы обрываете свой текущий расчет.
как то так.
---
Или в сигнальщике просто при каждом чартевенте меняете мс в гп, а в основном лишь контролируете его
вобщем - второй индикатор распараллелит