2017-03-21 9 views
2

インタラクティブブローカーはPythonバージョンのAPIをリリースしました。私はデータを取得しようとしています。IBS APIからのデータをPythonでどのように受け取るのですか?

私は 'Program.py'の 'examples'を使用しており、アカウントの値を取得しようとしています。私はちょうど口座の清算価値が何であるかを知り、それをPythonに取り入れるだけです。これはdocumentation.であり、これは要求を作成して送信するためのコードです:

 app = TestApp() 
     app.connect("127.0.0.1", 4001, clientId=0) 
     print("serverVersion:%s connectionTime:%s" % (app.serverVersion(), 
                app.twsConnectionTime())) 
     app.reqAccountSummary(9004, 'All', '$LEDGER') 

私はIBゲートウェイを使用して、送信された要求を見て、応答が戻ってIBゲートウェイに入ってくることができます。私はPythonへの応答を得る方法を理解できません。ドキュメントを正しく読んでいると、次のように表示されます。

Receiving 

Summarised information is delivered via IBApi.EWrapper.accountSummary and IBApi.EWrapper.accountSummaryEnd 

    1 class TestWrapper(wrapper.EWrapper): 
... 
    1  def accountSummary(self, reqId: int, account: str, tag: str, value: str, 
    2      currency: str): 
    3   super().accountSummary(reqId, account, tag, value, currency) 
    4   print("Acct Summary. ReqId:", reqId, "Acct:", account, 
    5    "Tag: ", tag, "Value:", value, "Currency:", currency) 
    6 
... 
    1  def accountSummaryEnd(self, reqId: int): 
    2   super().accountSummaryEnd(reqId) 
    3   print("AccountSummaryEnd. Req Id: ", reqId) 

私はこれをどうしますか?値を取得するためにこの関数を呼び出すようですが、この関数は入力として返される値を必要としています!私は何が欠けているのですか?

誰もが提供できるお手伝いをありがとう。

EDIT:

@iswrapper 
# ! [accountsummary] 
def accountSummary(self, reqId: int, account: str, tag: str, value: str, 
        currency: str): 
    super().accountSummary(reqId, account, tag, value, currency) 
    print("Acct Summary. ReqId:", reqId, "Acct:", account, 
      "Tag: ", tag, "Value:", value, "Currency:", currency) 

そして、私は混乱しています場所です:

これは、 'コールバック' であると思います。これは、アカウントの値(宣言の 'value:str')を期待しているようですが、これはまさに私が作成することを求めているものです。私は、次のようなsomehtingを言うどこで見つけることができません。

myMonies = whateverTheHellGetsTheValue(reqID) 

だから、「myMonies」は、アカウントの値を保持するだろう、と私は私の陽気な方法で続けることができます。

+0

Pythonについてのアイデアはありませんが、コールバックのようなJavaのIB API関数では、コールされていない_get_が呼ばれています。おそらくPython APIでも同じです。 – SantiBailors

+0

それは私がちょっと考えていたものですが、どのようにデータを端末に取り込みますか?またはコードに戻る?あなたはどのように応答を得ますか? – lukehawk

答えて

2

私はここで非常に似た質問に答えました。 https://stackoverflow.com/a/42868938/2855515

ここでは、同じクラスのEWrapperEClientをサブクラス化し、すべてのリクエストとコールバックの受信に使用するプログラムです。

EClientメソッドを呼び出してデータを要求し、EWrapperメソッドを介してフィードバックします。それらは@iswrapper表記のものです。

from ibapi import wrapper 
from ibapi.client import EClient 
from ibapi.utils import iswrapper #just for decorator 
from ibapi.common import * 

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

    @iswrapper 
    def nextValidId(self, orderId:int): 
     print("setting nextValidOrderId: %d", orderId) 
     self.nextValidOrderId = orderId 
     # here is where you start using api 
     self.reqAccountSummary(9002, "All", "$LEDGER") 

    @iswrapper 
    def error(self, reqId:TickerId, errorCode:int, errorString:str): 
     print("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString) 

    @iswrapper 
    def accountSummary(self, reqId:int, account:str, tag:str, value:str, currency:str): 
     print("Acct Summary. ReqId:" , reqId , "Acct:", account, 
      "Tag: ", tag, "Value:", value, "Currency:", currency) 

    @iswrapper 
    def accountSummaryEnd(self, reqId:int): 
     print("AccountSummaryEnd. Req Id: ", reqId) 
     # now we can disconnect 
     self.disconnect() 

def main(): 
    app = TestApp() 
    app.connect("127.0.0.1", 7497, clientId=123) 
    app.run() 

if __name__ == "__main__": 
    main() 
+0

ありがとう!!これはうまくいくようです。サンプルコードの簡素化に感謝します – lukehawk

+0

このことをどうやって止めるのですか? Ha。それは走っているようだ...そして、私は..実行中にものを要求することはできません。私が理解しているように、このTestAppは、 '#ここはあなたがapiを使って始める場所の後にすべてのリクエストを実行する 'run'メソッドを継承しています。これは応答を開始し、3分ごとに更新された値で応答を続ける要求を送ります。これが実行されている間、私はそれを停止するように見えることはできません。そして、私は...「オンザフライで」リクエストを追加することはできません。では、どうやってそれをするのですか?または、これは 'nextValidID'メソッド内で実行され、停止されることを意味しますか? – lukehawk

+0

私はそれを実行すると、accountSummaryEndイベントを受け取った後に切断されます。これが 'self.disconnect'の目的です。ユーザーの操作はありません。 – brian

0

正しいコールバックを探してください。たとえば、オプションをリクエストした場合(つまり、testbed/contractOperations_req)結果はcontractdetails(@iswrapper)になります。あなたが何をしたいのかを指定できます... print(contractDetails.summary.symbol)などです。アカウント情報のコールバックを見つけて、リターン/ etc。あなたのプログラムに戻します。

+0

申し訳ありませんが、分かりません。私は上記の質問を更新しました... – lukehawk

関連する問題