跨周期信号闪烁问题

共有data0-5个图层: 分别对应1分钟、5分钟、1小时、日线、周线;为了避免跨周期bar数据不对齐问题,特意添加了数据对齐函数本人已经大概排查出代码第591行条件 data4.Arrp_data1[11][1]>0 会出现信号闪烁;但是按照程序的运行原理,我是取用data0.close[1]的数据进行运算的,不会出现未来函数的问题,但是编译程序运行时还是会提示有信号闪缩代码://------------------------------------------------------------------------// 简称: 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:保留空仓 VarsNumeric 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//------------------------------------------------------------------------回溯CLOSE收盘价;Numeric FU_Cbacktrace(Numeric Length1, ArrayRef <Numeric> R_value ){/*Length1:回溯值R_value:返回值*/Numeric i;For i=0 To Length1-1{R_value[i]=CLOSE[i];}Return 1;}//------------------------------------------------------------------------指定数_求数组平均值;Numeric FU_AverageArray(Numeric Length1, ArrayRef <Numeric> R_value ){/* Length1:参与运算个数R_value:传输值*/ Numeric i;Numeric sumValue(0);For i=0 To Length1-1{//数据不为0视为有效数据IF (R_value[i]!=0){ sumValue = sumValue + R_value[i]; //数组之和}//传入数据有误Else{Print(第[+text(CurrentBar)+]bar_+参数传入有误:+DateTimeToString(Date + Time));Print(数据:+TextArray(R_value));Return 0; }}Return sumValue/Length1; //数组之和除以样本数量}//------------------------------------------------------------------------指定数_求数组平均值;Numeric FU_MAdat(Numeric sentence,Numeric MA1_1, Numeric MA1_2, Numeric MA2_1, Numeric MA2_2,Numeric MA3_1, Numeric MA3_2,ArrayRef <Numeric> R_value ){/* sentence:判断数据MA1_1:实时均线值MA1_2:回溯1均线值MA2_1:实时均线值MA2_2:回溯1均线值MA3_1:实时均线值MA3_2:回溯1均线值R_value:传输值0:回溯那条bar//MA11:存放斜率K2:存放斜率K对应的角度3:存放截距b_公式y=kx+b4:存放指定的回归值,当前值与线性的差值//MA25:存放斜率K6:存放斜率K对应的角度7:存放截距b_公式y=kx+b8:存放指定的回归值,当前值与线性的差值//MA39:存放斜率K10:存放斜率K对应的角度11:存放截距b_公式y=kx+b12:存放指定的回归值,当前值与线性的差值//MA120:均线_斜率状态值 1:多 0:其他 -1:空//MA221:均线_斜率状态值 1:多 0:其他 -1:空//MA322:均线_斜率状态值 1:多 0:其他 -1:空//MA123: 均线压制 1:多 0: 其他 -1:空 //MA224: 均线压制 1:多 0: 其他 -1:空 //MA325: 均线压制 1:多 0: 其他 -1:空 //金叉_死叉26:5_10 1:金叉 0:其他 -1:空27:10_20金叉 1:金叉 0:其他 -1:空28:5_20金叉 1:金叉 0:其他 -1:空*///线性回归_斜率等基本数据LinearReg(MA1_1,3,R_value[0],R_value[1],R_value[2],R_value[3],R_value[4]);LinearReg(MA2_1,3,R_value[0],R_value[5],R_value[6],R_value[7],R_value[8]);LinearReg(MA3_1,3,R_value[0],R_value[9],R_value[10],R_value[11],R_value[12]);//MA1 均线_斜率状态值If(sentence>MA1_1 and R_value[1]>0 ){R_value[20]=1;}Else IF(sentence<MA1_1 and R_value[1]<0 ){R_value[20]=-1;}Else{R_value[20]=0;}//MA2 均线_斜率状态值If(sentence>MA2_1 and R_value[5]>0 ){R_value[21]=1;}Else IF(sentence<MA2_1 and R_value[5]<0 ){R_value[21]=-1;}Else{R_value[21]=0;}//MA3 均线_斜率状态值If(sentence>MA3_1 and R_value[5]>0 ){R_value[22]=1;}Else IF(sentence<MA3_1 and R_value[5]<0 ){R_value[22]=-1;}Else{R_value[22]=0;}//MA1单均线If(MA1_1>MA1_2){R_value[23]=1;}Else If ( MA1_1<MA1_2){R_value[23]=-1;}Else{R_value[23]=0;}//MA2单均线If(MA2_1>MA2_2){R_value[24]=1;}Else If ( MA2_1<MA2_2){R_value[24]=-1;}Else{R_value[24]=0;}//MA3单均线If(MA3_1>MA3_2){R_value[25]=1;}Else If ( MA3_1<MA3_2){R_value[25]=-1;}Else{R_value[25]=0;}//5_10IF(MA1_1>MA2_1){R_value[26]=1; //金叉}Else If(MA1_1<MA2_1){R_value[26]=-1; //死叉}Else{R_value[26]=0; //相等}//10_20IF(MA2_1>MA3_1){R_value[27]=1; //金叉}Else If(MA2_1<MA3_1){R_value[27]=-1; //死叉}Else{R_value[27]=0; //相等}//5_20IF(MA1_1>MA3_1){R_value[28]=1; //金叉}Else If(MA1_1<MA3_1){R_value[28]=-1; //死叉}Else{R_value[28]=0; //相等}Return 1; } Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次OnInit(){// 初始化数据GANumeric1[0]=0; //程序运行错误标志位GANumeric1[1]=DSquantity; //设置默认交易单位GANumeric1[2]=SLoss/100; //止损位%,前5条bar为低点,超过0.5按照0.5进行止损GANumeric1[3]=Sprofit/100; //止盈位%,涨幅超过止盈位并且回落后进行止盈!GANumeric1[5]=Clearance; //过节清仓标志位 1:保留多仓 0:无持仓 -1:保留空仓 //----------订阅周期SubscribeBar(Symbol,5m,Data0.BeginDateTime); //5 分钟周期 data1SubscribeBar(Symbol,15m,Data0.BeginDateTime); //15 分钟周期 data2SubscribeBar(Symbol,1h,Data0.BeginDateTime); //1 小时周期 data3SubscribeBar(Symbol,1d,Data0.BeginDateTime); //1 天周期 data4SubscribeBar(Symbol,1w,Data0.BeginDateTime); //1 周周期 data5//----------多图层参数设置Range[0:DataCount-1]{SetInitCapital(2000000); //设置初始资金为200万SetOrderMap2MainSymbol(); //设置委托映射到主力SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手1SetOrderPriceOffset(2); //设置委托价为叫买/卖价偏移2跳AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());//设置忽略换仓信号计算}PrintClear; //控制台消息清除GetProperty(codePro);//获取合约属性 //当前策略应用商品的默认手续费率GetCommissionRate(rate); //获得当前品总手续费//SetCommissionRate(rate); //设置手续费GANumeric1[11]=rate.ratioType; //手续费类型GANumeric1[15]=ContractUnit; //交易单位GANumeric1[16]=MinMove*PriceScale; // 一个最小变动单位,也就是一跳GANumeric1[17]=bigpointvalue; // 股票类,一个整数点的价值}//每一个bar开始前驱动OnBarOpen(ArrayRef<Integer> indexs){//Print(ON**********);//----------多图层数据对齐Numeric i;Range[i=0:DataCount-1]{ If (BarExistStatus<>1) { Print(图层[+Text(i) +]_时间:+DateTimeToString(Date + Time)+ _状态:+Text(BarExistStatus)); Return; } //买入手续费判断If(GANumeric1[11]==1) //一手多少钱{ GANumeric1[12]=GANumeric1[1]*rate.openRatio; //买入手续费=买入数量*买入手续费; GANumeric1[13]=GANumeric1[1]*rate.closeRatio; //平仓手续费=平仓数量*平仓手续费 GANumeric1[14]=GANumeric1[1]*rate.closeTodayRatio; //平今手续费=平仓数量*平今手续费}Else If (GANumeric1[11]==4) //按成交金额万分之{ GANumeric1[12]=close[1]*GANumeric1[1]*GANumeric1[15]*rate.openRatio/10000; //买入手续费= 期货价格 *买入数量*交易单位*买入手续费/10000 GANumeric1[13]=close[1]*GANumeric1[1]*GANumeric1[15]*rate.closeRatio/10000; //平仓手续费= 期货价格 *买入数量*交易单位*平仓手续费/10000 GANumeric1[14]=close[1]*GANumeric1[1]*GANumeric1[15]*rate.closeTodayRatio/10000; //平仓手续费= 期货价格 *买入数量*交易单位*平仓手续费/10000}//其他手续费类型报错Else{ GANumeric1[0]=GANumeric1[0]+1;}//合约基本信息Commentary(图层:[+Text(i)+]报错状态:[+Text(GANumeric1[0])+]bar:[+Text(CurrentBar)+]交易单位:[+text(GANumeric1[15])+] 一跳:[+Text(GANumeric1[16])+]变动价格:[+Text(GANumeric1[15]*GANumeric1[16]) +]5新高:[+Text(SANumeric1[0][65])+]5新低:[+text(SANumeric1[0][68])+]);//手续费If (GANumeric1[11]==1){Commentary(元/手:+买入手续费:[+text(GANumeric1[12])+]平仓手续费:[+Text(GANumeric1[13])+]平今仓手续费:[+Text(GANumeric1[14])+]); }Else If (GANumeric1[11]==4){Commentary(成交金额:+买入手续费:[+text(GANumeric1[12])+]平仓手续费:[+Text(GANumeric1[13])+]平今仓手续费:[+Text(GANumeric1[14])+]); }}}//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组OnBar(ArrayRef<Integer> indexs){//程序报错,不继续执行//----------多图层数据对齐If (BarExistStatus<>1 OR GANumeric1[0]>0){ print( 对齐状态:+Text(BarExistStatus)+_报错数量:+text(GANumeric1[0])+_停止时间:+DateTimeToString(CurrentDate+CurrentTime)); Return;} Numeric i;//------------------------------------------------------------------------多图层Range[i=0:DataCount-1]{ //------------------------------------------------------------------------数据处理 //均线数据运算 MA1=AverageFC(Close,Length1); MA2=AverageFC(Close,Length2); MA3=AverageFC(Close,Length3); //新高 SANumeric1[0][65]=Highest(Close,5); //5 SANumeric1[0][66]=Highest(Close,10); //10 SANumeric1[0][67]=Highest(Close,20); //20 //新低 SANumeric1[0][68]=Lowest(Close,5); //5 SANumeric1[0][69]=Lowest(Close,10); //10 SANumeric1[0][70]=Lowest(Close,20); //10 //------------------------------------------------------------------------Data 取数据 FU_Cbacktrace(30,Arrp_data1[0]);//只有在Data0图层上才运行调用FU_Cbacktrace函数,并且把数据赋值在data0.Arrp_data1[0]中,由于其他图层并没有运行该函数,所以其他图层中Arrp_data1[0]值为0则没有弹窗; FU_Cbacktrace(30,Arrp_data1[1]); FU_Cbacktrace(30,Arrp_data1[2]); FU_Cbacktrace(30,Arrp_data1[3]); FU_Cbacktrace(30,Arrp_data1[4]); FU_Cbacktrace(30,Arrp_data1[5]); /*//数据展示 For i=0 To GetArraySize(Arrp_data1[1])-1 { Commentary(bar+Arrp_data[+Text(i)+]=+text(Arrp_data1[1][i])); }*/ //------------------------------------------------------------------------Data0图层处理 If(i==0) { Print(Data0:1); //替换Data0图层数据 Arrp_data1[0][0]=data0.Close[1]; SANumeric1[0][11]=FU_AverageArray(5,Arrp_data1[0]); //5均线 SANumeric1[0][14]=FU_AverageArray(10,Arrp_data1[0]); //10均线 SANumeric1[0][17]=FU_AverageArray(20,Arrp_data1[0]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][11],SANumeric1[3][11],SANumeric1[0][14],SANumeric1[3][14],SANumeric1[0][17],SANumeric1[3][17],Arrp_data1[11]); //画图区 PlotNumeric(MA1,MA1,0,Yellow); //黄均线 //PlotNumeric(MA2,MA2,0,Green); //绿均线 PlotNumeric(MA3,MA3,0,DarkRed); //红均线 //其他周期 //Data1 //PlotNumeric(1.MA1,Data1.SANumeric1[0][20],0,Yellow); //黄均线 //PlotNumeric(1.MA3,Data1.SANumeric1[0][26],0,DarkRed); //红均线 //Data2 PlotNumeric(data2.MA1,data2.SANumeric1[0][29],0,Yellow); //黄均线 PlotNumeric(data2.MA3,data2.SANumeric1[0][35],0,DarkRed); //红均线 //Data3 //Data4 //Data5 Print(Data0:2); Print(时间:+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data1图层处理 If (i==1) { Print(Data1:1); //替换Data1图层数据 Arrp_data1[1][0]=data0.Close[1]; SANumeric1[0][20]=FU_AverageArray(5,Arrp_data1[1]); //5均线 SANumeric1[0][23]=FU_AverageArray(10,Arrp_data1[1]); //10均线 SANumeric1[0][26]=FU_AverageArray(20,Arrp_data1[1]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][20],SANumeric1[3][20],SANumeric1[0][23],SANumeric1[3][23],SANumeric1[0][26],SANumeric1[3][26],Arrp_data1[11]); //画图区 PlotNumeric(MA1,MA1,0,Yellow); //黄均线 //PlotNumeric(MA2,MA2,0,Green); //绿均线 PlotNumeric(MA3,MA3,0,DarkRed); //红均线 Print(Data1:2); Print(时间:+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data2图层处理 If (i==2 ) { Print(Data2:1); //替换Data2图层数据 多维度素组:Arrp_data1[2][0] [2]代表第二个维度数组 [0]0代表当前元素 [1]1代表前一个元素 Arrp_data1[2][0]=data0.Close[1]; SANumeric1[0][29]=FU_AverageArray(5,Arrp_data1[2]); //5均线 SANumeric1[0][32]=FU_AverageArray(10,Arrp_data1[2]); //10均线 SANumeric1[0][35]=FU_AverageArray(20,Arrp_data1[2]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][29],SANumeric1[3][29],SANumeric1[0][32],SANumeric1[3][32],SANumeric1[0][35],SANumeric1[3][35],Arrp_data1[11]); //画图区 PlotNumeric(MA1,MA1,0,Yellow); //黄均线 //PlotNumeric(MA2,MA2,0,Green); //绿均线 PlotNumeric(MA3,MA3,0,DarkRed); //红均线 //其他周期均线 PlotNumeric(data2.MA1,SANumeric1[0][29]); PlotNumeric(data3.MA1,SANumeric1[0][35]); Print(Data2:2); Print(时间:+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data3图层处理 if (i==3) { Print(Data3:1); //替换Data3图层数据 Arrp_data1[3][0]=data0.Close[1]; SANumeric1[0][38]=FU_AverageArray(5,Arrp_data1[3]); //5均线 SANumeric1[0][41]=FU_AverageArray(10,Arrp_data1[3]); //10均线 SANumeric1[0][44]=FU_AverageArray(20,Arrp_data1[3]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][38],SANumeric1[3][38],SANumeric1[0][41],SANumeric1[3][41],SANumeric1[0][44],SANumeric1[3][44],Arrp_data1[11]); //画图区 PlotNumeric(MA1,MA1,0,Yellow); //黄均线 //PlotNumeric(MA2,MA2,0,Green); //绿均线 PlotNumeric(MA3,MA3,0,DarkRed); //红均线 Print(Data3:1); Print(电脑时间:+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data4图层处理 if (i==4) { Print(Data4:1); //替换Data4图层数据 Arrp_data1[4][0]=data0.Close[1]; SANumeric1[0][47]=FU_AverageArray(5,Arrp_data1[4]); //5均线 SANumeric1[0][50]=FU_AverageArray(10,Arrp_data1[4]); //10均线 SANumeric1[0][53]=FU_AverageArray(20,Arrp_data1[4]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][47],SANumeric1[3][47],SANumeric1[0][50],SANumeric1[3][50],SANumeric1[0][53],SANumeric1[3][53],Arrp_data1[11]); //画图区 PlotNumeric(MA1,MA1,0,Yellow); //黄均线 //PlotNumeric(MA2,MA2,0,Green); //绿均线 PlotNumeric(MA3,MA3,0,DarkRed); //红均线 Print(Data4:1); Print(电脑时间:+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data5图层处理 If (i==5) { Print(Data5:1); //替换Data5图层数据 Arrp_data1[5][0]=data0.Close[1]; SANumeric1[0][56]=FU_AverageArray(5,Arrp_data1[5]); //5均线 SANumeric1[0][59]=FU_AverageArray(10,Arrp_data1[5]); //10均线 SANumeric1[0][62]=FU_AverageArray(20,Arrp_data1[5]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][56],SANumeric1[3][56],SANumeric1[0][59],SANumeric1[3][59],SANumeric1[0][62],SANumeric1[3][62],Arrp_data1[11]); //画图区 PlotNumeric(MA1,MA1,0,Yellow); //黄均线 //PlotNumeric(MA2,MA2,0,Green); //绿均线 PlotNumeric(MA3,MA3,0,DarkRed); //红均线 //状态展示 Print(Data5:1); Print(电脑时间:+DateTimeToString(CurrentDate+CurrentTime)); } //各状态标志状态 Commentary( 5均斜率:[+Text(Arrp_data1[11][1]) +]单均线超过回溯3值:[+Text(Arrp_data1[11][23]) +]交叉状态:[+Text(Arrp_data1[11][28]) +] ); }//------------------------------------------------------------------------Data0.图层有5条K线时在进行开仓If (Data0.CurrentBar >5 ){//------------------------------------------------------------------------Data0.图层处理Range[0:0]{ }//------------------------------------------------------------------------Data1.图层处理Range[1:1]{}//------------------------------------------------------------------------Data2.图层处理Range[2:2]{Commentary(data4图层:+text(data4.Arrp_data1[11][1])); //------------------------------------------------------------------------做多买卖点IF (MarketPosition<>1 AND BarExistStatus==1 and data4.Arrp_data1[11][1]>0) //添加 data4.Arrp_data1[11][1]>0 日线5均线斜率>0 会出现信号闪烁{//------------------------------------------------------------------------买点If( data2.Arrp_data1[11][28]==1 ) //DATA2.MA1与MA3金叉 { Buy(GANumeric1[1],close[1]); //最小交易单位 Commentary( 买1:data2周期金叉 ); } }//------------------------------------------------------------------------有多单的情况 if (MarketPosition==1 AND BarsSinceEntry>=1 ) //持有多单 and 下单>一个bar数的时候{//------------------------------------------------------------------------卖点If( data2.Arrp_data1[11][28]<>1) //DATA2.MA1与MA3金叉{ Sell(GANumeric1[1],close[1]); //全部卖出 Commentary(卖1:data2图层_金叉不成立); } }}//------------------------------------------------------------------------Data3.图层处理Range[3:3]{} //------------------------------------------------------------------------Data4.图层处理Range[4:4]{}} }//------------------------------------------------------------------------// 编译版本 2023/12/11 112053// 版权所有 xToby2100// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TradeBlazer公式修改和重写的权利//------------------------------------------------------------------------

