Ошибки, баги, вопросы - страница 1547
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Теперь внимание вопрос -- как заставить терминал тотчас же перерисовать данные которые были рассчитаны таким образом?
У него рисует данные из буферов, которые находятся не в OnCalculate
в OnCalculate минимальное время отрисоки 1 минута
Тиковые индикаторы рисуют каждый тик
Похоже, никак.
Хотя, в четверке ChartRedraw 100% сделает то, что надо.
Да и в пятерке, как оказалось, нормально.
Так что ChartRedraw в обеих платформах отработает норм.
Когда приходит CHARTEVENT_CHART_CHANGE, делаю расчет, длящийся иногда секунду/другую. Если во время расчета, например, подвинуть чарт, то после расчета будет вызван из очереди снова CHARTEVENT_CHART_CHANGE.
А можно ли во время расчета узнать, что в событийной очереди что-то имеется? Тогда бы мог не делать уже не актуальный расчет, прерывать его и начинать новый расчет?
Например, если даже в очень тяжелую расчетную часть запихнуть всюду проверку на IsStopped(), то закрытие советника будет происходить мгновенно - не дожидаясь расчета.
Вот бы что-то подобное, но не с событие закрытия, а с ChartEvent.
Когда приходит 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, то новое событие таймера не ставится в очередь.
Никто не читает документацию...
Никто не читает документацию...
давно это было