IB Java API:为多个合同提取股票代码数据(实时条)

时间:2016-07-01 06:14:57

标签: java api tws

我正在使用算法交易和IB API进行一些自学和实验。我决定使用Java,但我可以切换到C ++。我浏览了一个在线教程,它将引导您完成下面显示的代码,但是想知道是否仅将其扩展到一个库存。我想查看所有SP500股票并查看股票代码数据,以便根据这些做出决定。

下面的代码将为Microsoft创建合同并获取数据,但我想获取所有500种股票的数据。 EWrapper界面中定义的所有其他方法都被排除在帖子之外,以便于阅读。

我认为我需要将自动收报机符号存储在一个文件中,解析它,并将每个合约逐个添加到向量中。但是,我不确定如何在此之后监控数据。如果我可以按顺序循环遍历每个自动收报机并发出数据请求,那将是很好的但我相信流是在异步线程上处理的(如果错误则纠正我。)

那么如何查看所有500种股票并检查他们的股票数据呢?

代码段和解释将不胜感激。谢谢!

// Import Java utilities and Interactive Brokers API                                            
import java.util.Vector;
import com.ib.client.Contract;
import com.ib.client.ContractDetails;
import com.ib.client.EClientSocket;
import com.ib.client.EWrapper;
import com.ib.client.Execution;
import com.ib.client.Order;
import com.ib.client.OrderState;
import com.ib.client.TagValue;
import com.ib.client.CommissionReport;
import com.ib.client.UnderComp;

// RealTimeBars Class is an implementation of the                                               
// IB API EWrapper class                                                                        
public class RealTimeBars implements EWrapper
{
    // Keep track of the next ID                                                                
    private int nextOrderID = 0;
    // The IB API Client Socket object                                                          
    private EClientSocket client = null;

    public RealTimeBars ()
    {
        // Create a new EClientSocket object                                                    
        client = new EClientSocket (this);
        // Connect to the TWS or IB Gateway application                                         
        // Leave null for localhost                                                             
    // Port Number (should match TWS/IB Gateway configuration                               
        client.eConnect (null, 7496, 0);

        // Pause here for connection to complete                                                
    try
            {
                // Thread.sleep (1000);                                                         
                while (! (client.isConnected()));
            } catch (Exception e) {
            e.printStackTrace ();

        };
        // Create a new contract                                                                
        Contract contract = new Contract ();
        contract.m_symbol = "MSFT";
        contract.m_exchange = "SMART";
        contract.m_secType = "STK";
    contract.m_primaryExch = "NASDAQ";
        contract.m_currency = "USD";
        // Create a TagValue list                                                               
        Vector<TagValue> realTimeBarsOptions = new Vector<TagValue>();
        // Make a call to start off data retrieval                                              
        client.reqRealTimeBars(0, contract,
                               5,            // Bar Size 5 seconds                              
                               "TRADES",     // whatToShow                                      
                               false,         // useRTH                                         
                               realTimeBarsOptions);
        // At this point our call is done and any market data events                            
        // will be returned via the realtimeBar method                                          

    } 

public static void main (String args[])
{
    try
        {
            // Create an instance                                                           
            // At this time a connection will be made                                       
    // and the request for market data will happen                                  
            RealTimeBars myData = new RealTimeBars();
        }
    catch (Exception e)
        {
            e.printStackTrace ();
        }
}    

}

1 个答案:

答案 0 :(得分:3)

我不知道这对所有500人都有用,但你可以试试。数据来自https://raw.githubusercontent.com/datasets/s-and-p-500-companies/master/data/constituents.csv SP

package sp;

import com.ib.client.CommissionReport;
import com.ib.client.Contract;
import com.ib.client.ContractDetails;
import com.ib.client.EWrapper;
import com.ib.client.Execution;
import com.ib.client.Order;
import com.ib.client.OrderState;
import com.ib.client.TickType;
import com.ib.client.UnderComp;
import java.util.HashMap;
import java.util.Map;

public class Wrapper  implements EWrapper{
    public Map<Integer, Data> dataMap = new HashMap<>();
    public Map<Integer, Strat> orderMap = new HashMap<>();

    //reqMktData snapshots are received here
    @Override
    public void tickPrice(int tickerId, int field, double price, int canAutoExecute) {
        if (field == TickType.LAST) {
            //if you just want the last price
            dataMap.get(tickerId).dataRecd(price);
        }
    } 

    @Override
    public void execDetails(int reqId, Contract contract, Execution execution) {
        orderMap.get(execution.m_orderId).exec(execution);
    }
//snip
}

包装

package sp;

import com.ib.client.Contract;
import com.ib.client.EClientSocket;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class Data {
            final Contract cont;
    private final EClientSocket socket;
    private final Strat strat;

    private static int nextId = 1; //auto increment for each request
    private final int myId;

    List<Double> prices = new ArrayList<>();
    double lastPrice = -1;

    public Data(Contract cont, EClientSocket socket) {
        this.cont = cont;
        this.socket = socket;
        strat = new Strat(this, socket);
        myId = nextId++;
        ((Wrapper) socket.wrapper()).dataMap.put(myId, this);
        reqData();
//        //call every 10 min
//        Timer timer = new Timer();
//        timer.schedule(new TimerTask() {
//            @Override
//            public void run() {
//                reqData();
//            }
//        }, 10 * 60 * 1000);
    }

    private void reqData(){
        socket.reqMktData(myId, cont, "", false /* true */, null);
    }

    public void dataRecd(double last){
        lastPrice = last;
        prices.add(last);
        strat.check();
    }
}

数据

package sp;

import com.ib.client.EClientSocket;
import com.ib.client.Execution;

public class Strat {
    public static final int NULL=0, LOOK=1<<0, LONG=1<<1, SHORT=1<<2, WAIT_FILL=1<<3, WAIT_CANCEL=1<<4;
    public int sysState = NULL;
    private final Data data;
    private final EClientSocket socket;

    private static int nextOrderId = 1;

    Strat(Data data, EClientSocket socket) {
        this.data = data;
        this.socket = socket;
        sysState = LOOK;
    }

    void check() {
        System.out.println("should I buy? "+ data.cont.m_symbol + " @ " + data.lastPrice);
        /*if (false && sysState & LOOK == LOOK) {
            ((Wrapper) socket.wrapper()).orderMap.put(nextOrderId, this);
            socket.placeOrder(nextOrderId++, data.cont, new Order());
            sysState = WAIT_FILL;
            nextOrderId++;
        }*/
    }

    public void exec(Execution exec){
        //will be called by wrapper after an exec.
        //sysState = LONG; //or whatever
    }
}

斯特拉特

const link = '/users/${item.id}';