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.io.Serializable; |
||
| 6 | import java.util.ArrayList; |
||
| 7 | import java.util.ArrayList; |
||
| 8 | import java.util.List; |
||
| 9 | import java.util.List; |
||
| 10 | |||
| 11 | import javax.annotation.PostConstruct; |
||
| 12 | import javax.faces.bean.ViewScoped; |
||
| 13 | import javax.inject.Named; |
||
| 14 | |||
| 15 | import br.com.kronus.core.Candle; |
||
| 16 | import br.com.kronus.core.DetectorGatilhos; |
||
| 17 | import br.com.kronus.core.PadraoGatilho; |
||
| 18 | import br.com.kronus.fibo.FibonacciService; |
||
| 19 | import br.com.kronus.strategy.EstrategiaGatilhoTipo3; |
||
| 20 | import br.com.kronus.strategy.ResultadoEstrategiaGatilho3; |
||
| 21 | import br.com.robo.sim.CandleExcelReader; |
||
| 22 | |||
| 23 | @Named |
||
| 24 | @ViewScoped |
||
| 25 | public class AnaliseTempoRealBean implements Serializable { |
||
| 26 | |||
| 27 | private static final long serialVersionUID = 1L; |
||
| 28 | |||
| 29 | // Lista completa de candles lidos do Excel (histórico) |
||
| 30 | private List<Candle> candlesExcel; |
||
| 31 | |||
| 32 | // Lista dos candles já "liberados" na simulação em tempo real |
||
| 33 | private List<Candle> candlesProcessados; |
||
| 34 | |||
| 35 | // Controle de índice do próximo candle a ser analisado |
||
| 36 | private int proximoIndice; |
||
| 37 | |||
| 38 | // Detector de padrões de gatilhos (GR, G1, G2, G3, G4) |
||
| 39 | private DetectorGatilhos detector; |
||
| 40 | |||
| 41 | // Estratégia específica do Gatilho Tipo 3 |
||
| 42 | private EstrategiaGatilhoTipo3 estrategiaGatilhoTipo3; |
||
| 43 | |||
| 44 | // Resultados das operações/ simulações da estratégia |
||
| 45 | private List<ResultadoEstrategiaGatilho3> resultadosEstrategia; |
||
| 46 | |||
| 47 | // Mensagem de status para exibir no dashboard |
||
| 48 | private String statusMensagem; |
||
| 49 | |||
| 50 | // Flag para saber se já terminou de analisar todo o arquivo |
||
| 51 | private boolean analiseConcluida; |
||
| 52 | |||
| 53 | // Caminho ou nome do recurso do Excel |
||
| 54 | private String caminhoExcel = "/dados.xls"; |
||
| 55 | |||
| 56 | @PostConstruct |
||
| 57 | public void init() { |
||
| 58 | this.candlesProcessados = new ArrayList<>(); |
||
| 59 | this.resultadosEstrategia = new ArrayList<>(); |
||
| 60 | this.proximoIndice = 0; |
||
| 61 | this.analiseConcluida = false; |
||
| 62 | |||
| 63 | // Detector com logs ativados (se quiser desligar, use false) |
||
| 64 | this.detector = new DetectorGatilhos(true); |
||
| 65 | |||
| 66 | // Estratégia do gatilho 3 |
||
| 67 | FibonacciService fiboService = new FibonacciService(); |
||
| 68 | this.estrategiaGatilhoTipo3 = new EstrategiaGatilhoTipo3(fiboService); |
||
| 69 | |||
| 70 | carregarCandlesDoExcel(); |
||
| 71 | } |
||
| 72 | |||
| 73 | /** |
||
| 74 | * Lê todos os candles do Excel (histórico completo). |
||
| 75 | * Aqui você ajusta o LeitorExcelCandles conforme sua implementação. |
||
| 76 | */ |
||
| 77 | private void carregarCandlesDoExcel() { |
||
| 78 | try { |
||
| 79 | CandleExcelReader reader = new CandleExcelReader(); |
||
| 80 | try { |
||
| 81 | List<Candle> candles = reader.lerCandles(caminhoExcel); |
||
| 82 | System.out.println("Qtd candles lidos: " + candles.size()); |
||
| 83 | this.candlesExcel = candles; |
||
| 84 | } catch (IOException e) { |
||
| 85 | e.printStackTrace(); |
||
| 86 | } |
||
| 87 | |||
| 88 | if (candlesExcel == null || candlesExcel.isEmpty()) { |
||
| 89 | statusMensagem = "Nenhum candle encontrado no Excel."; |
||
| 90 | analiseConcluida = true; |
||
| 91 | } else { |
||
| 92 | statusMensagem = "Arquivo carregado. Total de candles: " + candlesExcel.size(); |
||
| 93 | } |
||
| 94 | } catch (Exception e) { |
||
| 95 | e.printStackTrace(); |
||
| 96 | statusMensagem = "Erro ao carregar candles do Excel: " + e.getMessage(); |
||
| 97 | analiseConcluida = true; |
||
| 98 | } |
||
| 99 | } |
||
| 100 | |||
| 101 | /** |
||
| 102 | * Método chamado a cada minuto (via p:poll, scheduler, botão, etc.) |
||
| 103 | * Simula a chegada de UM novo candle do mercado, |
||
| 104 | * executa o detector em modo tempo real, |
||
| 105 | * e, ao encontrar um G3, dispara a EstrategiaGatilhoTipo3. |
||
| 106 | */ |
||
| 107 | public void analisarEmTempoReal() { |
||
| 108 | if (analiseConcluida) { |
||
| 109 | // Já processou tudo |
||
| 110 | return; |
||
| 111 | } |
||
| 112 | |||
| 113 | if (candlesExcel == null || candlesExcel.isEmpty()) { |
||
| 114 | statusMensagem = "Sem candles para analisar."; |
||
| 115 | analiseConcluida = true; |
||
| 116 | return; |
||
| 117 | } |
||
| 118 | |||
| 119 | if (proximoIndice >= candlesExcel.size()) { |
||
| 120 | statusMensagem = "Todos os candles do arquivo já foram analisados."; |
||
| 121 | analiseConcluida = true; |
||
| 122 | return; |
||
| 123 | } |
||
| 124 | |||
| 125 | // "Chegou" um candle novo |
||
| 126 | Candle novoCandle = candlesExcel.get(proximoIndice); |
||
| 127 | candlesProcessados.add(novoCandle); |
||
| 128 | proximoIndice++; |
||
| 129 | |||
| 130 | statusMensagem = String.format( |
||
| 131 | "Novo candle lido: %s | Total processado: %d/%d", |
||
| 132 | novoCandle.getTime(), |
||
| 133 | proximoIndice, |
||
| 134 | candlesExcel.size() |
||
| 135 | ); |
||
| 136 | |||
| 137 | // Chama o detector em modo tempo real |
||
| 138 | PadraoGatilho padrao = detector.processarCandleTempoReal(candlesProcessados); |
||
| 139 | |||
| 140 | if (padrao != null) { |
||
| 141 | // Só nos interessa quando tiver Gatilho 3 identificado |
||
| 142 | if (padrao.getGatilho3() != null) { |
||
| 143 | try { |
||
| 144 | ResultadoEstrategiaGatilho3 resultado = |
||
| 145 | estrategiaGatilhoTipo3.executarEstrategia(padrao, candlesProcessados); |
||
| 146 | |||
| 147 | resultadosEstrategia.add(resultado); |
||
| 148 | |||
| 149 | statusMensagem = String.format( |
||
| 150 | "Padrão encontrado! GR: %s | G1: %s | G2: %s | G3: %s | Operação executada.", |
||
| 151 | padrao.getReferencia().getTime(), |
||
| 152 | padrao.getGatilho1().getTime(), |
||
| 153 | padrao.getGatilho2().getTime(), |
||
| 154 | padrao.getGatilho3().getTime() |
||
| 155 | ); |
||
| 156 | } catch (Exception e) { |
||
| 157 | e.printStackTrace(); |
||
| 158 | statusMensagem = "Erro ao executar EstrategiaGatilhoTipo3: " + e.getMessage(); |
||
| 159 | } |
||
| 160 | } else { |
||
| 161 | // Encontrou padrão sem G3 (ex: padrão que morre antes de completar) |
||
| 162 | statusMensagem = "Padrão identificado sem G3 completo. Aguardando próximo candle."; |
||
| 163 | } |
||
| 164 | } |
||
| 165 | } |
||
| 166 | |||
| 167 | // ============================================================ |
||
| 168 | // GETTERS / SETTERS para o JSF |
||
| 169 | // ============================================================ |
||
| 170 | |||
| 171 | public List<Candle> getCandlesProcessados() { |
||
| 172 | return candlesProcessados; |
||
| 173 | } |
||
| 174 | |||
| 175 | public List<ResultadoEstrategiaGatilho3> getResultadosEstrategia() { |
||
| 176 | return resultadosEstrategia; |
||
| 177 | } |
||
| 178 | |||
| 179 | public String getStatusMensagem() { |
||
| 180 | return statusMensagem; |
||
| 181 | } |
||
| 182 | |||
| 183 | public boolean isAnaliseConcluida() { |
||
| 184 | return analiseConcluida; |
||
| 185 | } |
||
| 186 | |||
| 187 | public String getCaminhoExcel() { |
||
| 188 | return caminhoExcel; |
||
| 189 | } |
||
| 190 | |||
| 191 | public void setCaminhoExcel(String caminhoExcel) { |
||
| 192 | this.caminhoExcel = caminhoExcel; |
||
| 193 | } |
||
| 194 | |||
| 195 | } |