Go to most recent revision | Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 797 | blopes | 1 | package br.com.kronus.ibkr.robos; |
| 2 | |||
| 3 | import com.ib.client.*; |
||
| 4 | |||
| 5 | import br.com.kronus.ibkr.api.IbkrMapper; |
||
| 6 | |||
| 7 | import java.time.*; |
||
| 8 | import java.time.format.DateTimeFormatter; |
||
| 9 | |||
| 10 | public class TesteMktDataSimples extends DefaultEWrapper { |
||
| 11 | |||
| 12 | private final EJavaSignal signal = new EJavaSignal(); |
||
| 13 | private final EClientSocket client = new EClientSocket(this, signal); |
||
| 14 | private EReader reader; |
||
| 15 | private final int reqId = 1001; |
||
| 16 | |||
| 17 | public static void main(String[] args) { |
||
| 18 | new TesteMktDataSimples().iniciar(); |
||
| 19 | } |
||
| 20 | |||
| 21 | public void iniciar() { |
||
| 22 | |||
| 23 | System.out.println("Conectando ao TWS..."); |
||
| 24 | |||
| 25 | // MESMOS PARAMETROS QUE FUNCIONARAM NO TesteConexaoSimples |
||
| 26 | client.eConnect("127.0.0.1", 7497, 2); |
||
| 27 | |||
| 28 | try { Thread.sleep(2000); } catch (Exception ignored) {} |
||
| 29 | |||
| 30 | System.out.println("isConnected = " + client.isConnected()); |
||
| 31 | if (!client.isConnected()) { |
||
| 32 | System.err.println("Ainda não conectado ao TWS. Saindo."); |
||
| 33 | return; |
||
| 34 | } |
||
| 35 | |||
| 36 | // 1 = realtime (se assinado), 3 = delayed |
||
| 37 | client.reqMarketDataType(3); |
||
| 38 | |||
| 39 | // EReader para processar mensagens |
||
| 40 | reader = new EReader(client, signal); |
||
| 41 | reader.start(); |
||
| 42 | |||
| 43 | new Thread(() -> { |
||
| 44 | while (client.isConnected()) { |
||
| 45 | try { |
||
| 46 | signal.waitForSignal(); |
||
| 47 | reader.processMsgs(); |
||
| 48 | } catch (Exception e) { |
||
| 49 | e.printStackTrace(); |
||
| 50 | break; |
||
| 51 | } |
||
| 52 | } |
||
| 53 | }, "IBKR-Reader-Thread").start(); |
||
| 54 | |||
| 55 | // --------- CONTRATO PARA TESTE: AAPL ---------- |
||
| 56 | // Contract c = IbkrMapper.contratoForex(); |
||
| 57 | Contract c = IbkrMapper.contratoAcaoBrasil("PETR4"); |
||
| 58 | /* |
||
| 59 | Contract c = new Contract(); |
||
| 60 | c.symbol("AAPL"); |
||
| 61 | c.secType("STK"); |
||
| 62 | c.currency("USD"); |
||
| 63 | c.exchange("SMART"); |
||
| 64 | */ |
||
| 65 | // c.primaryExch("NASDAQ"); |
||
| 66 | |||
| 67 | // --------------------------------------------- |
||
| 68 | |||
| 69 | System.out.println("Solicitando market data (reqMktData)..."); |
||
| 70 | client.reqMktData(reqId, c, "", false, false, null); |
||
| 71 | } |
||
| 72 | |||
| 73 | // =========================================== |
||
| 74 | // CALLBACKS DE PREÇO |
||
| 75 | // =========================================== |
||
| 76 | |||
| 77 | @Override |
||
| 78 | public void tickPrice(int tickerId, int field, double price, TickAttrib attrib) { |
||
| 79 | if (price <= 0) return; |
||
| 80 | |||
| 81 | String campo; |
||
| 82 | switch (field) { |
||
| 83 | case 1: campo = "BID"; break; |
||
| 84 | case 2: campo = "ASK"; break; |
||
| 85 | case 4: campo = "LAST"; break; |
||
| 86 | default: campo = "FIELD_" + field; |
||
| 87 | } |
||
| 88 | |||
| 89 | String hora = LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")); |
||
| 90 | |||
| 91 | System.out.println("[TICK] " + campo + " = " + price + " | " + hora); |
||
| 92 | } |
||
| 93 | |||
| 94 | @Override |
||
| 95 | public void tickSize(int tickerId, int field, Decimal size) { |
||
| 96 | // Se quiser ver tamanhos: |
||
| 97 | // System.out.println("[SIZE] field=" + field + " size=" + size); |
||
| 98 | } |
||
| 99 | |||
| 100 | // =========================================== |
||
| 101 | // ERROS |
||
| 102 | // =========================================== |
||
| 103 | @Override |
||
| 104 | public void error(int id, long code, int arg2, String arg3, String msg) { |
||
| 105 | System.err.println("IBKR ERROR: id=" + id + " code=" + arg2 + " msg=" + arg3); |
||
| 106 | } |
||
| 107 | } |