Subversion Repositories Integrator Subversion

Rev

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

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 KronusSimuladorBean 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 KronusSimuladorBean() {
    }
   
    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;
    }

}