Return 使用 Interactive Brokers TWS 的 object/variable 价格 API - Python
Return price as an object/variable using Interactive Brokers TWS API - Python
如标题所示,我试图从 TWS API 获取给定证券的价格,并将其用作我程序中其他地方的变量。下面的代码(直接来自 Interactive Broker 的一个教程)将 运行 并在屏幕上打印价格,但我无法以创建 variable/object 包含价格。该代码每十次尝试也只能工作一次,如果我在那里做错了什么,请告诉我。
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum
class TestApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
def error(self, reqId, errorCode, errorString):
print('Error: ', reqId, ' ', errorCode, ' ', errorString)
def tickPrice(self, reqId, tickType, price, attrib):
print('Tick Price. Ticker Id:', reqId, 'tickType:', TickTypeEnum.to_str(tickType),
'Price:', price, end=' ')
def main():
app = TestApp()
app.connect('127.0.0.1', 7496, 0)
contract = Contract()
contract.symbol = 'AAPL'
contract.secType = 'STK'
contract.currency = 'USD'
contract.exchange = 'SMART'
app.reqMarketDataType(1)
app.reqMktData(1, contract, '', False, False, [])
app.run()
if __name__ == '__main__':
main()
该程序没有考虑 api 的异步性质。
#here you are asking to connect, you must wait for a connection
app.connect('127.0.0.1', 7496, 0)
contract...
# you may not have a connection and you're not listeneing for responses yet.
app.reqMarketDataType(1)
app.reqMktData(1, contract, '', False, False, [])
# here is where you start listening for responses, that's what run() does
app.run()
我会这样写
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum
from ibapi.common import *
class TestApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
# here you can add variables to the TestApp class, just use self.var in the class
self.last = 0;
# ib suggests waiting for this response to know that you have a connection
def nextValidId(self, orderId:int):
self.reqMarketDataType(MarketDataTypeEnum.REALTIME) # or DELAYED
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "STK"
contract.currency = "USD"
contract.exchange = "SMART"
self.reqMktData(1, contract, "", False, False, None)
def error(self, reqId, errorCode, errorString):
print('Error: ', reqId, ' ', errorCode, ' ', errorString)
def tickPrice(self, reqId, tickType, price, attrib):
print('Tick Price. Ticker Id:', reqId, 'tickType:', TickTypeEnum.to_str(tickType),
'Price:', price)
if tickType == TickTypeEnum.LAST or tickType == TickTypeEnum.DELAYED_LAST :
self.last = price;
print("disconnecting")
self.disconnect() # just for testing, normally the program would do something
def main():
app = TestApp()
app.connect('127.0.0.1', 7497, 123)
app.run() # this blocks the program until disconnect()
print("app.last:", app.last) # now you refer to the variable by class.var
if __name__ == '__main__':
main()
如标题所示,我试图从 TWS API 获取给定证券的价格,并将其用作我程序中其他地方的变量。下面的代码(直接来自 Interactive Broker 的一个教程)将 运行 并在屏幕上打印价格,但我无法以创建 variable/object 包含价格。该代码每十次尝试也只能工作一次,如果我在那里做错了什么,请告诉我。
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum
class TestApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
def error(self, reqId, errorCode, errorString):
print('Error: ', reqId, ' ', errorCode, ' ', errorString)
def tickPrice(self, reqId, tickType, price, attrib):
print('Tick Price. Ticker Id:', reqId, 'tickType:', TickTypeEnum.to_str(tickType),
'Price:', price, end=' ')
def main():
app = TestApp()
app.connect('127.0.0.1', 7496, 0)
contract = Contract()
contract.symbol = 'AAPL'
contract.secType = 'STK'
contract.currency = 'USD'
contract.exchange = 'SMART'
app.reqMarketDataType(1)
app.reqMktData(1, contract, '', False, False, [])
app.run()
if __name__ == '__main__':
main()
该程序没有考虑 api 的异步性质。
#here you are asking to connect, you must wait for a connection
app.connect('127.0.0.1', 7496, 0)
contract...
# you may not have a connection and you're not listeneing for responses yet.
app.reqMarketDataType(1)
app.reqMktData(1, contract, '', False, False, [])
# here is where you start listening for responses, that's what run() does
app.run()
我会这样写
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum
from ibapi.common import *
class TestApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
# here you can add variables to the TestApp class, just use self.var in the class
self.last = 0;
# ib suggests waiting for this response to know that you have a connection
def nextValidId(self, orderId:int):
self.reqMarketDataType(MarketDataTypeEnum.REALTIME) # or DELAYED
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "STK"
contract.currency = "USD"
contract.exchange = "SMART"
self.reqMktData(1, contract, "", False, False, None)
def error(self, reqId, errorCode, errorString):
print('Error: ', reqId, ' ', errorCode, ' ', errorString)
def tickPrice(self, reqId, tickType, price, attrib):
print('Tick Price. Ticker Id:', reqId, 'tickType:', TickTypeEnum.to_str(tickType),
'Price:', price)
if tickType == TickTypeEnum.LAST or tickType == TickTypeEnum.DELAYED_LAST :
self.last = price;
print("disconnecting")
self.disconnect() # just for testing, normally the program would do something
def main():
app = TestApp()
app.connect('127.0.0.1', 7497, 123)
app.run() # this blocks the program until disconnect()
print("app.last:", app.last) # now you refer to the variable by class.var
if __name__ == '__main__':
main()