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

Python控制台不允许我编写新的代码行。皮查姆,python,api,console,pycharm,interactive-brokers,Python,Api,Console,Pycharm,Interactive Brokers,我对Python非常陌生,我的大部分代码都是在R中完成的。在这段代码中,我从交互式代理API中提取数据。代码完成时有0个错误,但是,控制台中的3个绿色箭头消失,我无法在控制台中写入任何内容或在脚本中执行代码。最后,我点击了左下角的绿色调试图标,现在我得到的“连接到控制台”并没有消失 我在这个项目(Python3.7)上运行了一个解释器 我希望看到的是要运行的代码,在它完成后,允许我在控制台中编写代码,并按照常规在脚本中执行新代码。我已经决定不把我的互动经纪人代码,因为我认为这是多余的。如果你想看

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

我在这个项目(Python3.7)上运行了一个解释器

我希望看到的是要运行的代码,在它完成后,允许我在控制台中编写代码,并按照常规在脚本中执行新代码。我已经决定不把我的互动经纪人代码,因为我认为这是多余的。如果你想看,我会上传的。多谢各位

下面是交互式代理代码。代码直接来自他们的一个示例脚本。我已决定将第30行的app.reqMktData设置为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数据上方时,它只是继续旋转,没有返回任何内容。谢谢

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


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

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


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

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

当应用程序运行时,这些线程以无限循环的方式运行,以收集和处理数据

从您的图像中可以看到,在“以代码0退出”之前,您只从reqmktdata()返回了一个勾号。在我自己的reqmktdata实现中,尽管是C#,我返回的是一致的数据流。(对于AAPL,它将是每秒几次滴答声和几种滴答声类型。)

很有可能您看到的是由这两个线程的故意的、但非终止的无限循环引起的一些锁定

建议:

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

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

当应用程序运行时,这些线程以无限循环的方式运行,以收集和处理数据

从您的图像中可以看到,在“以代码0退出”之前,您只从reqmktdata()返回了一个勾号。在我自己的reqmktdata实现中,尽管是C#,我返回的是一致的数据流。(对于AAPL,它将是每秒几次滴答声和几种滴答声类型。)

很有可能您看到的是由这两个线程的故意的、但非终止的无限循环引起的一些锁定

建议:

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

正如Daniel所说,这是一个常见的问题,它是由于API的线程在程序返回后被卡住而导致的。之后,您将无法运行程序并继续在控制台中调用API。要解决连接到控制台的问题,您需要在返回之前通过调用
app.disconnect()
从脚本中的API断开连接

也可以考虑将这些行添加到TestApp对象:

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

setattr(self, "_thread", thread)
这将为您启动线程,您不再需要调用
app.run()

您需要从线程模块导入线程类-
从线程导入线程


本博客可以帮助您实现其他类,并使用队列接收来自API的回调

正如Daniel所说,这是一个常见的问题,它是由于API的线程在程序返回后被卡住而导致的。之后,您将无法运行程序并继续在控制台中调用API。要解决连接到控制台的问题,您需要在返回之前通过调用
app.disconnect()
从脚本中的API断开连接

也可以考虑将这些行添加到TestApp对象:

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

setattr(self, "_thread", thread)
这将为您启动线程,您不再需要调用
app.run()

您需要从线程模块导入线程类-
从线程导入线程


本博客可以帮助您实现其他类,并使用队列接收来自API的回调

您看到控制台窗口左上角的绿色箭头按钮了吗?按下它,然后你可以在控制台中再次编写代码,如果这是你的意思。你看到控制台窗口左上角的绿色箭头按钮了吗?按下它,然后你可以在控制台中再次编写代码,如果这是你的意思。嘿,丹尼尔,我上传了代码并尝试了你的建议,仍然没有运气!!你的理论很有道理,所以我把这句话设为true,true表示只接受一个snaphsot。不过,运气不好。在API版本9.74.01的示例代码中,我看到了这些行。tc=TestClient(无)tc.REQUMKTDATA(1101,合同样本