Консоль Python не позволяет мне писать новую строку кода.PyCharm - PullRequest
0 голосов
/ 23 февраля 2019

Я очень плохо знаком с Python, большая часть моего кода написана на R. В этом коде я извлекаю данные из Interactive Brokers API.Код завершен с 0 ошибками, однако 3 зеленые стрелки в консоли исчезают, и я не могу ничего написать в консоли или выполнить код в сценарии.Наконец, я нажал зеленый значок отладки в левом нижнем углу, и теперь я получаю это "подключение к консоли", которое не проходит.

У меня работает интерпретатор в этом проекте (python 3.7).

Я хотел бы увидеть код для запуска, и после его завершения позвольте мне написать код в консолии выполнить новый код в скрипте, как обычно.Я решил не включать мой код Interactive Brokers, так как считаю, что он избыточен.Если вы хотели бы видеть это, я буду загружать это.Спасибо.

enter image description here

Ниже приведен код интерактивных брокеров.Код приходит непосредственно из одного из их примеров сценариев.Я решил установить для app.reqMktData в строке 30 значение 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 голосов
/ 23 февраля 2019

Я думаю, что то, что вы видите здесь, является представителем двухпоточной системы, которую IB использует для своего API.( ссылка )

При запуске приложения эти потоки работают в бесконечных циклах для сбора и обработки данных.

Из того, что я вижу на вашем изображении, вы вернули только один тик из reqmktdata () перед «выходом с кодом 0.»В моей собственной, хотя и C #, реализации reqmktdata я возвращаю последовательный поток данных.(Для AAPL это будет несколько тиков в секунду и несколько типов тиков.)

Существует большая вероятность того, что вы видите некоторую блокировку, вызванную преднамеренным, но не заканчивающимся бесконечным циклом этихдве темы.

Предложения:

  • Попробуйте поставить app.run () перед вызовом reqmktdata ().(Это длинный пример, поскольку я не знаком с реализацией IB на Python)
  • Было бы целесообразно шаг за шагом пройтись по вашему коду, чтобы увидеть, где именно он решит выйти.Исходя из моего собственного опыта, этот код не должен выходить, пока вы не решите его остановить.(т.е.: должно быть напечатано много строк вывода)
0 голосов
/ 24 февраля 2019

Как сказал Дэниел, это распространенная проблема, которая является результатом того, что потоки из API застревают в открытом состоянии после возврата вашей программы.Вы не сможете запустить свою программу, а затем продолжать вызывать API в консоли.Чтобы решить проблему с подключением к консоли, вам нужно отключиться от API в вашем скрипте, вызвав app.disconnect() перед возвратом.

Также рассмотрите возможность добавления этих строк в ваш объект TestApp:

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

setattr(self, "_thread", thread)

Это запустит поток для вас, и вам больше не нужно вызывать app.run()

Вам нужно будет импортировать класс Thread из модуля Threading - from Threading import Thread

Этот блог может помочь вам в реализации других классов и использовании очередей для получения обратных вызовов от API.https://qoppac.blogspot.com/2017/03/interactive-brokers-native-python-api.html

0 голосов
/ 23 февраля 2019

Я предлагаю перезапустить PyCharm, чтобы избавиться от задач «Подключение к консоли».Я думаю, что это происходит сбой, потому что консоль мертва.

Затем используйте действие (Ctrl + Shift + A или Ctrl + 3, чтобы найти действие) «Запустить файл в консоли».

...