无法使用 ibapi 连接 python 与交易平台
Unable to connect python with TWS using ibapi
这是我的代码:
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 :', reqID, '', errorCode,'', errorString)
def contractDetails(self, reqID, contractDetails):
print('Contract Details :', reqID, '', 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. ', orderId, 'Status: ', status, 'Filled: ', 'Remaining: ', remaining, 'Last Fill Price: ', lastFillprice)
def openOrderEnd(self, orderId, contract, order, orderState):
print('Open Order ID. ', orderId, contract.symbol, contract.secType, '@', contract.exchange, ': ', order.action, order.orderType, order.totalQuantity, orderState.status)
def execDetails(self, reqId, contract, execution):
print('Exec Details. ', reqId, contract.symbol, contract.secType, contract.currency, execution.execId, execution.orderId, execution.shares, execution.lastLiquidity)
def accountSummary(self, reqId, account, tag, value, currency):
print('Account Summary. ', reqId, account, tag, value, 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, contract, 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()
我在执行这段代码时只收到基本消息:
错误 -1 2104 市场数据场连接是 OK:hfarm
错误 -1 2104 市场数据场连接是 OK:usfarm.nj
错误 -1 2104 市场数据场连接是 OK:usfuture
错误 -1 2104 市场数据场连接是 OK:jfarm
错误 -1 2104 市场数据场连接是 OK:eufarm
错误 -1 2104 市场数据场连接是 OK:cashfarm
错误 -1 2104 市场数据场连接是 OK:usfarm
错误 -1 2106 HMDS 数据场连接是 OK:euhmds
错误 -1 2106 HMDS 数据场连接是 OK:fundfarm
错误 -1 2106 HMDS 数据场连接是 OK:ushmds
错误 -1 2158 Sec-def 数据场连接是 OK:secdefnj
我从 IBKR 在线视频中复制了代码。我不知道我做错了什么。如果有任何帮助,我将不胜感激。
您已连接,只是您从未在启动方法中下订单。考虑重命名您的启动方法,因为调用 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 :', reqID, '', errorCode,'', errorString)
def contractDetails(self, reqID, contractDetails):
print('Contract Details :', reqID, '', 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. ', orderId, 'Status: ', status, 'Filled: ', 'Remaining: ', remaining, 'Last Fill Price: ', lastFillPrice)
#maybe disconnect when order is filled
if remaining == 0.0:
self.stop()
def openOrderEnd(self, orderId, contract, order, orderState):
print('Open Order ID. ', orderId, contract.symbol, contract.secType, '@', contract.exchange, ': ', order.action, order.orderType, order.totalQuantity, orderState.status)
def execDetails(self, reqId, contract, execution):
print('Exec Details. ', reqId, contract.symbol, contract.secType, contract.currency, execution.execId, execution.orderId, execution.shares, execution.lastLiquidity)
def accountSummary(self, reqId, account, tag, value, currency):
print('Account Summary. ', reqId, account, tag, value, 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, contract, 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()
这是我的代码:
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 :', reqID, '', errorCode,'', errorString)
def contractDetails(self, reqID, contractDetails):
print('Contract Details :', reqID, '', 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. ', orderId, 'Status: ', status, 'Filled: ', 'Remaining: ', remaining, 'Last Fill Price: ', lastFillprice)
def openOrderEnd(self, orderId, contract, order, orderState):
print('Open Order ID. ', orderId, contract.symbol, contract.secType, '@', contract.exchange, ': ', order.action, order.orderType, order.totalQuantity, orderState.status)
def execDetails(self, reqId, contract, execution):
print('Exec Details. ', reqId, contract.symbol, contract.secType, contract.currency, execution.execId, execution.orderId, execution.shares, execution.lastLiquidity)
def accountSummary(self, reqId, account, tag, value, currency):
print('Account Summary. ', reqId, account, tag, value, 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, contract, 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()
我在执行这段代码时只收到基本消息:
错误 -1 2104 市场数据场连接是 OK:hfarm 错误 -1 2104 市场数据场连接是 OK:usfarm.nj 错误 -1 2104 市场数据场连接是 OK:usfuture 错误 -1 2104 市场数据场连接是 OK:jfarm 错误 -1 2104 市场数据场连接是 OK:eufarm 错误 -1 2104 市场数据场连接是 OK:cashfarm 错误 -1 2104 市场数据场连接是 OK:usfarm 错误 -1 2106 HMDS 数据场连接是 OK:euhmds 错误 -1 2106 HMDS 数据场连接是 OK:fundfarm 错误 -1 2106 HMDS 数据场连接是 OK:ushmds 错误 -1 2158 Sec-def 数据场连接是 OK:secdefnj
我从 IBKR 在线视频中复制了代码。我不知道我做错了什么。如果有任何帮助,我将不胜感激。
您已连接,只是您从未在启动方法中下订单。考虑重命名您的启动方法,因为调用 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 :', reqID, '', errorCode,'', errorString)
def contractDetails(self, reqID, contractDetails):
print('Contract Details :', reqID, '', 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. ', orderId, 'Status: ', status, 'Filled: ', 'Remaining: ', remaining, 'Last Fill Price: ', lastFillPrice)
#maybe disconnect when order is filled
if remaining == 0.0:
self.stop()
def openOrderEnd(self, orderId, contract, order, orderState):
print('Open Order ID. ', orderId, contract.symbol, contract.secType, '@', contract.exchange, ': ', order.action, order.orderType, order.totalQuantity, orderState.status)
def execDetails(self, reqId, contract, execution):
print('Exec Details. ', reqId, contract.symbol, contract.secType, contract.currency, execution.execId, execution.orderId, execution.shares, execution.lastLiquidity)
def accountSummary(self, reqId, account, tag, value, currency):
print('Account Summary. ', reqId, account, tag, value, 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, contract, 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()