下载MetaTrader 5
MQL5参考自定义指标指标类型示例 

指标类型示例

MetaTrader 5 客户端包含可以使用相应函数用在MQL5程序的38种技术指标。但是MQL5语言的主要优势在于创建自定义指标的能力,然后将其用在EA交易或简单地应用在价格图表,用于技术分析。

指标的整个设定可以源自于几种基本的 绘图类型,主要为标图。标图是指展示数据的方式,可以用于指标计算,存储和提供请求。共有七种这类的基本标图类型:

  1. 线型
  2. 节(段)
  3. 直方图
  4. 箭头(符号)
  5. 禁区(填充的通道)
  6. 柱形图
  7. 日式蜡烛图

每个标图都需要一至五个双精度类型的数组,指标值可以存在这里。为方便起见,这些数组与指标缓冲区相联。一个指标缓冲区的数量必须使用编译程序指令提前声明,例如:

#property indicator_buffers 3 // 缓冲区数量
#property indicator_plots   2 // 标图数量

指标缓冲区的数量通常大于或等于指标标图的数量。

由于每个基本标图类型都可以有颜色变量或结构规范,所以MQL5标图类型的实际数量是18:

标图

描述

价值缓冲区

颜色缓冲区

DRAW_NONE

不直观显示在图表中,但是在数据窗口可以看到相应缓冲区的值

1

-

DRAW_LINE

在相应缓冲区的值上标绘线型(缓冲区的空值不符合)

1

-

DRAW_SECTION

绘制为相应缓冲区值之间的线段(通常有很多空值)

1

-

DRAW_HISTOGRAM

绘制为从零线到相应缓冲区值的直方图(可能有很多空值)

1

-

DRAW_HISTOGRAM2

绘制为基于两个指标缓冲区的直方图(可能有空值)

2

-

DRAW_ARROW

绘制为符号(可能有空值)

1

-

DRAW_ZIGZAG

类似 DRAW_SECTION 样式,但又不一样,它可以在柱上绘制垂直段

2

-

DRAW_FILLING

颜色填充在两条线之间。相应缓冲区的2个值显示在数据窗口

2

-

DRAW_BARS

绘制为柱形。相应缓冲区的4个值显示在数据窗口

4

-

DRAW_CANDLES

绘制为日式蜡烛图。相应缓冲区的4个值显示在数据窗口

4

-

DRAW_COLOR_LINE

您可以在不同柱上替换颜色或随时改变其颜色的线

1

1

DRAW_COLOR_SECTION

类似 DRAW_SECTION 样式,但每段的颜色可以单独设置;颜色也可以动态设置

1

1

DRAW_COLOR_HISTOGRAM

类似 DRAW_HISTOGRAM 样式,但每一条都可能有不同的颜色,您可以设置动态颜色

1

1

DRAW_COLOR_HISTOGRAM2

类似 DRAW_HISTOGRAM2 样式,但每一条都可能有不同的颜色,您可以设置动态颜色

2

1

DRAW_COLOR_ARROW

类似 DRAW_ARROW 样式,但每个符号都可能有它的颜色。颜色可以动态改变

1

1

DRAW_COLOR_ZIGZAG

DRAW_ZIGZAG 样式具有节段单独颜色和动态颜色改变的选项

2

1

DRAW_COLOR_BARS

DRAW_BARS 样式具有柱形单独颜色和动态颜色改变的选项

4

1

DRAW_COLOR_CANDLES

DRAW_CANDLES 样式具有蜡烛图单独颜色和动态颜色改变的选项

4

1

 

指标缓冲区和数组之间的不同性

每个指标中,在其全局水平,您都应该声明一个或多个双精度类型的数组,然后必须使用SetIndexBuffer()函数用作指标缓冲区。若要绘制指标标图,只可使用指标缓冲区的值,任何其他数组都不能为此目的使用。另外,缓冲区的值展示在数据窗口。

一个指标缓冲区应该是动态的并且不需要规范大小 �C 用作指标缓冲区的数组大小,通过程序端执行子系统自动设置。

