Params
Numeric length(9);
Numeric LengthRSI(16);
Numeric MTMlength(5); //MTM均值计算值
Numeric longband(60); //rsi 向上突破边界值
Numeric shoryband(40); //rsi 向下突破边界值
Numeric lots(1);
Vars
series<Numeric> MTM(0);
series<Numeric> MTMMA(0);
series<Numeric> longstop(0);
series<Numeric> Highafterentry(0);
series<Numeric> shortstop(0);
series<Numeric> lowafterentry(0);
series<Numeric> NetChgAvg( 0 );
series<Numeric> TotChgAvg( 0 );
series<Numeric> RSIValue;
Numeric SF( 0 );
Numeric Change( 0 );
Numeric ChgRatio( 0 ) ;
Numeric stoppoint(10); //多头止损点
Numeric stoppoint1(10); //空头止损点
Events
OnBar(ArrayRef<Integer> indexs)
{
stoppoint=Average(TrueRange(),10);
stoppoint1=Average(TrueRange(),10);
MTM=close-close[length]; //计算MTM动能指标
MTMMA=Average(MTM,MTMlength); //计算MTM动能指标均值
//-------------------------计算RSI-------------------------------
If(CurrentBar <= LengthRSI - 1)
{
NetChgAvg = ( Close - Close[LengthRSI] ) / LengthRSI ;
TotChgAvg = Average( Abs( Close - Close[1] ), LengthRSI ) ;
}
Else
{
SF = 1/LengthRSI;
Change = Close - Close[1] ;
NetChgAvg = NetChgAvg[1] + SF * ( Change - NetChgAvg[1] ) ;
TotChgAvg = TotChgAvg[1] + SF * ( Abs( Change ) - TotChgAvg[1] ) ;
}
If( TotChgAvg <> 0 )
{
ChgRatio = NetChgAvg / TotChgAvg;
}
else
{
ChgRatio = 0 ;
}
RSIValue = 50 * ( ChgRatio + 1 );
//---------------------------开仓条件为MTM 金叉MTM均值意味着行情呈现强势,
//并且同时RSI 也突破做多边界,反之亦然----------------------------
if (marketposition==0 && CrossOver(mtm[1],mtmma[1]) && RSIValue[1]>=longband )
{
buy (lots,Open);
}
if (marketposition==0 && CrossUnder(mtm[1],mtmma[1]) && RSIValue[1]<=shoryband)
{
sellshort(lots,Open);
}
if (barssinceentry==0)
{
longstop=min(low,low[1])-stoppoint; //入场的当跟k线的最低价与前一根k线的最低价进行比较,谁低作为出场止损价
Highafterentry=high;
}
//-------------------------多头出场模块--------------------------------------
if (high>Highafterentry)
{
Highafterentry=high; //如果不断创新高Highafterentry 这个变量值就是新高
}
if (barssinceentry>0)
{
if (c[1]>Highafterentry[2])
{
longstop=min(low,low[1])-stoppoint; //如果收盘价比前一个新高要高,那么止损价格就变为这一根k线和前低的最低价-10为止损点
}
}
if (marketposition==1 && Low<=longstop)
{
sell(lots,longstop); //止损操作止损价格为longstop,计算方法见上一句
}
//-------------------------空头出场模块--------------------------------------
if (low<lowafterentry)
{
lowafterentry=low; //如果不断创新低lowafterentry 这个变量值就是新低
}
if (barssinceentry==0)
{
shortstop=max(high,high[1])+stoppoint;//入场的当跟k线的最高价与前一根k线的最高价进行比较,谁低作为出场止损价
lowafterentry=low;
}
if (barssinceentry>0)
{
if (c[1]<lowafterentry[2])
{
shortstop=max(high,high[1])+stoppoint; //入场的当跟k线的最高价与前一根k线的最高价进行比较,谁高作为出场止损
}
}
if (marketposition==-1 && high>=shortstop)
{
buytocover(lots,shortstop); //止损操作止损价格为longstop,计算方法见上一句
}
}