图125显示2条指标线:红色MA,周期为21柱;蓝色MA,周期为5柱。蓝线MA靠近柱子,滞后小,但它波动起伏大,会产生大量错误信号,很难用它分析市场。红色MA波动起伏不大,错误信号不太多,但有滞后的弱点。
图. 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在规定时间段的变化值。
图. 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个周期的价格变化速度。
有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周期的价格变速线;
- 蓝线 - 价格变速平均线;
- 红线 - 平滑后的价格变速线。
图. 127. 外建指标 roc.mq4 3条不同周期的价格变速线,及它们的均线
指标 roc.mq4 可以放入各种周期的主图,如图128和129。
图. 128. 当前周期M15的第3条变速线(棕色),第2周期M30的第2条变速线(绿色),第3周期H1的第1条变速线(桔色)。
图. 129. 当前周期M30的第2条变速线(绿色),第2周期M15的第3条变速线(棕色),第3周期(H1)的第1条变速线(桔色)。
指标roc.mq4的特点:每条变速线不仅反映价格变化,而且依赖MA支撑线的变化。一方面,直接画线的技术十分方便;另一方面,如果变速值太小,变速线等于MA支撑线,造成不良滞后。
下一个外建指标,是对 roc.mq4 的全面模仿,只是它在副图显示。这使得不同周期的变速线,与一条水平零线有关,而与MA支撑线无关。程序相应地修改了一点,不必再计算MA支撑线和伸缩系数。
技术指标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)
图. 130. rocseparate.mq4 指标在副图显示3个周期的6条线,其中,3条变速线,3条平均线。