package br.com.ec.controller;
import java.io.IOException;
import java.io.Serializable;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ViewScoped;
import javax.inject.Named;
import br.com.kronus.core.Candle;
import br.com.kronus.core.DetectorGatilhos;
import br.com.kronus.core.PadraoGatilho;
import br.com.kronus.fibo.FibonacciService;
import br.com.kronus.strategy.EstrategiaGatilhoTipo3;
import br.com.kronus.strategy.ResultadoEstrategiaGatilho3;
import br.com.robo.sim.CandleExcelReader;
@Named
@ViewScoped
public class AnaliseTempoRealBean
implements Serializable {
private static final long serialVersionUID = 1L
;
// Lista completa de candles lidos do Excel (histórico)
private List<Candle
> candlesExcel
;
// Lista dos candles já "liberados" na simulação em tempo real
private List<Candle
> candlesProcessados
;
// Controle de índice do próximo candle a ser analisado
private int proximoIndice
;
// Detector de padrões de gatilhos (GR, G1, G2, G3, G4)
private DetectorGatilhos detector
;
// Estratégia específica do Gatilho Tipo 3
private EstrategiaGatilhoTipo3 estrategiaGatilhoTipo3
;
// Resultados das operações/ simulações da estratégia
private List<ResultadoEstrategiaGatilho3
> resultadosEstrategia
;
// Mensagem de status para exibir no dashboard
private String statusMensagem
;
// Flag para saber se já terminou de analisar todo o arquivo
private boolean analiseConcluida
;
// Caminho ou nome do recurso do Excel
private String caminhoExcel =
"/dados.xls";
@PostConstruct
public void init
() {
this.
candlesProcessados =
new ArrayList<>();
this.
resultadosEstrategia =
new ArrayList<>();
this.
proximoIndice =
0;
this.
analiseConcluida =
false;
// Detector com logs ativados (se quiser desligar, use false)
this.
detector =
new DetectorGatilhos
(true);
// Estratégia do gatilho 3
FibonacciService fiboService =
new FibonacciService
();
this.
estrategiaGatilhoTipo3 =
new EstrategiaGatilhoTipo3
(fiboService
);
carregarCandlesDoExcel
();
}
/**
* Lê todos os candles do Excel (histórico completo).
* Aqui você ajusta o LeitorExcelCandles conforme sua implementação.
*/
private void carregarCandlesDoExcel
() {
try {
CandleExcelReader reader =
new CandleExcelReader
();
try {
List<Candle
> candles = reader.
lerCandles(caminhoExcel
);
System.
out.
println("Qtd candles lidos: " + candles.
size());
this.
candlesExcel = candles
;
} catch (IOException e
) {
e.
printStackTrace();
}
if (candlesExcel ==
null || candlesExcel.
isEmpty()) {
statusMensagem =
"Nenhum candle encontrado no Excel.";
analiseConcluida =
true;
} else {
statusMensagem =
"Arquivo carregado. Total de candles: " + candlesExcel.
size();
}
} catch (Exception e
) {
e.
printStackTrace();
statusMensagem =
"Erro ao carregar candles do Excel: " + e.
getMessage();
analiseConcluida =
true;
}
}
/**
* Método chamado a cada minuto (via p:poll, scheduler, botão, etc.)
* Simula a chegada de UM novo candle do mercado,
* executa o detector em modo tempo real,
* e, ao encontrar um G3, dispara a EstrategiaGatilhoTipo3.
*/
public void analisarEmTempoReal
() {
if (analiseConcluida
) {
// Já processou tudo
return;
}
if (candlesExcel ==
null || candlesExcel.
isEmpty()) {
statusMensagem =
"Sem candles para analisar.";
analiseConcluida =
true;
return;
}
if (proximoIndice
>= candlesExcel.
size()) {
statusMensagem =
"Todos os candles do arquivo já foram analisados.";
analiseConcluida =
true;
return;
}
// "Chegou" um candle novo
Candle novoCandle = candlesExcel.
get(proximoIndice
);
candlesProcessados.
add(novoCandle
);
proximoIndice++
;
statusMensagem =
String.
format(
"Novo candle lido: %s | Total processado: %d/%d",
novoCandle.
getTime(),
proximoIndice,
candlesExcel.
size()
);
// Chama o detector em modo tempo real
PadraoGatilho padrao = detector.
processarCandleTempoReal(candlesProcessados
);
if (padrao
!=
null) {
// Só nos interessa quando tiver Gatilho 3 identificado
if (padrao.
getGatilho3() !=
null) {
try {
ResultadoEstrategiaGatilho3 resultado =
estrategiaGatilhoTipo3.
executarEstrategia(padrao, candlesProcessados
);
resultadosEstrategia.
add(resultado
);
statusMensagem =
String.
format(
"Padrão encontrado! GR: %s | G1: %s | G2: %s | G3: %s | Operação executada.",
padrao.
getReferencia().
getTime(),
padrao.
getGatilho1().
getTime(),
padrao.
getGatilho2().
getTime(),
padrao.
getGatilho3().
getTime()
);
} catch (Exception e
) {
e.
printStackTrace();
statusMensagem =
"Erro ao executar EstrategiaGatilhoTipo3: " + e.
getMessage();
}
} else {
// Encontrou padrão sem G3 (ex: padrão que morre antes de completar)
statusMensagem =
"Padrão identificado sem G3 completo. Aguardando próximo candle.";
}
}
}
// ============================================================
// GETTERS / SETTERS para o JSF
// ============================================================
public List<Candle
> getCandlesProcessados
() {
return candlesProcessados
;
}
public List<ResultadoEstrategiaGatilho3
> getResultadosEstrategia
() {
return resultadosEstrategia
;
}
public String getStatusMensagem
() {
return statusMensagem
;
}
public boolean isAnaliseConcluida
() {
return analiseConcluida
;
}
public String getCaminhoExcel
() {
return caminhoExcel
;
}
public void setCaminhoExcel
(String caminhoExcel
) {
this.
caminhoExcel = caminhoExcel
;
}
}