私は、複数の取引を一度に配置して株式の価格を取得し、次に頻繁に再調整するAPIプログラムを作成しようとしています。私はこのコードの一部を入手するためにオンラインのチュートリアルを使用し、いくつかの調整を行いました。インタラクティブブローカーAPI - 複数の取引を実行する
しかし、私がコードを実行すると、IB TWSを再起動すると、頻繁に接続されて注文が行われます。しかし、コードをもう一度実行しても機能しない場合、またはコードが接続されることを示すメッセージが表示されます。誰も私がmain.javaファイルを実行できるように、接続を維持する方法を理解するのを助けることができますか?それは複数の取引を実行し、接続を終了しますか?コードまたはTWSの設定でクライアントID番号を変更する必要はありますか?
Ordermanagement.java:
package SendMarketOrder;
//import statements//
class OrderManagement extends Thread implements EWrapper{
private EClientSocket client = null; //IB API client Socket Object
private Stock stock = new Stock();
private Order order = new Order();
private int orderId;
private double limitprice;
private String Ticker;
//method to create connection class. It's the constructor
public OrderManagement() throws InterruptedException, ClassNotFoundException, SQLException {
// Create a new EClientSocket object
System.out.println("////////////// Creating a Connection ////////////");
client = new EClientSocket(this); //Creation of a socket to connect
//connect to the TWS Demo
client.eConnect(null,7497,1);
try {
Thread.sleep(3000); //waits 3 seconds for user to accept
while (!(client.isConnected()));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("///////// Connected /////////");
}
public void sendMarketOrder(String cusip, String buyorSell, int shares) throws SQLException, ClassNotFoundException{
//New Order ID
orderId++;
order.m_action = buyorSell;
order.m_orderId = orderId;
order.m_orderType = "MKT";
order.m_totalQuantity = shares;
order.m_account = "DU33xxxxx"; //write own account
order.m_clientId = 1;
//Create a new contract
stock.createContract(cusip);
client.placeOrder(orderId, stock.contract, order);
//Show order in console
SimpleDateFormat time_formatter = new SimpleDateFormat("HH:mm:ss");
String current_time_str = time_formatter.format(System.currentTimeMillis());
System.out.println("////////////////////////////////////////////////\n" +
"#Limit Price: " + order.m_lmtPrice + "///////////////////////////\n" +
"#Client number: " + order.m_clientId + "///////////////////////////\n" +
"#OrderType: " + order.m_orderType + "///////////////////////////\n" +
"#Order Quantity: " + order.m_totalQuantity + "///////////////////////////\n" +
"#Account number: " + order.m_account + "///////////////////////////\n" +
"#Symbol: " + stock.contract.m_secId + "///////////////////////////\n" +
"///////////////////////////////////////"
);
}
Stock.java
public class Stock{
private int StockId; //we can identify the stock
private String Symbol; //Ticker
public Stock() { //default constructor
}
public Stock(int StockId, String Symbol) { //constructor
this.StockId = StockId;
this.Symbol = Symbol;
}
//getter and setters
public int getStockId() {
return StockId;
}
public String getSymbol() {
return Symbol;
}
Contract contract = new Contract();
public void createContract(String cusip){
contract.m_secId = cusip;
contract.m_secIdType = "CUSIP";
contract.m_exchange = "SMART";
contract.m_secType = "STK";
contract.m_currency = "USD";
}
}
Main.java:
3つのファイルがあります
package SendMarketOrder;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws InterruptedException, ClassNotFoundException, SQLException {
OrderManagement order = new OrderManagement();
order.sendMarketOrder("922908363","BUY", 100);
order.sendMarketOrder("92204A504","BUY", 50);
order.sendMarketOrder("92204A702","BUY", 100);
System.exit(0);
}
}
これらは私の現在の設定がされていますTWSセッティNGSそれは場合に役立ちます:
事前のおかげで助けを求めて!
プログラムは、冗長行 'System.exit(0);'で終了します。メインが終了すると、プログラムはとにかく終了します。プログラムを実行したままにするには、mainでループが必要です。またはguiを作成してください。これがコンソールアプリケーションであれば、私は東部時間午後4時のような特定の時間まで、あなたのリバースの市場データをチェックし続けます。 – brian
クライアントIDがすでに使用中であるとTWSが判断した場合、再接続しないことがあります。そのため、TWSを再起動すると新しい接続が可能になります。このプログラムを何度も実行したいのですか、またはそのプログラムを1日のうちに実行したままにしますか? – brian
私は、株式の重みを変更するときに自動的に再調整するために、たびにプログラムを一度実行したいだけです。それは常に実行する必要はありません – user3628240