es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

IB_insync – Error de Sanic después de una orden exitosa que impide realizar más órdenes.

Estoy escribiendo una API utilizando ib_insync, Sanic y ngrok para redirigir señales de webhook desde Tradingview a Interactive Brokers. Funciona solo en el primer intento y se produce el siguiente error que impide realizar más órdenes:

[ERROR] Se produjo una excepción al manejar la URI:
‘http://url.ngrok.io/webhook’ Traceback (the most recent call last): File “handle_request”, línea 103, en handle_request
“, sanic.exceptions.ServerError: tipo de respuesta no válido Ninguno (se necesita HTTPResponse)

El código es el siguiente:

“`
from datetime import datetime
from sanic import Sanic<br>
from sanic import response
from ib_insync import *

<h1>Crea el objeto Sanic</h1>

app = Sanic(<strong>nombre</strong>)
app.ib = None

<h1>Crea la raíz</h1>

@app.route('/')
async def root(request):
return response.text('en línea')

<h1>Escucha las señales y ejecuta las órdenes</h1>

@app.route('/webhook', methods=['POST'])
async def webhook(request):
if request.method == 'POST':
await checkIfReconnect()
#Analiza los datos de la alerta
alerta = request.json
orden = MarketOrder(alerta['action'],alerta['quantity'],account=app.ib.wrapper.accounts[0])
#Envía la orden de mercado
contrato_accion = Stock('NVDA','SMART','USD')
app.ib.placeOrder(contrato_accion,orden)

<h1>Reconecta si es necesario</h1>

async def checkIfReconnect():
if not app.ib.isConnected() or not app.ib.client.isConnected():
app.ib.disconnect()
app.ib = IB()
app.ib.connect('127.0.0.1',7496,clientId=1)

<h1>Arranca la aplicación</h1>

if <strong>nombre</strong> == '<strong>main</strong>':
#Conectarse a IB
app.ib = IB()
app.ib.connect('127.0.0.1',7496,clientId=1)
app.run(port=5000)
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema con el código proporcionado

    El código proporcionado está creando una API utilizando Sanic, ib_insync y ngrok para reenviar señales de webhook desde Tradingview a Interactive Brokers. Sin embargo, el problema con el código es que solo funciona en el primer intento y muestra el siguiente error, impidiendo cualquier orden adicional:

    [ERROR] Se produjo una excepción al manejar la URI: 'http://url.ngrok.io/webhook' 
    Traceback (most recent call last): 
    File "handle_request", line 103, in handle_request "_future_listeners", sanic.exceptions.ServerError: Tipo de respuesta no válido: None (se necesita un HTTPResponse)
    

    Explicación

    El error sugiere que la causa raíz del problema es el objeto response devuelto por la función webhook. En el código proporcionado, la función webhook se utiliza para analizar las señales de alerta de Tradingview y realizar órdenes de mercado en función de la señal recibida. Sin embargo, la función no está devolviendo ninguna respuesta, lo que provoca el error “Invalid response type None”.

    Solución

    Para solucionar el problema, la función webhook debe devolver un objeto HTTPResponse. Podemos modificar la función para que devuelva un objeto de respuesta de éxito después de realizar la orden.

    # Escuchar señales y ejecutar órdenes
    @app.route('/webhook', methods=['POST'])
    async def webhook(request):
        if request.method == 'POST':
            await checkIfReconnect()
            # Analizar datos de alerta
            alerta = request.json
            orden = MarketOrder(alerta['action'], alerta['quantity'], account=app.ib.wrapper.accounts[0])
            # Enviar orden de mercado
            contrato_acciones = Stock('NVDA', 'SMART', 'USD')
            app.ib.placeOrder(contrato_acciones, orden)
    
            # Devolver respuesta de éxito
            return response.json({'status': 'success'})
    

    Esto asegurará que cada vez que se active la función webhook, devolverá un objeto HTTPResponse y no causará más errores.

Comments are closed.