跨周期信号闪烁及行情驱动底层逻辑问题

策略主要想实现课程里的内容:  https://www.tbquant.net/TrainDetail?id=240  17分钟;

共有data0-5个图层,每个图层都会进行数据交互;

data-href=

我主要是用大周期日线、周线、级别来确定方向,然后用小周期来回操作;

1,5,15,60,分钟级别可能都会有交易进行买卖操作,所以我会针对不同周期开发不同的策略;

这样程序框架必须以图层为单位来进行管理;

我想到的办法是,数据运算部分放在Range[i=0:DataCount-1],统一进行运算;

onbar最前端使用了 BarExistStatus函数让多周期的数据进行对齐;

data-href=

用Range[2:2]函数,进行分图层管理,所有逻辑条件和交易信号都在Range[2:2] 内编写;

这样的好处是,发现data2周期有问题的时候,我可以快速根据图层找到问题点,而不用去管其他图层的逻辑信号,提高程序开发,调试,迭代升级效率;

data-href=

最近在开发data2图层时发现程序会报信号闪烁

data-href=


但是我检查程序,发现没有使用未来函数,数据源都是引用的Data0.close[1]这个确定的数据;

咨询老师后,叫我把逻辑信号放在最小周期内进行处理,于是我将data2图层的逻辑写到data0图层中去,然后data0输出一个交易信号  1:买开 0:卖平,然后在data2图层中检测信号进行买卖操作;

data-href=

data-href=

但是加载在交易单元后发现还是会存在信号闪烁;

我甚至将所均线、逻辑判断、结果都进行回溯[1]后,都会出现信号闪烁;

fb000最容易报信号闪烁,其余没有报信号闪烁的品种,策略在运行的时候也会报出信号闪烁;

data-href=

试了好多种方法,还是没找到问题出在哪里,所以请各位老师们帮忙看看,找出原因后我好随之修正;

附件解读:

TM_difficult_2023.12.12-1 是用户函数文件

积寒_000_2023.12.11-1是策略单元1:,是最初发现问题, 简化后的策略单元

积寒_000_2023.12.12-2是策略单元2:是用 Range将图层分开处理后的策略单元

积寒_000_2023.12.12-3是策略单元3:这是将信号放在data0图层,在data2图层进行买卖标记的策略单元

以上文件都存在信号闪烁问题!

这是简化后的代码:


//------------------------------------------------------------------------
// 简称: TM_difficult
// 名称: 代码存在问题
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
//此处添加参数
Numeric Length1(5);
Numeric Length2(10);
Numeric Length3(20);
Numeric DSquantity(1); //默认交易数量
Numeric SLoss(0.5);    //止损位%,前5条bar为低点,超过0.5按照0.5进行止损
Numeric Sprofit(0.5);  //动态止盈位%,涨幅超过止盈位并且回落后进行止盈,如果没有回落则等死叉在进行止盈
Numeric Clearance(0);  //过节清仓标志位  1:保留多仓    0:无持仓   -1:保留空仓  


Vars
Numeric i;  //零时变量
Series  <Numeric> MA1; //5均线
Series  <Numeric> MA2; //10均线
Series  <Numeric> MA3; //20均线
Global Array <Numeric> GANumeric1;  //全局数组
//Numeric型数组数据
array <Numeric> ACounter; //计数器
array <Numeric> Arr_price;  //交易价格
array <Numeric> Arrma1;   //数据
//多数组指针式交互
array <array <Numeric>> Arrp_data1;   //多周期数据
// 复合类型数据
Series <Array<Numeric>> SANumeric1;  //序列型Numeric一维数组
Series <Array<Array<Numeric>>> SAANumeric1;  //序列型Numeric二维数组
//结构体数据
Global CommissionRate rate;  //手续费
Natural CodeProperty codePro;  //合约属性
//Natural CommissionRate rate;  //手续费


Defs
//功能函数


Events
    //此处实现事件函数
    
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
//----------订阅周期
SubscribeBar(Symbol,5m,Data0.BeginDateTime);  //5  分钟周期 data1
SubscribeBar(Symbol,15m,Data0.BeginDateTime); //15 分钟周期 data2
SubscribeBar(Symbol,1h,Data0.BeginDateTime);  //1 小时周期  data3
SubscribeBar(Symbol,1d,Data0.BeginDateTime);  //1 天周期    data4
SubscribeBar(Symbol,1w,Data0.BeginDateTime);  //1 周周期    data5
}


//每一个bar开始前驱动
OnBarOpen(ArrayRef<Integer> indexs)
{
//Print(ON**********);
//----------多图层数据对齐
Numeric i;
Numeric result=1;
For i=0 to DataSourceSize-1
{
    result=result*data[i].BarExistStatus;
}
If(result<>1) Return;
}




//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
//程序报错,不继续执行
//----------多图层数据对齐
Numeric i;
Numeric result=1;
For i=0 to DataSourceSize-1
{
    result=result*data[i].BarExistStatus;
}
If(result<>1) Return;


//------------------------------------------------------------------------多图层
Range[i=0:DataCount-1]
{   
    //------------------------------------------------------------------------数据处理    
    //均线数据运算
    MA1=AverageFC(Close,Length1);
    MA2=AverageFC(Close,Length2);
    MA3=AverageFC(Close,Length3);          
    //------------------------------------------------------------------------Data 取数据             
    //取30条close值
    Numeric T;
    For T=0 To 30-1
    {
    SAANumeric1[0][33][T]=CLOSE[T];
    }
    /*//数据展示
    For i=0 To GetArraySize(SAANumeric1[0][33])-1
    {
    Commentary(bar+Arrp_data[+Text(i)+]=+text(SAANumeric1[0][33][i]));
    }*/
    //数据替换
    SAANumeric1[0][33][0]=data0.Close[1];
    
    Numeric C;
    Numeric sumValue;
    sumValue=0;
    For C=0 To 5-1
    {
      sumValue = sumValue + SAANumeric1[0][33][C];    //数组之和算5均线
    }
    SAANumeric1[0][35][0]=sumValue/5;
    
    sumValue=0;
    For C=0 To 20-1
    {
      sumValue = sumValue + SAANumeric1[0][33][C];    //数组之和算20均线
    }
    SAANumeric1[0][37][0]=sumValue/20;
    //均值展示
    Commentary(5均线+text(SAANumeric1[0][35][0]));
    Commentary(20均线+text(SAANumeric1[0][37][0]));    
    
    //5&20均线 交叉状态
    If(SAANumeric1[0][35][0]> SAANumeric1[0][37][0])
    {
        SAANumeric1[0][41][0]=1;
    }
    Else if (SAANumeric1[0][35][0]< SAANumeric1[0][37][0])
    {
        SAANumeric1[0][41][0]=-1;
    }
    Else
    {
        SAANumeric1[0][41][0]=0;
    }
    //data2周期赋值给data0周期
    data0.SAANumeric1[0][50][0]=data2.MarketPosition;  //data2.周期没有持有多单
    data0.SAANumeric1[0][50][1]=data2.SAANumeric1[0][41][0]; //data2.周期均线交叉情况
    //------------------------------------------------------------------------Data0图层处理
    If(i==0)
    {    
         //其他周期
          PlotNumeric(data2.MA1,data2.SAANumeric1[0][35][0],0,Yellow);
          PlotNumeric(data2.MA3,data2.SAANumeric1[0][37][0],0,DarkRed);
         
         If(Data0.CurrentBar >20)
         {
            //------------------------------------------------------------------------Data0.图层处理data2数据
            IF ( data0.SAANumeric1[0][50][0]<>1 )     //添加 data4.Arrp_data1[11][1]>0 日线5均线斜率>0 会出现信号闪烁
            {
                //------------------------------------------------------------------------买点
                If( data0.SAANumeric1[0][50][1]==1 ) //DATA2.MA1与MA3金叉  
                {
                    data2.SAANumeric1[0][50][2]=1;  //data2.图层买多
                }
            }
                //------------------------------------------------------------------------有多单的情况
                if ( data0.SAANumeric1[0][50][0]==1 )   //持有多单 and 下单>一个bar数的时候
                {
                    //------------------------------------------------------------------------卖点
                    If( data0.SAANumeric1[0][50][1]<>1) //DATA2.MA1与MA3金叉
                    {
                        data2.SAANumeric1[0][50][2]=0;  //data2.图层卖出
                    }    
                }
             
         }
         
    }
    //------------------------------------------------------------------------Data1图层处理
    ELSE If (i==1)
    {
        //画图区
         PlotNumeric(MA1,MA1,0,Yellow);  //黄均线
         //PlotNumeric(MA2,MA2,0,Green);  //绿均线
         PlotNumeric(MA3,MA3,0,DarkRed);  //红均线                             
    }
    //------------------------------------------------------------------------Data2图层处理
    ELSE If (i==2 )
    {
         //画图区
         PlotNumeric(MA1,MA1,0,Yellow);  //黄均线
         PlotNumeric(MA3,MA3,0,DarkRed);  //红均线    
         //逻辑区
         //买卖点处理1
         If (data2.MarketPosition<>1 and  data2.SAANumeric1[0][50][2]==1)
         {
             Buy(1,close[1]);   //最小交易单位
         }
         else if (data2.MarketPosition==1 and data2.SAANumeric1[0][50][2]<>1)    
         {
             Sell(1,close[1]);  //全部卖出
         }                                                 
    }
    //------------------------------------------------------------------------Data3图层处理
    ELSE if (i==3)
    {
        //画图区
         PlotNumeric(MA1,MA1,0,Yellow);  //黄均线
         //PlotNumeric(MA2,MA2,0,Green);  //绿均线
         PlotNumeric(MA3,MA3,0,DarkRed);  //红均线    
    }
    //------------------------------------------------------------------------Data4图层处理
    ELSE if (i==4)
    {
        //画图区
         PlotNumeric(MA1,MA1,0,Yellow);  //黄均线
         //PlotNumeric(MA2,MA2,0,Green);  //绿均线
         PlotNumeric(MA3,MA3,0,DarkRed);  //红均线             
    }
    //------------------------------------------------------------------------Data5图层处理
    ELSE If (i==5)
    {
         PlotNumeric(MA1,MA1,0,Yellow);  //黄均线
         //PlotNumeric(MA2,MA2,0,Green);  //绿均线
         PlotNumeric(MA3,MA3,0,DarkRed);  //红均线
    }


}
    
}
//------------------------------------------------------------------------
// 编译版本    2023/12/11 112053
// 版权所有    xToby2100
// 更改声明    TradeBlazer Software保留对TradeBlazer平台
//            每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------


调试时还发现,该策略单元很吃内存,由于运算任务重可以理解;

data-href=

但是我发现软件停止任何策略单元运行后,超过10多分钟占用的内存也没有得到释放,不知道是什么原因?

data-href=

规避跨周期信号闪烁
请问老师关于跨周期信号闪烁问题
跨周期信号闪烁问题
跨周期数据造成信号闪烁的问题
跨图层信号闪烁问题,求助
跨周期信号闪烁加开仓延迟
关于信号闪烁的逻辑问题
多周期策略出现信号闪烁问题。
请教信号闪烁后继处理逻辑或思路
关于跨周期代码在行情页面加载运行的问题

计算均线当前K线CLOSE的关系。data-href=

111

请问老师是啥问题呢?

我都是调用AverageFC 平台自带的函数进行运算;

而且运算处理的值我只是用PlotNumeric展示在图上用,MA1,MA2,MA3 都并没有参与过实际的逻辑运算;

真正参与逻辑运算的是从其他周期取出来的最近CLOSE回溯值,算出的均线值,这些值都是确定的;

\"\"

老师有排查问题后各品种都不会出现信号闪烁的代码吗,请一并输出一下.

顺便问一下ArrayRef<Integer> indexs 这是什么数据呀?

\"\"

我可以这样写的条件将图层分开处理吗?

我理解这句话的意思是

当 indexs[0,2,3,5]中包含2

就执行if下的语句,没有就不执行?

会研究一下这个问题