Subversion Repositories Integrator Subversion

Rev

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

package br.com.robo.strategy;

import br.com.robo.model.Candle;

import java.util.List;

public class MovingAverageCrossoverStrategy implements Strategy {

    private int fastPeriod;
    private int slowPeriod;

    public MovingAverageCrossoverStrategy(int fastPeriod, int slowPeriod) {
        this.fastPeriod = fastPeriod;
        this.slowPeriod = slowPeriod;
    }

    private double mediaMovel(List<Candle> candles, int index, int period) {
        if (index + 1 < period) {
            return Double.NaN; // ainda não tem dados suficientes
        }

        double sum = 0.0;
        for (int i = index; i > index - period; i--) {
            sum += candles.get(i).getClose();
        }
        return sum / period;
    }

    @Override
    public Signal decide(int index, List<Candle> candles, boolean hasPosition) {
        if (index == 0) {
            return Signal.HOLD;
        }

        double fast = mediaMovel(candles, index, fastPeriod);
        double slow = mediaMovel(candles, index, slowPeriod);

        if (Double.isNaN(fast) || Double.isNaN(slow)) {
            return Signal.HOLD;
        }

        double fastPrev = mediaMovel(candles, index - 1, fastPeriod);
        double slowPrev = mediaMovel(candles, index - 1, slowPeriod);

        if (!hasPosition && fastPrev <= slowPrev && fast > slow) {
            return Signal.BUY;
        }

        if (hasPosition && fastPrev >= slowPrev && fast < slow) {
            return Signal.SELL;
        }

        return Signal.HOLD;
    }
}