跨周期信号闪烁问题

共有data0-5个图层: 分别对应1分钟、5分钟、1小时、日线、周线;

为了避免跨周期bar数据不对齐问题,特意添加了数据对齐函数

data-href=

本人已经大概排查出代码第591行条件  data4.Arrp_data1[11][1]>0 会出现信号闪烁;

但是按照程序的运行原理,我是取用data0.close[1]的数据进行运算的,不会出现未来函数的问题,但是编译程序运行时还是会提示有信号闪缩

data-href=

代码:

//------------------------------------------------------------------------

// 简称: 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 )

{

/*

sentence:判断数据

MA1_1:实时均线值

MA1_2:回溯1均线值

MA2_1:实时均线值

MA2_2:回溯1均线值

MA3_1:实时均线值

MA3_2:回溯1均线值

R_value:传输值

0:回溯那条bar

//MA1

1:存放斜率K

2:存放斜率K对应的角度

3:存放截距b_公式y=kx+b

4:存放指定的回归值,当前值与线性的差值

//MA2

5:存放斜率K

6:存放斜率K对应的角度

7:存放截距b_公式y=kx+b

8:存放指定的回归值,当前值与线性的差值

//MA3

9:存放斜率K

10:存放斜率K对应的角度

11:存放截距b_公式y=kx+b

12:存放指定的回归值,当前值与线性的差值



//MA1

20:均线_斜率状态值 1:多  0:其他 -1:空

//MA2

21:均线_斜率状态值 1:多  0:其他 -1:空

//MA3

22:均线_斜率状态值 1:多  0:其他 -1:空


//MA1

23: 均线压制  1:多    0: 其他  -1:空

//MA2

24: 均线压制  1:多    0: 其他  -1:空

//MA3

25: 均线压制  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_10

IF(MA1_1>MA2_1)

{

R_value[26]=1; //金叉

}

Else If(MA1_1<MA2_1)

{

R_value[26]=-1; //死叉

}

Else

{

R_value[26]=0; //相等

}



//10_20

IF(MA2_1>MA3_1)

{

R_value[27]=1; //金叉

}

Else If(MA2_1<MA3_1)

{

R_value[27]=-1; //死叉

}

Else

{

R_value[27]=0; //相等

}


//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()

{

// 初始化数据

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  分钟周期 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


//----------多图层参数设置

Range[0:DataCount-1]

{

SetInitCapital(2000000); //设置初始资金为200万

SetOrderMap2MainSymbol(); //设置委托映射到主力

SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手1

SetOrderPriceOffset(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多行

data-href=

你这个不是只对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:保留空仓  

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 )

{

/*

sentence:判断数据

MA1_1:实时均线值

MA1_2:回溯1均线值

MA2_1:实时均线值

MA2_2:回溯1均线值

MA3_1:实时均线值

MA3_2:回溯1均线值

R_value:传输值

0:回溯那条bar

//MA1

1:存放斜率K

2:存放斜率K对应的角度

3:存放截距b_公式y=kx+b

4:存放指定的回归值,当前值与线性的差值

//MA2

5:存放斜率K

6:存放斜率K对应的角度

7:存放截距b_公式y=kx+b

8:存放指定的回归值,当前值与线性的差值

//MA3

9:存放斜率K

10:存放斜率K对应的角度

11:存放截距b_公式y=kx+b

12:存放指定的回归值,当前值与线性的差值



//MA1

20:均线_斜率状态值 1:多  0:其他 -1:空

//MA2

21:均线_斜率状态值 1:多  0:其他 -1:空

//MA3

22:均线_斜率状态值 1:多  0:其他 -1:空


//MA1

23: 均线压制  1:多    0: 其他  -1:空

//MA2

24: 均线压制  1:多    0: 其他  -1:空

//MA3

25: 均线压制  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_10

IF(MA1_1>MA2_1)

{

R_value[26]=1; //金叉

}

Else If(MA1_1<MA2_1)

{

R_value[26]=-1; //死叉

}

Else

{

R_value[26]=0; //相等

}



//10_20

IF(MA2_1>MA3_1)

{

R_value[27]=1; //金叉

}

Else If(MA2_1<MA3_1)

{

R_value[27]=-1; //死叉

}

Else

{

R_value[27]=0; //相等

}


//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()

{

// 初始化数据

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  分钟周期 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


//----------多图层参数设置

Range[0:DataCount-1]

{

SetInitCapital(2000000); //设置初始资金为200万

SetOrderMap2MainSymbol(); //设置委托映射到主力

SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手1

SetOrderPriceOffset(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:保留空仓  


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公式修改和重写的权利

//------------------------------------------------------------------------

\"\"

简化完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:保留空仓  

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公式修改和重写的权利

//------------------------------------------------------------------------