package org.ripple.power.hft;
import org.ripple.power.hft.def.HPeriod;
import org.ripple.power.hft.def.IHStatistics;
import org.ripple.power.hft.def.IHStatisticsHistory;
import com.tictactec.ta.lib.Core;
import com.tictactec.ta.lib.MAType;
import com.tictactec.ta.lib.MInteger;
public class StochasticsEntrySignalGenerator implements EntrySignalGenerator {
private Core core = new Core();
private int period;
private int maPeriod;
private double oversold;
private double overbought;
@Override
public double generateSignal(IHStatistics stat) {
IHStatisticsHistory history = stat.history(period + 1, HPeriod.Day);
double[] close = history.getClosingPrice();
double[] high = history.getHighPrice();
double[] low = history.getLowPrice();
double[][] result = computeSlowStochastic(close, high, low, period,
maPeriod);
double[] slowK = result[0];
double[] slowD = result[1];
double lastSlowK = slowK[result.length - 2];
double lastSlowD = slowD[result.length - 2];
double currentSlowK = slowK[result.length - 1];
double currentSlowD = slowD[result.length - 1];
// 计算当天的SlowK与SlowD的差值
double previousDelta = lastSlowK - lastSlowD;
double delta = currentSlowK - currentSlowD;
double slowKDelta = currentSlowK - lastSlowK;
// slowK上升, 从下方穿过slowD, slowK > overSold, 买入信号
if (slowKDelta > 0 && previousDelta < 0 && delta > 0
&& currentSlowK > oversold) {
return 1;
}
// slowK下降, 从上方穿过slowD, slowK < overbought, 卖出信号
else if (slowKDelta < 0 && previousDelta > 0 && delta < 0
&& currentSlowK < overbought) {
return -1;
} else {
return 0;
}
}
/**
* 计算SlowStochastic
*
* @param close
* @param high
* @param low
* @param period
* @param maPeriod
* @return 2维数组, [0]是slowK, [1]是slowD
*/
public double[][] computeSlowStochastic(double[] close, double[] high,
double[] low, int period, int maPeriod) {
MInteger begin = new MInteger();
MInteger length = new MInteger();
int resultLegnth = close.length - period + 1;
double[] slowK = new double[resultLegnth];
double[] slowD = new double[resultLegnth];
double[][] result = new double[2][resultLegnth];
result[0] = slowK;
result[1] = slowD;
core.stoch(0, close.length - 1, high, low, close, period, maPeriod,
MAType.Sma, maPeriod, MAType.Sma, begin, length, slowK, slowD);
return result;
}
}