Скачать MetaTrader 5

Обсуждение статьи "Рецепты MQL5 - обработка события BookEvent"

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пиши роботов на заказ. Зарабатывай с сервисом Фриланс!
MetaQuotes Software Corp.
Модератор
181080
MetaQuotes Software Corp. 2014.10.17 17:02 

Опубликована статья Рецепты MQL5 - обработка события BookEvent:

В статье рассматриваются событие стакана BookEvent и принцип его обработки. В качестве примера создается MQL5-программа, обрабатывающая состояния стакана. Используется объектно-ориентированный подход. Результаты обработки выводятся на экран в виде панели и уровней стакана.

Торговый терминал MetaTrader 5, как известно, - это мультирыночная платформа. С ее помощью можно торговать на рынках: Форекс (Forex), фондовые рынки (биржи), Фьючерсы и Контракты на разницу. Судя по заказам в разделе Фриланс, доля трейдеров, которые торгуют не только на Форексе, растет.

В своей статье я хотел бы познакомить начинающего MQL5-программиста с обработчиком события BookEvent. Это событие связано с биржевым стаканом, который скорее является инструментом трейдера, торгующего фондовыми активами и производными на них. Однако для Forex-трейдеров стакан тоже может оказаться полезным. Сейчас все большую популярность набирают так называемые ECN-счета, где поставщики ликвидности предоставляют информацию по заявкам, пускай и в рамках только своей модели агрегатора.


1. Событие BookEvent

Согласно Документации данное событие появляется при изменении состояния стакана цен. Условимся, что событие BookEvent – это "событие стакана".

Сам стакан – это массив заявок, которые отличаются направлением (sell и buy), ценой и объемом. Цены в стакане распределены возле рыночных, поэтому считаются лучшими.

Рис.1 Стакан цен в MetaTrader 5

Рис.1 Стакан цен в MetaTrader 5

В MetaTrader 5 стакан называется «Стакан цен» (рис.1). Более подробно о стакане цен можно почитать в Руководстве пользователя клиентского терминала.

Автор: Dennis Kirichenko

Alain Verleyen
Модератор
30724
Alain Verleyen 2014.10.22 18:26  

Спасибо за эту статью.

Немного об ошибке:

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

Это не правда, индикатор может обрабатывать OnBookEvent тоже.

Dennis Kirichenko
11317
Dennis Kirichenko 2014.10.22 18:41  

angevoyageur:

Немного об ошибке:

Это не правда, индикатор может обрабатывать OnBookEvent тоже.

Alain, спасибо за сообщение. Да, точно, я не прав. В индикаторах тоже работает... понадеялся на список обработчиков при создании индикатора, среди которых нет OnBookEvent().

А самое главное, что Документация гласит:

Функция OnBookEvent() является обработчиком  события BookEvent. Событие BookEvent генерируется только для экспертов при изменении состояния стакана цен (Depth of Market).


Alain Verleyen
Модератор
30724
Alain Verleyen 2014.10.23 10:46  
denkir :

Alain, спасибо за сообщение. Да, точно, я не прав. В индикаторах тоже работает... понадеялся на список обработчиков при создании индикатора , среди которых нет OnBookEvent().

А самое главное, что Документация гласит:

Право, документация должна быть исправлена. Вы пишите ServiceDesk по этому поводу?
Dennis Kirichenko
11317
Dennis Kirichenko 2014.10.23 10:57  
angevoyageur:
Право, документация должна быть исправлена. Вы пишите ServiceDesk по этому поводу?
Нет, пока не написал... сделаю и внесу изменения в материал статьи...
Serhiy Dotsenko
919
Serhiy Dotsenko 2014.12.05 14:34  

добрый день, спасибо за статью, очень полезная!

такое вопрос, допустим я обрабатываю событие BookEvent, и своём обработчике буду удалять, выставлять ордера, которые в свою очередь снова инициируют это событие..... то в тот момент когда отработает срока выставления (удаления заявки) и снова образуется новое событие BookEvent, то моя самая начальная процедура прервётся? т.к. замечал что выполнение кода до конца не доходит... не всё выполняется ... надеюсь понятно изложил мысль )) 

Dennis Kirichenko
11317
Dennis Kirichenko 2014.12.05 14:56  
thejobber:

добрый день, спасибо за статью, очень полезная!

такое вопрос, допустим я обрабатываю событие BookEvent, и своём обработчике буду удалять, выставлять ордера, которые в свою очередь снова инициируют это событие..... то в тот момент когда отработает срока выставления (удаления заявки) и снова образуется новое событие BookEvent, то моя самая начальная процедура прервётся? т.к. замечал что выполнение кода до конца не доходит... не всё выполняется ... надеюсь понятно изложил мысль )) 

Спасибо за мнение!

Нет, пока обрабатывается одно событие, управление программой не переходит автоматом к другому обработчику при генерировании нового события... это можно проверить с помощью функции Print() ( и лучше добавить паузу Sleep()).

Есть такое понятие, как "очередь событий".

Согласно Документации:

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

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

Serhiy Dotsenko
919
Serhiy Dotsenko 2014.12.06 10:08  

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

значит всё таки мои опасения не лишены оснований ))  написал спредера для фьючерса на usd\rub что бы всё время лучшими ценами в стакане стоять... то там точно будет переполнение очереди, т.к. там за секунду стакан обновляется оооч. много раз и это без того что я ещё туда что-то ставлю, удаляю... а со мной точно не будет успевать..... и это только демо... а на реале там стакан вообще бешаный ))

спасибо что направили мысли в нужное русло )

Pavel Trofimov
1466
Pavel Trofimov 2015.02.16 14:10  

Доброго времени суток. Очень познавательная статья. У меня по ходу нее такой вопрос.

Стоит задача фильтрации сделок совершенных по инструменту в соответствии с типом заявок, которыми они совершены (рыночная/лимитированная).

Как связать события OnBookEvent и события OnTick, чтобы можно было решить указанную задачу, т.е как можно определить какие типы заявок участвовали в сделке? Только средствами OnBookEvent на сколько я понял, такую задачу не решить.

Dennis Kirichenko
11317
Dennis Kirichenko 2015.02.16 14:28  

Rubick:

...Как связать события OnBookEvent и события OnTick, чтобы можно было решить указанную задачу, т.е как можно определить какие типы заявок участвовали в сделке? Только средствами OnBookEvent на сколько я понял, такую задачу не решить.

Скорее всего Вам не стакан нужен, а обработчик рыночных операций. Здесь более подробно.
Pavel Trofimov
1466
Pavel Trofimov 2015.02.17 05:19  
denkir:
Скорее всего Вам не стакан нужен, а обработчик рыночных операций. Здесь более подробно.
Огромное спасибо!
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий