《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度)

时间:2023-01-08 09:05:32
平移均线指标MA的最大弱点,是它的滞后性。价格变化速度指标(ROC),与简单MA相比有一优点,它滞后很少,并且直观。

图125显示2条指标线:红色MA,周期为21柱;蓝色MA,周期为5柱。蓝线MA靠近柱子,滞后小,但它波动起伏大,会产生大量错误信号,很难用它分析市场。红色MA波动起伏不大,错误信号不太多,但有滞后的弱点。

《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度)
图. 125. 指标线: MA(21) - 红线,MA(5) - 蓝线,ROC - 桔线。

图125中桔色的第三条线是ROC指标。与其他2个指标相比,它明显的优点是滞后非常小、非常平滑。

ROC指标的根据,是MA(21)的变化速度。在 A-B 区间,MA变化增大。并不是说,MA的点位简单地增高,而是点位的近似值在增高。例如,若MA(21) 第271柱的值为1.3274,第272柱的值为1.3280,第273柱的值为1.3288,第272柱的MA值,比第271柱增高了 6 个点,第273柱比第272柱的MA值增高了 8 个点。MA不仅简单增高,并且变化率也加大。在A-B区间,MA线向上弯曲,可以大致描述成以半径 r1 画出的弧线。它反映了A-B区间MA的变化速度。

MA 接近 B 点时,弧线加快上翘,在 B 点到达极限,因为,此时MA变成直线,桔色线V也停止上升。在B-C区间,MA增速下降,使得桔色线V也下跌。在MA下方,以半径r2画出弧线,可做辅助分析。.

在C点MA停止增长,增速为零。在本例中,红色MA(21)是桔色线V的支撑线。若V线在MA上方,MA增速为正;若在其下方,MA增速为负;在两线交叉点,MA增速为零。C-D区间可以用 A-B区间的理论描述,只是它的MA增速为负值。

V线与MA有个重要不同。在整个B-C区间,MA还在增长,而V线却已明显达到极限点位 K。图形分析可见,ROC指标在表示峰顶和谷底时,优于MA指标。

速度的计算值,是以对象的变化量为分子,以变化发生的时间段为分母,二者相除的结果。例如图126中,MA_c (当前MA的值) 和 MA_p (之前的值)相减的差值,是MA的变化量; 变化发生的时间段是柱子的数目 Bars_V。时间段是固定不变的常数,不必专门计算。要计算的只是MA在规定时间段的变化值。

《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度)
图. 126.形成 ROC 指标线的对象

这个指标有6条线。指标数组Line_0[]是MA支撑线的数据,也是其他指标线形成的根据。指标数组Line_1[], Line_2[] 和 Line_3[] 是不同周期的价格变速线的数据,产生的根据是不同周期的MA线。指标数组 Line_4[] 是平均变速线的数据,其算术平均值,来自对 Line_1[],Line_2[] , Line_3[]), 和 Line_5[] 的计算。

汇客做交易决定时,通常不仅注意当前价格走势,还要考虑其他计算周期的情况。为了更好地理解ROC指标,要注意以下细节。MA指标在某一周期的均值,计算的根据包括相临大周期和相临更大周期的均值。例如,若M30图的均值周期是400(柱),它还要H1图的周期为200的均值,以及H4图周期为50的值,等等。虽然小周期的大量数据会产生误差,但是误差很小,可以接受。

桔色线的根据是 Line_1[] 表示当前周期的变化速度。绿线的根据是 Line_2[],表示相临大周期的变化速度。棕色线表示更大周期的变化速度。ROC指标的这3条线,分别表示这3个周期的价格变化速度。

《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度) 有3条周期线的外建指标ROC roc.mq4
//--------------------------------------------------------------------
// roc.mq4 (Priliv)
// 仅用于教学
//--------------------------------------------------------------------
//--------------------------------------------------------------- 1 --
#property copyright "Copyright © SK, 2007"
#property link      "http://AutoGraf.dp.ua"
//--------------------------------------------------------------------
#property indicator_chart_window    // 在主图画出指标
#property indicator_buffers 6       // 缓冲数目
#property indicator_color1 Black    // 0号缓冲的线色
#property indicator_color2 DarkOrange  // 1号缓冲的线色
#property indicator_color3 Green    // 2号缓冲的线色
#property indicator_color4 Brown    // 3号缓冲的线色
#property indicator_color5 Blue     // 4号缓冲的线色
#property indicator_color6 Red      // 5号缓冲的线色
//--------------------------------------------------------------- 2 --
extern int History    =5000;        // 历史柱的数目
extern int Period_MA_0=13;          // 当前周期下,MA支撑线的计算周期
extern int Period_MA_1=21;          // MA周期
extern int Bars_V     =13;          // 计算价格变化速度时用到的柱子数目
extern int Aver_Bars  =5;           // 为了线的平滑用到的柱子数目
extern double K       =2;           // 放大的倍数
//--------------------------------------------------------------- 3 --
int
   Period_MA_2,  Period_MA_3,       // 其他2个周期下的 MA 使用的计算周期
   Period_MA_02, Period_MA_03,      // 2个 MA 支撑线的计算周期
   K2, K3;                          // 周期的关联系数
double
   Line_0[],                        // MA支撑线的指标数组
   Line_1[], Line_2[], Line_3[],    // 3条速度线的指标数组
   Line_4[],                        // 指标用于汇总的数组
   Line_5[],                        // 用于平滑指标线的汇总数组
   Sh_1, Sh_2, Sh_3;                // 计算3个周期速率用到的3种柱子数目
//--------------------------------------------------------------- 4 --
int init()                          // 特别函数 init()
  {
   SetIndexBuffer(0,Line_0);        // 数组与缓冲关联
   SetIndexBuffer(1,Line_1);        // 数组与缓冲关联
   SetIndexBuffer(2,Line_2);        // 数组与缓冲关联
   SetIndexBuffer(3,Line_3);        // 数组与缓冲关联
   SetIndexBuffer(4,Line_4);        // 数组与缓冲关联
   SetIndexBuffer(5,Line_5);        // 数组与缓冲关联
   SetIndexStyle (5,DRAW_LINE,STYLE_SOLID,3);// 线的特点
//--------------------------------------------------------------- 5 --
   switch(Period())                 // 计算不同周期的系数
     {                              
      case     1: K2=5;K3=15; break;// 周期 M1
      case     5: K2=3;K3= 6; break;// 周期 M5
      case    15: K2=2;K3= 4; break;// 周期 M15
      case    30: K2=2;K3= 8; break;// 周期 M30
      case    60: K2=4;K3=24; break;// 周期 H1
      case   240: K2=6;K3=42; break;// 周期 H4
      case  1440: K2=7;K3=30; break;// 周期 D1
      case 10080: K2=4;K3=12; break;// 周期 W1
      case 43200: K2=3;K3=12; break;// 周期 MN
     }
//--------------------------------------------------------------- 6 --
   Sh_1=Bars_V;                     // 计算速度的周期(柱子数目)
   Sh_2=K2*Sh_1;                    // 临近第一周期下计算速度的周期(柱子数目)
   Sh_3=K3*Sh_1;                    // 临近第二周期下计算速度的周期(柱子数目)
   Period_MA_2 =K2*Period_MA_1;     // 临近第一周期下MA的计算周期(柱子数目)
   Period_MA_3 =K3*Period_MA_1;     // 下一个周期的MA计算周期(柱子数目)
   Period_MA_02=K2*Period_MA_0;     // 临近第一周期下MA支撑线的计算周期(柱子数目)
   Period_MA_03=K3*Period_MA_0;     // 临近第二周期下MA支撑线的计算周期(柱子数目)
 //--------------------------------------------------------------- 7 --
   return;                          // 退出 init()
  }
//--------------------------------------------------------------- 8 --
int start()                         // 特别函数 start()
  {
//--------------------------------------------------------------- 9 --
   double
   MA_0, MA_02, MA_03,              // 各周期下的MA支撑
   MA_c, MA_p,                      // 当前和先前MA的值
   Sum;                             // 累计汇总的技术参数
   int
   i,                                  // 柱的索引
   n,                                  // 普通变量(柱的索引)
   Counted_bars;                       // 历史柱的数目
//-------------------------------------------------------------- 10 --
   Counted_bars=IndicatorCounted(); // 历史柱数目
   i=Bars-Counted_bars-1;           // 第一个历史柱的索引
   if (i<History-1)                 // 若历史柱太多,
      i=History-1;                  // 则以此为准
//-------------------------------------------------------------- 11 --
   while(i<=0)                      // 逐个计算历史柱
     {
      //-------------------------------------------------------- 12 --
      MA_0=iMA(NULL,0,Period_MA_0,0,MODE_LWMA,PRICE_TYPICAL,i);
      Line_0[i]=MA_0;               // MA支撑线的值
      //-------------------------------------------------------- 13 --
      MA_c=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i);
      MA_p=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_1);
      Line_1[i]= MA_0+K*(MA_c-MA_p);// 第1条变速线
      //-------------------------------------------------------- 14 --
      MA_c=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i);
      MA_p=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_2);
      MA_02= iMA(NULL,0,Period_MA_02,0,MODE_LWMA,PRICE_TYPICAL,i);
      Line_2[i]=MA_02+K*(MA_c-MA_p);// 第2条变速线
      //-------------------------------------------------------- 15 --
      MA_c=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i);
      MA_p=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_3);
      MA_03= iMA(NULL,0,Period_MA_03,0,MODE_LWMA,PRICE_TYPICAL,i);
      Line_3[i]=MA_03+K*(MA_c-MA_p);// 第3条变速线
      //-------------------------------------------------------- 16 --
      Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])/3;// 汇总数组
      //-------------------------------------------------------- 17 --
      if (Aver_Bars>0)              // 若设置平滑错误,
         Aver_Bars=0;               // 重新设置
      Sum=0;                        // 技术手段
      for(n=i; n>=i+Aver_Bars; n++) // 最新值汇总
         Sum=Sum + Line_4[n];       // 最新值累计汇总
      Line_5[i]= Sum/(Aver_Bars+1); // 指标的平滑线数组
      //-------------------------------------------------------- 18 --
      i--;                          // 下一柱的索引
      //-------------------------------------------------------- 19 --
     }
   return;                          // 退出 start()
  }
//-------------------------------------------------------------- 20 --

当前MA指标的周期,由汇客用外部变量Period_MA_1设置;MA支撑线的周期,由变量Period_MA_0设置。.

第6-7代码段的任务,是计算较大周期内各MA变速线、支撑线的平均周期。 计算用到的相关系数,在第5-6代码段定义。例如,若指标放在M30图,则系数K2和K2分别等于2和8,临近周期H1和H4分别是M30的2倍和8倍。

函数start()的计算十分简单。第12-13段代码计算当前周期的MA支撑线(黑色)。第13-14代码段处理指标数组Line_1[],以画出当前周期ROC线(桔色)。当前柱与索引等于Sh_1的柱之间的差值,即MA_c - MA_p,就是平均价格变化速度。当前柱的指标数组Line_1[]用于MA支撑线和变速线。此处的变量 K 是伸缩系数,其值来自外部变量:

Line_1[i]= MA_0+K*(MA_c-MA_p);// 第一条变速线的数据
      

第14-16代码段,以类似的计算画出其他2个周期的变速线。指标没有显示这些数组表示的MA支撑线。第16-17代码段,指标数组Line_4[] 用于画出平均变速线(蓝色)。

第17-18代码段,根据指标数据Line_5[],对平均变速线做平滑处理(红色粗线)。 平滑处理的办法,是把Line_4[]最新的几个柱的算术平均值,作为Line_5[]的当前柱的值。这就减小了指标线的波动起伏。

启动该指标,会在主图看到6条指标线:

  • 黑线 - 当前周期的MA支撑线,用于建立价格变速线;
  • 桔线 - 当前周期的价格变速线;
  • 绿线 - 临近第2周期的价格变速线;
  • 棕线 - 临近第3周期的价格变速线;
  • 蓝线 - 价格变速平均线;
  • 红线 - 平滑后的价格变速线。

《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度)
图. 127. 外建指标 roc.mq4 3条不同周期的价格变速线,及它们的均线

指标 roc.mq4 可以放入各种周期的主图,如图128和129。

《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度)
图. 128. 当前周期M15的第3条变速线(棕色),第2周期M30的第2条变速线(绿色),第3周期H1的第1条变速线(桔色)。

《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度)
图. 129. 当前周期M30的第2条变速线(绿色),第2周期M15的第3条变速线(棕色),第3周期(H1)的第1条变速线(桔色)。

指标roc.mq4的特点:每条变速线不仅反映价格变化,而且依赖MA支撑线的变化。一方面,直接画线的技术十分方便;另一方面,如果变速值太小,变速线等于MA支撑线,造成不良滞后。

下一个外建指标,是对 roc.mq4 的全面模仿,只是它在副图显示。这使得不同周期的变速线,与一条水平零线有关,而与MA支撑线无关。程序相应地修改了一点,不必再计算MA支撑线和伸缩系数。

《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度) 技术指标ROC rocseparate.mq4 ,3条不同周期线,在副图显示。
//--------------------------------------------------------------------
// rocseparate.mq4 (Priliv_s)
// 仅用于教学
//--------------------------------------------------------------- 1 --
#property copyright "Copyright © SK, 2007"
#property link      "http://AutoGraf.dp.ua"
//--------------------------------------------------------------------
#property indicator_separate_window // 在副图显示指标
#property indicator_buffers 6       // 缓冲数目
#property indicator_color1 Black    // 缓冲0的线色
#property indicator_color2 DarkOrange//缓冲1的线色
#property indicator_color3 Green    // 缓冲2的线色
#property indicator_color4 Brown    // 缓冲3的线色
#property indicator_color5 Blue     // 缓冲4的线色
#property indicator_color6 Red      // 缓冲5的线色
//--------------------------------------------------------------- 2 --
extern int History    =5000;        // 历史线柱的数目
extern int Period_MA_1=21;          // MA计算周期
extern int Bars_V     =13;          // 计算变速线用的柱子数目
extern int Aver_Bars  =5;           // 用于平滑显示的柱子数目
//--------------------------------------------------------------- 3 --
int
   Period_MA_2,  Period_MA_3,       // 第2、第3周期的MA周期
   K2, K3;                          // 相应的周期系数
double
   Line_0[],                        // MA支撑线数组
   Line_1[], Line_2[], Line_3[],    // 3条变速线数组 
   Line_4[],                        // 汇总数组
   Line_5[],                        // 汇总、平滑数组
   Sh_1, Sh_2, Sh_3;                // 计算3条变速线用的3种柱子数
