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)
“`
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:
Explicación
El error sugiere que la causa raíz del problema es el objeto
response
devuelto por la funciónwebhook
. En el código proporcionado, la funciónwebhook
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 objetoHTTPResponse
. Podemos modificar la función para que devuelva un objeto de respuesta de éxito después de realizar la orden.Esto asegurará que cada vez que se active la función
webhook
, devolverá un objetoHTTPResponse
y no causará más errores.