私募量化交易系统开发之预警平台编程

发布时间 2023-08-14 10:12:10作者: 孤翁

如何实现私募机构及操盘员进行期货与股票的交易,这时候IT技术在软件开发中体现了主导能力。一套完善的系统架构需要成熟的技术人员来进行搭建,利用spring语言、 java语言、 python语言进行设计与编程。

实现私募交易系统中预警平台是至关重要的,基于我们的数据中台服务,搭建的一款支持云端自动设置规则选股及因子触发式实时预警的系统。罗列出预警平台的功能特点;

1.可以创建多个预警组,每个组设置规则自动选股入池和出池,并且支持人工指定选股

2.每个预警组可以单独设置指定要关注的预警因子,当组中品种预警因子触发后可通过看盘端、网页端,钉钉消息等方式及时通知到相关人员

3.多个预警组可以进行分类管理和查看guweng22346

4.当预警信号触发后,可以分仓系统联动进行直接快速下单

5.支持对单个品种进行画线预警、指定周期指定因子预警

6.多品种、多周期对预警组内品种进行查看及预警设置

7.动态分组功能(对指定规则的预警组内的品种,自动分配到不同交易组,多人协作操作数量较多的标的,)

经过平台一系列功能设计,预警平台系统就具备了雏形。

下一步,我们就需要把这个交易系统用代码实现出来

/**定义推送信号头**/
StringBuilder stringBuilder = new StringBuilder("信号");
if (StringUtils.isEmpty(tbAlarmConfigDetial.getFactorId()) || ObjectUtil.isNull(tbAlarmConfigDetial.getFreqId()) || StringUtils.isEmpty(tbAlarmConfigDetial.getTradeDirection())) {
return stringBuilder.toString();
}
/**获取预警因子**/
String[] factorList = tbAlarmConfigDetial.getFactorId().split(",");
List<Integer> checkedFactor = Lists.newArrayList(factorList).stream().map(f -> Integer.valueOf(f)).collect(Collectors.toList());
/**获取预警周期**/
Integer freqId = tbAlarmConfigDetial.getFreqId();
List<Integer> checkedFreqList = Lists.newArrayList(freqId);
/** 多空 **/
List<Integer> collect = Arrays.stream(tbAlarmConfigDetial.getTradeDirection().split(",")).map(f -> Integer.valueOf(f)).collect(Collectors.toList());
Map<Integer, Integer> tradeMaps = collect.stream().collect(Collectors.toMap(x -> x, y -> y, (oldValue, newValue) -> newValue));

List<TbFactorData> sendTbFactorData = tbFactorDataList.stream().filter(f -> {
return checkedFreqList.contains(f.getFreqId());
}).filter(f -> {
return checkedFactor.contains(f.getParamId());
}).collect(Collectors.toList());
stringBuilder.append(":");
for (TbFactorData tbFactorData : sendTbFactorData) {
WarnningSignalVo warnningSignalVo = new WarnningSignalVo();
warnningSignalVo.setGroupId(tbAlarmConfig.getGroupId());
warnningSignalVo.setFeatureType(featureType);
warnningSignalVo.setMarginTrading(marginTrading);
//warnningSignalVo.setGroupName(groupName);
if (tbFactorData.getParamValue() != 0) {
if (tradeMaps.containsKey(tbFactorData.getParamValue().intValue())) {
/**品种代码**/
stringBuilder.append(code);
warnningSignalVo.setFeatureCode(code);
if (StringUtils.isNotEmpty(tbAlarmConfig.getUserList())) {
String[] split = tbAlarmConfig.getUserList().split(",");
List<Integer> userIds = Arrays.asList(split).stream().map(f -> Integer.valueOf(f.trim())).collect(Collectors.toList());
warnningSignalVo.setUserIds(userIds);
}
stringBuilder.append("\t");
/**品种名称**/
stringBuilder.append(featureName);
warnningSignalVo.setFeatureName(featureName);
warnningSignalVo.setFeatureId(featureId);
stringBuilder.append("\t");
/**时间**/
stringBuilder.append(dateTime);
warnningSignalVo.setDatetime(dateTime);
stringBuilder.append("\t");
/**周期**/
stringBuilder.append(freqReverseMaps.get(tbFactorData.getFreqId()));
warnningSignalVo.setFreqName(freqReverseMaps.get(tbFactorData.getFreqId()));
warnningSignalVo.setFreqId(tbFactorData.getFreqId());
String score = scoreMaps.get(freqReverseMaps.get(tbFactorData.getFreqId()));
if (StringUtils.isNotEmpty(score)) {
warnningSignalVo.setScore(Double.valueOf(score));
}
stringBuilder.append("\t");
/**预警因子**/
stringBuilder.append(factorMaps.get(tbFactorData.getParamId() + "" + tbFactorData.getParamValue().intValue()) + (tbFactorData.getParamValue() > 0 ? "⬆" : "⬇"));
warnningSignalVo.setFactorName(factorMaps.get(tbFactorData.getParamId() + "" + tbFactorData.getParamValue().intValue()) + (tbFactorData.getParamValue() > 0 ? "⬆" : "⬇"));
warnningSignalVo.setFactorId(tbFactorData.getParamId());
warnningSignalVo.setReceiverTime(receiverTime);
warnningSignalVo.setPushTime(new Date());
warnningSignalVo.setSignValue(tbFactorData.getParamValue().doubleValue());
stringBuilder.append("\t");
stringBuilder.append("\r\n");
warnningSignalVoList.add(warnningSignalVo);
}
}
}
return stringBuilder.toString();