Subversion Repositories Integrator Subversion

Rev

Blame | Last modification | View Log | Download | RSS feed

package br.com.kronus.ibkr.futures;

import java.math.BigDecimal;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import com.ib.client.Contract;

import br.com.kronus.core.trade.ServicoMercadoFuturos;
import br.com.kronus.ibkr.api.IbkrClient;
import br.com.kronus.ibkr.api.IbkrMapper;

/**
 * Implementação de mercado usando IBKR, reutilizando a assinatura do serviço da Binance.
 */

public class ServicoMercadoFuturosIbkr implements ServicoMercadoFuturos {

    private final IbkrClient ibkr;
    private final AtomicInteger nextTickerId = new AtomicInteger(1);

    public ServicoMercadoFuturosIbkr(IbkrClient ibkr) {
        this.ibkr = ibkr;
    }

    /**
     * Obtém o último preço do símbolo usando market data da IBKR.
     */

    @Override
    public BigDecimal obterUltimoPreco(String symbol) throws Exception {
        Contract contract = IbkrMapper.contratoFuturoIndice(symbol);

        int tickerId = nextTickerId.getAndIncrement();
        CompletableFuture<BigDecimal> future = ibkr.registrarFuturePreco(tickerId);

        ibkr.getClient().reqMktData(tickerId, contract, "", false, false, null);

        BigDecimal preco = future.get(5, TimeUnit.SECONDS);

        ibkr.getClient().cancelMktData(tickerId);

        return preco;
    }
}