期货网站源码分享下载 期货交易平台源码

大家好,今天小编来为大家解答以下的问题,关于期货网站源码分享下载,期货交易平台源码这个很多人还不知道,现在让我们一起来看看吧!

平均趋向ADX指标是我喜欢观察的一个好指标,它是辅助我判断是否有趋势运动的关键性指标,大家可以对它很熟悉了,我也不再这里细说什么了,这次直接解读TB系统里编写的基于ADX及EMA的交易系统,当然我对交易结果感觉一般,所以后面按我个人意愿,给它改了一下,变成一个新的系统。

已保存

我改写的系统暂且放下,先来看这TB系统操作的规则要素:

1.计算30根k线最高价和最低价的EMA价差;

2.计算12根k线的ADX.

入场条件:

1.满足上根K线的收盘价收于EMA30之上,且ADX向上的条件在EntryBarBAR内该条件成立;

2.当前价大于等于BuySetup,做多,当条件满足超过EntryBarBAR后,取消入场.

出场条件:

1.当前价格下破30根K线最高价的EMA.

好了,让我们来看看这系统编写的程序化代码及解读:(个人觉得那些参数名,变量名可以跳过,直接读正文好的,要不然这一大堆的参数名,变量名谁能记得住的,我都是用的时候返回来写的)

Params

NumericDMI_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。//

Begin

If(!CallAuctionFilter())Return;//集合竞价和小节休息过滤。//

Minpoint=Minmove*PriceScale;//这两句一般固定的直接调用就行,一个过滤,一个计算最小变动价位。//

//DMI指标计算,最终将输出ADX指标//

//————————–DMI计算开始———————————–//

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。//

//————————–DMI计算结束———————————–//

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

很一般,再看卖空的代码其实都差不多,就是改一下条件,代码及结果如下:

Params

NumericDMI_N(14);

NumericDMI_M(30);

NumericAvgLen(30);

NumericEntryBar(2);

Vars

NumericSeriesoDMIPlus;

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

看这做空的,多差的收益,所以我就照着心中想的,买卖规则很简单,两条移动均价,ADX值大于25的,两均线交叉的买入;ADX大于25,两均线交叉卖出。代码及结果如下:

Params

NumericDMI_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个点//

Vars

NumericSeriesoDMIPlus;

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;

Begin

AvgValue1=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/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;

If(MarketPosition<>1&&AvgValue1[1]>AvgValue2[1]&&oADX[1]>25)

{

Buy(1,Open);

}

If(MarketPosition<>-1&&AvgValue1[1]<AvgValue2[1]&&oADX[1]>25)

{

SellShort(1,Open);

}

If(BarsSinceentry==0)

{

HighestAfterEntry=Close;

LowestAfterEntry=Close;

If(MarketPosition<>0)

{

HighestAfterEntry=Max(HighestAfterEntry,AvgEntryPrice);//开仓的Bar,将开仓价和当时的收盘价的较大值保留到HighestAfterEntry//

LowestAfterEntry=Min(LowestAfterEntry,AvgEntryPrice);//开仓的Bar,将开仓价和当时的收盘价的较小值保留到LowestAfterEntry//

}

}else

{

HighestAfterEntry=Max(HighestAfterEntry,High);//记录下当前Bar的最高点,用于下一个Bar的跟踪止损判断//

LowestAfterEntry=Min(LowestAfterEntry,Low);//记录下当前Bar的最低点,用于下一个Bar的跟踪止损判断//

}

Commentary(“HighestAfterEntry=”+Text(HighestAfterEntry));

Commentary(“LowestAfterEntry=”+Text(LowestAfterEntry));

Commentary(“MyEntryPrice=”+Text(MyEntryPrice));

MinPoint=MinMove*PriceScale;

MyEntryPrice=AvgEntryPrice;

If(MarketPosition==1)//有多仓的情况//

{

If(HighestAfterEntry[1]>=MyEntryPrice+TrailingStart2*MinPoint)//第二级跟踪止损的条件表达式//

{

If(Low<=HighestAfterEntry[1]-TrailingStop2*MinPoint)

{

MyExitPrice=HighestAfterEntry[1]-TrailingStop2*MinPoint;

Sell(0,MyExitPrice);

}

}elseif(HighestAfterEntry[1]>=MyEntryPrice+TrailingStart1*MinPoint)//第一级跟踪止损的条件表达式//

{

If(Low<=HighestAfterEntry[1]-TrailingStop1*MinPoint)

{

MyExitPrice=HighestAfterEntry[1]-TrailingStop1*MinPoint;

Sell(0,MyExitPrice);

}

}elseif(Low<=MyEntryPrice-StopLossSet*MinPoint)//可以在这里写上初始的止损处理//

{

MyExitPrice=MyEntryPrice-StopLossSet*MinPoint;

Sell(0,MyExitPrice);

}

}elseif(MarketPosition==-1)//有空仓的情况//

{

If(LowestAfterEntry[1]<=MyEntryPrice-TrailingStart2*MinPoint)//第二级跟踪止损的条件表达式//

{

If(High>=LowestAfterEntry[1]+TrailingStop2*MinPoint)

{

MyExitPrice=LowestAfterEntry[1]+TrailingStop2*MinPoint;

BuyToCover(0,MyExitPrice);

}

}elseif(LowestAfterEntry[1]<=MyEntryPrice-TrailingStart1*MinPoint)//第一级跟踪止损的条件表达式//

{

If(High>=LowestAfterEntry[1]+TrailingStop1*MinPoint)

{

MyExitPrice=LowestAfterEntry[1]+TrailingStop1*MinPoint;

BuyToCover(0,MyExitPrice);

}

}elseIf(High>=MyEntryPrice+StopLossSet*MinPoint)//可以在这里写上初始的止损处理//

{

MyExitPrice=MyEntryPrice+StopLossSet*MinPoint;

BuyToCover(0,MyExitPrice);

}

}

End

看吧,改了一下条件,这系统就变得不错的,所以说ADX指标是不错的,我的很多趋势操作也是借鉴这个指标的。当然,我这个代码也是有缺陷的,就是买卖的时候,触发止盈之后,条件符合,持续开仓,所以造成很大的浪费手续费,但怎么改进,我现在也懒得去写了,有兴趣的朋友可以自己弄了。

好了,文章到此结束,希望可以帮助到大家。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平