Subversion Repositories Integrator Subversion

Rev

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

package br.com.kronus.binance.futures;

import java.io.IOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

import br.com.kronus.binance.futures.model.CandleKLinha;

public class EscritorCsvCandle {

    private final Path diretorioSaida;
    private final ZoneId zoneId;
    private final DateTimeFormatter formatoData;
    private final DateTimeFormatter formatoHora;
    private final DecimalFormat formatoDecimal;

    public EscritorCsvCandle(Path diretorioSaida, ZoneId zoneId) {
        this.diretorioSaida = diretorioSaida;
        this.zoneId = zoneId;

        this.formatoData = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        this.formatoHora = DateTimeFormatter.ofPattern("HH:mm:ss");

        DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("pt", "BR"));
        symbols.setDecimalSeparator(',');
        symbols.setGroupingSeparator('.');

        this.formatoDecimal = new DecimalFormat("#0.00", symbols);
        this.formatoDecimal.setGroupingUsed(false);
    }

    /**
     * Grava uma linha no CSV no formato:
     * SYMBOL;dd/MM/yyyy;HH:mm:ss;open;high;low;close;volume;numberOfTrades
     */

    public void escreverCandle(CandleKLinha candle) {
        try {
            Files.createDirectories(diretorioSaida);

         // um arquivo por símbolo+intervalo, ex: BTCUSDT_1m.csv
            String nomeArquivo = candle.getSimbolo() + "_" + candle.getIntervalo() + ".csv";
            Path arquivo = diretorioSaida.resolve(nomeArquivo);

            var aberturaZoned = candle.getHorarioAberturaZoned(zoneId);
            String data = aberturaZoned.toLocalDate().format(formatoData);
            String hora = aberturaZoned.toLocalTime().format(formatoHora);

            String linha = new StringBuilder()
                    .append(candle.getSimbolo()).append(';')
                    .append(data).append(';')
                    .append(hora).append(';')
                    .append(formatar(candle.getAbertura())).append(';')
                    .append(formatar(candle.getMaxima())).append(';')
                    .append(formatar(candle.getMinima())).append(';')
                    .append(formatar(candle.getFechamento())).append(';')
                    .append(formatar(candle.getVolume())).append(';')
                    .append(candle.getQuantidadeNegocios())
                    .append(System.lineSeparator())
                    .toString();

            Files.write(arquivo,
                    linha.getBytes(StandardCharsets.UTF_8),
                    StandardOpenOption.CREATE,
                    StandardOpenOption.APPEND);

        } catch (IOException e) {
            throw new RuntimeException("Erro ao escrever CSV de candle", e);
        }
    }
   
    public void escreverCandleHistorico(CandleKLinha candle) {
        escreverCandle(candle); // usa o mesmo padrão do WebSocket
    }

    private String formatar(BigDecimal valor) {
        return formatoDecimal.format(valor);
    }
}