Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IbPy: How to extract API response into a variable

Tags:

python

I'm looking into if IbPy can be a good way for me to connect to Interactive Brokers trading API. I'm now, as a test, trying to collect some stock price snapshots, to see if I can get IbPy to work for me. I'm using the Brokertron gateway to connect with IB.

I get the requested stock price back from the IB API just fine (from some example code with error handling which I've found, see below), so technically it works towards the IB API, but I can't figure out how to extract the specific field (field=4, price=175.95 below) into a variable for later use.

Any ideas how to get field 4 content into a variable? Thanks!

Python example script:

import ib
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message
from time import sleep

class Downloader(object):
    def __init__(self,debug=False):
        self.tws = ibConnection('localhost', 4001, 0)

        if debug:
            self.tws.registerAll(self.debugHandler)

        self.tws.connect()
        self._reqId = 1 # current request id

    def debugHandler(self,msg):
        print '[debug]', msg

    def requestData(self,contract):
        self.tws.reqMktData(self._reqId,c,'',1)
        self._reqId+=1
        return "???"

if __name__=='__main__':
    dl = Downloader(debug=True)
    c = Contract()
    c.m_symbol = 'SPY'
    c.m_secType = 'STK'
    c.m_exchange = 'SMART'
    c.m_currency = 'USD'
    laststockpricefield4 = dl.requestData(c)
    print laststockpricefield4
    sleep(3)
    print 'Done.'

Commande line output:

01-Nov-12 22:30:43 DEBUG Server Version: 65
01-Nov-12 22:30:43 DEBUG TWS Time at connection: 20121101 22:30:43 GMT
???
[debug] ManagedAccounts accountsList=DU15144>
[debug] NextValidId orderId=1>
[debug] TickString tickerId=1, tickType=45, value=1351808899>
[debug] TickPrice tickerId=1, field=4, price=175.95, canAutoExecute=0>
[debug] TickSize tickerId=1, field=5, size=1>
[debug] TickGeneric tickerId=1, tickType=49, value=0.0>
[debug] TickPrice tickerId=1, field=1, price=176.03, canAutoExecute=1>
[debug] TickSize tickerId=1, field=0, size=378>
[debug] TickPrice tickerId=1, field=2, price=176.05, canAutoExecute=1>
[debug] TickSize tickerId=1, field=3, size=344
like image 373
Kenneth Schoultz Avatar asked Nov 03 '12 00:11

Kenneth Schoultz


1 Answers

This works!

import re
import ib
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message
from time import sleep

class Downloader(object):
    field4price = ''

    def __init__(self):
        self.tws = ibConnection('localhost', 4001, 0)
        self.tws.register(self.tickPriceHandler, 'TickPrice')
        self.tws.connect()
        self._reqId = 1 # current request id

    def tickPriceHandler(self,msg):
        if msg.field == 4:
            self.field4price = msg.price
            #print '[debug]', msg

    def requestData(self,contract): 
        self.tws.reqMktData(self._reqId, contract, '', 1)
        self._reqId+=1

if __name__=='__main__':
    dl = Downloader()
    c = Contract()
    c.m_symbol = 'SPY'
    c.m_secType = 'STK'
    c.m_exchange = 'SMART'
    c.m_currency = 'USD'
    dl.requestData(c)
    sleep(3)
    print 'Price - field 4: ', dl.field4price
like image 127
Kenneth Schoultz Avatar answered Sep 29 '22 12:09

Kenneth Schoultz