数组绑定指标缓冲区以后,标引方向 像普通数组一样默认设置,但是您可以使用ArraySetAsSeries()函数更改访问数组元素的方式。默认下,指标缓冲区被用于存储用于标图的数据(INDICATOR_DATA)。

如果指标值的计算需要保持中间计算并存储每个柱的额外值,然后这个数组可以被声明为绑定期间的计算缓冲区(INDICATOR_CALCULATIONS)。对于中间值,您也可以使用正规数组,但是在这种情况下,程序员必须管理数组大小。

一些标图允许为每个柱形设置颜色。若要存储颜色信息,需要使用颜色缓冲区(INDICATOR_COLOR_INDEX)。颜色是整型color ,但是所有指标缓冲区必须是具有双精度类型的特点。颜色的值和辅助 (INDICATOR_CALCULATIONS) 缓冲区的值不能通过使用CopyBuffer()来获得。

指标缓冲区的数量必须使用编译程序指令#property indicator_buffers number_of_buffers来指定:

#property indicator_buffers 3  //  指标有3个缓冲区

一个指标可允许的最大缓冲区数量是512。

 

指标缓冲区和标图的关联

每个标图都是基于一个或多个指标缓冲区。所以,若要显示简单的蜡烛图,则需要四个值 - 开盘价,最高价,最低价和收盘价。相应地,若要以蜡烛图的形式显示一个指标,必须为它们声明4个指标缓冲区和4个双精度类型的数组。例如:

//--- 指标有4个指标缓冲区
#property indicator_buffers 4
//--- 指标有一个标图
#property indicator_plots   1
//--- 图形标图数1将显示为蜡烛图
#property indicator_type1   DRAW_CANDLES
//--- 蜡烛图将会以clrDodgerBlue绘制
#property indicator_color1  clrDodgerBlue
//--- 指标缓冲区的4个数组
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

 

图形标图根据标图号自动使用指标缓冲区。标图数从1开始,缓冲区数从0开始。如果第一个标图需要4个指标缓冲区,那么开始的4个指标缓冲区将被用于绘制它。这四个缓冲区应该使用SetIndexBuffer() 函数,以正确的标引连接相应的数组。

//--- 绑定数组和指标缓冲区
   SetIndexBuffer(0,OBuffer,INDICATOR_DATA);  // 第一指标缓冲区对应0标引
   SetIndexBuffer(1,HBuffer,INDICATOR_DATA);  // 第二指标缓冲区对应1标引
   SetIndexBuffer(2,LBuffer,INDICATOR_DATA);  // 第三缓冲区对应2标引
   SetIndexBuffer(3,CBuffer,INDICATOR_DATA);  // 第四缓冲区对应3标引

标图蜡烛图,指标将只使用这开始的四个缓冲区,因为“蜡烛图”的标图在第一个数字下已经公布。

改变示例,并添加简单的线型标图 - DRAW_LINE。现在假设线的编号为1,而蜡烛图的编号为2。缓冲区和标图的数量会增加。

//--- 指标有5个指标缓冲区
#property indicator_buffers 5
//--- 指标有2个标图
#property indicator_plots   2
//--- 图 1 是线型
#property indicator_type1   DRAW_LINE
//--- 线的颜色是 clrDodgerRed
#property indicator_color1  clrDodgerRed
//--- 图 2 是日式蜡烛图
#property indicator_type2   DRAW_CANDLES
//--- 蜡烛图的颜色是clrDodgerBlue
#property indicator_color2  clrDodgerBlue
//--- 指标缓冲区的5个数组
double LineBuffer[];
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

标图顺序已经改变,现在线型是第一位,紧跟着是日式蜡烛图。因此,缓冲区的顺序也相应改变 - 首先我们公布的是0标引线型缓冲区,然后是四个蜡烛图缓冲区。

   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);  // 第一个缓冲区对应0标引
