用于处理完整图表特性集的函数概述

图表特性可通过 ChartSetChartGet 函数组进行读取和编辑,每个函数组包含特定类型的特性:实数(double)、整数(longintdatetimecolorbool、枚举)和字符串。

所有函数均将图表 ID 作为第一个参数。值 0 表示当前图表,即相当于传递调用ChartID()的结果。然而,这并不意味着当前图表的 ID 为 0。

描述所有特性的常量构成了三个枚举:ENUM_CHART_PROPERTY_INTEGER、ENUM_CHART_PROPERTY_DOUBLE 和 ENUM_CHART_PROPERTY_STRING,它们被用作相应类型函数的参数。所有特性的汇总表可在 MQL5 文档中的 图表特性相关页面上找到。在本章的后面几节,我们将逐步介绍几乎所有特性,同时按用途对它们进行分组。唯一的例外是管理图表事件的特性 - 我们将在事件一章的 相关章节 中对它们进行介绍。

所有三个枚举的元素都被赋予值,使得它们构成一个没有交集(重复)的单一列表。因此你可以通过特定值确定枚举的类型。例如,给定一个常量,我们可以持续尝试将其转换为其中一个枚举名称的字符串,直到成功为止。

int value = ...;
   
ResetLastError(); // clear the error code if there was one
EnumToString((ENUM_CHART_PROPERTY_INTEGER)value); // resulting string is not important
if(_LastError == 0// analyze if there is a new error
{
   // success is an element of ENUM_CHART_PROPERTY_INTEGER
   return ChartGetInteger(0, (ENUM_CHART_PROPERTY_INTEGER)value);
}
   
ResetLastError();
EnumToString((ENUM_CHART_PROPERTY_DOUBLE)value);
if(_LastError == 0)
{
   // success is an ENUM_CHART_PROPERTY_DOUBLE element
   return ChartGetDouble(0, (ENUM_CHART_PROPERTY_DOUBLE)value);
}
   
... // continue a similar check for ENUM_CHART_PROPERTY_STRING

稍后我们将在测试脚本中使用这种方法。

某些特性(例如可见柱线数量)为只读特性,无法更改。这些特性将进一步标记为“r/o”(只读)。

特性读取函数有简写和完整两种形式:简写形式直接返回请求的值,完整形式返回成功 (true) 或错误 (false) 的布尔特性,而值本身会被放入通过引用传递的最后一个参数中。使用简写形式时,检查 _LastError变量中的错误代码尤为重要,因为在出现问题时返回的 0(NULL)值可能通常会被误认为是正确的。

访问某些特性时,必须指定一个额外的参数window,用于指示图表窗口/子窗口。0 表示主窗口。子窗口编号从 1 开始。某些特性适用于整个图表,因此其对应的函数变体不包含 window参数。

以下是用于读取和写入整数型特性的函数原型。请注意,其中值的类型为 long

bool ChartSetInteger(long chartId, ENUM_CHART_PROPERTY_INTEGER property, long value)

bool ChartSetInteger(long chartId, ENUM_CHART_PROPERTY_INTEGER property, int window, long value)

long ChartGetInteger(long chartId, ENUM_CHART_PROPERTY_INTEGER property, int window = 0)

bool ChartGetInteger(long chartId, ENUM_CHART_PROPERTY_INTEGER property, int window, long &value)

实数型特性的函数说明类似。子窗口没有可写的实数型特性,因此 ChartSetDouble仅有一种形式,即不带 window 参数。

bool ChartSetDouble(long chartId, ENUM_CHART_PROPERTY_DOUBLE property, double value)

double ChartGetDouble(long chartId, ENUM_CHART_PROPERTY_DOUBLE property, int window = 0)

bool ChartGetDouble(long chartId, ENUM_CHART_PROPERTY_DOUBLE property, int window, double &value)

字符串特性同样遵循此规则,但需要注意一个细节:字符串长度不能超过 2045 个字符(超出部分将被截断)。

bool ChartSetString(long chartId, ENUM_CHART_PROPERTY_STRING property, string value)

string ChartGetString(long chartId, ENUM_CHART_PROPERTY_STRING property)

bool ChartGetString(long chartId, ENUM_CHART_PROPERTY_STRING property, string &value)

使用 ChartGetInteger/ChartGetDouble简写形式读取特性时,window 参数为可选参数,默认指向主窗口(window=0)。

设置图表特性的函数(ChartSetIntegerChartSetDoubleChartSetString)是异步的,用于向图表发送更改命令。如果这些函数成功执行,该命令会被添加到图表事件的公共队列中,并返回true。当发生错误时,函数将返回false。在这种情况下,你应检查 _LastError变量中的错误代码。

图表特性会在后续处理该图表的事件队列时发生更改,通常会有一定延迟,因此在应用新设置后不应期望图表立即更新。要强制更新图表的外观和特性,请使用 ChartRedraw函数。如果要一次性更改多个图表特性,需在一个代码块中调用相应函数,然后仅调用一次 ChartRedraw

通常,终端会自动更新图表以响应各类事件,例如:新报价到达、图表窗口大小更改、缩放操作、滚动操作、添加指标等。

获取图表特性的函数(ChartGetIntegerChartGetDoubleChartGetString)是同步的,这意味着调用代码会等待这些函数的执行结果。