图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条平均线。