Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 760 | blopes | 1 | package br.com.robo.strategy; |
| 2 | |||
| 3 | import br.com.robo.model.Candle; |
||
| 4 | |||
| 5 | import java.util.List; |
||
| 6 | |||
| 7 | public class MovingAverageCrossoverStrategy implements Strategy { |
||
| 8 | |||
| 9 | private int fastPeriod; |
||
| 10 | private int slowPeriod; |
||
| 11 | |||
| 12 | public MovingAverageCrossoverStrategy(int fastPeriod, int slowPeriod) { |
||
| 13 | this.fastPeriod = fastPeriod; |
||
| 14 | this.slowPeriod = slowPeriod; |
||
| 15 | } |
||
| 16 | |||
| 17 | private double mediaMovel(List<Candle> candles, int index, int period) { |
||
| 18 | if (index + 1 < period) { |
||
| 19 | return Double.NaN; // ainda não tem dados suficientes |
||
| 20 | } |
||
| 21 | |||
| 22 | double sum = 0.0; |
||
| 23 | for (int i = index; i > index - period; i--) { |
||
| 24 | sum += candles.get(i).getClose(); |
||
| 25 | } |
||
| 26 | return sum / period; |
||
| 27 | } |
||
| 28 | |||
| 29 | @Override |
||
| 30 | public Signal decide(int index, List<Candle> candles, boolean hasPosition) { |
||
| 31 | if (index == 0) { |
||
| 32 | return Signal.HOLD; |
||
| 33 | } |
||
| 34 | |||
| 35 | double fast = mediaMovel(candles, index, fastPeriod); |
||
| 36 | double slow = mediaMovel(candles, index, slowPeriod); |
||
| 37 | |||
| 38 | if (Double.isNaN(fast) || Double.isNaN(slow)) { |
||
| 39 | return Signal.HOLD; |
||
| 40 | } |
||
| 41 | |||
| 42 | double fastPrev = mediaMovel(candles, index - 1, fastPeriod); |
||
| 43 | double slowPrev = mediaMovel(candles, index - 1, slowPeriod); |
||
| 44 | |||
| 45 | if (!hasPosition && fastPrev <= slowPrev && fast > slow) { |
||
| 46 | return Signal.BUY; |
||
| 47 | } |
||
| 48 | |||
| 49 | if (hasPosition && fastPrev >= slowPrev && fast < slow) { |
||
| 50 | return Signal.SELL; |
||
| 51 | } |
||
| 52 | |||
| 53 | return Signal.HOLD; |
||
| 54 | } |
||
| 55 | } |