如何解决无法使用 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 举报,一经查实,本站将立刻删除。