图标上显示开仓位置及开仓价格与实际开仓不一致的问题

老师,好!

我的交易策略是1小时和1天的多周期交易。

在1小时周期里通过判断1天周期中符合开仓条件进行开仓操作。

今天实盘中发现,22:51分进行了开仓,买入价格是:1192.

但在策略K线图上查看,发现是在21:00到22:00的那个K线上出现的开仓信息,并且开仓价格是1202.

实际开仓的时间和价格与策略是一致的,只是K线图上显示不正确,并且发现历史数据中都存在这个问题,对策略回策准确性存在很大问题。

与实际开仓产生很大偏差,请问是什么问题?


开仓价格
开仓后无法平仓
开仓后,如何从开仓价格开始画横线
回测与实盘开仓价不一致
请教开仓问题
记录开仓价格的函数有异常
关于不写价格的开仓
关于开仓价格问题(buy Open\close\High\Low)
关于开仓策略与平仓策略对接
增加止盈止损后,原位置不开仓了

建议模型里加输出语句,在信号执行的时候输出一下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线上标注信号。