Subversion Repositories Integrator Subversion

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
778 blopes 1
package br.com.ec.controller;
2
 
3
import java.io.IOException;
4
import java.io.Serializable;
5
import java.time.LocalDateTime;
6
import java.time.format.DateTimeFormatter;
7
import java.util.ArrayList;
8
import java.util.List;
9
 
10
import javax.faces.bean.ManagedBean;
11
import javax.faces.bean.ViewScoped;
12
 
13
import org.primefaces.model.chart.Axis;
14
import org.primefaces.model.chart.AxisType;
15
import org.primefaces.model.chart.LineChartModel;
16
import org.primefaces.model.chart.LineChartSeries;
17
 
18
import br.com.ec.domain.dto.AtivoAnaliseDTO;
19
import br.com.ec.domain.dto.TradeDTO;
20
import br.com.kronus.core.BacktestEngine;
21
import br.com.kronus.core.BacktestSummary;
22
import br.com.kronus.core.Candle;
23
import br.com.kronus.core.DetectorGatilhos;
24
import br.com.kronus.core.PadraoGatilho;
25
import br.com.kronus.core.Timeframe;
26
import br.com.kronus.fibo.FibonacciService;
27
import br.com.kronus.strategy.EstrategiaGatilhoTipo3;
28
import br.com.kronus.strategy.Strategy;
29
import br.com.robo.model.Trade;
30
import br.com.robo.model.TriggerFinder;
31
import br.com.robo.sim.CandleExcelReader;
32
 
