Python示例中的基本交互式代理API不起作用

Python示例中的基本交互式代理API不起作用,python,interactive-brokers,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 clas

我正在尝试将交互式代理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函数没有被正确覆盖有关,或者与这些方面有关。感谢您提供的任何帮助或信息

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

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

    “3-延迟数据:免费、延迟的数据延迟15-20分钟。”

    “4-延迟冻结数据:为没有市场数据订阅的用户请求延迟的“冻结”数据。”

    据我所知,“延迟冻结数据”既延迟15-20分钟,也是市场收盘价,因此只能在市场收盘后请求

  • 合同交换
  • 初始化合同类时,如果exchange属性定义为“智能”,则NASDAQ在primaryExchange字段中始终定义为“孤岛”:

    contract.primaryExchange = "ISLAND"
    
  • 处理接收到的数据的新线程
  • 同意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)
        ...
    
  • reMarketDataType()
  • 我同意Brian所说的,reqMarketDataType(4)只能在正常交易时间之外工作。它在IB API的文档中说明如下:

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

    “3-延迟数据:免费、延迟的数据延迟15-20分钟。”

    “4-延迟冻结数据:为没有市场数据订阅的用户请求延迟的“冻结”数据。”

    据我所知,“延迟冻结数据”既延迟15-20分钟,也是市场收盘价,因此只能在市场收盘后请求

  • 合同交换
  • 初始化合同类时,如果exchange属性定义为“智能”,则NASDAQ在primaryExchange字段中始终定义为“孤岛”:

    contract.primaryExchange = "ISLAND"
    
  • 处理接收到的数据的新线程
  • 同意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)
        ...
    

    您的代码在AAPL交易日使用
    app.reqMarketDataType(3)
    运行良好,因此可能与请求冻结数据有关。也许4只在市场关闭时才起作用。我同意前面的评论。我还要确保TestApp线程执行时主线程处于休眠状态。否则,应用程序可能会在TestApp线程可以打印任何输出之前终止。您的代码在AAPL交易日使用
    app.reqMarketDataType(3)
    运行良好,因此可能与请求冻结数据有关。也许4只在市场关闭时才起作用。我同意前面的评论。我还要确保TestApp线程执行时主线程处于休眠状态。否则,应用程序可能会在TestApp线程可以打印任何输出之前终止。