Subversion Repositories Integrator Subversion

Rev

Rev 791 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
791 blopes 1
package br.com.sl.core;
2
 
3
import java.io.File;
4
import java.io.FileWriter;
5
import java.io.IOException;
6
import java.math.BigDecimal;
7
import java.text.SimpleDateFormat;
8
import java.util.List;
9
 
10
import br.com.sl.domain.dto.OrdemBinanceDTO;
11
import br.com.sl.domain.dto.robo.SinalTradeGatilho3;
12
import br.com.sl.domain.model.Candle;
13
import br.com.sl.domain.model.tipos.TipoSinal;
14
 
15
public class ExportadorSinalBinance {
16
 
17
    // Ajuste a pasta como preferir
18
    private static final String PASTA_SINAIS = "D:/Dropbox/BLP/INVESTIMENTOS/DAYTRADE/sinais";
19
 
20
    // Se quiser usar em algum momento para quantidade padrão
21
    private static final BigDecimal QTDE_PADRAO = BigDecimal.ONE;
22
 
23
    /**
24
     * Exporta todos os sinais para arquivos CSV,
25
     * 1 arquivo por sinal, pronto para ser lido por outro serviço.
26
     */
27
    public static void exportarSinaisParaPasta(List<SinalTradeGatilho3> sinais) {
28
        if (sinais == null || sinais.isEmpty()) {
29
            System.out.println("[BinanceSignalExporter] Nenhum sinal para exportar.");
30
            return;
31
        }
32
 
33
        File pasta = new File(PASTA_SINAIS);
34
        if (!pasta.exists()) {
35
            boolean ok = pasta.mkdirs();
36
            if (!ok) {
37
                System.err.println("[BinanceSignalExporter] Não foi possível criar a pasta: " + PASTA_SINAIS);
38
                return;
39
            }
40
        }
41
 
42
        for (SinalTradeGatilho3 sinal : sinais) {
43
            try {
44
                OrdemBinanceDTO payload = converterParaPayloadBinance(sinal);
45
                String csv = converterParaCsv(payload);
46
                String nomeArquivo = montarNomeArquivoCsv(pasta, payload, sinal);
47
                gravarArquivo(nomeArquivo, csv);
48
            } catch (Exception e) {
49
                System.err.println("[BinanceSignalExporter] Erro ao exportar sinal: " + e.getMessage());
50
                e.printStackTrace();
51
            }
52
        }
53
    }
54
 
55
    /**
56
     * Converte um SinalTradeGatilho3 para o payload de ordem "modelo Binance".
57
     */
58
    private static OrdemBinanceDTO converterParaPayloadBinance(SinalTradeGatilho3 sinal) {
59
        OrdemBinanceDTO p = new OrdemBinanceDTO();
60
 
61
        // 1) Symbol da Binance
62
        String symbol = mapearParaSymbolBinance(sinal);
63
 
64
        // 2) Side -> BUY ou SELL
65
        String side = sinal.getTipoOperacao() == TipoSinal.COMPRA_C ? "BUY" : "SELL";
66
 
67
        // 3) Tipo de ordem – exemplo LIMIT padrão
68
        String type = "LIMIT";
69
        String timeInForce = "GTC";
70
 
71
        // 4) Quantidade – usa contratosTotais, mas pode ajustar
72
        BigDecimal quantity = BigDecimal.valueOf(sinal.getContratosTotais());
73
 
74
        // 5) Preço de entrada – Entrada 1 como principal
75
        BigDecimal price = sinal.getPrecoEntrada1();
76
 
77
        // 6) Stops e Targets
78
        BigDecimal stopLoss = sinal.getStopMenos100();
79
        BigDecimal tp1 = sinal.getAlvo1();
80
        BigDecimal tp2 = sinal.getAlvo2();
81
 
82
        // 7) ClientOrderId – algo identificável
83
        Candle g3 = sinal.getGatilho3();
84
        String dataHora = "";
85
        if (g3 != null && g3.getDataHora() != null) {
86
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
87
            dataHora = sdf.format(g3.getDataHora());   // aqui getDataHora() é Date
88
        }
89
        String clientOrderId = "G3_" + symbol + "_" + dataHora + "_c" + sinal.getGatilho3().getContadorCandle();
90
 
91
        p.setSymbol(symbol);
92
        p.setSide(side);
93
        p.setType(type);
94
        p.setTimeInForce(timeInForce);
95
        p.setQuantity(quantity);
96
        p.setPrice(price);
97
        p.setStopLoss(stopLoss);
98
        p.setTakeProfit1(tp1);
99
        p.setTakeProfit2(tp2);
100
        p.setClientOrderId(clientOrderId);
101
 
102
        return p;
103
    }
104
 
105
    /**
106
     * Mapeia o ativo interno para o símbolo da Binance.
107
     */
108
    private static String mapearParaSymbolBinance(SinalTradeGatilho3 sinal) {
109
        String nomeAtivo = null;
110
 
111
        if (sinal.getReferencia() != null && sinal.getReferencia().getAtivo() != null) {
112
            nomeAtivo = sinal.getReferencia().getAtivo().getNome();
113
        } else if (sinal.getReferencia() != null) {
114
            nomeAtivo = sinal.getReferencia().getNomeAtivo();
115
        }
116
 
117
        if (nomeAtivo == null) {
118
            return "BTCUSDT";
119
        }
120
 
121
        if (nomeAtivo.equalsIgnoreCase("BTC") || nomeAtivo.equalsIgnoreCase("BTCUSDT")) {
122
            return "BTCUSDT";
123
        }
124
        if (nomeAtivo.equalsIgnoreCase("ETH") || nomeAtivo.equalsIgnoreCase("ETHUSDT")) {
125
            return "ETHUSDT";
126
        }
127
 
128
        return nomeAtivo.toUpperCase() + "USDT";
129
    }
130
 
131
    /**
132
     * Gera o conteúdo CSV (cabeçalho + linha única).
133
     * Novo campo: status = "P" (pendente)
134
     */
135
    private static String converterParaCsv(OrdemBinanceDTO p) {
136
        StringBuilder sb = new StringBuilder();
137
 
138
        // Cabeçalho
139
        sb.append("symbol,side,type,timeInForce,quantity,price,stopLoss,takeProfit1,takeProfit2,clientOrderId,status\n");
140
 
141
        // Linha de dados
142
        sb.append(escapeCsv(p.getSymbol())).append(",");
143
        sb.append(escapeCsv(p.getSide())).append(",");
144
        sb.append(escapeCsv(p.getType())).append(",");
145
        sb.append(escapeCsv(p.getTimeInForce())).append(",");
146
        sb.append(p.getQuantity()).append(",");
147
        sb.append(p.getPrice()).append(",");
148
        sb.append(p.getStopLoss()).append(",");
149
        sb.append(p.getTakeProfit1()).append(",");
150
        sb.append(p.getTakeProfit2()).append(",");
151
        sb.append(escapeCsv(p.getClientOrderId())).append(",");
152
 
153
        sb.append("P"); // status pendente
154
 
155
        sb.append("\n");
156
 
157
        return sb.toString();
158
    }
159
 
160
 
161
    /**
162
     * Escapa campos texto para CSV básico.
163
     */
164
    private static String escapeCsv(String s) {
165
        if (s == null) return "";
166
        // Se tiver vírgula, aspas ou quebra de linha, envolve em aspas e escapa aspas
167
        boolean precisaAspas = s.contains(",") || s.contains("\"") || s.contains("\n") || s.contains("\r");
168
        String valor = s.replace("\"", "\"\"");
169
        return precisaAspas ? "\"" + valor + "\"" : valor;
170
    }
171
 
172
    /**
173
     * Monta nome de arquivo: BINANCE_SIGNAL_<symbol>_<clientOrderId>.csv
174
     */
175
    private static String montarNomeArquivoCsv(File pasta, OrdemBinanceDTO payload, SinalTradeGatilho3 sinal) {
176
        String symbol = payload.getSymbol();
177
        String clientId = payload.getClientOrderId();
178
        String nome = "BINANCE_SIGNAL_" + symbol + "_" + clientId + ".csv";
179
        return new File(pasta, nome).getAbsolutePath();
180
    }
181
 
182
    private static void gravarArquivo(String caminho, String conteudo) throws IOException {
183
        try (FileWriter fw = new FileWriter(caminho, false)) {
184
            fw.write(conteudo);
185
        }
186
        System.out.println("[BinanceSignalExporter] Arquivo CSV criado: " + caminho);
187
    }
188
}