2016-05-11 7 views
1

私はTrading Toolboxを使用して、IB TWSへの接続を確立しています。一般に、APIは正常に動作し、コードはリアルタイムデータを取得して注文を実行するなどの目的を実行します。MATLAB Trading Toolbox:forループでIBコードがスタックするのはなぜですか?

私が今やりたいこと(複数の戦略を介して実行するために)for -loopに私のコードブロックを実行しますが、できるだけ早く私はforループ内のコードを実行しようとすると、コードがに表示されています無限ループに詰まることがあります。これは、MATLAB(さらにCTRL + cでも、この場合はトリックは行いません)。

マイコマンドウィンドウは、その後急速に

Cannot unregister 'xxx'、XXXは、tickPricetickDataなど

としてIB機能、種々のある
IBエラーメッセージを表示します

奇妙なことは、私が手動でコードを強調表示して実行すると(F9)、すべてが魅力のように機能します。

私の研究からは、接続が処理される方法と関係があるように見えます。ibib接続をforループの先頭(その内側)に開き、それを閉じ、ループの終わり(ループ内も)を閉じます。

"close"コマンドの後に1〜2秒間実行を一時停止しようとしましたが、接続を正しく閉じるのに十分な時間を確保しますが、効果はありません。

誰でも私にここで助けてもらえますか、この問題に取り組む方法についてのアイデアはありますか?

+0

既にお気づきかもしれませんが、そのStackOverflowはMCVEベースの質問を使用することをお勧めします。あなたの問題には、問題の根本的な原因を確認するためにコードを再現する必要があります。 MCVEなしでは、空気からの答えを「見つける」ことは困難ですが、問題の分離と回帰的なコードユニットのテストは、単に結果につながります。あなたの観察された問題の良い&すぐにアドバイスを見つけることを願っています。 MCVEはこれらの両方の方向で多くのことを助けます。 ** – user3666197

+0

インタラクティブブローカーの利用規約は、「集中的な」再接続をブロックするためのポリシー上の制限を課す可能性があります。通常、ブローカ側の接続通信ゲートウェイゲートキーパーは、接続の頻繁なセットアップ/クローズ/再確立を好まない。これは、通信ゲートウェイに高い処理オーバーヘッドをもたらし、クライアント側のソフトウェアコンポーネントの誤った動作を通知する可能性があるからである。 **単に「裸の足で蛇をむかつけてはいけません」**(なぜ「獅子の洞窟に足を踏み入れるだろう」というのですか?) – user3666197

答えて

0

トレーディングツールボックスの問題の大部分は、Matlabに組み込まれたイベントハンドラの製品です。問題を解決するには、データを取得する関数ごとにカスタムイベントハンドラを定義する必要があります。また、上記のコメントに記載されているように、ibの開閉を最小限に抑えるようにしてください。さまざまなGUI、クラス、またはスクリプトを実行している場合、最大10の接続を持つことができます。

IB = ibtws( '1'、7496)、IB2 = ibtws( '2'、7496)...など

私はクラスにごibtwsコントロールをラップをお勧めします、これは、それらを保存するよりも優れて動作しているようですベースのワークスペースに移動します。

GUIまたはラッパーを閉じる前に関連するすべてのデータ要求をキャンセルします。 ib.Handle.cancelMktData(ReqID); ib.Handle.cancelMktDepth(ReqID); ...など

残念ながら、Mathworksは、大部分の関数のreqIDをシードするために乱数ジェネレータ(1:10000)を作成しました。これにより、要求IDが重複してIBに送信され、致命的なエラーが発生することがあります。 (これはおそらく、あなたがコントロールを頻繁に開いて閉じたいと思う理由です)コードのいくつかを書き換えない限り、これについてはあまりできません。

+0

どうもありがとうございました!複数の接続(つまり、複数のActiveX ibtwsオブジェクト)を持つ場合と、単純に1つを持つ場合の利点は何ですか?私はOOPとMatlabを使ってスタートアップを始めていますが、私の研究が私に示していることから、あなたはすべてのカスタム関数のハンドルを単一のクラスに格納するのか、データ要求の処理をどのように整理するのが好きですか?事前に多くの感謝! – Benvaulter

+0

複数の接続を使用する最善の理由は、データ要求を送信したり、注文などでエラーが発生して接続が切断された場合、IBが完全に切断されないようにすることです。最低限、リアルタイムデータ、レベルIIデータ、注文、履歴データリクエストを別々の接続で実行することをおすすめします。これにより、イベントハンドラが簡略化されます。私は、それぞれの戦略と関連する機能グループに対して別々のクラスを使用します。イベントハンドラは、関連するクラスの静的関数として、またはアプリケーションによっては別のクラスとして書き込むことがよくあります。 – CNEV

関連する問題