老师,好!
我的交易策略是1小时和1天的多周期交易。
在1小时周期里通过判断1天周期中符合开仓条件进行开仓操作。
今天实盘中发现,22:51分进行了开仓,买入价格是:1192.
但在策略K线图上查看,发现是在21:00到22:00的那个K线上出现的开仓信息,并且开仓价格是1202.
实际开仓的时间和价格与策略是一致的,只是K线图上显示不正确,并且发现历史数据中都存在这个问题,对策略回策准确性存在很大问题。
与实际开仓产生很大偏差,请问是什么问题?


建议模型里加输出语句,在信号执行的时候输出一下bar时间和机器时间确认一下到底是什么时候出的信号。
或者直接看消息中心也应该是有信号显示的

消息中心看,和实际成交的时间是一致的,也符合策略中的开仓条件。
但是在策略K线上显示的开仓位置及开仓价格都不对。
开仓条件是执行的日线的周期。信号是在1小时周期上显示的。
仔细发现如果是开多单,在K线上显示的都是在实际开仓时间的前一根1小时K线最高价。
如果是开空单,在K线上显示的都是实际开仓时间的前一根1小时K线的最低价。
不知道是哪个逻辑不对。
那说明你的模型信号闪烁了,有未来数据
检查过很多次都没有未来函数。
以下就是实盘中这个策略的一部分内容,麻烦老师帮忙看看问题出哪了
Params
Numeric boll_Length(26); //周期
Numeric boll_Offset(2); //标准差倍数
Numeric shuzhi(6000); //单笔止损金额
Vars
Series<Numeric> UpLine; //BOLL上轨
Series<Numeric> DownLine; //BOLL下轨
Series<Numeric> MidLine; //BOLL中轨线
Series<Numeric>BFQUpLine; //BOLL上轨
Series<Numeric>BFQDownLine; //BOLL下轨
Series<Numeric>BFQMidLine; //BOLL中轨线
Numeric Band; //初始止损数值,定义一个数值变量 Band,用于存储布林带的宽度(上轨与下轨之间的距离)
Series<Numeric> buyhands; //定义一个数值序列变量,可能用于存储买入手数或买入信号的数量
Series<Numeric> sellhands; //定义一个数值序列变量,可能用于存储卖出手数或卖出信号的数量
Series<bool> con_duo_1; //定义一个布尔序列变量,可能用于存储多头(买入)条件的判断结果
Series<bool> con_kong_1; //定义一个布尔序列变量,可能用于存储空头(卖出)条件的判断结果
Series<bool> con_duo_out_1; //定义一个布尔序列变量,可能用于存储多头平仓(退出)条件的判断结果
Series<bool> con_kong_out_1; //定义一个布尔序列变量,可能用于存储空头平仓(退出)条件的判断结果。
Events
OnInit()
{
{
SubscribeBar(data0.Symbol,"1d",data0.BeginDateTime);
}
Range[0:DataCount-1]
{
//=========数据源相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
AddDataFlag(Enum_Data_FullPeriod); //设置K线分割完全交易时段
SetBackBarMaxCount(200000); //设置序列变量最大回溯bar数
SetOrderMap2MainSymbol(); //映射主力合约
}
}
OnBar(ArrayRef<Integer> indexes)
{
data1.MidLine = data1.AverageFC( data1.Close, boll_Length); //计算布林带的中轨线
data1.Band = data1.StandardDev( data1.Close, boll_Length); //计算收盘价的标准差
data1.UpLine = data1.MidLine + boll_Offset * data1.Band; //计算布林带的上轨线
data1. DownLine = data1.MidLine - boll_Offset * data1.Band; //计算布林带的下轨线
data1.BFQUpLine= data1.UpLine/Rollover;
data1.BFQDownLine= data1.DownLine/Rollover;
data1.BFQMidLine= data1.MidLine/Rollover;
data1.PlotNumeric(" data1.UpLine", data1.UpLine); //在图表上绘制布林带上轨线
data1.PlotNumeric(" data1.DownLine", data1.DownLine); //在图表上绘制布林带下轨线
data1.PlotNumeric(" data1.MidLine", data1.MidLine); //在图表上绘制布林带中轨线
buyhands = Round(shuzhi / (ContractUnit * BigPointValue) / ( data1.BFQUpLine[1]- data1.BFQMidLine[1]), 0); //计算买入开仓的手数
sellhands = Round(shuzhi / (ContractUnit * BigPointValue) / ( data1.BFQMidLine[1]- data1.BFQDownLine[1]), 0); //计算卖入开仓的手数
con_duo_1=data1.open<data1.UpLine[1] and data1.CrossOver(data1.h,data1.UpLine[1]);
con_kong_1=data1.open>data1.downLine[1] and data1.CrossUnder(data1.l,data1.downLine[1]) ;
if(MarketPosition== 0)
{
IF(con_duo_1 )
{
buy(buyhands, DATA1.UpLine[1]);
}
ELSE
IF( con_kong_1)
{
sellshort(sellhands, DATA1.DownLine[1]);
}
}
con_duo_out_1 =DATA1.open>DATA1.MidLine[1] and DATA1.CrossUnder(DATA1.L,DATA1.MidLine[1]);
if( MarketPosition > 0 and con_duo_out_1 )
{
sell(0, DATA1.MidLine[1]);
}
con_kong_out_1 =DATA1.open<DATA1.MidLine[1] and DATA1.CrossOver(DATA1.H,DATA1.midline[1]);
if(MarketPosition<0 and con_kong_out_1 )
{
BuyToCover(0, DATA1.midline[1]);
}
}
今天早上开仓的氧化铝也是一样的问题。
实际开仓是今天早上9:52分。
但K线图却显示在昨天晚上21:00到22:00的那个K线上,并且开仓价格和实际开仓价格也不一样。


跨周期用quant3,不要用quant
在quant3 中也试了,问题是一样的
quant3是可以用setbaseperiod来判断信号闪烁问题的
代码诊断问题因为需要调试代码,要么走付费代写排队。
可以确定不是信号闪烁的问题!
仔细查看图表上的开仓信号及位置,发现如下规律:
策略是:1小时周期与日线周期的多周期策略。
1、按日线出现开仓信号后,能够按正确的交易指令及价格正常开仓,这一点是没问题的。主要的问题是开仓后在图表上显示位置及显示的开仓价格不正确。
2、经过仔细观察发现在图表上的开仓信号都是标注在当天的第一个1小时K线上。如果实际开仓是在当天第2根或是第3根小时K线进行的开仓,但图表依旧是标注在第一个小时K线上,因为标准的K线不正确,从而导致价格也就不正确了。
如何实现在图表在实际的小时K线上标注信号。
无夜盘的商品,日线对应4根小时K线,不管当天是在哪个时间开、平仓,在图上表都是在9点第1根小时K线上标注信号,如果是多单,价格就是当根K线的最高价。如果是空单,价格就是当根K线的最低价。
有夜盘的商品,日线对应6根小时K线,不管当天是在哪个时间开、平仓,在图上表都是在21点第1根小时K线上标注信号
如可实现在实际对应的那个小时K线上出信号,如:下午14:40开仓,在图表上就在当天最后一根小时K线上标注信号。