我正在使用算法交易和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 ();
}
}
}
答案 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}';