//--------------------------------------------------------------- 4 --
int init()                          // 特别函数 init()
  {
   SetIndexBuffer(0,Line_0);        // 数组与缓冲关联
   SetIndexBuffer(1,Line_1);        // 数组与缓冲关联
   SetIndexBuffer(2,Line_2);        // 数组与缓冲关联
   SetIndexBuffer(3,Line_3);        // 数组与缓冲关联
   SetIndexBuffer(4,Line_4);        // 数组与缓冲关联
   SetIndexBuffer(5,Line_5);        // 数组与缓冲关联
   SetIndexStyle (5,DRAW_LINE,STYLE_SOLID,3);// 线条特点
//--------------------------------------------------------------- 5 --
   switch(Period())                 // 计算不同周期的系数
     {                              
      case     1: K2=5;K3=15; break; // 周期 M1
      case     5: K2=3;K3= 6; break; // 周期 M5
      case    15: K2=2;K3= 4; break; // 周期 M15
      case    30: K2=2;K3= 8; break; // 周期 M30
      case    60: K2=4;K3=24; break; // 周期 H1
      case   240: K2=6;K3=42; break; // 周期 H4
      case  1440: K2=7;K3=30; break; // 周期 D1
      case 10080: K2=4;K3=12; break; // 周期 W1
      case 43200: K2=3;K3=12; break; // 周期 MN
     }
//--------------------------------------------------------------- 6 --
   Sh_1=Bars_V;                     // 变速线计算周期(柱子数)
   Sh_2=K2*Sh_1;                    // 临近第1周期变速线的计算周期
   Sh_3=K3*Sh_1;                    // 临近第2周期变速线的计算周期
   Period_MA_2 =K2*Period_MA_1;     // 临近第1周期MA线的计算周期
   Period_MA_3 =K3*Period_MA_1;     // 临近第2周期MA线的计算周期
//--------------------------------------------------------------- 7 --
   return;                          // 退出 init()
  }
//--------------------------------------------------------------- 8 --
int start()                         // 特别函数 start()
  {
//--------------------------------------------------------------- 9 --
   double
   MA_c, MA_p,                      // 当前和先前MA的值
   Sum;                             // 汇总用变量
   int
   i,                               // 柱子索引
   n,                               // 普通变量(柱子索引)
   Counted_bars;                    // 历史柱的数目
//-------------------------------------------------------------- 10 --
   Counted_bars=IndicatorCounted(); // 计算用到的柱数目
   i=Bars-Counted_bars-1;           // 第1个计算用到的柱的索引
   if (i<History-1)                 // 柱子太多,
      i=History-1;                  // 则以此数为准
//-------------------------------------------------------------- 11 --
   while(i<=0)                      // 逐个柱子计算
     {
      //-------------------------------------------------------- 12 --
      Line_0[i]=0;                  // 参照用水平线
      //-------------------------------------------------------- 13 --
      MA_c=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i);
      MA_p=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_1);
      Line_1[i]= MA_c-MA_p;         // 第1条变速线的值
      //-------------------------------------------------------- 14 --
      MA_c=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i);
      MA_p=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_2);
      Line_2[i]= MA_c-MA_p;         // 第2条变速线的值
      //-------------------------------------------------------- 15 --
      MA_c=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i);
      MA_p=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_3);
      Line_3[i]= MA_c-MA_p;         // 第3条变速线的值
      //-------------------------------------------------------- 16 --
      Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])/3;   // 汇总用数组
      //-------------------------------------------------------- 17 --
      if (Aver_Bars>0)              // 若平滑设置错误,
         Aver_Bars=0;               // 则不小于零
      Sum=0;                        // 技术手段
      for(n=i; n>=i+Aver_Bars; n++) // 汇总最新数据
         Sum=Sum + Line_4[n];       // 累计汇总
      Line_5[i]= Sum/(Aver_Bars+1); // 平滑线用数组
      //-------------------------------------------------------- 18 --
      i--;                          // 下一个柱子的索引
      //-------------------------------------------------------- 19 --
     }
   return;                          // 退出 start()
  }
//-------------------------------------------------------------- 20 --

主图中的指标,要用到MA支撑线,副图中则不需要。 roc.mq4 指标强调的是变速线、MA线的交叉,而rocseparate.mq4.指标强调的是变速线与水平辅助线的交叉。

(见图130)

《MQL4实用编程》读书笔记(9) - 简单编程:外建指标 ROC (价格变化速度)
图. 130.  rocseparate.mq4 指标在副图显示3个周期的6条线,其中,3条变速线,3条平均线。