Suscripción a los cambios en el libro de órdenes

La API de Python incluye tres funciones para trabajar con el libro de órdenes.

bool market_book_add(symbol)

La función market_book_add se suscribe para recibir eventos sobre cambios en el libro de órdenes para el símbolo especificado. El nombre del instrumento financiero requerido se indica en un único parámetro sin nombre.

La función devuelve una indicación booleana de éxito.

La función es un análogo de MarketBookAdd. Una vez finalizado el trabajo con el libro de órdenes, la suscripción debe cancelarse llamando a market_book_release (véase más adelante).

tuple[] market_book_get(symbol)

La función market_book_get solicita el contenido actual del libro de órdenes para el símbolo especificado. El resultado se devuelve como una tupla (array) de registros BookInfo. Cada entrada es un análogo de la estructura MqlBookInfo, y desde el punto de vista de Python, se trata de una tupla con nombre con los campos «type», «price», «volume», «volume_real». En caso de error, se devuelve el valor None.

Tenga en cuenta que, por alguna razón, en Python el campo se llama volume_dbl, aunque en MQL5 el campo correspondiente se llama volume_real.

Para trabajar con esta función, primero debe suscribirse para recibir eventos del libro de órdenes mediante la función market_book_add.

La función es un análogo de MarketBookGet. Tenga en cuenta que un script de Python no puede recibir eventos de OnBookEvent directamente y debe sondear el contenido del cristal en un bucle.

bool market_book_release(symbol)

La función market_book_release cancela la suscripción a eventos de cambio de libro de órdenes para el símbolo especificado. Si tiene éxito, la función devuelve True. La función es un análogo de MarketBookRelease.

Tomemos un ejemplo sencillo (véase MQL5/Scripts/MQL5Book/Python/eurusdbook.py).

import MetaTrader5 as mt5
import time               # connect a pack for the pause
   
# let's establish a connection to the MetaTrader 5 terminal
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   mt5.shutdown()
   quit()
   
# subscribe to receive DOM updates for the EURUSD symbol
if mt5.market_book_add('EURUSD'):
   # run 10 times a loop to read data from the order book
   for i in range(10):
      # get the contents of the order book
      items = mt5.market_book_get('EURUSD')
      # display the entire order book in one line as is
      print(items)
      # now display each price level separately in the form of a dictionary, for clarity
      for it in items or []:
         print(it._asdict())
      # let's pause for 5 seconds before the next request for data from the order book
      time.sleep(5
   # unsubscribe to order book changes
   mt5.market_book_release('EURUSD')
else:
   print("mt5.market_book_add('EURUSD') failed, error code =", mt5.last_error())
   
# complete the connection to the MetaTrader 5 terminal
mt5.shutdown()

He aquí un ejemplo del resultado:

(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}

...