共有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:保留空仓
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多行
老师我按照视频增加了代码之后还是会有信号闪烁?
代码:
//------------------------------------------------------------------------
// 简称: 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公式修改和重写的权利
//------------------------------------------------------------------------