RMI相对动量指标,是由罗吉·阿尔特曼(Roger Altman)发明,是相对强弱指标(RSI)加上动量成分后的一个变种。早期研究了很久的RSI指标,但还真没注意过这个RMI,这也是第一次接触它。它的具体算法,没在百度里找到,这里我也不写出来了,直接看代码吧,也不难的。
先看它用到的第一个函数,快速求和SummationFC(前面解读过了),代码如下:
Params
NumericSeries Price(1);
Numeric Length(10);
Vars
NumericSeries SumValue(0);
Numeric i;
Begin
If(CurrentBar < Length)
{
SumValue = 0;
for i = 0 to Length - 1
{
SumValue = SumValue + Price[i];
}
}Else
{
SumValue = SumValue[1] + Price - Price[Length];
}
Return SumValue;
End
看真正RMI具体代码及解读如下了:
Params
Numeric Length(5);//声明数值参数Length,初值5.//
Numeric OverSold(20) ;//声明数值参数OverSold,初值20.//
Numeric OverBought(80) ; //声明数值参数OverBought,初值80.//
Vars
NumericSeries TmpValue;//声明数值序列变量TmpValue。//
NumericSeries TmpValue1;//声明数值序列变量TmpValue1.//
NumericSeries TmpValue2;//声明数值序列变量TmpValue2.//
Numeric RMIValue; //声明数值变量RMIValue。//
Begin
TmpValue = Close - Close[4];//变量TmpValue = 当前K线收盘价 - 前第四根k线收盘价。//
TmpValue1 = SummationFC(IIf(TmpValue>0,TmpValue,0),Length);//函数SummationFC没什么可以说的,就是把括号里对应的值返回这个函数求值了。IIf()这个也解读过了,就是变量TmpValue > 0条件成立,则取值TmpValue值,要是不成立,则取值0.//
TmpValue2 = SummationFC(abs(TmpValue),Length);//函数abs()就是不管括号里的值为正负,最后都只能显为正数。//
If(TmpValue2 <> 0)//序列变量TmpValue2值不等于0的。//
RMIValue = TmpValue1/TmpValue2 * 100;//依据上面求得的值代入,变量RMIValue = 序列变量TmpValue1 / 序列变量TmpValue2 * 100.//
Else//序列变量TmpValue2值等于0的。//
RMIValue = 0;//变量RMIValue = 0.//
PlotNumeric("RMI",RMIValue);//画线RMI,值为RMIValue值。//
PlotNumeric("超买",OverBought);//画线超买,值为80了。//
PlotNumeric("超卖",OverSold);//画线超卖,值为20了。//
End
最后我也不想再随意给写上什么买卖程序化了,因为它跟RSI或者KD真的挺像的,这里给个建议,就是要用这些指标时,能不能把价格对比一下,比如,close与close[1]的,close[1]与close[2]的,close[2]与close[3]的,等等。同理的,把变量RMIValue,声明成序列变量,也可以对比一下。这做成的程序化会不会好点呢?当然,我懒得去测试了,有兴趣的朋友自己去试试看吧。