Обсуждение статьи "Рецепты MQL5 - Пишем свой стакан цен"

 

Опубликована статья Рецепты MQL5 - Пишем свой стакан цен:

Эта статья научит читателей программно работать со стаканом цен, а также подробно опишет принципы работы класса CMarketBook, который органично расширит стандартную библиотеку классов MQL5 и предоставит удобные методы для работы со стаканом.

Язык MQL5 постоянно развивается и с каждым годом предоставляет все больше возможностей для работы с биржевой информацией. Одним из таких биржевых типов данных является информация о биржевом стакане цен. Это специальная таблица, показывающая ценовые уровни и объемы лимитных заявок. MetaTrader 5 имеет встроенный стакан цен для отображения лимитных заявок, однако этого не всегда бывает достаточно. В первую очередь необходимо дать простой и удобный доступ к стакану цен своему торговому эксперту. Конечно, в языке MQL5 есть несколько специальных функций для работы с этим типом информации, но все эти функции достаточно низкоуровневые и требуют дополнительных математических расчетов.

Тем не менее, всех промежуточных расчетов можно избежать. Все что для этого нужно, это один раз написать специальный класс для работы со стаканом цен. Все сложные расчеты будут производиться внутри него, а сам класс будет предоставлять удобные методы для работы с ценами и уровнями стакана. Благодаря этому классу будет достаточно просто создать эффектную панель в виде индикатора, которая будет быстро отображать текущее состояние цен в стакане:


Рис. 1. Биржевой стакан цен в виде панели

Из первой главы данной статьи будет ясно, что штатный стакан цен, предоставляемый MetaTrader 5, обладает внушительными возможностями. Мы не будем пытаться дублировать все эти многочисленные возможности в своем индикаторе, наша задача будет иной. На практическом примере создания удобной торговой панели — стакана цен — мы покажем, что принципы объектно-ориентированного программирования позволяют достаточно легко оперировать сложными структурами данными. Мы убедимся в том, что с помощью MQL5 не представляет трудностей получить доступ к стакану цен прямо из своего эксперта и, как следствие, визуализировать его представление так, как будет удобно нам.

Автор: Vasiliy Sokolov

 
Долго читал, но не понял зачем всё это?
 
Михаил:
Долго читал, но не понял зачем всё это?

Имхо, хотя бы для того, чтобы иметь готовый класс (по типу Стандартной библиотеки) для анализа текущей ликвидности по инструменту.

Василий молодец! Высокий уровень кода и системный подход. Так держать!

 
Михаил:
Долго читал, но не понял зачем всё это?
Dennis Kirichenko:

Имхо, хотя бы для того, чтобы иметь готовый класс (по типу Стандартной библиотеки) для анализа текущей ликвидности по инструменту.

Василий молодец! Высокий уровень кода и системный подход. Так держать!

Именно так. Задача моих "Рецептов MQL" расширить стандартную библиотеку MQL новыми нетривиальными классами, делающую работу трейдера более удобной.

Что касается стакана цен, то здесь критически важно дать максимально эффективный механизм доступа к данным Level II. Это именно тот случай, когда работа через класс-посредник может быть гораздо быстрее (и конечно удобней) полного перебора стакана на каждом OnBookEvent. Алгоритмы заложенные в класс стакана цен, не просто так писаны.

 
Vasiliy Sokolov:

Именно так. Задача моих "Рецептов MQL" расширить стандартную библиотеку MQL новыми нетривиальными классами, делающую работу трейдера более удобной.

Что касается стакана цен, то здесь критически важно дать максимально эффективный механизм доступа к данным Level II. Это именно тот случай, когда работа через класс-посредник может быть гораздо быстрее (и конечно удобней) полного перебора стакана на каждом OnBookEvent. Алгоритмы заложенные в класс стакана цен, не просто так писаны.

 
полезная иформация для торговли в стакане! хорошо что есть единомышленники в этом вопросе )
 
Михаил:

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

А еще Вы кажется обещали написать свою статью о том, как необходимо использовать событийную модель в MetaTrader5. Хотелось бы ее наконец прочитать.

 
Vasiliy Sokolov:

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

А еще Вы кажется обещали написать свою статью о том, как необходимо использовать событийную модель в MetaTrader5. Хотелось бы ее наконец прочитать.

Статью не выпустили (мала по размеру, в отличии от Вашей), а прочитать можно в моём Блоге.

P/S В соседней ветке и читайте о напралении... 

Кстати, замечание по статье.

Так, как Вы написали делать нельзя:

//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
//---
   printf("Стакан цен по " + symbol +  " изменен"); 
  }

 Потому что событие BookEvent - широковещательное.

И как только Вы подписались на на получение его, то Вам в OnBookEvent() "посыпется" всё,

что у Вас открыто в Обзоре рынка.

Поэтому нужно фильтровать событие именно для выбранного символа:

//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
//---
    if ( symbol == _Symbol )
    { 
      printf("Стакан цен по " + symbol +  " изменен");
    } 
  }
 
Михаил:

Статью не выпустили (мала по размеру, в отличии от Вашей), а прочитать можно в моём Блоге.

P/S В соседней ветке и читайте о напралении... 

Кстати, замечание по статье.

Так, как Вы написали делать нельзя:

 Потому что событие BookEvent - широковещательное.

И как только Вы подписались на на получение его, то Вам в OnBookEvent() "посыпется" всё,

что у Вас открыто в Обзоре рынка.

Поэтому нужно фильтровать событие именно для выбранного символа:

Михаил, из документации:

MarketBookAdd

Обеспечивает открытие стакана цен по указанному инструменту, а также производит подписку на получение извещений об изменении указанного стакана.

bool  MarketBookAdd(
   string  symbol      // символ
   );

 Т.е. разработчики для того и ввели MarketBookAdd, что бы OnBookEvent вызывался только при изменении стакана заранее установленных символов в MarketBookAdd. Таким образом, ничего кроме заранее требуемых символов в OnBookEvent не попадет.

 

Читайте OnBookEvent()

В отличие от других событий, событие BookEvent является широковещательным.
Это означает, что достаточно одному эксперту подписаться на получение события BookEvent с помощью функции MarketBookAdd,
все остальные эксперты, имеющие обработчик OnBookEvent(), будут получать это событие.
Поэтому необходимо анализировать имя символа, которое передается в обработчик в качестве параметра const string& symbol.
 
Извиняюсь, но скачал архив к статье и самого класса там не обнаружил
Причина обращения: