package stock.simulator.trader.web.indicatrixinterface;
public interface Indicatrix {
/**
* 计算MACD指标数据
*
* @param closePrice--收盘价要从第一天开始
* @param fastPeriod--日快线移动平均,标准为12
* @param slowPeriod--日慢线移动平均,标准为26
* @param signalPeriod--日移动平均,标准为9
* @param macd--顺序记录macd指标
* new double[]
* @param dea--顺序记录dea指标
* new double[]
* @param diff--顺序记录diff指标
* new double[]
*/
void MACD(double[] closePrice, int fastPeriod, int slowPeriod, int signalPeriod, double[] macd, double[] dea,
double[] diff);
/**
* 计算KDJ指标数据
*
* @param maxPrice--最高价要从第一天开始
* @param minPrice--最低价要从第一天开始
* @param closePrice--收盘价要从第一天开始
* @param fastK_Period--标准值:9
* @param slowK_Period--标准值:3
* @param slowD_Period--标准值:3
* @param K--顺序记录K指标
* new double[]
* @param D--顺序记录D指标
* new double[]
* @param J--顺序记录J指标
* new double[]
*/
void KDJ(double[] maxPrice, double[] minPrice, double[] closePrice, int fastK_Period, int slowK_Period,
int slowD_Period, double[] K, double[] D, double[] J);
/**
* 计算RSI指标数据
*
* @param closePrice--收盘价要从第一天开始
* @param rsi1_n--计算rsi1指标,标准为:6
* @param rsi2_n--计算rsi2指标,标准为:12
* @param rsi3_n--计算rsi3指标,标准为:24
* @param rsi1--顺序记录rsi1指标
* new double[]
* @param rsi2--顺序记录rsi2指标
* new double[]
* @param rsi3--顺序记录rsi3指标
* new double[]
*/
void RSI(double[] closePrice, int rsi1_n, int rsi2_n, int rsi3_n, double[] rsi1, double[] rsi2, double[] rsi3);
}
package stock.simulator.trader.web.indicatrixinterfaceimpl
import java.math.BigDecimal
import java.util.ArrayList
import java.util.Arrays
import java.util.HashMap
import java.util.List
import java.util.Map
import org.apache.commons.collections.CollectionUtils
import org.apache.commons.lang3.StringUtils
import org.springframework.stereotype.Service
import stock.simulator.trader.web.data.StockHistoryData
import stock.simulator.trader.web.indicatrixinterface.Indicatrix
import util.DateUtil
import util.Define
import util.MathCaclateUtil
@Service("indicatrix")
public class IndicatrixImpl implements Indicatrix {
@Override
public void MACD(double[] closePrice, int fast, int slow, int signal, double[] macd, double[] dea, double[] diff) {
double preEma_12 = 0
double preEma_26 = 0
double preDEA = 0
double ema_12 = 0
double ema_26 = 0
double fastPeriod = Double.valueOf(new Integer(fast))
double slowPeriod = Double.valueOf(new Integer(slow))
double signalPeriod = Double.valueOf(new Integer(signal))
double DEA = 0
double DIFF = 0
double MACD = 0
for (int i = 0
ema_12 = i == 0 ? closePrice[i]
: MathCaclateUtil.add(
MathCaclateUtil.divide(
MathCaclateUtil.multiply(preEma_12, fastPeriod - 1, BigDecimal.ROUND_HALF_UP),
fastPeriod + 1, BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(
MathCaclateUtil.multiply(closePrice[i], 2D, BigDecimal.ROUND_HALF_UP),
fastPeriod + 1, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
ema_26 = i == 0 ? closePrice[i]
: MathCaclateUtil.add(
MathCaclateUtil.divide(
MathCaclateUtil.multiply(preEma_26, slowPeriod - 1, BigDecimal.ROUND_HALF_UP),
slowPeriod + 1, BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(
MathCaclateUtil.multiply(closePrice[i], 2D, BigDecimal.ROUND_HALF_UP),
slowPeriod + 1, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
DIFF = i == 0 ? 0 : MathCaclateUtil.subtract(ema_12, ema_26, BigDecimal.ROUND_HALF_UP)
DEA = i == 0 ? 0
: MathCaclateUtil.add(
MathCaclateUtil.divide(
MathCaclateUtil.multiply(preDEA, signalPeriod - 1, BigDecimal.ROUND_HALF_UP),
signalPeriod + 1, BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(MathCaclateUtil.multiply(DIFF, 2D, BigDecimal.ROUND_HALF_UP),
signalPeriod + 1, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
MACD = i == 0 ? 0
: MathCaclateUtil.multiply(2D, MathCaclateUtil.subtract(DIFF, DEA, BigDecimal.ROUND_HALF_UP),
BigDecimal.ROUND_HALF_UP)
preEma_12 = ema_12
preEma_26 = ema_26
preDEA = DEA
macd[i] = MACD
dea[i] = DEA
diff[i] = DIFF
}
}
@Override
public void KDJ(double[] maxPrice, double[] minPrice, double[] closePrice, int fastK, int slowK, int slowD,
double[] K_R, double[] D_R, double[] J_R) {
List highestPriceList = new ArrayList<>()
List lowestPriceList = new ArrayList<>()
List highestPriceList_temp = new ArrayList<>()
List lowestPriceList_temp = new ArrayList<>()
double RSV = 0
double fastK_Period = fastK
double slowK_Period = Double.valueOf(new Integer(slowK))
double slowD_Period = Double.valueOf(new Integer(slowD))
double preK = 0
double preD = 0
double K = 0
double D = 0
double J = 0
for (int i = 0
if (highestPriceList.size() == fastK_Period) {
highestPriceList.remove(0)
lowestPriceList.remove(0)
} else if (highestPriceList.size() == 0) {
highestPriceList.add(maxPrice[i])
lowestPriceList.add(minPrice[i])
}
highestPriceList.add(maxPrice[i])
lowestPriceList.add(minPrice[i])
highestPriceList_temp = new ArrayList<>()
lowestPriceList_temp = new ArrayList<>()
highestPriceList_temp.addAll(highestPriceList)
lowestPriceList_temp.addAll(lowestPriceList)
highestPriceList_temp = MathCaclateUtil.sortList(highestPriceList_temp)
lowestPriceList_temp = MathCaclateUtil.sortList(lowestPriceList_temp)
RSV = MathCaclateUtil.multiply(MathCaclateUtil.divide(
MathCaclateUtil.subtract(closePrice[i], lowestPriceList_temp.get(0), BigDecimal.ROUND_HALF_UP),
MathCaclateUtil.subtract(highestPriceList_temp.get(highestPriceList_temp.size() - 1),
lowestPriceList_temp.get(0), BigDecimal.ROUND_HALF_UP),
BigDecimal.ROUND_UNNECESSARY), 100D, BigDecimal.ROUND_HALF_UP)
// 如果无前一日的K、D值
K = MathCaclateUtil.divide(MathCaclateUtil.add(RSV,
MathCaclateUtil.multiply(2D, preK, BigDecimal.ROUND_HALF_UP), BigDecimal.ROUND_HALF_UP),
slowK_Period, BigDecimal.ROUND_UNNECESSARY)
D = MathCaclateUtil.divide(MathCaclateUtil.add(K,
MathCaclateUtil.multiply(2D, preD, BigDecimal.ROUND_HALF_UP), BigDecimal.ROUND_HALF_UP),
slowD_Period, BigDecimal.ROUND_UNNECESSARY)
J = MathCaclateUtil.subtract(MathCaclateUtil.multiply(3D, K, BigDecimal.ROUND_HALF_UP),
MathCaclateUtil.multiply(2D, D, BigDecimal.ROUND_HALF_UP), BigDecimal.ROUND_HALF_UP)
preK = K
preD = D
K_R[i] = K
D_R[i] = D
J_R[i] = J
}
}
@Override
public void RSI(double[] closePrice, int rsi1_n, int rsi2_n, int rsi3_n, double[] rsi1, double[] rsi2,
double[] rsi3) {
double pp_6
double np_6
double pp_12
double np_12
double pp_24
double np_24
double prepp_6 = 0
double prenp_6 = 0
double prepp_12 = 0
double prenp_12 = 0
double prepp_24 = 0
double prenp_24 = 0
double upsanddowns
double n1 = Double.valueOf(new Integer(rsi1_n))
double n2 = Double.valueOf(new Integer(rsi2_n))
double n3 = Double.valueOf(new Integer(rsi3_n))
double num_100 = 100D
double RSI1 = 0
double RSI2 = 0
double RSI3 = 0
for (int i = 0
if (i == 0) {
continue
}
upsanddowns = closePrice[i] - closePrice[i - 1]
pp_6 = MathCaclateUtil.add(
MathCaclateUtil.divide(MathCaclateUtil.multiply(prepp_6, n1 - 1, BigDecimal.ROUND_HALF_UP), n1,
BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(upsanddowns >= 0 ? upsanddowns : 0, n1, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
np_6 = MathCaclateUtil.add(
MathCaclateUtil.divide(MathCaclateUtil.multiply(prenp_6, n1 - 1, BigDecimal.ROUND_HALF_UP), n1,
BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(upsanddowns >= 0 ? 0 : upsanddowns, n1, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
RSI1 = MathCaclateUtil.divide(MathCaclateUtil.multiply(num_100, pp_6, BigDecimal.ROUND_HALF_UP),
MathCaclateUtil.add(pp_6, -np_6, BigDecimal.ROUND_HALF_UP), BigDecimal.ROUND_UNNECESSARY)
rsi1[i] = RSI1
prepp_6 = pp_6
prenp_6 = np_6
pp_12 = MathCaclateUtil.add(
MathCaclateUtil.divide(MathCaclateUtil.multiply(prepp_12, n2 - 1, BigDecimal.ROUND_HALF_UP), n2,
BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(upsanddowns >= 0 ? upsanddowns : 0, n2, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
np_12 = MathCaclateUtil.add(
MathCaclateUtil.divide(MathCaclateUtil.multiply(prenp_12, n2 - 1, BigDecimal.ROUND_HALF_UP), n2,
BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(upsanddowns >= 0 ? 0 : upsanddowns, n2, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
RSI2 = MathCaclateUtil.divide(MathCaclateUtil.multiply(num_100, pp_12, BigDecimal.ROUND_HALF_UP),
MathCaclateUtil.add(pp_12, -np_12, BigDecimal.ROUND_HALF_UP), BigDecimal.ROUND_UNNECESSARY)
rsi2[i] = RSI2
prepp_12 = pp_12
prenp_12 = np_12
pp_24 = MathCaclateUtil.add(
MathCaclateUtil.divide(MathCaclateUtil.multiply(prepp_24, n3 - 1, BigDecimal.ROUND_HALF_UP), n3,
BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(upsanddowns >= 0 ? upsanddowns : 0, n3, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
np_24 = MathCaclateUtil.add(
MathCaclateUtil.divide(MathCaclateUtil.multiply(prenp_24, n3 - 1, BigDecimal.ROUND_HALF_UP), n3,
BigDecimal.ROUND_UNNECESSARY),
MathCaclateUtil.divide(upsanddowns >= 0 ? 0 : upsanddowns, n3, BigDecimal.ROUND_UNNECESSARY),
BigDecimal.ROUND_HALF_UP)
RSI3 = MathCaclateUtil.divide(MathCaclateUtil.multiply(num_100, pp_24, BigDecimal.ROUND_HALF_UP),
MathCaclateUtil.add(pp_24, -np_24, BigDecimal.ROUND_HALF_UP), BigDecimal.ROUND_UNNECESSARY)
rsi3[i] = RSI3
prepp_24 = pp_24
prenp_24 = np_24
}
}
}