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

策略主要想实现课程里的内容: https://www.tbquant.net/TrainDetail?id=240 17分钟;共有data0-5个图层,每个图层都会进行数据交互;我主要是用大周期日线、周线、级别来确定方向,然后用小周期来回操作;1,5,15,60,分钟级别可能都会有交易进行买卖操作,所以我会针对不同周期开发不同的策略;这样程序框架必须以图层为单位来进行管理;我想到的办法是,数据运算部分放在Range[i=0:DataCount-1],统一进行运算;onbar最前端使用了 BarExistStatus函数让多周期的数据进行对齐;用Range[2:2]函数,进行分图层管理,所有逻辑条件和交易信号都在Range[2:2] 内编写;这样的好处是,发现data2周期有问题的时候,我可以快速根据图层找到问题点,而不用去管其他图层的逻辑信号,提高程序开发,调试,迭代升级效率;最近在开发data2图层时发现程序会报信号闪烁但是我检查程序,发现没有使用未来函数,数据源都是引用的Data0.close[1]这个确定的数据;咨询老师后,叫我把逻辑信号放在最小周期内进行处理,于是我将data2图层的逻辑写到data0图层中去,然后data0输出一个交易信号 1:买开 0:卖平,然后在data2图层中检测信号进行买卖操作;但是加载在交易单元后发现还是会存在信号闪烁;我甚至将所均线、逻辑判断、结果都进行回溯[1]后,都会出现信号闪烁;fb000最容易报信号闪烁,其余没有报信号闪烁的品种,策略在运行的时候也会报出信号闪烁;试了好多种方法,还是没找到问题出在哪里,所以请各位老师们帮忙看看,找出原因后我好随之修正;附件解读: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公式修改和重写的权利 //------------------------------------------------------------------------调试时还发现,该策略单元很吃内存,由于运算任务重可以理解;但是我发现软件停止任何策略单元运行后,超过10多分钟占用的内存也没有得到释放,不知道是什么原因?

计算均线当前K线CLOSE的关系。

回复:111

回复:请问老师是啥问题呢?我都是调用AverageFC 平台自带的函数进行运算;而且运算处理的值我只是用PlotNumeric展示在图上用,MA1,MA2,MA3 都并没有参与过实际的逻辑运算;真正参与逻辑运算的是从其他周期取出来的最近CLOSE回溯值,算出的均线值,这些值都是确定的;老师有排查问题后各品种都不会出现信号闪烁的代码吗,请一并输出一下.顺便问一下ArrayRef<Integer> indexs 这是什么数据呀?我可以这样写的条件将图层分开处理吗?我理解这句话的意思是 当 indexs[0,2,3,5]中包含2就执行if下的语句,没有就不执行?

会研究一下这个问题