Subversion Repositories Integrator Subversion

Rev

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

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;
    }
}