matbarofex / pyRofex

Python library to connect with Matba Rofex's Rest and Websocket APIs. Market Data and Order Routing are supported.
MIT License
83 stars 56 forks source link

Inconvenientes al obtener IV de los indices por websocket #8

Closed juliansodo closed 4 years ago

juliansodo commented 4 years ago

Hola qué tal?

Desde LBO se está necesitando conectarse al xOMS mediante pyRofex, la cuestión es que al querer obtener el Entry INDEX VALUE, no están pudiendo, la conexión la hacen a través de websocket, cuyo endpoint es: wss://api.lbo.xoms.com.ar/

Se probó obtener MarketData para distintos instrumentos y fue posible, pero lo único que no están pudiendo traer son el Index Value, el problema es que la consola no muestra nada para este instrumento.

Este es el código resumido luego de hacer la conexión:

def market_data_handler(message):
    MD = "MD Message Received (Last): {} {} @ {} x {}".format(datetime.fromtimestamp(message['timestamp']/1000).strftime('%Y-%m-%d %H:%M:%S'),message['instrumentId']['symbol'], message['marketData']['LA']['price'], message['marketData']['LA']['size'])
    print(message)

def order_report_handler(message):
    print("Order Report Message Received: {0}".format(message))
def error_handler(message):
    print("Error Message Received: {0}".format(message))
def exception_handler(e):
    print("Exception Occurred: {0}".format(e.message))

# Initiate Websocket Connection
pyRofex.init_websocket_connection(market_data_handler=market_data_handler,
                                  order_report_handler=order_report_handler,
                                  error_handler=error_handler,
                                  exception_handler=exception_handler)
inst_rofex = ["I.RFX20"]
instruments = inst_rofex

entries = [
           pyRofex.MarketDataEntry.INDEX_VALUE
           ]

# Subscribes to receive market data messages **
pyRofex.market_data_subscription(tickers=instruments,
                                 entries=entries)

Se probó hacer la conexión directamente con el cliente websocket de la propia API y sí se pudo obtener la información del Index Value con el mismo usuario:

image

Podría deberse a un problema con el conector o directamente con el código?

Gracias!

fzanuso commented 4 years ago

Hola Julián,

Mira por lo que veo en la función que definieron para manejar la MD, no están consultando el entry del indice. Tendrían que probar con algo así:

def market_data_handler(message):
    IndexValue = message['marketData']['IV'] # De esta manera extraen el valor del indice del mensaje
    MD = "MD Message Received (Last): {} {} @ {} x {}".format(datetime.fromtimestamp(message['timestamp']/1000).strftime('%Y-%m-%d %H:%M:%S'),message['instrumentId']['symbol'], message['marketData']['IV']['price'], message['marketData']['LA']['size'])
    print(message)

Decime si les sirve esto, Saludos

chanchiste commented 4 years ago

Hola Franco como estas? Pero estoy imprimiendo en la consola el 'message' nomás, no estoy usando la variable 'MD' ahí.

def market_data_handler(message): MD = "MD Message Received (Last): {} {} @ {} x {}".format(datetime.fromtimestamp(message['timestamp']/1000).strftime('%Y-%m-%d %H:%M:%S'),message['instrumentId']['symbol'], message['marketData']['LA']['price'], message['marketData']['LA']['size']) print(message)

El problema es que veo que directamente no recibo el 'message' del I.RFX20. Del resto de los productos recibo el IV con valor nulo porque no tiene valor, pero no recibo ningún 'message' sobre los indices..

fzanuso commented 4 years ago

Creo que el problema viene porque cuando recibís un mensaje del indice, los campos LA viene en null por lo que al consultar: message['marketData']['LA']['price'] te esta tirando una excepción. Fijate de hacer el print(message) antes de asignar la variable MD.

chanchiste commented 4 years ago

Franco, Excelente, ese era el problema. Muchas gracias por tu respuesta. Saludos!

fzanuso commented 4 years ago

Perfecto! Cierro el issue entonces. Saludos!