Subversion Repositories Integrator Subversion

Rev

Rev 796 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

package br.com.kronus.ibkr.history;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

import com.ib.client.Bar;
import com.ib.client.Contract;
import com.ib.client.TagValue;

import br.com.kronus.ibkr.api.IbkrClient;

public class IbkrHistoricalDataService {

    private final IbkrClient ibkr;

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

    /**
     * Solicita histórico para IBKR e grava tudo em CSV.
     *
     * @param contract        contrato IBKR
     * @param endDateTime     "" para agora ou "yyyyMMdd HH:mm:ss"
     * @param durationStr     "2 D", "5 D", "1 W", "1 M", etc.
     * @param barSizeSetting  "1 min", "5 mins", "15 mins", "1 day", etc.
     * @param whatToShow      "TRADES", "MIDPOINT", etc.
     */

    public void baixarHistoricoParaCsv(
            int reqId,
            Contract contract,
            String endDateTime,
            String durationStr,
            String barSizeSetting,
            String whatToShow,
            Path arquivoCsv
    ) throws Exception {

        if (!Files.exists(arquivoCsv.getParent())) {
            Files.createDirectories(arquivoCsv.getParent());
        }

        try (BufferedWriter writer = Files.newBufferedWriter(arquivoCsv,
                java.nio.file.StandardOpenOption.CREATE,
                java.nio.file.StandardOpenOption.TRUNCATE_EXISTING)) {

            writer.write("data;hora;open;high;low;close;volume;wap;count");
            writer.newLine();

            CompletableFuture<List<Bar>> fut = ibkr.prepararFutureHistorico(reqId);

            ibkr.getClient().reqHistoricalData(
                    reqId,
                    contract,
                    endDateTime,
                    durationStr,
                    barSizeSetting,
                    whatToShow,
                    1,
                    2,
                    false,
                    (List<TagValue>) null
            );

            List<Bar> bars = fut.get(60, TimeUnit.SECONDS);

            for (Bar b : bars) {
                String timeStr = b.time(); // ex: 20250125 10:05:00
                String dataStr = timeStr.substring(0, 8);
                String horaStr = timeStr.substring(9);

                String yyyy = dataStr.substring(0, 4);
                String mm   = dataStr.substring(4, 6);
                String dd   = dataStr.substring(6, 8);
                String dataFormatada = yyyy + "-" + mm + "-" + dd;

                String linha = String.join(";",
                        dataFormatada,
                        horaStr,
                        String.valueOf(b.open()),
                        String.valueOf(b.high()),
                        String.valueOf(b.low()),
                        String.valueOf(b.close()),
                        String.valueOf(b.volume()),
                        String.valueOf(b.wap()),
                        String.valueOf(b.count())
                );
                writer.write(linha);
                writer.newLine();
            }
            writer.flush();
        }
    }
}