//------------------------------------------------------------------------ // 简称: 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 //------------------------------------------------------------------------回溯CLOSE收盘价; Numeric FU_Cbacktrace(Numeric Length1, ArrayRef <Numeric> R_value ) { /*Length1:回溯值 R_value:返回值*/ Numeric i; For i=0 To Length1-1 { R_value[i]=CLOSE[i]; } Return 1; } //------------------------------------------------------------------------指定数_求数组平均值; Numeric FU_AverageArray(Numeric Length1, ArrayRef <Numeric> R_value ) { /* Length1:参与运算个数 R_value:传输值 */ Numeric i; Numeric sumValue(0); For i=0 To Length1-1 { //数据不为0视为有效数据 IF (R_value[i]!=0) { sumValue = sumValue + R_value[i]; //数组之和 } Else //传入数据有误 { Print(\"第[\"+text(CurrentBar)+\"]bar_\"+\"参数传入有误:\"+DateTimeToString(Date + Time)); Print(\"数据:\"+TextArray(R_value)); Return 0; } } Return sumValue/Length1; //数组之和除以样本数量 } //------------------------------------------------------------------------指定数_求数组平均值; Numeric FU_MAdat(Numeric sentence,Numeric MA1_1, Numeric MA1_2, Numeric MA2_1, Numeric MA2_2,Numeric MA3_1, Numeric MA3_2,ArrayRef <Numeric> R_value ) { //线性回归_斜率等基本数据 LinearReg(MA1_1,3,R_value[0],R_value[1],R_value[2],R_value[3],R_value[4]); LinearReg(MA2_1,3,R_value[0],R_value[5],R_value[6],R_value[7],R_value[8]); LinearReg(MA3_1,3,R_value[0],R_value[9],R_value[10],R_value[11],R_value[12]); //5_20 IF(MA1_1>MA3_1) { R_value[28]=1; //金叉 } Else If(MA1_1<MA3_1) { R_value[28]=-1; //死叉 } Else { R_value[28]=0; //相等 } Return 1; } 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); //新高 SANumeric1[0][65]=Highest(Close,5); //5 SANumeric1[0][66]=Highest(Close,10); //10 SANumeric1[0][67]=Highest(Close,20); //20 //新低 SANumeric1[0][68]=Lowest(Close,5); //5 SANumeric1[0][69]=Lowest(Close,10); //10 SANumeric1[0][70]=Lowest(Close,20); //10 //------------------------------------------------------------------------Data 取数据 FU_Cbacktrace(30,Arrp_data1[0]); //取data0-5周期 close数据 FU_Cbacktrace(30,Arrp_data1[1]); FU_Cbacktrace(30,Arrp_data1[2]); FU_Cbacktrace(30,Arrp_data1[3]); FU_Cbacktrace(30,Arrp_data1[4]); FU_Cbacktrace(30,Arrp_data1[5]);//只有在Data0图层上才运行调用FU_Cbacktrace函数,并且把数据赋值在data0.Arrp_data1[0]中,由于其他图层并没有运行该函数,所以其他图层中Arrp_data1[0]值为0则没有弹窗; //------------------------------------------------------------------------Data0图层处理 If(i==0) { Print(\"Data0:1\"); //替换Data0图层数据 Arrp_data1[0][0]=data0.Close[1]; SANumeric1[0][11]=FU_AverageArray(5,Arrp_data1[0]); //5均线 SANumeric1[0][14]=FU_AverageArray(10,Arrp_data1[0]); //10均线 SANumeric1[0][17]=FU_AverageArray(20,Arrp_data1[0]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][11],SANumeric1[3][11],SANumeric1[0][14],SANumeric1[3][14],SANumeric1[0][17],SANumeric1[3][17],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期 //Data1 //PlotNumeric(\"1.MA1\",Data1.SANumeric1[0][20],0,Yellow); //黄均线 //PlotNumeric(\"1.MA3\",Data1.SANumeric1[0][26],0,DarkRed); //红均线 //Data2 //PlotNumeric(\"data2.MA1\",data2.SANumeric1[0][29]); //5均线 //PlotNumeric(\"data2.MA3\",data2.SANumeric1[0][35]); //20均线 //Data3 //Data4 //PlotNumeric(\"data4.MA1\",data4.SANumeric1[0][47]); //5均线 //Data5 Print(\"Data0:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data1图层处理 If (i==1) { Print(\"Data1:1\"); //替换Data1图层数据 Arrp_data1[1][0]=data0.Close[1]; SANumeric1[0][20]=FU_AverageArray(5,Arrp_data1[1]); //5均线 SANumeric1[0][23]=FU_AverageArray(10,Arrp_data1[1]); //10均线 SANumeric1[0][26]=FU_AverageArray(20,Arrp_data1[1]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][20],SANumeric1[3][20],SANumeric1[0][23],SANumeric1[3][23],SANumeric1[0][26],SANumeric1[3][26],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 Print(\"Data1:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data2图层处理 If (i==2 ) { Print(\"Data2:1\"); //替换Data2图层数据 多维度素组:Arrp_data1[2][0] [2]代表第二个维度数组 [0]0代表当前元素 [1]1代表前一个元素 Arrp_data1[2][0]=data0.Close[1]; SANumeric1[0][29]=FU_AverageArray(5,Arrp_data1[2]); //5均线 SANumeric1[0][32]=FU_AverageArray(10,Arrp_data1[2]); //10均线 SANumeric1[0][35]=FU_AverageArray(20,Arrp_data1[2]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][29],SANumeric1[3][29],SANumeric1[0][32],SANumeric1[3][32],SANumeric1[0][35],SANumeric1[3][35],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期均线 //PlotNumeric(\"data2.MA1\",SANumeric1[0][29]); //PlotNumeric(\"data3.MA1\",SANumeric1[0][35]); Print(\"Data2:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data3图层处理 if (i==3) { Print(\"Data3:1\"); //替换Data3图层数据 Arrp_data1[3][0]=data0.Close[1]; SANumeric1[0][38]=FU_AverageArray(5,Arrp_data1[3]); //5均线 SANumeric1[0][41]=FU_AverageArray(10,Arrp_data1[3]); //10均线 SANumeric1[0][44]=FU_AverageArray(20,Arrp_data1[3]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][38],SANumeric1[3][38],SANumeric1[0][41],SANumeric1[3][41],SANumeric1[0][44],SANumeric1[3][44],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 Print(\"Data3:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data4图层处理 if (i==4) { Print(\"Data4:1\"); //替换Data4图层数据 Arrp_data1[4][0]=data0.Close[1]; //将data4周期数据最新价替换为 data0.Close[1] ,避免信号闪烁 SANumeric1[0][47]=FU_AverageArray(5,Arrp_data1[4]); //替换数据后计算出5均线 SANumeric1[0][50]=FU_AverageArray(10,Arrp_data1[4]); //替换数据后计算出10均线 SANumeric1[0][53]=FU_AverageArray(20,Arrp_data1[4]); //替换数据后计算出20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][47],SANumeric1[3][47],SANumeric1[0][50],SANumeric1[3][50],SANumeric1[0][53],SANumeric1[3][53],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期 //PlotNumeric(\"data4.MA1\",SANumeric1[0][47]); //黄均线 //PlotNumeric(\"data4.MA3\",SANumeric1[0][53]); //红均线 Print(\"Data4:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data5图层处理 If (i==5) { Print(\"Data5:1\"); //替换Data5图层数据 Arrp_data1[5][0]=data0.Close[1]; SANumeric1[0][56]=FU_AverageArray(5,Arrp_data1[5]); //5均线 SANumeric1[0][59]=FU_AverageArray(10,Arrp_data1[5]); //10均线 SANumeric1[0][62]=FU_AverageArray(20,Arrp_data1[5]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][56],SANumeric1[3][56],SANumeric1[0][59],SANumeric1[3][59],SANumeric1[0][62],SANumeric1[3][62],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //状态展示 Print(\"Data5:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //各状态标志状态 Commentary( \"5均斜率:[\"+Text(Arrp_data1[11][1]) +\"]单均线超过回溯3值:[\"+Text(Arrp_data1[11][23]) +\"]交叉状态:[\"+Text(Arrp_data1[11][28]) +\"]\" ); } //------------------------------------------------------------------------Data0.图层有20条K线时在进行开仓 If (Data0.CurrentBar >20 ) { //------------------------------------------------------------------------Data0.图层处理 Range[0:0] { } //------------------------------------------------------------------------Data1.图层处理 Range[1:1] { } //------------------------------------------------------------------------Data2.图层处理 Range[2:2] { Commentary(\"data4图层:\"+text(data4.Arrp_data1[11][1])); //------------------------------------------------------------------------做多买卖点 IF (MarketPosition<>1 and data4.Arrp_data1[11][1]>0) //添加 data4.Arrp_data1[11][1]>0 日线5均线斜率>0 会出现信号闪烁 { //------------------------------------------------------------------------买点 If( data2.Arrp_data1[11][28]==1 ) //DATA2.MA1与MA3金叉 { Buy(GANumeric1[1],close[1]); //最小交易单位 Commentary( \"买1:data2周期金叉\" ); } } //------------------------------------------------------------------------有多单的情况 if (MarketPosition==1 AND BarsSinceEntry>=1 ) //持有多单 and 下单>一个bar数的时候 { //------------------------------------------------------------------------卖点 If( data2.Arrp_data1[11][28]<>1) //DATA2.MA1与MA3金叉 { Sell(GANumeric1[1],close[1]); //全部卖出 Commentary(\"卖1:data2图层_金叉不成立\"); } } } //------------------------------------------------------------------------Data3.图层处理 Range[3:3] { } //------------------------------------------------------------------------Data4.图层处理 Range[4:4] { } } } //------------------------------------------------------------------------ // 编译版本 2023/12/11 112053 // 版权所有 xToby2100 // 更改声明 TradeBlazer Software保留对TradeBlazer平台 // 每一版本的TradeBlazer公式修改和重写的权利 //------------------------------------------------------------------------

