IB API Python sample not using Ibpy

前端 未结 4 1594
我寻月下人不归
我寻月下人不归 2020-12-13 22:27

Can someone help me to figure out how to do basic request by using IB API Python socket? (I am using the latest IB API and it seems it support Python so should not need the

4条回答
  •  悲&欢浪女
    2020-12-13 22:49

    You have to subclass/override/implement the wrapper.EWrapper. That's where you're telling EClient to send the data received from TWS.

    I removed almost everything from the sample program and this runs.

    from ibapi import wrapper
    from ibapi.client import EClient
    from ibapi.utils import iswrapper #just for decorator
    from ibapi.common import *
    from ibapi.contract import *
    from ibapi.ticktype import *
    
    class TestApp(wrapper.EWrapper, EClient):
        def __init__(self):
            wrapper.EWrapper.__init__(self)
            EClient.__init__(self, wrapper=self)
    
        @iswrapper
        def nextValidId(self, orderId:int):
            print("setting nextValidOrderId: %d", orderId)
            self.nextValidOrderId = orderId
            #here is where you start using api
            contract = Contract()
            contract.symbol = "AAPL"
            contract.secType = "STK"
            contract.currency = "USD"
            contract.exchange = "SMART"
            self.reqMktData(1101, contract, "", False, None)
    
        @iswrapper
        def error(self, reqId:TickerId, errorCode:int, errorString:str):
            print("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString)
    
        @iswrapper
        def tickPrice(self, reqId: TickerId , tickType: TickType, price: float,
                      attrib:TickAttrib):
            print("Tick Price. Ticker Id:", reqId, "tickType:", tickType, "Price:", price)
            #this will disconnect and end this program because loop finishes
            self.done = True
    
    def main():
        app = TestApp()
        app.connect("127.0.0.1", 7496, clientId=123)
        print("serverVersion:%s connectionTime:%s" % (app.serverVersion(),
                                                    app.twsConnectionTime()))
        app.run()
    
    if __name__ == "__main__":
        main()
    

    Once you call app.run() the program starts an almost infinite loop reading messages so you'll need some other way to structure your program since the loop must be started.

提交回复
热议问题