package org.ripple.power.hft; import org.ripple.power.hft.computer.MAComputer; import org.ripple.power.hft.def.HPeriod; import org.ripple.power.hft.def.IHStatistics; /** * MA算法仅适用于长期均线趋势变化明显,转向少的情况,如果长期均线有大量whipsaws,不适合 */ public class MAEntrySignalGenerator implements EntrySignalGenerator { private int shortPeriod; private int longPeriod; private int shortPeriodType; private int longPeriodType; private int maRecentPeriod; public MAEntrySignalGenerator() { } public MAEntrySignalGenerator(int shortPeriod, int longPeriod, int shortPeriodType, int longPeriodType, int maRecentPeriod) { super(); this.shortPeriod = shortPeriod; this.longPeriod = longPeriod; this.shortPeriodType = shortPeriodType; this.longPeriodType = longPeriodType; this.maRecentPeriod = maRecentPeriod; } public double generateSignal(IHStatistics stat) { // 储存进去对应的数组 double[] closeShort = stat.history(shortPeriod + maRecentPeriod, HPeriod.Day) .getClosingPrice(); double[] closeLong = stat.history(longPeriod + maRecentPeriod, HPeriod.Day) .getClosingPrice(); // 计算短期MA double[] shortMA = MAComputer.computeMA(closeShort, shortPeriod, shortPeriodType); // 计算长期MA double[] longMA = MAComputer.computeMA(closeLong, longPeriod, longPeriodType); // 计算当天的短期MA与长期MA的差值 int crossed = 0; double delta = shortMA[0] - longMA[0]; for (int i = 0; i < shortMA.length; i++) { double previousDelta = delta; delta = shortMA[i] - longMA[i]; // 短期MA与长期MA值出现交叉, 短期MA处于下降趋势, 长期MA处于上升趋势 // 简单起见信号强度绝对值统一设置成1 if ((previousDelta > 0) && delta < 0) { crossed = crossed - 1; } // 短期MA与长期MA值出现交叉, 短期MA处于上升趋势,长期MA处于下降趋势 else if ((previousDelta < 0) && delta > 0) { crossed = crossed + 1; } } if (crossed < 0) { return -1; } else if (crossed > 0) { return 1; } // 什么也不做 else { return 0; } } }