package br.com.ec.controller;
import java.io.IOException;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.chart.Axis;
import org.primefaces.model.chart.AxisType;
import org.primefaces.model.chart.LineChartModel;
import org.primefaces.model.chart.LineChartSeries;
import br.com.ec.domain.dto.AtivoAnaliseDTO;
import br.com.ec.domain.dto.TradeDTO;
import br.com.kronus.core.BacktestEngine;
import br.com.kronus.core.BacktestSummary;
import br.com.kronus.core.Candle;
import br.com.kronus.core.DetectorGatilhos;
import br.com.kronus.core.PadraoGatilho;
import br.com.kronus.core.Timeframe;
import br.com.kronus.fibo.FibonacciService;
import br.com.kronus.strategy.EstrategiaGatilhoTipo3;
import br.com.kronus.strategy.Strategy;
import br.com.robo.model.Trade;
import br.com.robo.model.TriggerFinder;
import br.com.robo.sim.CandleExcelReader;
@ManagedBean
(name =
"kronusSimuladorBean")
@ViewScoped
public class CandleCollectorBean
implements Serializable {
private double plDia
;
private int numeroTrades
;
private double taxaAcerto
;
private List<TradeDTO
> tradesDoDia
;
private LineChartModel plDiaChart
;
private List<AtivoAnaliseDTO
> ativosAnalise
;
private List<PadraoGatilho
> gatilhos
;
private LineChartModel grafico
;
private final DateTimeFormatter HORA_FORMATTER = DateTimeFormatter.
ofPattern("HH:mm");
private Double capitalInicial
;
private Double capitalFinal
;
private Double retornoPercentual
;
private List<Trade
> trades
;
private List<Candle
> candles
; // guardar os candles gerados
// private List<TriggerFinder.TriggerPattern> gatilhos; // padrões encontrados
public CandleCollectorBean
() {
}
public List<AtivoAnaliseDTO
> getAtivosAnalise
() {
return ativosAnalise
;
}
public Double getCapitalInicial
() {
return capitalInicial
;
}
public void setCapitalInicial
(Double capitalInicial
) {
this.
capitalInicial = capitalInicial
;
}
public Double getCapitalFinal
() {
return capitalFinal
;
}
public void setCapitalFinal
(Double capitalFinal
) {
this.
capitalFinal = capitalFinal
;
}
public Double getRetornoPercentual
() {
return retornoPercentual
;
}
public void setRetornoPercentual
(Double retornoPercentual
) {
this.
retornoPercentual = retornoPercentual
;
}
public List<Trade
> getTrades
() {
return trades
;
}
public void setTrades
(List<Trade
> trades
) {
this.
trades = trades
;
}
public List<Candle
> getCandles
() {
return candles
;
}
public void setCandles
(List<Candle
> candles
) {
this.
candles = candles
;
}
public List<PadraoGatilho
> getGatilhos
() {
return gatilhos
;
}
public void setGatilhos
(List<PadraoGatilho
> gatilhos
) {
this.
gatilhos = gatilhos
;
}
public LineChartModel getGrafico
() {
return grafico
;
}
public void setGrafico
(LineChartModel grafico
) {
this.
grafico = grafico
;
}
public void executar
() {
CandleExcelReader reader =
new CandleExcelReader
();
try {
List<Candle
> candles = reader.
lerCandles("/dados.xls");
System.
out.
println("Qtd candles lidos: " + candles.
size());
setCandles
(candles
);
} catch (IOException e
) {
e.
printStackTrace();
}
// 2) Estratégias
// Strategy strategy = new MovingAverageCrossoverStrategy(fastPeriod, slowPeriod);
FibonacciService fiboService =
new FibonacciService
();
Strategy strategy =
new EstrategiaGatilhoTipo3
(fiboService
);
// 3) Backtest
BacktestEngine engine =
new BacktestEngine
();
BacktestSummary summary = engine.
runBacktest(candles, strategy
);
System.
out.
println("===== RESULTADO BACKTEST GATILHO 3 =====");
System.
out.
println("Trades executados: " + summary.
getNumTradesExecutados());
System.
out.
println("Total P/L: " + summary.
getTotalPnl());
System.
out.
println("WinRate: " + summary.
getWinRate() +
" %");
System.
out.
println("Max Drawdown: " + summary.
getMaxDrawdown());
// this.trades = result.getTrades();
// Gatilhos
// TriggerFinder finder = new TriggerFinder();
// setGatilhos(finder.findTriggers(getCandles()));
DetectorGatilhos detector =
new DetectorGatilhos
();
List<PadraoGatilho
> padroes = detector.
identificarPadroes(candles
);
for (PadraoGatilho p : padroes
) {
if (p.
getGatilho1() !=
null && p.
getGatilho2() !=
null && p.
getGatilho3() !=
null && p.
getGatilho4() ==
null) {
System.
out.
println("=== GATILHOS ENCONTRADOS ===");
System.
out.
println("Referência: [" + p.
getReferencia().
getContador() +
"] " + p.
getReferencia().
getTime());
if (p.
getGatilho1() !=
null) System.
out.
println("Gatilho 1: [" + p.
getGatilho1().
getContador() +
"] " + p.
getGatilho1().
getTime());
if (p.
getGatilho2() !=
null) System.
out.
println("Gatilho 2: [" + p.
getGatilho2().
getContador() +
"] " + p.
getGatilho2().
getTime());
if (p.
getGatilho3() !=
null) System.
out.
println("Gatilho 3: [" + p.
getGatilho3().
getContador() +
"] " + p.
getGatilho3().
getTime());
if (p.
getGatilho4() !=
null) System.
out.
println("Gatilho 4: [" + p.
getGatilho4().
getContador() +
"] " + p.
getGatilho4().
getTime());
}
}
/*
// Modo monitor/tempo real (com logs opcionais)
for (int i = 0; i < candles.size(); i++) {
List<String> logs = detector.processarCandle(candles, i);
// Se quiser tratar os logs em tela (JSF, etc.)
for (String msg : logs) {
// exibir em um painel de logs, gravar em arquivo, etc.
}
}
*/
/*
for (PadraoGatilho p : padroes) {
System.out.println("=== PADRÃO ENCONTRADO ===");
System.out.println("Referência: " + p.getReferencia().getTime());
if (p.getGatilho1() != null) System.out.println("Gatilho 1: " + p.getGatilho1().getTime());
if (p.getGatilho2() != null) System.out.println("Gatilho 2: " + p.getGatilho2().getTime());
if (p.getGatilho3() != null) System.out.println("Gatilho 3: " + p.getGatilho3().getTime());
if (p.getGatilho4() != null) System.out.println("Gatilho 4: " + p.getGatilho4().getTime());
}
*/
// Fundos/Topos predominantes
// SwingLevelDetector levelDetector = new SwingLevelDetector();
// this.niveisPredominantes = levelDetector.detectPredominantLevels(candles);
// Monta gráfico
montarGraficoPadroes
();
}
private void montarGraficoPadroes
() {
// 🔹 1) Obter candles – aqui estou gerando exemplo
// No seu cenário real, você vai puxar do histórico (mini índice, etc.)
List<Candle
> candles = gerarCandlesExemploPadroes
();
// 🔹 2) Detectar padrões com a classe DetectorGatilhos
DetectorGatilhos detector =
new DetectorGatilhos
();
List<PadraoGatilho
> padroes = detector.
identificarPadroes(candles
);
// 🔹 3) Montar gráfico
grafico =
new LineChartModel
();
// Série de preço (fechamento)
LineChartSeries seriePreco =
new LineChartSeries
();
seriePreco.
setLabel("Fechamento");
seriePreco.
setShowLine(true);
seriePreco.
setFill(false);
for (int i =
0; i
< candles.
size(); i++
) {
Candle c = candles.
get(i
);
// eixo X = índice do candle (0,1,2,...)
seriePreco.
set(i, c.
getFechamento());
}
// Séries de marcadores – uma para cada tipo
LineChartSeries serieRef =
new LineChartSeries
();
serieRef.
setLabel("Ref");
serieRef.
setShowLine(false); // só marcadores
serieRef.
setMarkerStyle("diamond");
LineChartSeries serieG1 =
new LineChartSeries
();
serieG1.
setLabel("G1");
serieG1.
setShowLine(false);
serieG1.
setMarkerStyle("circle");
LineChartSeries serieG2 =
new LineChartSeries
();
serieG2.
setLabel("G2");
serieG2.
setShowLine(false);
serieG2.
setMarkerStyle("triangle");
LineChartSeries serieG3 =
new LineChartSeries
();
serieG3.
setLabel("G3");
serieG3.
setShowLine(false);
serieG3.
setMarkerStyle("square");
LineChartSeries serieG4 =
new LineChartSeries
();
serieG4.
setLabel("G4");
serieG4.
setShowLine(false);
serieG4.
setMarkerStyle("x");
// 🔹 4) Preencher as séries de marcadores com base nos padrões encontrados
for (PadraoGatilho p : padroes
) {
if (p.
getReferencia() !=
null) {
int idx = candles.
indexOf(p.
getReferencia());
if (idx
>=
0) {
serieRef.
set(idx, candles.
get(idx
).
getFechamento());
}
}
if (p.
getGatilho1() !=
null) {
int idx = candles.
indexOf(p.
getGatilho1());
if (idx
>=
0) {
serieG1.
set(idx, candles.
get(idx
).
getFechamento());
}
}
if (p.
getGatilho2() !=
null) {
int idx = candles.
indexOf(p.
getGatilho2());
if (idx
>=
0) {
serieG2.
set(idx, candles.
get(idx
).
getFechamento());
}
}
if (p.
getGatilho3() !=
null) {
int idx = candles.
indexOf(p.
getGatilho3());
if (idx
>=
0) {
serieG3.
set(idx, candles.
get(idx
).
getFechamento());
}
}
if (p.
getGatilho4() !=
null) {
int idx = candles.
indexOf(p.
getGatilho4());
if (idx
>=
0) {
serieG4.
set(idx, candles.
get(idx
).
getFechamento());
}
}
}
// 🔹 5) Adiciona todas as séries ao modelo
grafico.
addSeries(seriePreco
);
grafico.
addSeries(serieRef
);
grafico.
addSeries(serieG1
);
grafico.
addSeries(serieG2
);
grafico.
addSeries(serieG3
);
grafico.
addSeries(serieG4
);
grafico.
setTitle("Preço + Gatilhos (Ref / G1 / G2 / G3 / G4)");
grafico.
setLegendPosition("e");
grafico.
setAnimate(true);
grafico.
setZoom(true);
Axis xAxis = grafico.
getAxis(AxisType.
X);
xAxis.
setLabel("Índice do Candle");
Axis yAxis = grafico.
getAxis(AxisType.
Y);
yAxis.
setLabel("Preço");
}
// Gerador de candles só pra exemplo – troque por seu histórico real
private List<Candle
> gerarCandlesExemploPadroes
() {
List<Candle
> lista =
new ArrayList<>();
LocalDateTime t = LocalDateTime.
now().
minusMinutes(200);
for (int i =
0; i
< 200; i++
) {
double open =
100 +
Math.
sin(i /
10.0) * 5 + i
* 0.05;
double close = open +
(Math.
random() -
0.5) * 2.0;
double high =
Math.
max(open, close
) +
Math.
random();
double low =
Math.
min(open, close
) -
Math.
random();
lista.
add(new Candle
(
t.
plusMinutes(i
),
open,
high,
low,
close,
1000L + i
* 10,
Timeframe.
M5
));
}
return lista
;
}
}