我复制粘贴看了一下,是论坛上代码复制到TBQ去每行代码会自动多出一行空格,所以看出来有700多行

你这个不是只对data0做了数据源有效性检查么?其他图层呢? https://www.tbquant.net/TrainDetail?id=445

回复:老师我按照视频增加了代码之后还是会有信号闪烁?代码://------------------------------------------------------------------------// 简称: 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:保留空仓 VarsNumeric 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//------------------------------------------------------------------------回溯CLOSE收盘价;Numeric FU_Cbacktrace(Numeric Length1, ArrayRef <Numeric> R_value ){/*Length1:回溯值R_value:返回值*/Numeric i;For i=0 To Length1-1{R_value[i]=CLOSE[i];}Return 1;}//------------------------------------------------------------------------指定数_求数组平均值;Numeric FU_AverageArray(Numeric Length1, ArrayRef <Numeric> R_value ){/* Length1:参与运算个数R_value:传输值*/ Numeric i;Numeric sumValue(0);For i=0 To Length1-1{//数据不为0视为有效数据IF (R_value[i]!=0){ sumValue = sumValue + R_value[i]; //数组之和}Else //传入数据有误{Print(\"第[\"+text(CurrentBar)+\"]bar_\"+\"参数传入有误:\"+DateTimeToString(Date + Time));Print(\"数据:\"+TextArray(R_value));Return 0; }}Return sumValue/Length1; //数组之和除以样本数量}//------------------------------------------------------------------------指定数_求数组平均值;Numeric FU_MAdat(Numeric sentence,Numeric MA1_1, Numeric MA1_2, Numeric MA2_1, Numeric MA2_2,Numeric MA3_1, Numeric MA3_2,ArrayRef <Numeric> R_value ){/* sentence:判断数据MA1_1:实时均线值MA1_2:回溯1均线值MA2_1:实时均线值MA2_2:回溯1均线值MA3_1:实时均线值MA3_2:回溯1均线值R_value:传输值0:回溯那条bar//MA11:存放斜率K2:存放斜率K对应的角度3:存放截距b_公式y=kx+b4:存放指定的回归值,当前值与线性的差值//MA25:存放斜率K6:存放斜率K对应的角度7:存放截距b_公式y=kx+b8:存放指定的回归值,当前值与线性的差值//MA39:存放斜率K10:存放斜率K对应的角度11:存放截距b_公式y=kx+b12:存放指定的回归值,当前值与线性的差值//MA120:均线_斜率状态值 1:多 0:其他 -1:空//MA221:均线_斜率状态值 1:多 0:其他 -1:空//MA322:均线_斜率状态值 1:多 0:其他 -1:空//MA123: 均线压制 1:多 0: 其他 -1:空 //MA224: 均线压制 1:多 0: 其他 -1:空 //MA325: 均线压制 1:多 0: 其他 -1:空 //金叉_死叉26:5_10 1:金叉 0:其他 -1:空27:10_20金叉 1:金叉 0:其他 -1:空28:5_20金叉 1:金叉 0:其他 -1:空*///线性回归_斜率等基本数据LinearReg(MA1_1,3,R_value[0],R_value[1],R_value[2],R_value[3],R_value[4]);LinearReg(MA2_1,3,R_value[0],R_value[5],R_value[6],R_value[7],R_value[8]);LinearReg(MA3_1,3,R_value[0],R_value[9],R_value[10],R_value[11],R_value[12]);//MA1 均线_斜率状态值If(sentence>MA1_1 and R_value[1]>0 ){R_value[20]=1;}Else IF(sentence<MA1_1 and R_value[1]<0 ){R_value[20]=-1;}Else{R_value[20]=0;}//MA2 均线_斜率状态值If(sentence>MA2_1 and R_value[5]>0 ){R_value[21]=1;}Else IF(sentence<MA2_1 and R_value[5]<0 ){R_value[21]=-1;}Else{R_value[21]=0;}//MA3 均线_斜率状态值If(sentence>MA3_1 and R_value[5]>0 ){R_value[22]=1;}Else IF(sentence<MA3_1 and R_value[5]<0 ){R_value[22]=-1;}Else{R_value[22]=0;}//MA1单均线If(MA1_1>MA1_2){R_value[23]=1;}Else If ( MA1_1<MA1_2){R_value[23]=-1;}Else{R_value[23]=0;}//MA2单均线If(MA2_1>MA2_2){R_value[24]=1;}Else If ( MA2_1<MA2_2){R_value[24]=-1;}Else{R_value[24]=0;}//MA3单均线If(MA3_1>MA3_2){R_value[25]=1;}Else If ( MA3_1<MA3_2){R_value[25]=-1;}Else{R_value[25]=0;}//5_10IF(MA1_1>MA2_1){R_value[26]=1; //金叉}Else If(MA1_1<MA2_1){R_value[26]=-1; //死叉}Else{R_value[26]=0; //相等}//10_20IF(MA2_1>MA3_1){R_value[27]=1; //金叉}Else If(MA2_1<MA3_1){R_value[27]=-1; //死叉}Else{R_value[27]=0; //相等}//5_20IF(MA1_1>MA3_1){R_value[28]=1; //金叉}Else If(MA1_1<MA3_1){R_value[28]=-1; //死叉}Else{R_value[28]=0; //相等}Return 1; } Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次OnInit(){// 初始化数据GANumeric1[0]=0; //程序运行错误标志位GANumeric1[1]=DSquantity; //设置默认交易单位GANumeric1[2]=SLoss/100; //止损位%,前5条bar为低点,超过0.5按照0.5进行止损GANumeric1[3]=Sprofit/100; //止盈位%,涨幅超过止盈位并且回落后进行止盈!GANumeric1[5]=Clearance; //过节清仓标志位 1:保留多仓 0:无持仓 -1:保留空仓 //----------订阅周期SubscribeBar(Symbol,\"5m\",Data0.BeginDateTime); //5 分钟周期 data1SubscribeBar(Symbol,\"15m\",Data0.BeginDateTime); //15 分钟周期 data2SubscribeBar(Symbol,\"1h\",Data0.BeginDateTime); //1 小时周期 data3SubscribeBar(Symbol,\"1d\",Data0.BeginDateTime); //1 天周期 data4SubscribeBar(Symbol,\"1w\",Data0.BeginDateTime); //1 周周期 data5//----------多图层参数设置Range[0:DataCount-1]{SetInitCapital(2000000); //设置初始资金为200万SetOrderMap2MainSymbol(); //设置委托映射到主力SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手1SetOrderPriceOffset(2); //设置委托价为叫买/卖价偏移2跳AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());//设置忽略换仓信号计算}PrintClear; //控制台消息清除GetProperty(codePro);//获取合约属性 //当前策略应用商品的默认手续费率GetCommissionRate(rate); //获得当前品总手续费//SetCommissionRate(rate); //设置手续费GANumeric1[11]=rate.ratioType; //手续费类型GANumeric1[15]=ContractUnit; //交易单位GANumeric1[16]=MinMove*PriceScale; // 一个最小变动单位,也就是一跳GANumeric1[17]=bigpointvalue; // 股票类,一个整数点的价值}//每一个bar开始前驱动OnBarOpen(ArrayRef<Integer> indexs){//Print(\"ON**********\");//----------多图层数据对齐Numeric i;Range[i=0:DataCount-1]{ If (BarExistStatus<>1) { Print(\"图层[\"+Text(i) +\"]_时间:\"+DateTimeToString(Date + Time)+ \"_状态:\"+Text(BarExistStatus)); Return; } //买入手续费判断If(GANumeric1[11]==1) //一手多少钱{ GANumeric1[12]=GANumeric1[1]*rate.openRatio; //买入手续费=买入数量*买入手续费; GANumeric1[13]=GANumeric1[1]*rate.closeRatio; //平仓手续费=平仓数量*平仓手续费 GANumeric1[14]=GANumeric1[1]*rate.closeTodayRatio; //平今手续费=平仓数量*平今手续费}Else If (GANumeric1[11]==4) //按成交金额万分之{ GANumeric1[12]=close[1]*GANumeric1[1]*GANumeric1[15]*rate.openRatio/10000; //买入手续费= 期货价格 *买入数量*交易单位*买入手续费/10000 GANumeric1[13]=close[1]*GANumeric1[1]*GANumeric1[15]*rate.closeRatio/10000; //平仓手续费= 期货价格 *买入数量*交易单位*平仓手续费/10000 GANumeric1[14]=close[1]*GANumeric1[1]*GANumeric1[15]*rate.closeTodayRatio/10000; //平仓手续费= 期货价格 *买入数量*交易单位*平仓手续费/10000}//其他手续费类型报错Else{ GANumeric1[0]=GANumeric1[0]+1;}//合约基本信息Commentary(\"图层:[\"+Text(i)+\"]报错状态:[\"+Text(GANumeric1[0])+\"]bar:[\"+Text(CurrentBar)+\"]交易单位:[\"+text(GANumeric1[15])+\"] 一跳:[\"+Text(GANumeric1[16])+\"]变动价格:[\"+Text(GANumeric1[15]*GANumeric1[16]) +\"]5新高:[\"+Text(SANumeric1[0][65])+\"]5新低:[\"+text(SANumeric1[0][68])+\"]\");//手续费If (GANumeric1[11]==1){Commentary(\"元/手:\"+\"买入手续费:[\"+text(GANumeric1[12])+\"]平仓手续费:[\"+Text(GANumeric1[13])+\"]平今仓手续费:[\"+Text(GANumeric1[14])+\"]\"); }Else If (GANumeric1[11]==4){Commentary(\"成交金额:\"+\"买入手续费:[\"+text(GANumeric1[12])+\"]平仓手续费:[\"+Text(GANumeric1[13])+\"]平今仓手续费:[\"+Text(GANumeric1[14])+\"]\"); }}}//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); //新高 SANumeric1[0][65]=Highest(Close,5); //5 SANumeric1[0][66]=Highest(Close,10); //10 SANumeric1[0][67]=Highest(Close,20); //20 //新低 SANumeric1[0][68]=Lowest(Close,5); //5 SANumeric1[0][69]=Lowest(Close,10); //10 SANumeric1[0][70]=Lowest(Close,20); //10 //------------------------------------------------------------------------Data 取数据 FU_Cbacktrace(30,Arrp_data1[0]);//只有在Data0图层上才运行调用FU_Cbacktrace函数,并且把数据赋值在data0.Arrp_data1[0]中,由于其他图层并没有运行该函数,所以其他图层中Arrp_data1[0]值为0则没有弹窗; FU_Cbacktrace(30,Arrp_data1[1]); FU_Cbacktrace(30,Arrp_data1[2]); FU_Cbacktrace(30,Arrp_data1[3]); FU_Cbacktrace(30,Arrp_data1[4]); FU_Cbacktrace(30,Arrp_data1[5]); /*//数据展示 For i=0 To GetArraySize(Arrp_data1[1])-1 { Commentary(\"bar\"+\"Arrp_data[\"+Text(i)+\"]=\"+text(Arrp_data1[1][i])); }*/ //------------------------------------------------------------------------Data0图层处理 If(i==0) { Print(\"Data0:1\"); //替换Data0图层数据 Arrp_data1[0][0]=data0.Close[1]; SANumeric1[0][11]=FU_AverageArray(5,Arrp_data1[0]); //5均线 SANumeric1[0][14]=FU_AverageArray(10,Arrp_data1[0]); //10均线 SANumeric1[0][17]=FU_AverageArray(20,Arrp_data1[0]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][11],SANumeric1[3][11],SANumeric1[0][14],SANumeric1[3][14],SANumeric1[0][17],SANumeric1[3][17],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期 //Data1 //PlotNumeric(\"1.MA1\",Data1.SANumeric1[0][20],0,Yellow); //黄均线 //PlotNumeric(\"1.MA3\",Data1.SANumeric1[0][26],0,DarkRed); //红均线 //Data2 //PlotNumeric(\"data2.MA1\",data2.SANumeric1[0][29]); //5均线 //PlotNumeric(\"data2.MA3\",data2.SANumeric1[0][35]); //20均线 //Data3 //Data4 //PlotNumeric(\"data4.MA1\",data4.SANumeric1[0][47]); //5均线 //Data5 Print(\"Data0:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data1图层处理 If (i==1) { Print(\"Data1:1\"); //替换Data1图层数据 Arrp_data1[1][0]=data0.Close[1]; SANumeric1[0][20]=FU_AverageArray(5,Arrp_data1[1]); //5均线 SANumeric1[0][23]=FU_AverageArray(10,Arrp_data1[1]); //10均线 SANumeric1[0][26]=FU_AverageArray(20,Arrp_data1[1]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][20],SANumeric1[3][20],SANumeric1[0][23],SANumeric1[3][23],SANumeric1[0][26],SANumeric1[3][26],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 Print(\"Data1:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data2图层处理 If (i==2 ) { Print(\"Data2:1\"); //替换Data2图层数据 多维度素组:Arrp_data1[2][0] [2]代表第二个维度数组 [0]0代表当前元素 [1]1代表前一个元素 Arrp_data1[2][0]=data0.Close[1]; SANumeric1[0][29]=FU_AverageArray(5,Arrp_data1[2]); //5均线 SANumeric1[0][32]=FU_AverageArray(10,Arrp_data1[2]); //10均线 SANumeric1[0][35]=FU_AverageArray(20,Arrp_data1[2]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][29],SANumeric1[3][29],SANumeric1[0][32],SANumeric1[3][32],SANumeric1[0][35],SANumeric1[3][35],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期均线 //PlotNumeric(\"data2.MA1\",SANumeric1[0][29]); //PlotNumeric(\"data3.MA1\",SANumeric1[0][35]); Print(\"Data2:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data3图层处理 if (i==3) { Print(\"Data3:1\"); //替换Data3图层数据 Arrp_data1[3][0]=data0.Close[1]; SANumeric1[0][38]=FU_AverageArray(5,Arrp_data1[3]); //5均线 SANumeric1[0][41]=FU_AverageArray(10,Arrp_data1[3]); //10均线 SANumeric1[0][44]=FU_AverageArray(20,Arrp_data1[3]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][38],SANumeric1[3][38],SANumeric1[0][41],SANumeric1[3][41],SANumeric1[0][44],SANumeric1[3][44],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 Print(\"Data3:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data4图层处理 if (i==4) { Print(\"Data4:1\"); //替换Data4图层数据 Arrp_data1[4][0]=data0.Close[1]; SANumeric1[0][47]=FU_AverageArray(5,Arrp_data1[4]); //5均线 SANumeric1[0][50]=FU_AverageArray(10,Arrp_data1[4]); //10均线 SANumeric1[0][53]=FU_AverageArray(20,Arrp_data1[4]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][47],SANumeric1[3][47],SANumeric1[0][50],SANumeric1[3][50],SANumeric1[0][53],SANumeric1[3][53],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期 //PlotNumeric(\"data4.MA1\",SANumeric1[0][47]); //黄均线 //PlotNumeric(\"data4.MA3\",SANumeric1[0][53]); //红均线 Print(\"Data4:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data5图层处理 If (i==5) { Print(\"Data5:1\"); //替换Data5图层数据 Arrp_data1[5][0]=data0.Close[1]; SANumeric1[0][56]=FU_AverageArray(5,Arrp_data1[5]); //5均线 SANumeric1[0][59]=FU_AverageArray(10,Arrp_data1[5]); //10均线 SANumeric1[0][62]=FU_AverageArray(20,Arrp_data1[5]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][56],SANumeric1[3][56],SANumeric1[0][59],SANumeric1[3][59],SANumeric1[0][62],SANumeric1[3][62],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //状态展示 Print(\"Data5:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //各状态标志状态 Commentary( \"5均斜率:[\"+Text(Arrp_data1[11][1]) +\"]单均线超过回溯3值:[\"+Text(Arrp_data1[11][23]) +\"]交叉状态:[\"+Text(Arrp_data1[11][28]) +\"]\" ); }//------------------------------------------------------------------------Data0.图层有20条K线时在进行开仓If (Data0.CurrentBar >20 ){//------------------------------------------------------------------------Data0.图层处理Range[0:0]{ }//------------------------------------------------------------------------Data1.图层处理Range[1:1]{}//------------------------------------------------------------------------Data2.图层处理Range[2:2]{Commentary(\"data4图层:\"+text(data4.Arrp_data1[11][1])); //------------------------------------------------------------------------做多买卖点IF (MarketPosition<>1 and data4.Arrp_data1[11][1]>0) //添加 data4.Arrp_data1[11][1]>0 日线5均线斜率>0 会出现信号闪烁{//------------------------------------------------------------------------买点If( data2.Arrp_data1[11][28]==1 ) //DATA2.MA1与MA3金叉 { Buy(GANumeric1[1],close[1]); //最小交易单位 Commentary( \"买1:data2周期金叉\" ); } }//------------------------------------------------------------------------有多单的情况 if (MarketPosition==1 AND BarsSinceEntry>=1 ) //持有多单 and 下单>一个bar数的时候{//------------------------------------------------------------------------卖点If( data2.Arrp_data1[11][28]<>1) //DATA2.MA1与MA3金叉{ Sell(GANumeric1[1],close[1]); //全部卖出 Commentary(\"卖1:data2图层_金叉不成立\"); } }}//------------------------------------------------------------------------Data3.图层处理Range[3:3]{} //------------------------------------------------------------------------Data4.图层处理Range[4:4]{}} }//------------------------------------------------------------------------// 编译版本 2023/12/11 112053// 版权所有 xToby2100// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TradeBlazer公式修改和重写的权利//------------------------------------------------------------------------

