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
);
}
}