0

私は Java API を使用しており、プッシュ ボタンを備えたシンプルな Swing GUI を作成しました。ボタンを押すと、次のように実行されます。

anInstance.connection.reqRealTimeBars(id, contract, 5,"TRADES",false); 
// note that connection = new EClientSocket(Wrapper) which is assigned in constructor`

これにより、オーバーライドされた Wrapper 関数 realtimeBar が実行されます。

Joda Time を使用getSecondOfMinuteして、ラッパー関数の Time を何秒に変換します。55秒あれば取引したいです。(つまり、プログラムで毎分 55 秒の時点で取引を行うようにしたい)。

しかし、取引を行うたびに、API との接続を切断する何かがあります。

同期とおそらくデッドロックに関係していると思いますか?とにかく、私のプログラムのポイントは常に取引することであるため、エラーはAPIへの接続を閉じます。

なぜこの問題が発生するのか知っている人はいますか? さらに重要なことに、これを回避するにはどうすればよいですか?

サンプルコード

EWrapper をオーバーライドする someWrapper.java:

public class someWrapper implements EWrapper {
    private IBProgram anInstance;

public void setReference(IBProgram anInstance){
    this.anInstance = anInstance    
 }

// overide and implement various EWrapper methods. 
// The Ewrapper method below is a sample of placing an Order 
// causing problems in an EWrapper method

public void updatePortfolio(Contract contract, int position, double marketPrice, double marketValue,
        double averageCost, double unrealizedPNL, double realizedPNL, String accountName){

Order myFakeOrder = new Order();
Contract myFakeContract = new Contract();
myFakeContract.m_symbol = "GOOG";
myFakeContract.m_exchange = "SMART";
myFakeContract.m_secType = "STK";
myFakeContract.m_currency = "USD";
myFakeOrder.m_action = "BUY";
myFakeOrder.m_totalQuantity = 1;
myFakeOrder.m_orderType = "LMT";
myFakeOrder.m_lmtPrice = 1;
myFakeOrder.m_tif = "DAY";
anInstance.connection.placeOrder(2124124,myFakeContract,myFakeOrder);
}
}

IBProgram.java

public class IBProgram {
 someWrapper wrapper;
 public EClientSocket connection;

 public IBProgram() {

 this.wrapper = new someWrapper();
 this.connection = new EClientSocket(wrapper);
 }
}

GUI

public class GUI extends javax.swing.JFrame{
     private IBProgram IBProgramInstance;

public GUI(){
     initComponents();
}

private void initComponents() {
     myButton = new javax.swing.JButton();
     myButton.setText("Start Trading");
     myButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            myButtonActionPerformed(evt);
        }
    });
}

public void setReference(IBProgram Instance){
      this.IBProgramInstance = Instance;
}

private void myButtonActionPerformed (java.awt.event.ActionEvent evt) {     
          IBProgramInstance.connection.reqAccountUpdates(true,"myaccountid");
}

public static void main(String args[]){
       IBProgram IBPInstance = new IBProgram();
       IBProgramInstance.wrapper.setReference(IBPInstance);
       IBProgram.connection.eConnect("127.0.0.1",7496,12);
       GUI guiInstance = new GUI();
       guiInstance.setReference(IBPInstance);
       guiInstance.setVisible(true);

}

エラーメッセージの追加

Exception in thread "EReader" java.lang.Error: Interrupted attempt to aquire write lock
at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1349)
at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:659)
at javax.swing.text.JTextComponent.setText(JTextComponent.java:1718)
at IBconnect.IBTradeGui.setConnectionText(IBTradeGui.java:698)
at IBconnect.someWrapper.connectionClosed(someWrapper.java:63)
at com.ib.client.EClientSocket.close(EClientSocket.java:2004)
at com.ib.client.EReader.run(EReader.java:78)
4

1 に答える 1

0

ほとんどの Swing オブジェクトはスレッドセーフではないため、メソッドで次GUIのコードを使用してインスタンスを作成する必要があります。main()

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        GUI guiInstance = new GUI();
    }
});

Swing スレッドの安全性とイベント ディスパッチ スレッド (別名 EDT) の詳細については、このリンク(および次のページ) を参照してください。


具体的な問題とは関係ありませんが、クラスには大文字の名前を使用し、クラス インスタンスにはキャメルケースの名前を使用するように注意してください。カプセル化の原則に違反するため、クラスのパブリック プロパティは避けてください。を実装するクラスですべての例外をキャッチしますEWrapper。それ以外の場合、IB は接続を閉じます。updatePortfolio()さらに重要なことは、メソッドまたはインターフェイスのメソッドをオーバーライドする他のメソッドに注文を挿入するときは、細心の注意を払うことです。注文はEWrapperIB ソケットによってトリガーされ、いつ呼び出されるかわからないためです。

于 2013-05-08T14:40:18.287 に答える