




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ADX均线策略(TB版)策略概述该策略基于ADX(平均方向性移动指数)和EMA(指数移动平均线)构建交易系统,旨在捕捉市场趋势变化,实现买入和卖出操作。参数设置DMI_N:14计算DMI指标的周期数。DMI_M:30,用于平滑ADX指标的周期数。AvgLen:30,用于计算EMA的周期数。EntryBar:2,入场确认后的等待周期数。FastLength:5,快速移动平均线周期数(扩展部分)。SlowLength:20,慢速移动平均线周期数(扩展部分)。TrailingStart1、TrailingStart2、TrailingStop1、TrailingStop2:跟踪止盈的启动和设置参数(扩展部分)。StopLossSet:30,固定止损点数(扩展部分)。入场条件做多条件:上根K线的收盘价高于30根K线最高价的EMA。ADX指标向上(即当前ADX值大于前一根K线的ADX值)。当前价格大于等于多头触发价(BuyTarget),多头触发价=收盘价+(30根K线最高价的EMA-30根K线最低价的EMA)/2。满足上述条件后的EntryBar周期内入场。做空条件:上根K线的收盘价低于30根K线最低价的EMA。ADX指标向上。当前价格小于等于空头触发价(SellTarget),空头触发价=收盘价-(30根K线最高价的EMA-30根K线最低价的EMA)/2。满足上述条件后的EntryBar周期内入场。出场条件多单出场:当前价格下破30根K线最高价的EMA。可选跟踪止盈或固定止损出场。空单出场:当前价格上破30根K线最低价的EMA。可选跟踪止盈或固定止损出场。扩展交易规则两均线交叉买入:当快速移动平均线(FastLength周期)上穿慢速移动平均线(SlowLength周期),且ADX值大于25时,执行买入操作。两均线交叉卖出:当快速移动平均线下穿慢速移动平均线,且ADX值大于25时,执行卖出操作。跟踪止盈:根据最高价(多单)或最低价(空单)与入场价的差距,动态调整止损点,以实现跟踪止盈。代码逻辑策略代码中包含了DMI指标的计算过程、EMA的计算、入场条件的判断、出场条件的判断以及扩展交易规则的实现。实现了对市场趋势的识别和交易信号的生成。做多代码:ParamsNumericDMI_N(14);NumericDMI_M(30);NumericAvgLen(30);NumericEntryBar(2);VarsNumericSeriesoDMIPlus;NumericSeriesoDMIMinus;NumericSeriesoDMI;NumericSeriesoADX;NumericSeriesoADXR;NumericSeriesoVolty;NumericSeriessDMI;NumericSeriessADX;NumericSeriescumm;NumericSeriessVolty;NumericPlusDM;NumericMinusDM;NumericUpperMove;NumericLowerMove;NumericSumPlusDM(0);NumericSumMinusDM(0);NumericSumTR(0);NumericSeriesAvgPlusDM;NumericSeriesAvgMinusDM;NumericSF;NumericDivisor;Numerici;NumericSeriesTRValue;NumericSeriesUpperMA(0);NumericSeriesLowerMA(0);NumericSeriesADXValue(0);NumericSeriesChanSpread(0);BoolBuySetup(False);NumericSeriesBuyTarget(0);NumericSeriesMROBS(0);BoolSeriesCon1;NumericMinpoint;BeginIf(!CallAuctionFilter())Return;Minpoint=Minmove*PriceScale;SF=1/DMI_N;TRValue=TrueRange;If(CurrentBar==DMI_N){Fori=0ToDMI_N-1{PlusDM=0;MinusDM=0;UpperMove=High[i]-High[i+1];LowerMove=Low[i+1]-Low[i];If(UpperMove>LowerMoveandUpperMove>0){PlusDM=UpperMove;}Elseif(LowerMove>UpperMoveandLowerMove>0){MinusDM=LowerMove;}SumPlusDM=SumPlusDM+PlusDM;SumMinusDM=SumMinusDM+MinusDM;SumTR=SumTR+TRValue[i];}AvgPlusDM=SumPlusDM/DMI_N;AvgMinusDM=SumMinusDM/DMI_N;sVolty=SumTR/DMI_N;}Elseif(CurrentBar>DMI_N){PlusDM=0;MinusDM=0;UpperMove=High-High[1];LowerMove=Low[1]-Low;If(UpperMove>LowerMoveandUpperMove>0){PlusDM=UpperMove;}Elseif(LowerMove>UpperMoveandLowerMove>0){MinusDM=LowerMove;}AvgPlusDM=AvgPlusDM[1]+SF*(PlusDM-AvgPlusDM[1]);AvgMinusDM=AvgMinusDM[1]+SF*(MinusDM-AvgMinusDM[1]);sVolty=sVolty[1]+SF*(TRValue-sVolty[1]);}Else{oDMIPlus=InvalidNumeric;oDMIMinus=InvalidNumeric;oDMI=InvalidNumeric;oADX=InvalidNumeric;oADXR=InvalidNumeric;oVolty=InvalidNumeric;}If(sVolty>0){oDMIPlus=100*AvgPlusDM/sVolty;oDMIMinus=100*AvgMinusDM/sVolty;}else{oDMIPlus=0;oDMIMinus=0;}Divisor=oDMIPlus+oDMIMinus;if(Divisor>0){sDMI=100*Abs(oDMIPlus-oDMIMinus)/Divisor;}else{sDMI=0;}cumm=Cum(sDMI);If(CurrentBar>0){If(CurrentBar<=DMI_N){sADX=Cumm/CurrentBar;oADXR=(sADX+sADX[CurrentBar-1])*0.5;}Else{sADX=sADX[1]+SF*(sDMI-sADX[1]);oADXR=(sADX+sADX[DMI_M-1])*0.5;}}oVolty=sVolty;oDMI=sDMI;oADX=sADX;ADXValue=oADX;UpperMA=XAverage(High,AvgLen);LowerMA=XAverage(Low,AvgLen);ChanSpread=(UpperMA-LowerMA)/2;BuySetup=Close>UpperMAandADXValue>ADXValue[1];IF(BuySetup){BuyTarget=Close+ChanSpread;}MROBS=NthCon(BuySetup,1);If(MROBS>EntryBar){MROBS=0;}IF(MROBS[1]<>0andMarketPosition==0andCurrentBar>100){If(High>=BuyTarget[1]AndVol>0){Buy(0,max(Open,BuyTarget[1]));}}If(MarketPosition==1andBarsSinceEntry>0AndVol>0){If(Low<=UpperMA[1]-Minpoint){Sell(0,min(Open,UpperMA[1]-minpoint));}}End做多代码解读:ParamsNumericDMI_N(14);//声明数值型参数名DMI_N,初始值为14.//NumericDMI_M(30);//声明数值型参数名DMI_M,初始值为30.//NumericAvgLen(30);//声明数值型参数名为AvgLen,初始值为30.//NumericEntryBar(2);//声明数值型参数名为EntryBar,初始值为2.//Vars//DMI最终算出结果需要的变量名。//NumericSeriesoDMIPlus;//声明数值序列变量名为oDMIPlus.//NumericSeriesoDMIMinus;//声明数值序列变量名为oDMIMinus.//NumericSeriesoDMI;//声明数值序列变量名为oDMI.//NumericSeriesoADX;//声明数值序列变量名为oADX.//NumericSeriesoADXR;//声明数值序列变量名为oADXR.//NumericSeriesoVolty;//声明数值序列变量名为oVolty.////DMI过程计算中需要的变量名。//NumericSeriessDMI;//声明数值序列变量名sDMI.//NumericSeriessADX;//声明数值序列变量名sADX.//NumericSeriescumm;//声明数值序列变量名cumm。//NumericSeriessVolty;//声明数值序列变量名sVilty。//NumericPlusDM;//声明数值变量名PlusDM。//NumericMinusDM;//声明数值变量名MinusDM。//NumericUpperMove;//声明数值变量名UpperMove。//NumericLowerMove;//声明数值变量名LowerMove。//NumericSumPlusDM(0);//声明数值变量名SumPlusDM,赋值为0.//NumericSumMinusDM(0);//声明数值变量名SumMinusDM,赋值为0.//NumericSumTR(0);//声明数值变量名SumTR,赋值为0.//NumericSeriesAvgPlusDM;//声明数值序列变量名AvgPlusDM.//NumericSeriesAvgMinusDM;//声明数值序列变量名AvgMinusDM.//NumericSF;//声明数值变量名SF。//NumericDivisor;声明数值变量名Divisor。//Numerici;//声明数值变量名i。//NumericSeriesTRValue;//声明数值序列变量名TRValue。////计算EMA用的变量名。//NumericSeriesUpperMA(0);//声明数值序列变量UpperMA,赋值为0.//NumericSeriesLowerMA(0);//声明数值序列变量LowerMA,赋值为0.//NumericSeriesADXValue(0);//声明数值序列变量ADXValue,赋值为0.//NumericSeriesChanSpread(0);//声明数值序列变量ChanSpread,赋值为0.//BoolBuySetup(False);//声明布尔型变量名BuySetup,初始判断为假。//NumericSeriesBuyTarget(0);//声明数值变量名BuyTarget,赋值为0.//NumericSeriesMROBS(0);//声明数值变量名MROBS,赋值为0.//BoolSeriesCon1;//声明布尔型序列变量名Con1.//NumericMinpoint;//声明数值型变量名Minpoint。//BeginIf(!CallAuctionFilter())Return;//集合竞价和小节休息过滤。//Minpoint=Minmove*PriceScale;//这两句一般固定的直接调用就行,一个过滤,一个计算最小变动价位。////DMI指标计算,最终将输出ADX指标SF=1/DMI_N;//变量SF是一个随周期而变化的系数,根据上面的赋值,可以直接得出SF=1/14。//TRValue=TrueRange;//变量TRValue值,直接调用以前我们解读过的求真实波动函数TrueRange的值。//If(CurrentBar==DMI_N)//假如当前k线数位等于14,按照下列语句来计算。//{Fori=0ToDMI_N-1//循环语句,就是下列计算方程i值从0-13给它计算一遍。//{PlusDM=0;//先直接等于0了//MinusDM=0;//先等于0//UpperMove=High[i]-High[i+1];//开始从UpperMove=最高价High[0]-最高价High[1],一直计算到High[13]-High[14],相当于反复算了14次//LowerMove=Low[i+1]-Low[i];//同上的,算这变量LowerMove,也来14次,但记住了,循环计算也是按照顺序逻辑来的,就像我们小学记的九九乘法表那样,先把1乘以到9,再2乘以到9,程序也是这么一步步按语句来读的,所以从这FOR下边的这花括号反复计算,当条件不满足了,才直接就跳过这括号//If(UpperMove>LowerMoveandUpperMove>0)//假如算得的变量UpperMove大于LowerMove,而且UpperMove大于0.//{PlusDM=UpperMove;//变量PlusDM就等于变量UpperMove值。//}Elseif(LowerMove>UpperMoveandLowerMove>0)//并列语句,当条件变成这样的时候,变量LowerMove大于变量UpperMove值,而且LowerMove大于0.//{MinusDM=LowerMove;//变量MinusDM值等于变量LowerMove值。//}SumPlusDM=SumPlusDM+PlusDM;//累加起来的意思,从变量SumPlusDM等于0逐步加上计算所得的PlusDM值。//SumMinusDM=SumMinusDM+MinusDM;//同上解读,这个是累加变量SumMinusDM总值。//SumTR=SumTR+TRValue[i];//同上,把真实波动值计算出来,累加到变量SumTR总值里。//}AvgPlusDM=SumPlusDM/DMI_N;//变量AvgPlusDM值等于变量SumPlusDM总值除以周期数14.//AvgMinusDM=SumMinusDM/DMI_N;//同上的解读。//sVolty=SumTR/DMI_N;//同上解读的。//}//循环到这只要还在0-13里的,就往回重新算一次,直到条件不满足了,才开始读下列语句。//Elseif(CurrentBar>DMI_N)//看着明白了吧,当k线数位大于了周期数14.就是上边循环跳出来了,开始执行下列语句。//{PlusDM=0;//先等于0.你要问我那14根k线里循环计算得到的变量PlusDM值呢?我只能跟你说,那个值是针对前14根k线计算的,但是从第15根到开始一直到当前跳动的K线,变量PlusDM都是从0新算起。//MinusDM=0;//同上解读的。先等于0.//UpperMove=High-High[1];//变量UpperMove值等于当前的最高价减去前一个的最高价。//LowerMove=Low[1]-Low;//变量LowerMove值等于前一个最低价减去当前的最低价。//If(UpperMove>LowerMoveandUpperMove>0)//假如了UpperMove大于LowerMove,并且大于0的。//{PlusDM=UpperMove;//把变量UpperMove值赋值给变量PlusDM,变成一个新值了,这时不再等于0了。//}Elseif(LowerMove>UpperMoveandLowerMove>0)//假如LowerMove大于UpperMove,并且大于0的。//{MinusDM=LowerMove;//也是赋予变量MinusDM新的值,即等于变量LowerMove值。//}AvgPlusDM=AvgPlusDM[1]+SF*(PlusDM-AvgPlusDM[1]);//照公式直接解读,变量AvgPlusDM[1]意思是前一个,对第15根k线来说,就是前14根k线算得的值。所以记住这[1]就是从当前数位倒退一个数位的意思。//AvgMinusDM=AvgMinusDM[1]+SF*(MinusDM-AvgMinusDM[1]);//这个也直接照公式解读。//sVolty=sVolty[1]+SF*(TRValue-sVolty[1]);//同上的,直接照公式解读。//}Else//其实这最后这个else就是上面CurrentBar不是大于或等于14时,那就是小于14了,执行下列语句,变量都是返回无效值的。//{oDMIPlus=InvalidNumeric;//返回无效值。//oDMIMinus=InvalidNumeric;//返回无效值。//oDMI=InvalidNumeric;//返回无效值。//oADX=InvalidNumeric;//返回无效值。//oADXR=InvalidNumeric;//返回无效值。//oVolty=InvalidNumeric;//返回无效值。//}If(sVolty>0)//假如计算得的变量sVolty值大于0.//{oDMIPlus=100*AvgPlusDM/sVolty;//变量0DMIPlus=100*变量AvgPlusDM/变量sVolty。//oDMIMinus=100*AvgMinusDM/sVolty;//直接照公式解读了。//}Else//这就是假如当变量sVolty小于0时。//{oDMIPlus=0;//变量oDMIPlus=0.//oDMIMinus=0;//变量oDMIMinus=0.//}Divisor=oDMIPlus+oDMIMinus;//变量Divisor=变量oDMIPlus+变量oDMIMinus//if(Divisor>0)//假如算得的变量Divisor值大于0的。//{sDMI=100*Abs(oDMIPlus-oDMIMinus)/Divisor;//函数Abs()意思是返回参数的绝对值,通俗的说不管括号里计算得到的是大于还是小于0,它返回的都是正整数。所以照公式解读,算出变量sDMI值了。//}else//假如算得的变量Divisor小于0的。//{sDMI=0;//变量sDMI等于0.//}cumm=Cum(sDMI);//函数Cum(),意思是求累计值,所以这个Cum(sDMI)就是计算从第一个k线以来sDMI值的累计值,把它赋值给变量cumm的。//If(CurrentBar>0)//假如k线数位大于0的,其实就是从第二根开始了。//{If(CurrentBar<=DMI_N)//这里再给个限定条件,k线数位小于或等于周期数14的。//{sADX=Cumm/CurrentBar;//变量sADX等于变量Cumm值除以k线数位值的。//oADXR=(sADX+sADX[CurrentBar-1])*0.5;//变量oADXR=(变量sADX+变量sADX[k线数位值-1])*固定系数0.5//}Else//这个就是假如CurrentBar大于14的。//{sADX=sADX[1]+SF*(sDMI-sADX[1]);//变量sADX又是一个新算法,直接照公式来解读了。//oADXR=(sADX+sADX[DMI_M-1])*0.5;//同样的,照公式算出新的oADXR值。//}}oVolty=sVolty;//变量oVolty=变量sVolty。//oDMI=sDMI;//变量oDMI=变量sDMI。//oADX=sADX;//变量oADX=变量sADX。//ADXValue=oADX;//变量ADXValue=变量oADX,其实这就是ADX均线了。//UpperMA=XAverage(High,AvgLen);//计算30根K线最高价的EMA。//LowerMA=XAverage(Low,AvgLen);//计算30根K线最低价的EMA。//ChanSpread=(UpperMA-LowerMA)/2;//通过EMA计算出通道宽度。//BuySetup=Close>UpperMAandADXValue>ADXValue[1];//当ADX向上且当前价大于30根K线最高价的EMA满足买入准备条件。//IF(BuySetup)//假如满足买入条件了,执行下列语句。//{BuyTarget=Close+ChanSpread;//满足买入准备条件时,用当前k线价格计算出多头触发价,即为当前价+通道值。//}MROBS=NthCon(BuySetup,1);//上次满足买入准备条件距离当前k线的距离数目.//If(MROBS>EntryBar)//假如这个距离数目大于参数EntryBar初值2的。//{MROBS=0;//距离上次买入准备条件超过参数ENTRYBAR的数目后,重置。//}//系统入场条件。//IF(MROBS[1]<>0andMarketPosition==0andCurrentBar>100)//满足买入准备条件后,在ENTRYBAR数目内,且大于等于买入多头触发价,多单入场。//{If(High>=BuyTarget[1]AndVol>0)//高价突破变量BuyTarget[1],而且成交量大于0的。//{Buy(0,max(Open,BuyTarget[1]));//取最大值开盘价买入1手。//}}//系统出场条件。//If(MarketPosition==1andBarsSinceEntry>0AndVol>0)//当持有多单且当前价格下破30根K线最高价的EMA,多单出场。//{If(Low<=UpperMA[1]-Minpoint)//低价小于或者等于UpperMA[1]-最小变动价Minpoint。//{Sell(0,min(Open,UpperMA[1]-minpoint));//取最小值卖出平仓。//}}End做空信号代码ParamsNumericDMI_N(14);NumericDMI_M(30);NumericAvgLen(30);NumericEntryBar(2);VarsNumericSeriesoDMIPlus;NumericSeriesoDMIMinus;NumericSeriesoDMI;NumericSeriesoADX;NumericSeriesoADXR;NumericSeriesoVolty;NumericSeriessDMI;NumericSeriessADX;NumericSeriescumm;NumericSeriessVolty;NumericPlusDM;NumericMinusDM;NumericUpperMove;NumericLowerMove;NumericSumPlusDM(0);NumericSumMinusDM(0);NumericSumTR(0);NumericSeriesAvgPlusDM;NumericSeriesAvgMinusDM;NumericSF;NumericDivisor;Numerici;NumericSeriesTRValue;NumericSeriesUpperMA(0);NumericSeriesLowerMA(0);NumericSeriesADXValue(0);NumericSeriesChanSpread(0);BoolSellSetup(False);NumericSeriesSellTarget(0);NumericSeriesMROSS(0);NumericMinpoint;Begin//集合竞价和小节休息过滤If(!CallAuctionFilter())Return;Minpoint=Minmove*PriceScale;//---DMI计算开始---//SF=1/DMI_N;TRValue=TrueRange;If(CurrentBar==DMI_N){Fori=0ToDMI_N-1{PlusDM=0;MinusDM=0;UpperMove=High[i]-High[i+1];LowerMove=Low[i+1]-Low[i];If(UpperMove>LowerMoveandUpperMove>0){PlusDM=UpperMove;}Elseif(LowerMove>UpperMoveandLowerMove>0){MinusDM=LowerMove;}SumPlusDM=SumPlusDM+PlusDM;SumMinusDM=SumMinusDM+MinusDM;SumTR=SumTR+TRValue[i];}AvgPlusDM=SumPlusDM/DMI_N;AvgMinusDM=SumMinusDM/DMI_N;sVolty=SumTR/DMI_N;}Elseif(CurrentBar>DMI_N){PlusDM=0;MinusDM=0;UpperMove=High-High[1];LowerMove=Low[1]-Low;If(UpperMove>LowerMoveandUpperMove>0){PlusDM=UpperMove;}Elseif(LowerMove>UpperMoveandLowerMove>0){MinusDM=LowerMove;}AvgPlusDM=AvgPlusDM[1]+SF*(PlusDM-AvgPlusDM[1]);AvgMinusDM=AvgMinusDM[1]+SF*(MinusDM-AvgMinusDM[1]);sVolty=sVolty[1]+SF*(TRValue-sVolty[1]);}Else{oDMIPlus=InvalidNumeric;oDMIMinus=InvalidNumeric;oDMI=InvalidNumeric;oADX=InvalidNumeric;oADXR=InvalidNumeric;oVolty=InvalidNumeric;}If(sVolty>0){oDMIPlus=100*AvgPlusDM/sVolty;oDMIMinus=100*AvgMinusDM/sVolty;}Else{oDMIPlus=0;oDMIMinus=0;}Divisor=oDMIPlus+oDMIMinus;if(Divisor>0){sDMI=100*Abs(oDMIPlus-oDMIMinus)/Divisor;}else{sDMI=0;}cumm=Cum(sDMI);If(CurrentBar>0){If(CurrentBar<=DMI_N){sADX=Cumm/CurrentBar;oADXR=(sADX+sADX[CurrentBar-1])*0.5;}Else{sADX=sADX[1]+SF*(sDMI-sADX[1]);oADXR=(sADX+sADX[DMI_M-1])*0.5;}}oVolty=sVolty;oDMI=sDMI;oADX=sADX;//PlotNumeric("oADX",oADX);//---DMI计算结束---//ADXValue=oADX;UpperMA=XAverage(High,AvgLen);LowerMA=XAverage(Low,AvgLen);ChanSpread=(UpperMA-LowerMA)/2;SellSetup=Close<LowerMAandADXValue>ADXValue[1];//当ADX向上且当前价下于30根K线最低价的EMA满足卖出准备条件。//If(SellSetup){SellTarget=Close-ChanSpread;//满足卖出准备条件时,用前bar价格计算出空头触发价。//}MROSS=NthCon(SellSetup,1);//上次满足卖出准备条件距离当前BAR的数目//If(MROSS>EntryBar){MROSS=0;//距离上次卖出准备条件超过ENTRYBAR的数目后,重置//}//系统入场规则//If(MROSS[1]<>0andMarketPosition==0andCurrentBar>100)//满足卖出准备条件后ENTRYBAR数目内,且小于等于空头触发价,空单入场//{If(Low<=SellTarget[1]AndVol>0){Sellshort(0,Min(Open,SellTarget[1]));}}//系统出场规则//If(MarketPosition==-1andBarsSinceEntry>0AndVol>0)//当持有空单且当前价格上破30根K线最低价的EMA,多单出场//{If(High>=LowerMA[1]+minpoint){BuyToCover(0,max(Open,LowerMA[1]+minpoint));}}End做空信号代码解释Params//定义数值型参数DMI_N并初始化为14NumericDMI_N(14);//定义数值型参数DMI_M并初始化为30NumericDMI_M(30);//定义数值型参数AvgLen并初始化为30NumericAvgLen(30);//定义数值型参数EntryBar并初始化为2NumericEntryBar(2);Vars//声明数值序列变量oDMIPlusNumericSeriesoDMIPlus;//声明数值序列变量oDMIMinusNumericSeriesoDMIMinus;//声明数值序列变量oDMINumericSeriesoDMI;//声明数值序列变量oADXNumericSeriesoADX;//声明数值序列变量oADXRNumericSeriesoADXR;//声明数值序列变量oVoltyNumericSeriesoVolty;//声明数值序列变量sDMINumericSeriessDMI;//声明数值序列变量sADXNumericSeriessADX;//声明数值序列变量cummNumericSeriescumm;//声明数值序列变量sVoltyNumericSeriessVolty;//声明数值变量PlusDMNumericPlusDM;//声明数值变量MinusDMNumericMinusDM;//声明数值变量UpperMoveNumericUpperMove;//声明数值变量LowerMoveNumericLowerMove;//声明数值变量SumPlusDM并初始化为0NumericSumPlusDM(0);//声明数值变量SumMinusDM并初始化为0NumericSumMinusDM(0);//声明数值变量SumTR并初始化为0NumericSumTR(0);//声明数值序列变量AvgPlusDMNumericSeriesAvgPlusDM;//声明数值序列变量AvgMinusDMNumericSeriesAvgMinusDM;//声明数值变量SFNumericSF;//声明数值变量DivisorNumericDivisor;//声明数值变量iNumerici;//声明数值序列变量TRValueNumericSeriesTRValue;//声明数值序列变量UpperMA并初始化为0NumericSeriesUpperMA(0);//声明数值序列变量LowerMA并初始化为0NumericSeriesLowerMA(0);//声明数值序列变量ADXValue并初始化为0NumericSeriesADXValue(0);//声明数值序列变量ChanSpread并初始化为0NumericSeriesChanSpread(0);//声明布尔型变量SellSetup并初始化为FalseBoolSellSetup(False);//声明数值序列变量SellTarget并初始化为0NumericSeriesSellTarget(0);//声明数值序列变量MROSS并初始化为0NumericSeriesMROSS(0);//声明数值变量MinpointNumericMinpoint;Begin//集合竞价和小节休息过滤If(!CallAuctionFilter())Return;//计算最小变动价位Minpoint=Minmove*PriceScale;//---DMI计算开始---////计算系数SFSF=1/DMI_N;//计算真实波动范围值并赋值给TRValueTRValue=TrueRange;//如果当前bar数等于DMI_NIf(CurrentBar==DMI_N){//循环计算相关变量Fori=0ToDMI_N-1{//初始化PlusDM和MinusDM为0PlusDM=0;MinusDM=0;//计算UpperMove和LowerMoveUpperMove=High[i]-High[i+1];LowerMove=Low[i+1]-Low[i];//根据条件赋值PlusDM和MinusDMIf(UpperMove>LowerMoveandUpperMove>0){PlusDM=UpperMove;}Elseif(LowerMove>UpperMoveandLowerMove>0){MinusDM=LowerMove;}//累加相关变量SumPlusDM=SumPlusDM+PlusDM;SumMinusDM=SumMinusDM+MinusDM;SumTR=SumTR+TRValue[i];}//计算平均值AvgPlusDM=SumPlusDM/DMI_N;AvgMinusDM=SumMinusDM/DMI_N;sVolty=SumTR/DMI_N;}//如果当前bar数大于DMI_NElseif(CurrentBar>DMI_N){//初始化PlusDM和MinusDM为0PlusDM=0;MinusDM=0;//计算UpperMove和LowerMoveUpperMove=High-High[1];LowerMove=Low[1]-Low;//根据条件赋值PlusDM和MinusDMIf(UpperMove>LowerMoveandUpperMove>0){PlusDM=UpperMove;}Elseif(LowerMove>UpperMoveandLowerMove>0){MinusDM=LowerMove;}//计算相关变量AvgPlusDM=AvgPlusDM[1]+SF*(PlusDM-AvgPlusDM[1]);AvgMinusDM=AvgMinusDM[1]+SF*(MinusDM-AvgMinusDM[1]);sVolty=sVolty[1]+SF*(TRValue-sVolty[1]);}//否则(当前bar数小于DMI_N)Else{//赋值为无效数值oDMIPlus=InvalidNumeric;oDMIMinus=InvalidNumeric;oDMI=InvalidNumeric;oADX=InvalidNumeric;oADXR=InvalidNumeric;oVolty=InvalidNumeric;}//根据sVolty的值计算oDMIPlus和oDMIMinusIf(sVolty>0){oDMIPlus=100*AvgPlusDM/sVolty;oDMIMinus=100*AvgMinusDM/sVolty;}Else{oDMIPlus=0;oDMIMinus=0;}//计算DivisorDivisor=oDMIPlus+oDMIMinus;//根据Divisor的值计算sDMIif(Divisor>0){sDMI=100*Abs(oDMIPlus-oDMIMinus)/Divisor;}else{sDMI=0;}//计算累计值cumm=Cum(sDMI);//根据当前bar数计算sADX和oADXRIf(CurrentBar>0){If(CurrentBar<=DMI_N){sADX=Cumm/CurrentBar;oADXR=(sADX+sADX[CurrentBar-1])*0.5;}Else{sADX=sADX[1]+SF*(sDMI-sADX[1]);oADXR=(sADX+sADX[DMI_M-1])*0.5;}}//赋值相关变量oVolty=sVolty;oDMI=sDMI;oADX=sADX;//---DMI计算结束---////计算相关指标ADXValue=oADX;UpperMA=XAverage(High,AvgLen);LowerMA=XAverage(Low,AvgLen);ChanSpread=(UpperMA-LowerMA)/2;//设置卖出准备条件SellSetup=Close<LowerMAandADXValue>ADXValue[1];//如果满足卖出准备条件,计算空头触发价If(SellSetup){SellTarget=Close-ChanSpread;}//计算上次满足卖出准备条件距离当前bar的数目MROSS=NthCon(SellSetup,1);//如果距离超过EntryBar,重置If(MROSS>EntryBar){MROSS=0;}//系统入场规则If(MROSS[1]<>0andMarketPosition==0andCurrentBar>100){If(Low<=SellTarget[1]AndVol>0){Sellshort(0,Min(Open,SellTarget[1]));}}//系统出场规则If(MarketPosition==-1andBarsSinceEntry>0AndVol>0){If(High>=LowerMA[1]+minpoint){BuyToCover(0,max(Open,LowerMA[1]+minpoint));}}End不行,还得加买卖规则:两条移动均价,ADX值大于25的,两均线交叉的买入;ADX大于25,两均线交叉卖出。加上后的信号代码如下:ParamsNumericDMI_N(14);NumericDMI_M(30);NumericAvgLen(30);NumericFastLength(5);NumericSlowLength(20);NumericTrailingStart1(50);//跟踪止盈启动设置1//NumericTrailingStart2(80);//跟踪止盈启动设置2//NumericTrailingStop1(30);//跟踪止盈设置1//NumericTrailingStop2(20);//跟踪止盈设置2//NumericStopLossSet(30);//固定止损30个点//VarsNumericSeriesoDMIPlus;NumericSeriesoDMIMinus;NumericSeriesoDMI;NumericSeriesoADX;NumericSeriesoADXR;NumericSeriesoVolty;NumericSeriessDMI;NumericSeriessADX;NumericSeriescumm;NumericSeriessVolty;NumericPlusDM;NumericMinusDM;NumericUpperMove;NumericLowerMove;NumericSumPlusDM(0);NumericSumMinusDM(0);NumericSumTR(0);NumericSeriesAvgPlusDM;NumericSeriesAvgMinusDM;NumericSF;NumericDivisor;Numerici;NumericSeriesTRValue;NumericMinpoint;NumericSeriesAvgValue1;NumericSeriesAvgValue2;NumericSeriesHighestAfterEntry;NumericSeriesLowestAfterEntry;NumericMyEntryPrice;Numericmyprice;Numericmyexitprice;BeginAvgValue1=AverageFC(Close,FastLength);AvgValue2=AverageFC(Close,SlowLength);PlotNumeric("MA1",AvgValue1);PlotNumeric("MA2",AvgValue2);If(!CallAuctionFilter())Return;Minpoint=Minmove*PriceScale;//---DMI计算开始---//SF=1/DMI_N;TRValue=TrueRange;If(CurrentBar==DMI_N){Fori=0ToDMI_N-1{PlusDM=0;MinusDM=0;UpperMove=High[i]-High[i+1];LowerMove=Low[i+1]-Low[i];If(UpperMove>LowerMoveandUpperMove>0){PlusDM=UpperMove;}Elseif(LowerMove>UpperMoveandLowerMove>0){MinusDM=LowerMove;}SumPlusDM=SumPlusDM+PlusDM;SumMinusDM=SumMinusDM+MinusDM;SumTR=SumTR+TRValue[i];}AvgPlusDM=SumPlusDM/DMI_N;AvgMinusDM=SumMinusDM/DMI_N;sVolty=SumTR/DMI_N;}Elseif(CurrentBar>DMI_N){PlusDM=0;MinusDM=0;UpperMove=High-High[1];LowerMove=Low[1]-Low;If(UpperMove>LowerMoveandUpperMove>0){PlusDM=UpperMove;}Elseif(LowerMove>UpperMoveandLowerMove>0){MinusDM=LowerMove;}AvgPlusDM=AvgPlusDM[1]+SF*(PlusDM-AvgPlusDM[1]);AvgMinusDM=AvgMinusDM[1]+SF*(MinusDM-AvgMinusDM[1]);sVolty=sVolty[1]+SF*(TRValue-sVolty[1]);}Else{oDMIPlus=InvalidNumeric;oDMIMinus=InvalidNumeric;oDMI=InvalidNumeric;oADX=InvalidNumeric;oADXR=InvalidNumeric;oVolty=InvalidNumeric;}If(sVolty>0){oDMIPlus=100*AvgPlusDM/sVolty;oDMIMinus=100*AvgMinusDM/sVolty;}Else{oDMIPlus=0;oDMIMinus=0;}Divisor=oDMIPlus+oDMIMinus;if(Divisor>0){sDMI=100*Abs(oDMIPlus-oDMIMinus)/Divisor;}else{sDMI=0;}cumm=Cum(sDMI);If(CurrentBar>0){If(CurrentBar<=DMI_N){sADX=Cumm/Curren
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科协课题立项申报书范文
- 如何撰写社科课题申报书
- 叉车租赁带司机合同范本
- 课题申报书哪里查
- 班级管理 课题立申报书
- 班级建设课题申报书
- 合同范本 销售合同
- 周结算合同范例
- 深圳课题申报书格式
- 音乐课题立项申报书代写
- GB/T 7251.3-2017低压成套开关设备和控制设备第3部分:由一般人员操作的配电板(DBO)
- 工程质量回访记录
- GB/T 2572-2005纤维增强塑料平均线膨胀系数试验方法
- 2023年江苏省中学生生物奥林匹克竞赛试题及答案
- 维修质量检验制度
- 食管支架植入术后护理课件
- 品质控制计划(QC工程图)
- 海外派遣人员管理办法
- 混凝土灌注桩质量平行检查记录(钢筋笼)
- 汽车营销学(全套课件)
- 现浇墩台身轴线偏位、全高竖直度检测记录表
评论
0/150
提交评论