package br.com.kronus.strategy;
import br.com.kronus.core.Candle;
import br.com.kronus.core.SinalDeTrade;
import br.com.kronus.fibo.FibonacciService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class EstrategiaGatilhoTipo2
implements Strategy
{
private final FibonacciService fibonacciService
;
public EstrategiaGatilhoTipo2
(FibonacciService fibonacciService
) {
this.
fibonacciService = fibonacciService
;
}
@
Override
public List<SinalDeTrade
> gerarSinais
(List<Candle
> candles
) {
List<SinalDeTrade
> sinais =
new ArrayList<>();
if (candles ==
null || candles.
size() < 5) {
return sinais
;
}
for (int i =
2; i
< candles.
size(); i++
) {
Candle cAtual = candles.
get(i
);
if (isFundoLocal
(candles, i -
2)) {
int idxRef = i -
2;
Candle ref = candles.
get(idxRef
);
for (int j = idxRef +
1; j
<= i
; j++
) {
Candle potencialGatilho = candles.
get(j
);
if (isGatilhoTipo2Alta
(ref, potencialGatilho
)) {
double fundoRef = ref.
getMinima();
double topoGatilho = potencialGatilho.
getMaxima();
Map<Double,
Double> niveisPreco =
fibonacciService.
calcularFiboPreco(fundoRef, topoGatilho
);
Double precoEntrada = niveisPreco.
get(0.5);
Double alvo = niveisPreco.
get(1.0);
double stop = fundoRef
;
if (precoEntrada
!=
null && alvo
!=
null) {
SinalDeTrade sinal =
new SinalDeTrade
(
SinalDeTrade.
Direcao.
COMPRA,
potencialGatilho.
getTime(),
precoEntrada,
stop,
alvo
);
sinais.
add(sinal
);
}
}
}
}
}
return sinais
;
}
private boolean isFundoLocal
(List<Candle
> candles,
int idx
) {
if (idx
<=
0 || idx
>= candles.
size() -
1) {
return false;
}
Candle anterior = candles.
get(idx -
1);
Candle atual = candles.
get(idx
);
Candle proximo = candles.
get(idx +
1);
return atual.
getMinima() < anterior.
getMinima()
&& atual.
getMinima() < proximo.
getMinima();
}
private boolean isGatilhoTipo2Alta
(Candle referencia, Candle gatilho
) {
boolean compradorNaRegiaoRef = gatilho.
isCandleComprador()
&& gatilho.
getMaxima() <= referencia.
getMaxima()
&& gatilho.
getMinima() >= referencia.
getMinima();
boolean vendedorRompendoComPavio = gatilho.
isCandleVendedor()
&& gatilho.
getMinima() < referencia.
getMinima();
return compradorNaRegiaoRef || vendedorRompendoComPavio
;
}
}