Подписка на стакан цен

Python API включает 3 функции для работы со стаканом цен.

bool market_book_add(symbol)

Функция market_book_add производит подписку на получение событий об изменениях в стакане по указанному символу. Имя требуемого финансового инструмента указывается в единственном неименованном параметре.

Функция возвращает логический признак успешного выполнения.

Функция является аналогом MarketBookAdd. После завершения работы со стаканом, подписку следует отменить вызовом market_book_release (см. далее).

tuple[] market_book_get(symbol)

Функция market_book_get запрашивает текущее содержимое стакана цен для указанного символа. Результат возвращается в виде кортежа (массива) записей BookInfo. Каждая запись является аналогом структуры MqlBookInfo, а с точки зрения Python — это именованный кортеж с полями "type", "price", "volume", "volume_real". В случае ошибки возвращается значение None.

Обратите внимание: по каким-то причинам в Python поле называется volume_dbl, хотя в MQL5 соответствующее поле называется volume_real.

Для работы с этой функцией требуется предварительно подписаться на получение событий в стакане цен с помощью функции market_book_add.

Функция является аналогом MarketBookGet. Обратите внимание, что скрипт Python не может получать события OnBookEvent напрямую и должен опрашивать содержимое стакана в цикле.

bool market_book_release(symbol)

Функция market_book_release отменяет подписку на получение событий об изменениях в стакане по указанному символу. В случае успешного выполнения функция возвращает True. Функция является аналогом MarketBookRelease.

Приведем простой пример (см. MQL5/Scripts/MQL5Book/Python/eurusdbook.py).

import MetaTrader5 as mt5
import time               # подключаем пакет для паузы
   
# установим подключение к терминалу MetaTrader 5
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   mt5.shutdown()
   quit()
   
# подпишемся на получение обновлений стакана по символу EURUSD
if mt5.market_book_add('EURUSD'):
   # запустим 10 раз цикл для чтения данных из стакана
   for i in range(10):
      # получим содержимое стакана
      items = mt5.market_book_get('EURUSD')
      # выведем весь стакан одной строкой как есть
      print(items)
      # теперь выведем каждый ценовой уровень отдельно в виде словаря, для наглядности
      for it in items or []:
         print(it._asdict())
      # сделаем паузу в 5 секунд перед следующим запросом данных из стакана
      time.sleep(5
   # отменим подписку на изменения стакана
   mt5.market_book_release('EURUSD')
else:
   print("mt5.market_book_add('EURUSD') failed, error code =", mt5.last_error())
   
# завершим подключение к терминалу MetaTrader 5
mt5.shutdown()

Пример результата:

(BookInfo(type=1, price=1.20036, volume=250, volume_dbl=250.0), BookInfo(type=1, price=1.20029, volume=100, volume...

{'type': 1, 'price': 1.20036, 'volume': 250, 'volume_dbl': 250.0}

{'type': 1, 'price': 1.20029, 'volume': 100, 'volume_dbl': 100.0}

{'type': 1, 'price': 1.20028, 'volume': 50, 'volume_dbl': 50.0}

{'type': 1, 'price': 1.20026, 'volume': 36, 'volume_dbl': 36.0}

{'type': 2, 'price': 1.20023, 'volume': 36, 'volume_dbl': 36.0}

{'type': 2, 'price': 1.20022, 'volume': 50, 'volume_dbl': 50.0}

{'type': 2, 'price': 1.20021, 'volume': 100, 'volume_dbl': 100.0}

{'type': 2, 'price': 1.20014, 'volume': 250, 'volume_dbl': 250.0}

(BookInfo(type=1, price=1.20035, volume=250, volume_dbl=250.0), BookInfo(type=1, price=1.20029, volume=100, volume...

{'type': 1, 'price': 1.20035, 'volume': 250, 'volume_dbl': 250.0}

{'type': 1, 'price': 1.20029, 'volume': 100, 'volume_dbl': 100.0}

{'type': 1, 'price': 1.20027, 'volume': 50, 'volume_dbl': 50.0}

{'type': 1, 'price': 1.20025, 'volume': 36, 'volume_dbl': 36.0}

{'type': 2, 'price': 1.20023, 'volume': 36, 'volume_dbl': 36.0}

{'type': 2, 'price': 1.20022, 'volume': 50, 'volume_dbl': 50.0}

{'type': 2, 'price': 1.20021, 'volume': 100, 'volume_dbl': 100.0}

{'type': 2, 'price': 1.20014, 'volume': 250, 'volume_dbl': 250.0}

(BookInfo(type=1, price=1.20037, volume=250, volume_dbl=250.0), BookInfo(type=1, price=1.20031, volume=100, volume...

{'type': 1, 'price': 1.20037, 'volume': 250, 'volume_dbl': 250.0}

{'type': 1, 'price': 1.20031, 'volume': 100, 'volume_dbl': 100.0}

{'type': 1, 'price': 1.2003, 'volume': 50, 'volume_dbl': 50.0}

{'type': 1, 'price': 1.20028, 'volume': 36, 'volume_dbl': 36.0}

{'type': 2, 'price': 1.20025, 'volume': 36, 'volume_dbl': 36.0}

{'type': 2, 'price': 1.20023, 'volume': 50, 'volume_dbl': 50.0}

{'type': 2, 'price': 1.20022, 'volume': 100, 'volume_dbl': 100.0}

{'type': 2, 'price': 1.20016, 'volume': 250, 'volume_dbl': 250.0}

...