webhookstradingview-apingrokinteractive-brokers

Error trying to connect Trading View's alerts webhook to Interactive Brokers via Python code, localhost and Ngrok


I'm trying to find some easy setup to send trades from TradingView's alerts into Interactive Brokers. I have set up a local host, I have ngrok running, and I have created the code below by watching some YTB video. I have also added the URL for webhook in the alerts in Trading View. The problem is that every time there is an alert, I get a 500 internal server error message in ngrok. And the trades do not execute.

**This is the code I've tried: **

`#imports
from datetime import datetime
from sanic import Sanic
from sanic import response
from ib_insync import *

#Create Sanic object called qpp
app = Sanic(__name__)
#app.ib = None
app.ctx.ib = None

#Create root / homepage
@app.route('/')
async def root(request):
return response.text('online')

#Listen for signals and submit BUY orders (webhook)
@app.route('/buy', methods=[ 'POST' ]) 
async def buy(request):
if request.method == 'POST':
#Check if we need to reconnect
await checkIfReconnect()
#Parse signal data
data = request.jason
order = MarketOrder('BUY', 0.00015)
contract = Crypto('BTC', 'PAXOS', 'USD')
trade = app.ib.placeOrder(contract,order)
#Wait for the order to be processed and check status
app.ctx.ib.sleep(1)
print(trade)

#Listen for signals and submit SELL orders (webhook)
@app.route('/sell', methods=[ 'POST' ]) 
async def sell(request):
if request.method == 'POST':
#Check if we need to reconnect
await checkIfReconnect()
#Parse signal data
data = request.jason
order = MarketOrder('SELL', 0.00015)
contract = Crypto('BTC', 'PAXOS', 'USD')
trade = app.ib.placeOrder(contract,order)
#Wait for the order to be processed and check status
app.ctx.ib.sleep(1)
print(trade)

#Reconnect to IB if connection is lost
async def checkIfReconnect():
if not app.ib.isDisconnected() or not app.ib.isConnected():
app.ib.disconnect()
app.ib = IB()
app.ib.connect('127.0.0.1',7496,clientId=1)

#Run app
if _name_ == '__main__':
#Connect to IB
app.ctx.ib = IB()
app.ctx.ib.connect('127.0.0.1',7496,clientId=1)
app.run(port=8080)`

**This is the error I get: ** { "description": "Internal Server Error", "status": 500, "message": "The application encountered an unexpected error and could not continue." }

**I also see these errors in the Terminal: **

ERROR:    Exception occurred while handling uri: 'http://MYURL/buy'
Traceback (most recent call last):
File "handle_request", line 102, in handle_request
if TYPE_CHECKING:
                  
File "/Users/MYURL/#imports.py", line 26, in buy
await checkIfReconnect()
File "/Users/MYURL/#imports.py", line 56, in checkIfReconnect
if not app.ib.isDisconnected() or not app.ib.isConnected():
       ^^^^^^
AttributeError: 'Sanic' object has no attribute 'ib'

**I'm using: **

MacOS High Sierra 10.13.6
Visual Studio Code Version: 1.85.2 (Universal)
Trader Workstation Version: Stable (10.19.2o) 20240612
Ngrok: 3.15.1

Solution

  • PM from ngrok here. According to the error, the Sanic object (app) doesn't have an ib property, which it does not according to the docs: https://sanic.readthedocs.io/en/stable/sanic/api/app.html#module-sanic.app

    looks like you probably want if not app.ctx.ib.isDisconnected() or not app.ctx.ib.isConnected(): maybe?