回复:你确定你单图层不会信号闪烁?

回复:你这一千行代码让人怎么看啊?不简化看不了

回复:我用data0图层周期跑都不会信号闪烁.

回复:功能函数解析:FU_Cbacktrace //取data0-5周期 close数据FU_AverageArray //用data0周期close[1]替换后算出data0-5周期的5均线值FU_MAdat//输入均线值,计算出均线的斜率,金叉,死叉等功能目前出现信号闪烁的是 (data4.Arrp_data1[11][1]>0)// 当data4周期5均线斜率>0 FU_MAdat算出均线斜率,是用替换后数据算出的结果,我观察了只有Data0.close[1]确定后,斜率值才会变动,所以是没有引用未来函数的;这是简化后代码://------------------------------------------------------------------------// 简称: 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:保留空仓 VarsNumeric 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//------------------------------------------------------------------------回溯CLOSE收盘价;Numeric FU_Cbacktrace(Numeric Length1, ArrayRef <Numeric> R_value ){/*Length1:回溯值R_value:返回值*/Numeric i;For i=0 To Length1-1{R_value[i]=CLOSE[i];}Return 1;}//------------------------------------------------------------------------指定数_求数组平均值;Numeric FU_AverageArray(Numeric Length1, ArrayRef <Numeric> R_value ){/* Length1:参与运算个数R_value:传输值*/ Numeric i;Numeric sumValue(0);For i=0 To Length1-1{//数据不为0视为有效数据IF (R_value[i]!=0){ sumValue = sumValue + R_value[i]; //数组之和}Else //传入数据有误{Print(\"第[\"+text(CurrentBar)+\"]bar_\"+\"参数传入有误:\"+DateTimeToString(Date + Time));Print(\"数据:\"+TextArray(R_value));Return 0; }}Return sumValue/Length1; //数组之和除以样本数量}//------------------------------------------------------------------------指定数_求数组平均值;Numeric FU_MAdat(Numeric sentence,Numeric MA1_1, Numeric MA1_2, Numeric MA2_1, Numeric MA2_2,Numeric MA3_1, Numeric MA3_2,ArrayRef <Numeric> R_value ){//线性回归_斜率等基本数据LinearReg(MA1_1,3,R_value[0],R_value[1],R_value[2],R_value[3],R_value[4]);LinearReg(MA2_1,3,R_value[0],R_value[5],R_value[6],R_value[7],R_value[8]);LinearReg(MA3_1,3,R_value[0],R_value[9],R_value[10],R_value[11],R_value[12]);//5_20IF(MA1_1>MA3_1){R_value[28]=1; //金叉}Else If(MA1_1<MA3_1){R_value[28]=-1; //死叉}Else{R_value[28]=0; //相等}Return 1; } Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次OnInit(){//----------订阅周期SubscribeBar(Symbol,\"5m\",Data0.BeginDateTime); //5 分钟周期 data1SubscribeBar(Symbol,\"15m\",Data0.BeginDateTime); //15 分钟周期 data2SubscribeBar(Symbol,\"1h\",Data0.BeginDateTime); //1 小时周期 data3SubscribeBar(Symbol,\"1d\",Data0.BeginDateTime); //1 天周期 data4SubscribeBar(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); //新高 SANumeric1[0][65]=Highest(Close,5); //5 SANumeric1[0][66]=Highest(Close,10); //10 SANumeric1[0][67]=Highest(Close,20); //20 //新低 SANumeric1[0][68]=Lowest(Close,5); //5 SANumeric1[0][69]=Lowest(Close,10); //10 SANumeric1[0][70]=Lowest(Close,20); //10 //------------------------------------------------------------------------Data 取数据 FU_Cbacktrace(30,Arrp_data1[0]); //取data0-5周期 close数据 FU_Cbacktrace(30,Arrp_data1[1]); FU_Cbacktrace(30,Arrp_data1[2]); FU_Cbacktrace(30,Arrp_data1[3]); FU_Cbacktrace(30,Arrp_data1[4]); FU_Cbacktrace(30,Arrp_data1[5]);//只有在Data0图层上才运行调用FU_Cbacktrace函数,并且把数据赋值在data0.Arrp_data1[0]中,由于其他图层并没有运行该函数,所以其他图层中Arrp_data1[0]值为0则没有弹窗; //------------------------------------------------------------------------Data0图层处理 If(i==0) { Print(\"Data0:1\"); //替换Data0图层数据 Arrp_data1[0][0]=data0.Close[1]; SANumeric1[0][11]=FU_AverageArray(5,Arrp_data1[0]); //5均线 SANumeric1[0][14]=FU_AverageArray(10,Arrp_data1[0]); //10均线 SANumeric1[0][17]=FU_AverageArray(20,Arrp_data1[0]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][11],SANumeric1[3][11],SANumeric1[0][14],SANumeric1[3][14],SANumeric1[0][17],SANumeric1[3][17],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期 //Data1 //PlotNumeric(\"1.MA1\",Data1.SANumeric1[0][20],0,Yellow); //黄均线 //PlotNumeric(\"1.MA3\",Data1.SANumeric1[0][26],0,DarkRed); //红均线 //Data2 //PlotNumeric(\"data2.MA1\",data2.SANumeric1[0][29]); //5均线 //PlotNumeric(\"data2.MA3\",data2.SANumeric1[0][35]); //20均线 //Data3 //Data4 //PlotNumeric(\"data4.MA1\",data4.SANumeric1[0][47]); //5均线 //Data5 Print(\"Data0:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data1图层处理 If (i==1) { Print(\"Data1:1\"); //替换Data1图层数据 Arrp_data1[1][0]=data0.Close[1]; SANumeric1[0][20]=FU_AverageArray(5,Arrp_data1[1]); //5均线 SANumeric1[0][23]=FU_AverageArray(10,Arrp_data1[1]); //10均线 SANumeric1[0][26]=FU_AverageArray(20,Arrp_data1[1]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][20],SANumeric1[3][20],SANumeric1[0][23],SANumeric1[3][23],SANumeric1[0][26],SANumeric1[3][26],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 Print(\"Data1:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data2图层处理 If (i==2 ) { Print(\"Data2:1\"); //替换Data2图层数据 多维度素组:Arrp_data1[2][0] [2]代表第二个维度数组 [0]0代表当前元素 [1]1代表前一个元素 Arrp_data1[2][0]=data0.Close[1]; SANumeric1[0][29]=FU_AverageArray(5,Arrp_data1[2]); //5均线 SANumeric1[0][32]=FU_AverageArray(10,Arrp_data1[2]); //10均线 SANumeric1[0][35]=FU_AverageArray(20,Arrp_data1[2]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][29],SANumeric1[3][29],SANumeric1[0][32],SANumeric1[3][32],SANumeric1[0][35],SANumeric1[3][35],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期均线 //PlotNumeric(\"data2.MA1\",SANumeric1[0][29]); //PlotNumeric(\"data3.MA1\",SANumeric1[0][35]); Print(\"Data2:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data3图层处理 if (i==3) { Print(\"Data3:1\"); //替换Data3图层数据 Arrp_data1[3][0]=data0.Close[1]; SANumeric1[0][38]=FU_AverageArray(5,Arrp_data1[3]); //5均线 SANumeric1[0][41]=FU_AverageArray(10,Arrp_data1[3]); //10均线 SANumeric1[0][44]=FU_AverageArray(20,Arrp_data1[3]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][38],SANumeric1[3][38],SANumeric1[0][41],SANumeric1[3][41],SANumeric1[0][44],SANumeric1[3][44],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 Print(\"Data3:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data4图层处理 if (i==4) { Print(\"Data4:1\"); //替换Data4图层数据 Arrp_data1[4][0]=data0.Close[1]; //将data4周期数据最新价替换为 data0.Close[1] ,避免信号闪烁 SANumeric1[0][47]=FU_AverageArray(5,Arrp_data1[4]); //替换数据后计算出5均线 SANumeric1[0][50]=FU_AverageArray(10,Arrp_data1[4]); //替换数据后计算出10均线 SANumeric1[0][53]=FU_AverageArray(20,Arrp_data1[4]); //替换数据后计算出20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][47],SANumeric1[3][47],SANumeric1[0][50],SANumeric1[3][50],SANumeric1[0][53],SANumeric1[3][53],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期 //PlotNumeric(\"data4.MA1\",SANumeric1[0][47]); //黄均线 //PlotNumeric(\"data4.MA3\",SANumeric1[0][53]); //红均线 Print(\"Data4:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data5图层处理 If (i==5) { Print(\"Data5:1\"); //替换Data5图层数据 Arrp_data1[5][0]=data0.Close[1]; SANumeric1[0][56]=FU_AverageArray(5,Arrp_data1[5]); //5均线 SANumeric1[0][59]=FU_AverageArray(10,Arrp_data1[5]); //10均线 SANumeric1[0][62]=FU_AverageArray(20,Arrp_data1[5]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][56],SANumeric1[3][56],SANumeric1[0][59],SANumeric1[3][59],SANumeric1[0][62],SANumeric1[3][62],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //状态展示 Print(\"Data5:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //各状态标志状态 Commentary( \"5均斜率:[\"+Text(Arrp_data1[11][1]) +\"]单均线超过回溯3值:[\"+Text(Arrp_data1[11][23]) +\"]交叉状态:[\"+Text(Arrp_data1[11][28]) +\"]\" ); }//------------------------------------------------------------------------Data0.图层有20条K线时在进行开仓If (Data0.CurrentBar >20 ){//------------------------------------------------------------------------Data0.图层处理Range[0:0]{ }//------------------------------------------------------------------------Data1.图层处理Range[1:1]{}//------------------------------------------------------------------------Data2.图层处理Range[2:2]{Commentary(\"data4图层:\"+text(data4.Arrp_data1[11][1])); //------------------------------------------------------------------------做多买卖点IF (MarketPosition<>1 and data4.Arrp_data1[11][1]>0) //添加 data4.Arrp_data1[11][1]>0 日线5均线斜率>0 会出现信号闪烁{//------------------------------------------------------------------------买点If( data2.Arrp_data1[11][28]==1 ) //DATA2.MA1与MA3金叉 { Buy(GANumeric1[1],close[1]); //最小交易单位 Commentary( \"买1:data2周期金叉\" ); } }//------------------------------------------------------------------------有多单的情况 if (MarketPosition==1 AND BarsSinceEntry>=1 ) //持有多单 and 下单>一个bar数的时候{//------------------------------------------------------------------------卖点If( data2.Arrp_data1[11][28]<>1) //DATA2.MA1与MA3金叉{ Sell(GANumeric1[1],close[1]); //全部卖出 Commentary(\"卖1:data2图层_金叉不成立\"); } }}//------------------------------------------------------------------------Data3.图层处理Range[3:3]{} //------------------------------------------------------------------------Data4.图层处理Range[4:4]{}} }//------------------------------------------------------------------------// 编译版本 2023/12/11 112053// 版权所有 xToby2100// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TradeBlazer公式修改和重写的权利//------------------------------------------------------------------------

