绘图设置:PlotIndexSetInteger
MQL5 API 提供了以下用于配置绘图的函数:PlotIndexSetInteger、PlotIndexSetDouble 和PlotIndexSetString。整数特性也可以通过PlotIndexGetInteger读取。我们主要关注整数特性。
PlotIndexSetInteger函数有两种形式。稍后,我们将介绍它们的区别。
bool PlotIndexSetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int value)
bool PlotIndexSetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int modifier,
int value)
该函数用于设置指定index处图形绘图的特性值。index值必须介于 0 和 P - 1 之间,其中 P 表示由 #property indicator_plots指令指定的绘图数量。特性本身由property参数标识:允许的值应从 ENUM_PLOT_PROPERTY_INTEGER 枚举选取(见下文)。特性值通过参数 value传递。
该函数的第二种形式用于应用于多个组件的特性(尽管这些组件属于同一个特性)。特别是,对于某些类型的图表,可以分配一组颜色,而非单一颜色。在这种情况下,你可以使用 modifier参数更改该组的任何颜色。
该函数成功时返回 true,否则返回 false。
下表提供可用的 ENUM_PLOT_PROPERTY_INTEGER 特性。
标识符 |
说明 |
特性类型 |
---|---|---|
PLOT_ARROW |
DRAW_ARROW 图表的 Wingdings 字体的箭头代码 |
uchar |
PLOT_ARROW_SHIFT |
DRAW_ARROW 图表的垂直箭头偏移量 |
int |
PLOT_DRAW_BEGIN |
数据起始的第一根柱线索引(从左到右) |
int |
PLOT_DRAW_TYPE |
绘图(图表)类型 |
ENUM_DRAW_TYPE |
PLOT_SHOW_DATA |
在 Data window中显示绘图值的标志(true 可见,false 不可见) |
bool |
PLOT_SHIFT |
指标图形沿时间轴的柱线偏移量(正值向右偏移,负值向左偏移) |
int |
PLOT_LINE_STYLE |
线条绘制风格 |
ENUM_LINE_STYLE |
PLOT_LINE_WIDTH |
设置线条粗细(像素,范围 1-5) |
int |
PLOT_COLOR_INDEXES |
颜色数量 (1 - 64) |
int |
PLOT_LINE_COLOR |
渲染颜色 |
颜色(modifier 颜色编号) |
我们将逐步学习所有特性,但目前,我们将关注三个主要特性:PLOT_DRAW_TYPE、PLOT_LINE_STYLE 和 PLOT_LINE_COLOR。
MetaTrader 5 中的指标支持多种预定义的绘制类型。它们决定了可视化表示方式以及用于显示的初始数据缓冲区的所需结构。
总共有 10 种此类基本绘图类型,在 MQL5 层面,它们由 ENUM_DRAW_TYPE 枚举中的标识符描述。PLOT_DRAW_TYPE 特性应被赋予其中一个 ENUM_DRAW_TYPE 值。
可视化类型, |
说明 |
缓冲区 |
---|---|---|
DRAW_NONE |
图表上不显示任何内容,但相应缓冲区的值可在数据窗口中查看。 |
1 |
DRAW_LINE |
根据缓冲区值绘制曲线(“空”元素会在线条中形成间隙)。 |
1 |
DRAW_SECTION |
在“非空”缓冲区元素之间形成折线的直线段(如果没有间隙,则类似于 DRAW_LINE)。 |
1 |
DRAW_ARROW |
字符(标签) |
1 |
DRAW_HISTOGRAM |
从零线到缓冲区值的直方图 |
1 |
DRAW_HISTOGRAM2 |
两个指标缓冲区的配对元素值之间的直方图 |
2 |
DRAW_ZIGZAG |
在两个缓冲区中连续出现的“非空”元素之间形成折线的直线段(类似于 DRAW_SECTION,但允许在单个柱线上有垂直线段)。 |
2 |
DRAW_FILLING |
根据两个缓冲区中的配对值对两条线之间的通道进行颜色填充 |
2 |
DRAW_BARS |
以柱线显示:每个柱线的四个价格按 OHLC 顺序显示在四个相邻的缓冲区中。 |
4 |
DRAW_CANDLES |
以蜡烛图显示:每个柱线的四个价格按 OHLC 顺序显示在四个相邻的缓冲区中。 |
4 |
此表未列出所有 ENUM_DRAW_TYPE 元素。存在支持对单个元素(柱线)进行着色的同类绘图类型。我们将在单独章节 图表逐元素着色中介绍。MQL5 文档提供了 所有类型的示例,而在本书范围内存在一些例外:类型名称旁会标注是否存在演示指标。
在所有情况下(包括 DRAW_NONE),其他程序均可通过 CopyBuffer 函数获取缓冲区数据。
DRAW_NONE 类型的一个额外特性是,此类缓冲区的值不参与图表的自动缩放,而默认情况下,显示在 子窗口中的指标会启用自动缩放功能。
线条风格由 PLOT_LINE_STYLE 特性决定,该特性还具有包含有效 ENUM_LINE_STYLE 值的枚举。
标识符 |
说明 |
---|---|
STYLE_SOLID |
实线 |
STYLE_DASH |
虚线 |
STYLE_DOT |
点线 |
STYLE_DASHDOT |
点划线 |
STYLE_DASHDOTDOT |
双点划线 |
最后,线条颜色由 PLOT_LINE_COLOR 特性设置。在最简单的情况下,该特性包含应用于整个图表的单一颜色。对于某些图表类型(尤其是 DRAW_CANDLES),可以使用 modifier 参数指定多种颜色。我们将在后面讨论这一点(请参阅 多货币和多时间范围指标章节的 IndSubChartSimple.mq5示例)。
上述三个特性足以演示指标IndReplica2.mq5。我们分别添加 ENUM_DRAW_TYPE 和 ENUM_LINE_STYLE 类型的两个输入参数 DrawType和 LineStyle,然后在 OnInit 函数中多次调用 PlotIndexSetInteger 函数来设置指标的渲染特性。
#property indicator_chart_window
|
对于 PLOT_LINE_COLOR 特性,我们没有创建输入变量,因为该特性及其他一些特性可直接从任何指标的特性对话框中的Colors选项卡中获取。默认情况下,即指标启动后,线条颜色为蓝色。但颜色以及线条粗细和风格均可在对话框(指定选项卡)中更改。我们的 LineStyle参数部分复制了 Colors 表格中的相应Style 单元格。但它提供了额外的优势。对话框的标准控件不允许在线宽大于 1 时选择线型。使用输入变量 LineStyle时,我们可以获得例如宽度为 3 像素的点划线。
与 IndReplica1.mq5相比,OnCalculate 函数中向缓冲区填充数据的方式完全一致。
在编译指标并在图表上启动指标后,我们得到预期画面:图表上收盘价位置显示一条蓝色线条,Data window中显示相应柱线的收盘价。
通过更改DrawType输入参数,我们可以更改缓冲区数据的显示方式。在这种情况下,应仅选择需要单个缓冲区的类型。任何其他图形类型(DRAW_HISTOGRAM2、DRAW_ZIGZAG、DRAW_FILLING、DRAW_BARS、DRAW_CANDLES)在单个缓冲区上使用,因此不会显示任何内容。同样,选择带着色的结构类型(名称以 "Color" 关键字开头)也不可行,因为它们需要每个柱线都有一个包含颜色编号的额外缓冲区(如前所述,我们将在 图表逐元素着色章节中详细介绍该功能)。
下面展示了 DRAW_LINE、DRAW_SECTION、DRAW_HISTOGRAM 和 DRAW_ARROW 显示选项。
一个缓冲区的图表类型
如果不是特意选择了不同的线型(DRAW_LINE 选择 STYLE_SOLID,DRAW_SECTION 选择 STYLE_DOT),这些绘制类型将完全相同,因为我们的缓冲区中所有元素均为“非空”值。默认情况下,“空”值指的是特殊常量 EMPTY_VALUE(本示例未使用)。DRAW_SECTION 中的线段会绕过“空”元素进行绘制,但这一特性仅在存在空元素时才会显现。我们将在 数据间隙可视化章节中介绍空元素的设置。
从零线开始的直方图 DRAW_HISTOGRAM 通常用于拥有独立窗口的指标,但此处仅为演示用途而展示。我们将在 等待数据和管理可见性 章节中创建一个使用此渲染类型的子窗口指标(请参阅 IndDeltaVolume.mq5示例)。
对于 DRAW_ARROW 类型,系统默认使用实心圆字符(代码 159),但可通过调用 PlotIndexSetInteger(index, PLOT_ARROW, code)将其更改为其他符号。
有关 Wingdings 的代码和外观,可在 MQL5 帮助中查找。
在 IndReplica3.mq5指标的另一个修改版本中,我们新增了以下输入参数:用于选择“箭头”符号 (ArrowCode),以及用于在图表上垂直移动这些标记 (Arrow padding) 和水平移动这些标记 (TimeShift)。
input uchar ArrowCode = 159;
|
沿价格轴的垂直移动以像素为单位指定(正值表示向下移动,负值表示向上移动)。沿时间轴的水平移动以柱线为单位设置(正值表示向右移动,即向未来方向,负值表示向左移动,即向过去方向)。新的输入变量通过 OnInit中的 PlotIndexSetInteger 调用传递。
int OnInit()
|
以下截图展示了 IndReplica3.mq5在图表上的示例,其设置为 117(菱形标记)、-50(向上移动 50 点)、3(向右/向前移动 3 根柱线)。
带垂直和水平标签偏移的散点图
我们的默认指标基于 Close价类型(但用户可以在特性对话框的Apply to 下拉列表中更改此设置)。如有需要,你可以通过以下指令指定不同的初始配置:
#property indicator_applied_price PRICE_TYPE |
此处请勿指定 PRICE_TYPE,而是应指定 ENUM_APPLIED_PRICE 枚举中的任意常量。它还包括 PRICE_CLOSE,对应于默认设置。例如,在源代码中添加以下指令将使指标默认基于典型价格:
#property indicator_applied_price PRICE_TYPICAL |
再次强调,该设置仅指定默认值。内置 _AppliedTo 变量允许你确定指标所基于的实际价格类型。如果指标是根据另一个指标的描述符构建的,则只能确定这一事实,而无法获知提供数据的具体指标名称。
如果要在源代码中查询 ENUM_PLOT_PROPERTY_INTEGER 枚举中的特性当前状态,需使用 PlotIndexGetInteger函数。
int PlotIndexGetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property)
int PlotIndexGetInteger(int index, ENUM_PLOT_PROPERTY_INTEGER property, int modifier)
该函数通常与 PlotIndexSetInteger配合使用,用于将一条线的绘制特性复制到另一条线,或从各类指标源代码所包含的通用 .mqh 文件代码中读取特性。
遗憾的是,目前没有提供类似的 PlotIndexGetDouble和 PlotIndexGetString 函数。