基本交互式代理API与Python示例不工作



我正在尝试将Interactive Brokers API与Python一起使用。我试图通过按照他们在教学视频中的方式来实现他们的一个基本例子,但似乎不起作用。下面是应该返回一些市场数据的代码,但当我运行它时,没有打印出任何数据。

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), end=' ')
def tickSize(self, reqId, tickType, size):
print("test")
print("Tick Size. Ticker Id ", reqId, " tickType: ", TickTypeEnum.to_str(tickType), "Size: ", size)

def main():
app = TestApp()
app.connect("127.0.0.1", 7496, 0)
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "STK"
contract.exchange = "SMART"
contract.currency = "USD"
contract.primaryExchange = "NASDAQ"
app.reqMarketDataType(4)
app.reqMktData(1, contract, "", False, False, [])
app.run()

if __name__ == "__main__":
main()

我不确定会发生什么,但我猜这与TestApp函数没有被正确覆盖有关,或者类似的事情。感谢您提供的任何帮助或信息。

  1. reMarketDataType((

我同意Brian所说的,reqMarketDataType(4(只能在正常交易时间之外工作。它在IB API的文件中说明如下:

";2-冻结数据:冻结市场数据是收盘时记录的最后一个数据。在TWS中,冻结数据以灰色数字显示。当您将市场数据类型设置为Frozen时,您要求TWS在当前没有可用报价时发送最后一个可用报价">

";3-延迟数据:免费,延迟数据延迟15-20分钟">

";4-延迟的冻结数据:请求延迟";冷冻的";没有市场数据订阅的用户的数据">

【市场数据类型IB API Python文档】

正如我所理解的";延迟冻结数据";延迟15-20分钟,是市场收盘价,所以只有在市场收盘后才能要求。

  1. 合同主交换

初始化合约类时,如果exchange属性定义为";SMART";,那么纳斯达克总是被定义为"纳斯达克";ISLAND";在primaryExchange字段中:

contract.primaryExchange = "ISLAND"
  1. 处理接收数据的新线程

同意MatthewScarpino,以避免发送请求和接收数据之间的中断:总是在后台启动一个新线程来运行EWrapper来处理返回的数据,然后在API连接启动后在main((中调用此函数。

def web_socket_thread(app: TestApp):
websocket_thread = threading.Thread(target=app.run, daemon=True)
websocket_thread.start()
def main():
...
web_socket_thread(app)
...

最新更新