回复:简化完700行?看不了...

回复:没有啊,我简化完387行呀?主要是data2图层:341-371有逻辑,其余的都是数据处理简化后代码://------------------------------------------------------------------------// 简称: 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:保留空仓 VarsNumeric 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//------------------------------------------------------------------------回溯CLOSE收盘价;Numeric FU_Cbacktrace(Numeric Length1, ArrayRef <Numeric> R_value ){/*Length1:回溯值R_value:返回值*/Numeric i;For i=0 To Length1-1{R_value[i]=CLOSE[i];}Return 1;}//------------------------------------------------------------------------指定数_求数组平均值;Numeric FU_AverageArray(Numeric Length1, ArrayRef <Numeric> R_value ){/* Length1:参与运算个数R_value:传输值*/ Numeric i;Numeric sumValue(0);For i=0 To Length1-1{//数据不为0视为有效数据IF (R_value[i]!=0){ sumValue = sumValue + R_value[i]; //数组之和}Else //传入数据有误{Print(\"第[\"+text(CurrentBar)+\"]bar_\"+\"参数传入有误:\"+DateTimeToString(Date + Time));Print(\"数据:\"+TextArray(R_value));Return 0; }}Return sumValue/Length1; //数组之和除以样本数量}//------------------------------------------------------------------------指定数_求数组平均值;Numeric FU_MAdat(Numeric sentence,Numeric MA1_1, Numeric MA1_2, Numeric MA2_1, Numeric MA2_2,Numeric MA3_1, Numeric MA3_2,ArrayRef <Numeric> R_value ){//线性回归_斜率等基本数据LinearReg(MA1_1,3,R_value[0],R_value[1],R_value[2],R_value[3],R_value[4]);LinearReg(MA2_1,3,R_value[0],R_value[5],R_value[6],R_value[7],R_value[8]);LinearReg(MA3_1,3,R_value[0],R_value[9],R_value[10],R_value[11],R_value[12]);//5_20IF(MA1_1>MA3_1){R_value[28]=1; //金叉}Else If(MA1_1<MA3_1){R_value[28]=-1; //死叉}Else{R_value[28]=0; //相等}Return 1; } Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次OnInit(){//----------订阅周期SubscribeBar(Symbol,\"5m\",Data0.BeginDateTime); //5 分钟周期 data1SubscribeBar(Symbol,\"15m\",Data0.BeginDateTime); //15 分钟周期 data2SubscribeBar(Symbol,\"1h\",Data0.BeginDateTime); //1 小时周期 data3SubscribeBar(Symbol,\"1d\",Data0.BeginDateTime); //1 天周期 data4SubscribeBar(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); //新高 SANumeric1[0][65]=Highest(Close,5); //5 SANumeric1[0][66]=Highest(Close,10); //10 SANumeric1[0][67]=Highest(Close,20); //20 //新低 SANumeric1[0][68]=Lowest(Close,5); //5 SANumeric1[0][69]=Lowest(Close,10); //10 SANumeric1[0][70]=Lowest(Close,20); //10 //------------------------------------------------------------------------Data 取数据 FU_Cbacktrace(30,Arrp_data1[0]); //取data0-5周期 close数据 FU_Cbacktrace(30,Arrp_data1[1]); FU_Cbacktrace(30,Arrp_data1[2]); FU_Cbacktrace(30,Arrp_data1[3]); FU_Cbacktrace(30,Arrp_data1[4]); FU_Cbacktrace(30,Arrp_data1[5]);//只有在Data0图层上才运行调用FU_Cbacktrace函数,并且把数据赋值在data0.Arrp_data1[0]中,由于其他图层并没有运行该函数,所以其他图层中Arrp_data1[0]值为0则没有弹窗; //------------------------------------------------------------------------Data0图层处理 If(i==0) { Print(\"Data0:1\"); //替换Data0图层数据 Arrp_data1[0][0]=data0.Close[1]; SANumeric1[0][11]=FU_AverageArray(5,Arrp_data1[0]); //5均线 SANumeric1[0][14]=FU_AverageArray(10,Arrp_data1[0]); //10均线 SANumeric1[0][17]=FU_AverageArray(20,Arrp_data1[0]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][11],SANumeric1[3][11],SANumeric1[0][14],SANumeric1[3][14],SANumeric1[0][17],SANumeric1[3][17],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期 //Data1 //PlotNumeric(\"1.MA1\",Data1.SANumeric1[0][20],0,Yellow); //黄均线 //PlotNumeric(\"1.MA3\",Data1.SANumeric1[0][26],0,DarkRed); //红均线 //Data2 //PlotNumeric(\"data2.MA1\",data2.SANumeric1[0][29]); //5均线 //PlotNumeric(\"data2.MA3\",data2.SANumeric1[0][35]); //20均线 //Data3 //Data4 //PlotNumeric(\"data4.MA1\",data4.SANumeric1[0][47]); //5均线 //Data5 Print(\"Data0:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data1图层处理 If (i==1) { Print(\"Data1:1\"); //替换Data1图层数据 Arrp_data1[1][0]=data0.Close[1]; SANumeric1[0][20]=FU_AverageArray(5,Arrp_data1[1]); //5均线 SANumeric1[0][23]=FU_AverageArray(10,Arrp_data1[1]); //10均线 SANumeric1[0][26]=FU_AverageArray(20,Arrp_data1[1]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][20],SANumeric1[3][20],SANumeric1[0][23],SANumeric1[3][23],SANumeric1[0][26],SANumeric1[3][26],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 Print(\"Data1:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data2图层处理 If (i==2 ) { Print(\"Data2:1\"); //替换Data2图层数据 多维度素组:Arrp_data1[2][0] [2]代表第二个维度数组 [0]0代表当前元素 [1]1代表前一个元素 Arrp_data1[2][0]=data0.Close[1]; SANumeric1[0][29]=FU_AverageArray(5,Arrp_data1[2]); //5均线 SANumeric1[0][32]=FU_AverageArray(10,Arrp_data1[2]); //10均线 SANumeric1[0][35]=FU_AverageArray(20,Arrp_data1[2]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][29],SANumeric1[3][29],SANumeric1[0][32],SANumeric1[3][32],SANumeric1[0][35],SANumeric1[3][35],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期均线 //PlotNumeric(\"data2.MA1\",SANumeric1[0][29]); //PlotNumeric(\"data3.MA1\",SANumeric1[0][35]); Print(\"Data2:2\"); Print(\"时间:\"+DateTimeToString(Date + Time)); } //------------------------------------------------------------------------Data3图层处理 if (i==3) { Print(\"Data3:1\"); //替换Data3图层数据 Arrp_data1[3][0]=data0.Close[1]; SANumeric1[0][38]=FU_AverageArray(5,Arrp_data1[3]); //5均线 SANumeric1[0][41]=FU_AverageArray(10,Arrp_data1[3]); //10均线 SANumeric1[0][44]=FU_AverageArray(20,Arrp_data1[3]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][38],SANumeric1[3][38],SANumeric1[0][41],SANumeric1[3][41],SANumeric1[0][44],SANumeric1[3][44],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 Print(\"Data3:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data4图层处理 if (i==4) { Print(\"Data4:1\"); //替换Data4图层数据 Arrp_data1[4][0]=data0.Close[1]; //将data4周期数据最新价替换为 data0.Close[1] ,避免信号闪烁 SANumeric1[0][47]=FU_AverageArray(5,Arrp_data1[4]); //替换数据后计算出5均线 SANumeric1[0][50]=FU_AverageArray(10,Arrp_data1[4]); //替换数据后计算出10均线 SANumeric1[0][53]=FU_AverageArray(20,Arrp_data1[4]); //替换数据后计算出20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][47],SANumeric1[3][47],SANumeric1[0][50],SANumeric1[3][50],SANumeric1[0][53],SANumeric1[3][53],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //其他周期 //PlotNumeric(\"data4.MA1\",SANumeric1[0][47]); //黄均线 //PlotNumeric(\"data4.MA3\",SANumeric1[0][53]); //红均线 Print(\"Data4:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //------------------------------------------------------------------------Data5图层处理 If (i==5) { Print(\"Data5:1\"); //替换Data5图层数据 Arrp_data1[5][0]=data0.Close[1]; SANumeric1[0][56]=FU_AverageArray(5,Arrp_data1[5]); //5均线 SANumeric1[0][59]=FU_AverageArray(10,Arrp_data1[5]); //10均线 SANumeric1[0][62]=FU_AverageArray(20,Arrp_data1[5]); //20均线 //均线斜率等基础数据 FU_MAdat(data0.Close[1],SANumeric1[0][56],SANumeric1[3][56],SANumeric1[0][59],SANumeric1[3][59],SANumeric1[0][62],SANumeric1[3][62],Arrp_data1[11]); //画图区 PlotNumeric(\"MA1\",MA1,0,Yellow); //黄均线 //PlotNumeric(\"MA2\",MA2,0,Green); //绿均线 PlotNumeric(\"MA3\",MA3,0,DarkRed); //红均线 //状态展示 Print(\"Data5:1\"); Print(\"电脑时间:\"+DateTimeToString(CurrentDate+CurrentTime)); } //各状态标志状态 Commentary( \"5均斜率:[\"+Text(Arrp_data1[11][1]) +\"]单均线超过回溯3值:[\"+Text(Arrp_data1[11][23]) +\"]交叉状态:[\"+Text(Arrp_data1[11][28]) +\"]\" ); }//------------------------------------------------------------------------Data0.图层有20条K线时在进行开仓If (Data0.CurrentBar >20 ){//------------------------------------------------------------------------Data0.图层处理Range[0:0]{ }//------------------------------------------------------------------------Data1.图层处理Range[1:1]{}//------------------------------------------------------------------------Data2.图层处理Range[2:2]{Commentary(\"data4图层:\"+text(data4.Arrp_data1[11][1])); //------------------------------------------------------------------------做多买卖点IF (MarketPosition<>1 and data4.Arrp_data1[11][1]>0) //添加 data4.Arrp_data1[11][1]>0 日线5均线斜率>0 会出现信号闪烁{//------------------------------------------------------------------------买点If( data2.Arrp_data1[11][28]==1 ) //DATA2.MA1与MA3金叉 { Buy(GANumeric1[1],close[1]); //最小交易单位 Commentary( \"买1:data2周期金叉\" ); } }//------------------------------------------------------------------------有多单的情况 if (MarketPosition==1 AND BarsSinceEntry>=1 ) //持有多单 and 下单>一个bar数的时候{//------------------------------------------------------------------------卖点If( data2.Arrp_data1[11][28]<>1) //DATA2.MA1与MA3金叉{ Sell(GANumeric1[1],close[1]); //全部卖出 Commentary(\"卖1:data2图层_金叉不成立\"); } }}//------------------------------------------------------------------------Data3.图层处理Range[3:3]{} //------------------------------------------------------------------------Data4.图层处理Range[4:4]{}} }//------------------------------------------------------------------------// 编译版本 2023/12/11 112053// 版权所有 xToby2100// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TradeBlazer公式修改和重写的权利//------------------------------------------------------------------------