# 向大家求助一个 ROC 指标 的问题

85

1. 用 [ ROC(12)+ROC(24) ]/2 代替原来的 ROC(12)；

2.另外添加一条 [ ROC(12)+ROC(24) ]/2 的10周期的移动平均线；应该怎样修改原指标呢？谢谢大家。

mt5软件自带的【ROC】指标源码如下：

//+------------------------------------------------------------------+
//| ROC.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property description "Rate of Change"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 LightSeaGreen
//--- input parameters
input int InpRocPeriod=12; // Period
//--- indicator buffers
double ExtRocBuffer[];
//--- global variable
int ExtRocPeriod;
//+------------------------------------------------------------------+
//| Rate of Change initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- check for input
if(InpRocPeriod<1)
{
ExtRocPeriod=12;
Print("Incorrect value for input variable InpRocPeriod =",InpRocPeriod,
"Indicator will use value =",ExtRocPeriod,"for calculations.");
}
else ExtRocPeriod=InpRocPeriod;
//--- indicator buffers mapping
SetIndexBuffer(0,ExtRocBuffer,INDICATOR_DATA);
//--- set accuracy
IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- name for DataWindow and indicator subwindow label
IndicatorSetString(INDICATOR_SHORTNAME,"ROC("+string(ExtRocPeriod)+")");
//--- sets first bar from what index will be drawn
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtRocPeriod);
//--- initialization done
}
//+------------------------------------------------------------------+
//| Rate of Change |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,const int begin,const double &price[])
{
//--- check for rates count
if(rates_total<ExtRocPeriod)
return(0);
//--- preliminary calculations
int pos=prev_calculated-1; // set calc position
if(pos<ExtRocPeriod)
pos=ExtRocPeriod;
//--- the main loop of calculations
for(int i=pos;i<rates_total;i++)
{
if(price==0.0)
ExtRocBuffer=0.0;
else
ExtRocBuffer=(price-price[i-ExtRocPeriod])/price*100;
}
//--- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+

1633

1 ExtRocBuffer=（(price-price[i-ExtRocPeriod])/price*100＋ (price-price[i-ExtRocPeriod×2])/price*100 ）/2;

2 有些复杂，自己看吧

85

//+------------------------------------------------------------------+
//| ROC.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property description "Rate of Change"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_type1 DRAW_LINE
#property indicator_color1 LightSeaGreen
#property indicator_type2 DRAW_LINE
#property indicator_color2 Magenta
//--- input parameters
input int InpRocPeriod=12; // Period
//--- indicator buffers
double ExtRocBuffer[];
double ExtRocBuffer1[];

//--- global variable
int ExtRocPeriod;
//+------------------------------------------------------------------+
//| Rate of Change initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- check for input
if(InpRocPeriod<1)
{
ExtRocPeriod=12;
Print("Incorrect value for input variable InpRocPeriod =",InpRocPeriod,
"Indicator will use value =",ExtRocPeriod,"for calculations.");
}
else ExtRocPeriod=InpRocPeriod;
//--- indicator buffers mapping
SetIndexBuffer(0,ExtRocBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtRocBuffer1,INDICATOR_DATA);

//--- set accuracy
IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- name for DataWindow and indicator subwindow label
IndicatorSetString(INDICATOR_SHORTNAME,"ROC("+string(ExtRocPeriod)+")");
//--- sets first bar from what index will be drawn
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtRocPeriod);
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtRocPeriod);
//--- initialization done
}
//+------------------------------------------------------------------+
//| Rate of Change |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,const int begin,const double &price[])
{
//--- check for rates count
if(rates_total<ExtRocPeriod)
return(0);
//--- preliminary calculations
int pos=prev_calculated-1; // set calc position
if(pos<ExtRocPeriod)
pos=ExtRocPeriod;
//--- the main loop of calculations
for(int i=pos;i<rates_total;i++)
{
if(price[i]==0.0)
{ ExtRocBuffer[i]=0.0; ExtRocBuffer1[i]=0.0;}
else
{ ExtRocBuffer[i]=(price[i]-price[i-ExtRocPeriod])/price[i]*100;
ExtRocBuffer1[i]=iMA(NULL,PERIOD_CURRENT,10,0,MODE_EMA,ExtRocBuffer[i]);}
}

//--- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+

85

3

//+------------------------------------------------------------------+
//| ROC.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property description "Rate of Change"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_type1 DRAW_LINE
#property indicator_color1 LightSeaGreen
#property indicator_type2 DRAW_LINE
#property indicator_color2 Magenta
//--- input parameters
input int InpRocPeriod=12; // Period
//--- indicator buffers
double ExtRocBuffer[];
double ExtRocBuffer1[];

//--- global variable
int ExtRocPeriod;
//+------------------------------------------------------------------+
//| Rate of Change initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- check for input
if(InpRocPeriod<1)
{
ExtRocPeriod=12;
Print("Incorrect value for input variable InpRocPeriod =",InpRocPeriod,
"Indicator will use value =",ExtRocPeriod,"for calculations.");
}
else ExtRocPeriod=InpRocPeriod;
//--- indicator buffers mapping
SetIndexBuffer(0,ExtRocBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtRocBuffer1,INDICATOR_DATA);

//--- set accuracy
IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- name for DataWindow and indicator subwindow label
IndicatorSetString(INDICATOR_SHORTNAME,"ROC("+string(ExtRocPeriod)+")");
//--- sets first bar from what index will be drawn
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtRocPeriod);
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtRocPeriod);
//--- initialization done
}
//+------------------------------------------------------------------+
//| Rate of Change |
int OnCalculate(const int rates_total,const int prev_calculated,const int begin,const double &price[])
{
//--- check for rates count
if(rates_total<ExtRocPeriod)
return(0);
//--- preliminary calculations
int pos=prev_calculated-1; // set calc position
if(pos<ExtRocPeriod)
pos=ExtRocPeriod;
//--- the main loop of calculations
int i=pos;
while(i<rates_total && !IsStopped())
{
if(price[i]==0.0)
ExtRocBuffer[i]=0.0;
else
ExtRocBuffer[i]=(price[i]-price[i-ExtRocPeriod])/price[i]*100;
i++;}
int j=pos;
while(j<rates_total && !IsStopped())
{
if(price[j]==0.0)
ExtRocBuffer[j]=0.0;
else
ExtRocBuffer1[j]=iMA(NULL,PERIOD_CURRENT,10,0,MODE_EMA,ExtRocBuffer[j]);
j++;}
//--- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+