2

契約の詳細を要求したいのですが、最初にコードを実行したときは機能しましたが、もう一度実行を押しても何も返されません。TWS と pycharm を終了して再試行すると機能します。Python は初めてで、全体的な仕組みがわかりません。助けてください。

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import *
from ibapi.contract import *
from ContractSamples import ContractSamples


class TestApp(EClient, EWrapper):
    def __init__(self):
        EClient.__init__(self, self)

    def error(self, reqId:TickerId, errorCode:int, errorString:str):
        print("Error: ", reqId, "", errorCode, "", errorString)

    def contractDetails(self, reqId:int, contractDetails:ContractDetails):
        print("contractDetail: ", reqId, " ", contractDetails)


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.reqContractDetails(10, contract)

    app.run()


if __name__ == "__main__":
    main()

エラーメッセージはなく、結果はありません:「プロセスは終了コード 0 で終了しました」。

4

1 に答える 1

3

app.run()ソケットから読み取るスレッドを開始します。プログラムは実行を停止することはなく、常に TWS に接続されています。TWSのデータメニューボタンをクリックしてみてください。すべての接続が表示されます。クライアント 0 が接続されたままになっていることがわかります。明らかにpyCharmを閉じるとプログラムが強制終了されます。

また、プログラムの準備が整う前に、契約の詳細を要求します。nextValidId を待ってから、リクエストを送信する必要があります。データが受信されたら、プログラムを停止できます。これにより、将来の接続のために clientId が解放されます。これが私があなたのプログラムを変更する方法です。

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import *
from ibapi.contract import *
from ContractSamples import ContractSamples


class TestApp(EClient, EWrapper):
    def __init__(self):
        EClient.__init__(self, self)

    def nextValidId(self, orderId:int):
        print("id", orderId)
        contract = Contract()
        contract.symbol = "IBKR"
        contract.secType = "STK"
        contract.exchange = "SMART"
        contract.currency = "USD"
        contract.primaryExchange = "NASDAQ"

        self.reqContractDetails(10, contract)

    def error(self, reqId:TickerId, errorCode:int, errorString:str):
        print("Error: ", reqId, "", errorCode, "", errorString)

    def contractDetails(self, reqId:int, contractDetails:ContractDetails):
        print("contractDetail: ", reqId, " ", contractDetails)

    def contractDetailsEnd(self, reqId:int):
        print("end, disconnecting")
        self.disconnect()

def main():
    app = TestApp()

    app.connect("127.0.0.1", 7496, 0)
    app.run()

if __name__ == "__main__":
    main()
于 2019-07-06T20:57:57.083 に答える