微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 ibapi 将 python 与 TWS 连接

如何解决无法使用 ibapi 将 python 与 TWS 连接

这是我的代码

from threading import Timer
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.order import *

class TestApp(EWrapper,EClient):

    def __init__(self):
        EClient.__init__(self,self)

    def Error(self,reqID,errorCode,errorString):
        print('Error :','',errorString)

    def contractDetails(self,contractDetails):
        print('Contract Details :',contractDetails)

    def nextValidId(self,orderId):
        self.nextOrderID = orderId
        self.run()

    def orderStatus(self,orderId,status,filled,remaining,avgFillPrice,permID,lastFillprice,cliendId,whyHeld,mktCapPrice):
        print('Orderstatus Id. ','Status: ','Filled: ','Remaining: ','Last Fill Price: ',lastFillprice)

    def openorderEnd(self,contract,order,orderState):
        print('Open Order ID. ',contract.symbol,contract.secType,'@',contract.exchange,': ',order.action,order.orderType,order.totalQuantity,orderState.status)

    def execDetails(self,reqId,execution):
        print('Exec Details. ',contract.currency,execution.execId,execution.orderId,execution.shares,execution.lastLiquidity)

    def accountSummary(self,account,tag,value,currency):
        print('Account Summary. ',currency)

    def start(self):
        contract = Contract()
        contract.symbol = 'NFLX'
        contract.secType = 'STK'
        contract.exchange = 'SMART'
        contract.currency = 'USD'
        contract.primaryExchange = 'NASDAQ'

        order = Order()
        order.action = 'BUY'
        order.totalQuantity = 2
        order.orderType = 'LMT'
        order.lmtPrice = 539.50

        self.placeOrder(self.nextOrderID,order)

    def stop(self):
        self.done = True
        self.disconnect()


def main():
    app = TestApp()
    app.nextOrderID = 0
    app.connect('127.0.0.1',7497,0)

    Timer(3,app.stop).start()
    app.run()


if __name__ == '__main__':
    main()

当我执行此代码时,我只收到基本消息:

ERROR -1 2104 市场数据场连接正常:hfarm ERROR -1 2104 市场数据农场连接正常:usfarm.nj ERROR -1 2104 市场数据场连接正常:usfuture ERROR -1 2104 市场数据场连接正常:jfarm ERROR -1 2104 市场数据农场连接正常:eufarm ERROR -1 2104 市场数据农场连接正常:cashfarm ERROR -1 2104 市场数据场连接正常:usfarm ERROR -1 2106 Hmds 数据场连接正常:euhmds ERROR -1 2106 Hmds 数据场连接正常:fundfarm ERROR -1 2106 Hmds 数据场连接正常:ushmds ERROR -1 2158 Sec-def 数据场连接正常:secdefnj

我从IBKR在线视频中复制了代码。我不知道我做错了什么。如有任何帮助,我将不胜感激。

解决方法

您已连接,只是您从未在 start 方法中下订单。考虑重命名您的 start 方法,因为调用 Timer.start 可能会令人困惑。

from threading import Timer
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.order import *

class TestApp(EWrapper,EClient):

    def __init__(self):
        EClient.__init__(self,self)
        self.nextOrderID = 0 # if this is init code put it in init

    def Error(self,reqID,errorCode,errorString):
        print('Error :','',errorString)

    def contractDetails(self,contractDetails):
        print('Contract Details :',contractDetails)

    def nextValidId(self,orderId):
        self.nextOrderID = orderId
        #self.run() you already called app.run
        self.start() # call your start function,you never did so order wasn't placed.
    
    # you missed parentId,just copy these big defs from the source
    def orderStatus(self,orderId,status,filled,remaining,avgFillPrice,permId,parentId,lastFillPrice,clientId,whyHeld,mktCapPrice):
        print('Orderstatus Id. ','Status: ','Filled: ','Remaining: ','Last Fill Price: ',lastFillPrice)
        #maybe disconnect when order is filled
        if remaining == 0.0:
            self.stop()

    def openOrderEnd(self,contract,order,orderState):
        print('Open Order ID. ',contract.symbol,contract.secType,'@',contract.exchange,': ',order.action,order.orderType,order.totalQuantity,orderState.status)

    def execDetails(self,reqId,execution):
        print('Exec Details. ',contract.currency,execution.execId,execution.orderId,execution.shares,execution.lastLiquidity)
        
    def accountSummary(self,account,tag,value,currency):
        print('Account Summary. ',currency)

    def start(self):
        contract = Contract()
        contract.symbol = 'NFLX'
        contract.secType = 'STK'
        contract.exchange = 'SMART'
        contract.currency = 'USD'
        #contract.primaryExchange = 'NASDAQ'#??may be ISLAND,but not needed for nflx

        order = Order()
        order.action = 'BUY'
        order.totalQuantity = 2
        order.orderType = 'LMT'
        order.lmtPrice = 539.50
        
        self.placeOrder(self.nextOrderID,order)
        self.nextOrderID +=1 # always increment after use

    def stop(self):
        #self.done = True # unnecessary 
        if self.isConnected() : 
            print("disconnecting")
            self.disconnect()
        
def main():
    app = TestApp()
    app.connect('127.0.0.1',7497,123)

    #Timer(3,app.stop).start() #means you want to stop in 3 seconds no matter what
    app.run()

if __name__ == '__main__':
    main()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。