通达信、东方财富神奇九转指标计算公式,代码实现
@Slf4j@Log4j2@Servicepublic class NineTurnServiceImpl extends StockServiceParent implements NineTurnServiceService {@Overridepublic Result nineTurn(String code, String date) {String key = "nineTurn:"
·
同花顺神奇九转指标计算公式可以参考:https://stockapi.com.cn
@Slf4j
@Service
public class NineTurnServiceImpl extends StockServiceParent implements NineTurnServiceService {
@Override
public Result nineTurn(String code, String date) {
String key = "nineTurn:" + code + date;
Object strOjb = redisTemplate.opsForValue().get(key);
Map<String, Object> obj = null;
if (ObjectUtil.isNull(strOjb)) {
LocalDate endDate = LocalDate.parse(date, ISO_DATE);
LocalDate startDate = endDate.minusDays(30);
Result day = day(code, startDate.toString(), endDate.toString());
Map<String, Object> data = (Map) day.getData();
Result result = nineTurnCalculateService.doCalculate(data, code, date);
if (ObjectUtil.isNotNull(result)) {
obj = (Map<String, Object>) result.getData();
setRedisValue(key, obj);
}
} else {
obj = (Map) JSON.parse(strOjb.toString());
}
return new Result(obj);
}
}
@Slf4j
@Service
public class NineTurnCalculateServiceImpl extends StockServiceParent implements NineTurnCalculateService {
@Override
public Result doCalculate(Map<String, Object> map, String code, String date) {
log.info("start doCalculate.................. code: {}");
List<Object> close = (List<Object>) map.get("close");
System.out.println("close size:" + close.size());
if (close.size() < 13) {
return null;
}
List<Object> high = (List<Object>) map.get("high");
List<Object> low = (List<Object>) map.get("low");
List<WwStockDetail> list = new ArrayList<>();
for (int i = close.size() - 1; i >= 0; i--) {
WwStockDetail wwStockDetail = new WwStockDetail();
wwStockDetail.setClose_price(Double.parseDouble(close.get(i).toString()));
wwStockDetail.setMin_price(Double.parseDouble(low.get(i).toString()));
wwStockDetail.setMax_price(Double.parseDouble(high.get(i).toString()));
list.add(wwStockDetail);
}
list = list.subList(0, 13);
log.info("start doCalculate..list: {}", JSON.toJSON(list));
log.info("start doCalculate..daixiao: {}", list.size());
boolean isLow = lowNineBuy(list);
boolean isHigh = highNineSale(list);
Map<String, Object> lastMap = new HashMap<>();
lastMap.put("lowNine", isLow ? 1 : 0);
lastMap.put("highNine", isHigh ? 1 : 0);
lastMap.put("api_code", code);
lastMap.put("date", date);
return new Result<>(lastMap);
}
/**
* 低九买入结构:满足两个条件:
* 第一:即连续出现九根K线,并且这些K线的收盘价都比各自前面的第四根K线的收盘价低,
* 就在其K线下方标记相应的数字,如果出现中断,则原计数作废,重新来过。
* 第二:8或9的最低价小于6或7的最低价
*/
private boolean lowNineBuy(List<WwStockDetail> list) {
boolean isTurn = true;
for (int i = 0; i < 9; i++) {
WwStockDetail k0 = list.get(i);
WwStockDetail k4 = list.get(i + 4);
if (k0.getClose_price() > k4.getClose_price()) {
isTurn = false;
}
}
if (isTurn) {
WwStockDetail nine = list.get(0);
WwStockDetail eight = list.get(1);
WwStockDetail seven = list.get(2);
WwStockDetail six = list.get(3);
if (nine.getMin_price() < seven.getMax_price()
|| eight.getMin_price() < six.getMax_price()) {
} else {
isTurn = false;
}
}
return isTurn;
}
/**
* 高九卖出结构:满足两个条件:
* 第一.即连续出现九根K线,并且这些K线的收盘价都比各自前面的第四根K线的收盘价高,就在其K线上方标记相应的数字,如果出现中断,则原计数作废,重新来过.
* 第二:8或9的最高价大于6或7的最高价,在9的上方显示
*/
private boolean highNineSale(List<WwStockDetail> list) {
boolean isTurn = true;
for (int i = 0; i < 9; i++) {
WwStockDetail k0 = list.get(i);
WwStockDetail k4 = list.get(i + 4);
if (k0.getClose_price() < k4.getClose_price()) {
isTurn = false;
}
}
if (isTurn) {
WwStockDetail nine = list.get(0);
WwStockDetail eight = list.get(1);
WwStockDetail seven = list.get(2);
WwStockDetail six = list.get(3);
if (nine.getMax_price() > seven.getMax_price()
|| eight.getMax_price() > six.getMax_price()) {
} else {
isTurn = false;
}
}
return isTurn;
}
}
计算过程很麻烦,其他技术指标可以参考别人已经做好的,直接去这里拿数据就可以了:
神奇九转指标及其他指标计算
啥指标都有:https://stockapi.com.cn
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)