//--- 绑定数组和蜡烛图指标缓冲区
   SetIndexBuffer(1,OBuffer,INDICATOR_DATA);     // 第二个缓冲区对应1标引
   SetIndexBuffer(2,HBuffer,INDICATOR_DATA);     // 第三个缓冲区对应2标引
   SetIndexBuffer(3,LBuffer,INDICATOR_DATA);     // 第四个缓冲区对应3标引
   SetIndexBuffer(4,CBuffer,INDICATOR_DATA);     // 第五个缓冲区对应4标引 

 

缓冲区和标图的数量仅可以通过使用编译程序指令来设置,不可以使用函数动态改变这些属性。

 

颜色版本样式

正如表格中所见,样式被分成两组。第一组包括名字中无COLOR的样式,我们调用这些基本样式:

  • DRAW_LINE
  • DRAW_SECTION
  • DRAW_HISTOGRAM
  • DRAW_HISTOGRAM2
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_FILLING
  • DRAW_BARS
  • DRAW_CANDLES

在第二组,样式名称包括 COLOR,我们称它们颜色版本:

  • DRAW_COLOR_LINE
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_HISTOGRAM
  • DRAW_COLOR_HISTOGRAM2
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG
  • DRAW_COLOR_BARS
  • DRAW_COLOR_CANDLES

所有颜色版本的样式不同于基本版,因为他们允许为标图的每个部分指定颜色。标图的最小部分是柱形,所以我们可以说颜色版允许在每个柱形上设置颜色。

除了 DRAW_NONEDRAW_FILLING样式,它们没有颜色版。

若要在每个柱上设置标图颜色,存储颜色标引的额外缓冲区已被添加到颜色版。这些标引在特定数组指出颜色数量,包括预定颜色组。颜色数组大小是64.这意味着每个样式的演示版都允许用64种不同颜色涂色标图。

在指定颜色数组中,颜色的设置和数量可以通过编译程序指令#property indicator_color来设置,在这里您可以通过逗号分隔指定所有必需的颜色。例如,指标中的这种输入:

//--- 定义8种颜色用于蜡烛图涂色(它们存储在指定数组)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange

说明标图 1,8种颜色被设置,将被置于指定数组。另外在程序中,我们将不会指定标图的颜色,但不仅它的标引。如果我们想要为K柱设置红色,那么来自数组的颜色标引值应该在指标的颜色缓冲区设置。红色首先在指令中指定,它对应0标引号。

  //--- 设置蜡烛图颜色clrRed
  col_buffer[buffer_index]=0;

颜色设置不会一劳永逸的一次性给予,它可以使用PlotIndexSetInteger()函数动态变化。例如:

      //--- 为每个标引设置颜色,像属性PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  图形样式的数量
                          PLOT_LINE_COLOR,      //  属性标识符
                          plot_color_ind,       //  颜色标引,在这里我们编写颜色
                          color_array[i]);      //  新颜色

 

指标和标图属性

对于指标标图,属性可以借助编译程序指令和使用相应的函数进行设置。在指标属性和函数之间的连接文章中阅读关于它的更多信息。使用指定函数动态改变指标属性允许创建更灵活的自定义指标。

 

图表上指标绘制的起点

在许多情况下,根据算法的条件,不可能在当前柱立即启动计算指标值,因为在历史记录中必须提供之前柱的最小数。例如,多种平滑类型意味着在之前的N柱上使用价格数组,并且在这些值的基础上,计算当前柱的指标值。

在这种情况下,既无法为开始的N柱计算指标值,这些值也不能显示在图表上而只能辅助计算进一步的值。为避免在历史记录的开始N柱上标图指标,则在相应的标图设置N值到PLOT_DRAW_BEGIN属性:

//--- 绑定数组和蜡烛图的指标缓冲区
PlotIndexSetInteger(number_of_plot,PLOT_DRAW_BEGIN,N);

在这里:

  • number_of_plot �C 从0到indicator_plots-1的值 (从0开始的标图数)。
  • N - 历史记录中开始柱的数量,在这里指标不能显示在图表上。

 


更新: 2016.08.25