2016-07-01 17 views
4

알고리즘 거래 및 IB API에 대한자가 학습 및 실험을하고 있습니다. Java를 사용하기로 결정했지만 C++로 전환 할 수 있습니다. 나는 아래의 코드를 살펴 보았으나 하나의 주식 만 지나치게 확장하는 것에 대해 궁금해하는 온라인 자습서를 살펴 보았습니다. 모든 SP500 주식을 살펴보고 티커 데이터를 확인하여이를 기반으로 의사 결정을 내리고 싶습니다.IB Java API : 여러 계약에 대한 티커 데이터 (실시간 바) 추출

아래 코드는 Microsoft의 계약을 만들고 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

질문은 무엇인가에서인가? –

+0

@JBNizet 모든 500에 대한 데이터를 얻는 방법을 모르고 각 반복에서 조건과 비교하면서 반복합니다. – jonnyd42

+0

500 라인의 데이터 구독에 대해 지불 한 realTimeBars unle에서는이 작업을 수행 할 수 없습니다. 기본값은 100입니다. reqMarketData()에서만 수행 할 수 있으며 true로 설정하십시오. 스냅 샷이 암시 하듯이 스트리밍 데이터 구독이 아니라 일시적인 것입니다. IB는이 상황에 대한 훌륭한 데이터 제공 업체는 아니지만 먼저 스냅 샷을 시도 할 수 있습니다. – brian

답변

3

나는이 모든 500 작동 방법을 몰라,하지만 당신은 시도 할 수 있습니다. 데이터는 https://raw.githubusercontent.com/datasets/s-and-p-500-companies/master/data/constituents.csv SP

package sp; 

import com.ib.client.Contract; 
import com.ib.client.EClientSocket; 
import com.ib.client.EWrapper; 
import java.util.Arrays; 
import java.util.List; 
import java.util.concurrent.atomic.AtomicInteger; 

public class SP { 
    //just a sample, like this so you can just use Files.lines instead. 
    private static List<String> lines = Arrays.asList(new String[]{ 
     "Symbol,Name,Sector", 
     "MMM,3M Company,Industrials", 
     "ABT,Abbott Laboratories,Health Care", 
     "ABBV,AbbVie,Health Care", 
     "ACN,Accenture plc,Information Technology", 
     "ATVI,Activision Blizzard,Information Technology", 
     "AYI,Acuity Brands Inc,Industrials", 
     "ADBE,Adobe Systems Inc,Information Technology", 
     "AAP,Advance Auto Parts,Consumer Discretionary", 
     "AES,AES Corp,Utilities", 
     "AET,Aetna Inc,Health Care", 
     "AMG,Affiliated Managers Group Inc,Financials", 
     "AFL,AFLAC Inc,Financials", 
     "A,Agilent Technologies Inc,Health Care", 
     "APD,Air Products & Chemicals Inc,Materials", 
     "AKAM,Akamai Technologies Inc,Information Technology", 
    }); 


    public static void main(String[] args) throws InterruptedException{ 
     EWrapper wrapper = new Wrapper(); 
     EClientSocket socket = new EClientSocket(wrapper); 
     socket.eConnect("", 4001, 123); 
     //supposedly gives frozen last recorded value, not working! 
     socket.reqMarketDataType(2); 

     AtomicInteger tickerId = new AtomicInteger(0); 
     lines.stream().skip(1).forEach(line -> { 
      //new cont for every request 
      Contract cont = new Contract(); 
      cont.m_currency = "usd"; 
      cont.m_exchange = "smart"; 
      cont.m_secType = "stk"; 
      cont.m_symbol = line.split(",")[0]; 
      Data data = new Data(cont, socket); 
     }); 

     //need you own logic for when to end program 
     //Thread.sleep(5000);//this thread, Socket starts a reader thread 
     //socket.eDisconnect(); 
    } 
} 

래퍼

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 
    } 
} 
+0

어떤 시장 데이터 구독이 있습니까? 구독하지 않아서 데이터에 액세스 할 수 없다는 오류가 나타납니다. 방금 계정을 지원했습니다. – jonnyd42

+0

많은 구독이 있지만 10 달러짜리 간단한 묶음 중 하나가 필요합니다. 이 데이터는 모두 레벨 1이므로 깊이가 필요 없습니다 (레벨 2). – brian

+0

네트워크 A (NYSE/CTA)로 충분합니까? 이건 $ 1.50입니다. 어느 번들보고 있니? – jonnyd42