33
@ManagedBean(name = "kronusSimuladorBean")
34
@ViewScoped
35
public class CandleCollectorBean implements Serializable {
36
 
37
    private double plDia;
38
    private int numeroTrades;
39
    private double taxaAcerto;
40
 
41
    private List<TradeDTO> tradesDoDia;
42
 
43
    private LineChartModel plDiaChart;
44
 
45
    private List<AtivoAnaliseDTO> ativosAnalise;
46
    private List<PadraoGatilho> gatilhos;
47
    private LineChartModel grafico;
48
 
49
    private final DateTimeFormatter HORA_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
50
 
51
    private Double capitalInicial;
52
    private Double capitalFinal;
53
    private Double retornoPercentual;
54
    private List<Trade> trades;
55
    private List<Candle> candles; // guardar os candles gerados
56
//    private List<TriggerFinder.TriggerPattern> gatilhos; // padrões encontrados
57
 
58
    public CandleCollectorBean() {
59
    }
60
 
61
    public List<AtivoAnaliseDTO> getAtivosAnalise() {
62
        return ativosAnalise;
63
    }
64
 
65
    public Double getCapitalInicial() {
66
                return capitalInicial;
67
        }
68
    public void setCapitalInicial(Double capitalInicial) {
69
                this.capitalInicial = capitalInicial;
70
        }
71
 
72
    public Double getCapitalFinal() {
73
                return capitalFinal;
74
        }
75
    public void setCapitalFinal(Double capitalFinal) {
76
                this.capitalFinal = capitalFinal;
77
        }
78
 
79
    public Double getRetornoPercentual() {
80
                return retornoPercentual;
81
        }
82
    public void setRetornoPercentual(Double retornoPercentual) {
83
                this.retornoPercentual = retornoPercentual;
84
        }
85
 
86
    public List<Trade> getTrades() {
87
                return trades;
88
        }
89
    public void setTrades(List<Trade> trades) {
90
                this.trades = trades;
91
        }
92
 
93
    public List<Candle> getCandles() {
94
                return candles;
95
        }
96
    public void setCandles(List<Candle> candles) {
97
                this.candles = candles;
98
        }
99
 
100
    public List<PadraoGatilho> getGatilhos() {
101
                return gatilhos;
102
        }
103
    public void setGatilhos(List<PadraoGatilho> gatilhos) {
104
                this.gatilhos = gatilhos;
105
        }
106
 
107
    public LineChartModel getGrafico() {
108
                return grafico;
109
        }
110
    public void setGrafico(LineChartModel grafico) {
111
                this.grafico = grafico;
112
        }
113
 
114
    public void executar() {
115
        CandleExcelReader reader = new CandleExcelReader();
116
        try {
117
            List<Candle> candles = reader.lerCandles("/dados.xls");
118
            System.out.println("Qtd candles lidos: " + candles.size());
119
            setCandles(candles);
120
        } catch (IOException e) {
121
            e.printStackTrace();
122
        }
123
 
124
        // 2) Estratégias
125
//        Strategy strategy = new MovingAverageCrossoverStrategy(fastPeriod, slowPeriod);
126
        FibonacciService fiboService = new FibonacciService();
127
        Strategy strategy = new EstrategiaGatilhoTipo3(fiboService);
128
 
129
        // 3) Backtest
130
        BacktestEngine engine = new BacktestEngine();
131
        BacktestSummary summary = engine.runBacktest(candles, strategy);
132
 
133
        System.out.println("===== RESULTADO BACKTEST GATILHO 3 =====");
134
        System.out.println("Trades executados: " + summary.getNumTradesExecutados());
135
        System.out.println("Total P/L: " + summary.getTotalPnl());
136
        System.out.println("WinRate: " + summary.getWinRate() + " %");
137
        System.out.println("Max Drawdown: " + summary.getMaxDrawdown());
138
 
139
//        this.trades = result.getTrades();
140
 
141
        // Gatilhos
142
//        TriggerFinder finder = new TriggerFinder();
143
//        setGatilhos(finder.findTriggers(getCandles()));
144
        DetectorGatilhos detector = new DetectorGatilhos();
145
 
146
        List<PadraoGatilho> padroes = detector.identificarPadroes(candles);
147
        for (PadraoGatilho p : padroes) {
148
                if (p.getGatilho1() != null && p.getGatilho2() != null && p.getGatilho3() != null && p.getGatilho4() == null) {
149
                    System.out.println("=== GATILHOS ENCONTRADOS ===");
150
                    System.out.println("Referência: [" + p.getReferencia().getContador() + "] " + p.getReferencia().getTime());
151
                    if (p.getGatilho1() != null) System.out.println("Gatilho 1: [" + p.getGatilho1().getContador() + "] " + p.getGatilho1().getTime());
152
                    if (p.getGatilho2() != null) System.out.println("Gatilho 2: [" + p.getGatilho2().getContador() + "] " + p.getGatilho2().getTime());
153
                    if (p.getGatilho3() != null) System.out.println("Gatilho 3: [" + p.getGatilho3().getContador() + "] " + p.getGatilho3().getTime());
154
                    if (p.getGatilho4() != null) System.out.println("Gatilho 4: [" + p.getGatilho4().getContador() + "] " + p.getGatilho4().getTime());
155
                }
156
        }
157
 
158
        /*
159
//        Modo monitor/tempo real (com logs opcionais)
160
        for (int i = 0; i < candles.size(); i++) {
161
            List<String> logs = detector.processarCandle(candles, i);
162
 
163
            // Se quiser tratar os logs em tela (JSF, etc.)
164
            for (String msg : logs) {
165
                // exibir em um painel de logs, gravar em arquivo, etc.
166
            }
167
        }
168
*/
169
 
170
        /*
171
        for (PadraoGatilho p : padroes) {
172
            System.out.println("=== PADRÃO ENCONTRADO ===");
173
            System.out.println("Referência: " + p.getReferencia().getTime());
174
            if (p.getGatilho1() != null) System.out.println("Gatilho 1: " + p.getGatilho1().getTime());
175
            if (p.getGatilho2() != null) System.out.println("Gatilho 2: " + p.getGatilho2().getTime());
176
            if (p.getGatilho3() != null) System.out.println("Gatilho 3: " + p.getGatilho3().getTime());
177
            if (p.getGatilho4() != null) System.out.println("Gatilho 4: " + p.getGatilho4().getTime());
178
        }
179
        */
180
 
181
        // Fundos/Topos predominantes
182
//        SwingLevelDetector levelDetector = new SwingLevelDetector();
183
//        this.niveisPredominantes = levelDetector.detectPredominantLevels(candles);
184
 
185
        // Monta gráfico
186
        montarGraficoPadroes();
187
    }
188
 
189
    private void montarGraficoPadroes() {
190
        // 🔹 1) Obter candles – aqui estou gerando exemplo
191
        //    No seu cenário real, você vai puxar do histórico (mini índice, etc.)
192
        List<Candle> candles = gerarCandlesExemploPadroes();
193
 
194
        // 🔹 2) Detectar padrões com a classe DetectorGatilhos
195
        DetectorGatilhos detector = new DetectorGatilhos();
196
        List<PadraoGatilho> padroes = detector.identificarPadroes(candles);
197
 
198
        // 🔹 3) Montar gráfico
199
        grafico = new LineChartModel();
200
 
201
        // Série de preço (fechamento)
202
        LineChartSeries seriePreco = new LineChartSeries();
203
        seriePreco.setLabel("Fechamento");
204
        seriePreco.setShowLine(true);
205
        seriePreco.setFill(false);
206
 
207
        for (int i = 0; i < candles.size(); i++) {
208
            Candle c = candles.get(i);
209
            // eixo X = índice do candle (0,1,2,...)
210
            seriePreco.set(i, c.getFechamento());
211
        }
212
 
213
        // Séries de marcadores – uma para cada tipo
214
        LineChartSeries serieRef = new LineChartSeries();
215
        serieRef.setLabel("Ref");
216
        serieRef.setShowLine(false);      // só marcadores
217
        serieRef.setMarkerStyle("diamond");
218
 
219
        LineChartSeries serieG1 = new LineChartSeries();
220
        serieG1.setLabel("G1");
221
        serieG1.setShowLine(false);
222
        serieG1.setMarkerStyle("circle");
223
 
224
        LineChartSeries serieG2 = new LineChartSeries();
225
        serieG2.setLabel("G2");
226
        serieG2.setShowLine(false);
227
        serieG2.setMarkerStyle("triangle");
228
 
229
        LineChartSeries serieG3 = new LineChartSeries();
230
        serieG3.setLabel("G3");
231
        serieG3.setShowLine(false);
232
        serieG3.setMarkerStyle("square");
233
 
234
        LineChartSeries serieG4 = new LineChartSeries();
235
        serieG4.setLabel("G4");
236
        serieG4.setShowLine(false);
237
        serieG4.setMarkerStyle("x");
238
 
239
        // 🔹 4) Preencher as séries de marcadores com base nos padrões encontrados
240
        for (PadraoGatilho p : padroes) {
241
            if (p.getReferencia() != null) {
242
                int idx = candles.indexOf(p.getReferencia());
243
                if (idx >= 0) {
244
                    serieRef.set(idx, candles.get(idx).getFechamento());
245
                }
246
            }
247
            if (p.getGatilho1() != null) {
248
                int idx = candles.indexOf(p.getGatilho1());
249
                if (idx >= 0) {
250
                    serieG1.set(idx, candles.get(idx).getFechamento());
251
                }
252
            }
253
            if (p.getGatilho2() != null) {
254
                int idx = candles.indexOf(p.getGatilho2());
255
                if (idx >= 0) {
256
                    serieG2.set(idx, candles.get(idx).getFechamento());
257
                }
258
            }
259
            if (p.getGatilho3() != null) {
260
                int idx = candles.indexOf(p.getGatilho3());
261
                if (idx >= 0) {
262
                    serieG3.set(idx, candles.get(idx).getFechamento());
263
                }
264
            }
265
            if (p.getGatilho4() != null) {
266
                int idx = candles.indexOf(p.getGatilho4());
267
                if (idx >= 0) {
268
                    serieG4.set(idx, candles.get(idx).getFechamento());
269
                }
270
            }
271
        }
272
 
273
        // 🔹 5) Adiciona todas as séries ao modelo
274
        grafico.addSeries(seriePreco);
275
        grafico.addSeries(serieRef);
276
        grafico.addSeries(serieG1);
277
        grafico.addSeries(serieG2);
278
        grafico.addSeries(serieG3);
279
        grafico.addSeries(serieG4);
280
 
281
        grafico.setTitle("Preço + Gatilhos (Ref / G1 / G2 / G3 / G4)");
282
        grafico.setLegendPosition("e");
283
        grafico.setAnimate(true);
284
        grafico.setZoom(true);
285
 
286
        Axis xAxis = grafico.getAxis(AxisType.X);
287
        xAxis.setLabel("Índice do Candle");
288
 
289
        Axis yAxis = grafico.getAxis(AxisType.Y);
290
        yAxis.setLabel("Preço");
291
    }
292
 
293
    // Gerador de candles só pra exemplo – troque por seu histórico real
294
    private List<Candle> gerarCandlesExemploPadroes() {
295
        List<Candle> lista = new ArrayList<>();
296
        LocalDateTime t = LocalDateTime.now().minusMinutes(200);
297
 
298
        for (int i = 0; i < 200; i++) {
299
            double open = 100 + Math.sin(i / 10.0) * 5 + i * 0.05;
300
            double close = open + (Math.random() - 0.5) * 2.0;
301
            double high = Math.max(open, close) + Math.random();
302
            double low = Math.min(open, close) - Math.random();
303
 
304
            lista.add(new Candle(
305
                    t.plusMinutes(i),
306
                    open,
307
                    high,
308
                    low,
309
                    close,
310
                    1000L + i * 10,
311
                    Timeframe.M5
312
            ));
313
        }
314
        return lista;
315
    }
316
 
317
}