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

Excepcion por exception_handler nulo para WebSocket #16

Closed fedeturi closed 3 years ago

fedeturi commented 3 years ago

Describe the bug Al enviar una nueva orden, cancelar una orden, o cambiarla, recibo una excepción con el seiguiente mensaje: log:

Starting new HTTPS connection (1): api.remarkets.primary.com.ar:443
. . .
https://api.remarkets.primary.com.ar:443 "GET /rest/order/newSingleOrder?marketId=ROFX&symbol=GGALFeb21&orderQty=1.0&ordType=limit&side=buy&timeInForce=Day&account=REM5018&cancelPrevious=False&price=121.35 HTTP/1.1" 200 None
. . .
error from callback <bound method WebSocketClient.on_message of <pyRofex.clients.websocket_rfx.WebSocketClient object at 0x0000013F98581CA0>>: 'NoneType' object is not callable

Lo extraño es que no es por algun error en los parametros porque las ordenes se encaminan correctamente al mercado, se cambian y se cancelan como corresponde tambien. Y ya venia usando el desarrollo sin que esto ocurriera, por lo que podria descartar una excepcion no manejada por nuestro desarrollo.

El mensaje que se imprime en consola es el siguiente:

  File "C:\ProgramData\Anaconda3\lib\site-packages\websocket\_app.py", line 344, in _callback
    callback(*args)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pyRofex\clients\websocket_rfx.py", line 175, in on_message
    self.on_exception(e)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pyRofex\clients\websocket_rfx.py", line 192, in on_exception
    self.exception_handler(exception)

Al evaluar el codigo de la libreria entiendo que es porque el exception_handler del WebSocket no esta correctamente inicializado, pero revise las definiciones y no encuentro un error, e insisto en que esta tal cual estaba antes que no aparecia esa excepcion.

Inicializacion del entorno 1. Definicion de mi propio exception_handler()

    def exception_handler(self, exc_message):
        """
        Handles Exception Messages received from server.

        :param exc_message: Message received. Comes as a JSON.
        :type exc_message: dict
        """
        error_msg = f"\033[0;30;47mERROR: EXCEPTION OCCURED\nCheck log file " \
                    "for detailed error message.\033[1;37;40m"
        print(error_msg)

        logging.debug(f'EXCEPTION Handler: Received {exc_message.message}')

2. Conexion y seteo de handlers propios

            # Initialize Environment
            pyRofex.initialize(user=user,
                               password=password,
                               account=account,
                               environment=environment)

            # Initialize WebSocket Connection with Handlers

            pyRofex.init_websocket_connection(market_data_handler=self.market_data_handler,
                                              order_report_handler=self.order_report_handler,
                                              error_handler=self.error_handler,
                                              exception_handler=self.exception_handler)

3. Envio de ordenes

def place_order(ticker, side, price, qty):
             order = pyRofex.send_order(ticker=ticker,
                                       side=side,
                                       size=qty,
                                       price=price,
                                       order_type=pyRofex.OrderType.LIMIT,
                                       cancel_previous=replace)

            if order.get('status') == 'OK':
                client_order_id = int(order.get('order').get('clientId'))
            else:
                client_order_id = 0

            side_str = 'sell' if side == pyRofex.Side.SELL else 'buy'

            return client_order_id

Todos funcionan correctamente, por lo que estoy un poco desorientado para encontrar en que momento se produce dicha excepcion.

matiasrivera commented 3 years ago

Proba seteando tu propio exception handler

pyRofex.set_websocket_exception_handler(self.onException,pyRofex.Environment.REMARKETS)

Asi podes ver que error está sucediendo.

fedeturi commented 3 years ago

@matiasrivera Gracias por la sugerencia. Funciono para mi, pero me llama la atencion que antes no recibia esa excepcion usandolo de la otra forma.

Sigo viendo una excepcion que idnica que alguno de los parametros que paso a la hora de colocar una orden es NoneType, pero no logroidentificar cual.

2021-01-29 16:49:42,480-Thread-3-ORHandler Exception: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

fzanuso commented 3 years ago

Fede, ahí encontré el problema, es algo que se me paso. Primero, no se esta seteando correctamente el exception handler y al momento de ocurrir la exception intenta llamar a la función que no existe, por eso salta el error: 'NoneType' object is not callable

Aunque también me fije que no estoy validando que el exception handler exista, es decir, si no se lo seteas no tendria que intentar llamar a la funcion.

En fin, subo el fix en estos dias y cierro el issue.

Saludos y gracias!.

fzanuso commented 3 years ago

Fix en la versión 0.3.2

Igualmente cualquier cosa que falle me avisas.