Python控制台不允许我编写新的代码行。 PyCharm

时间:2019-02-23 06:23:46

标签: python api console pycharm interactive-brokers

我对Python很陌生,我的大部分代码都是在R中完成的。在此代码中,我正在从Interactive Brokers API中提取数据。代码以0错误完成,但是,控制台中的3个绿色箭头消失了,并且我无法在控制台中编写任何内容或执行脚本中的代码。最后,我点击了左下角的绿色调试图标,现在我得到的“连接到控制台”并没有消失。

我有一个在此项目上运行的解释器(python 3.7)。

我想看到的是要运行的代码,完成后,请允许我像往常一样在控制台中编写代码并在脚本中执行新代码。我已决定不放入我的Interactive Brokers代码,因为我认为这是多余的。如果您希望看到它,我将上传它。谢谢。

enter image description here

下面是交互式经纪人代码。该代码直接来自其示例脚本之一。我决定将第30行的app.reqMktData设置为True,True,因此我只收到快照。我仍然收到同样的问题。

import numpy as np
import pandas as pd
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 tickSize(self, reqId, tickType, size):
        print("Tick Size. Ticker Id:", reqId, "tickType:", TickTypeEnum.to_str(tickType), "Size:", size, end=" ")

def main():
    app = TestApp()
    app.connect("127.0.0.1", 4001, 0)

    contract = Contract()
    contract.symbol = "AAPL"
    contract.secType = "STK"
    contract.exchange = "SMART"
    contract.currency = "USD"
    app.reqMarketDataType(4)
    app.reqMktData(1, contract, "", True, True, [])

    app.run()

if __name__ == "__main__":
    main()

当我将run.app放在reqmkt数据上方时,它只是保持旋转而不返回任何内容。谢谢

3 个答案:

答案 0 :(得分:3)

正如Daniel所说,这是一个常见的问题,是由于API的线程在程序返回后卡住了。您将无法运行程序,然后再继续在控制台中调用API。要解决与控制台的连接问题,您需要在返回之前调用app.disconnect(),以断开脚本中的API的连接。

此外,请考虑将以下几行添加到您的TestApp对象中:

thread = Thread(target=self.run)
thread.start()

setattr(self, "_thread", thread)

这将为您启动线程,并且您不再需要调用app.run()

您将需要从Threading模块中导入Thread类-from Threading import Thread

此博客可以帮助您实现其他类,并使用队列从API接收回调。 https://qoppac.blogspot.com/2017/03/interactive-brokers-native-python-api.html

答案 1 :(得分:1)

我认为您在这里看到的是IB用于其API的双线程系统的代表。 (link

在运行应用程序时,这些线程以无限循环运行,以收集和处理数据。

根据您在图像中看到的内容,在“以代码0退出”之前,您仅从reqmktdata()返回了一个刻度。在我自己的(尽管是C#)reqmktdata的实现中,我正在返回一致的数据流。 (对于AAPL,这将是每秒几个刻度线和几种刻度类型。)

您很有可能看到的是这两个线程的故意但无止境的无限循环导致的锁定。

建议:

  • 尝试将app.run()放在reqmktdata()调用之前。 (这是一个长镜头,因为我不熟悉IB的Python实现)
  • 值得逐行浏览您的代码以查看其确切决定退出的位置。根据我的经验,在您决定停止该代码之前,不应退出此代码。 (即:应该打印多行输出)

答案 2 :(得分:0)

我建议重新启动PyCharm以摆脱那些“连接到控制台”任务。我的猜测是它失败了,因为控制台已死。

然后使用操作(Ctrl + Shift + A或Ctrl + 3查找操作)“在控制台中运行文件”。

相关问题