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