自定义交易品种特性
自定义交易品种与经纪商提供的交易品种具有相同的特性。这些特性通过 金融工具一章中讨论的标准函数读取。
自定义交易品种的特性可以通过一组特殊的 CustomSymbolSet 函数来设置,每种基本类型(整数、实数、字符串)对应一个函数。
bool CustomSymbolSetInteger(const string name, ENUM_SYMBOL_INFO_INTEGER property, long value)
bool CustomSymbolSetDouble(const string name, ENUM_SYMBOL_INFO_DOUBLE property, double value)
bool CustomSymbolSetString(const string name, ENUM_SYMBOL_INFO_STRING property, string value)
这些函数为名为 name 的自定义交易品种设置 property 的值为 value。所有现有特性都分组到枚举 ENUM_SYMBOL_INFO_INTEGER、ENUM_SYMBOL_INFO_DOUBLE、ENUM_SYMBOL_INFO_STRING 中,这些枚举已在上述章节的各节中逐元素讨论过。
该函数返回操作状态标识:成功 (true) 或错误 (false)。导致错误的一个可能问题是,并非所有特性都允许更改。当尝试设置只读特性时,我们会收到错误 CUSTOM_SYMBOL_PROPERTY_WRONG (5307)。如果你尝试向特性写入无效值,则会收到 CUSTOM_SYMBOL_PARAMETER_ERROR (5308) 错误。
请注意,如果以下任何特性在交易品种规范中发生更改,则自定义交易品种的分钟和分时报价历史记录将被完全删除:
- SYMBOL_CHART_MODE 用于构建柱线的价格类型(Bid 或 Last)
- SYMBOL_DIGITS 价格值中的小数位数
- SYMBOL_POINT 一个点的价值
- SYMBOL_TRADE_TICK_SIZE 一项分时报价的价值,允许的最小价格变动
- SYMBOL_TRADE_TICK_VALUE 每项分时报价的价格变动成本(另请参见 SYMBOL_TRADE_TICK_VALUE_PROFIT、SYMBOL_TRADE_TICK_VALUE_LOSS)
- SYMBOL_FORMULA 价格计算公式
如果自定义交易品种是按公式计算的,则在删除其历史后,终端将自动尝试使用更新的特性创建新的历史记录。但是,对于以编程方式生成的交易品种,MQL 程序本身必须负责重新计算。
对于修改先前创建的自定义交易品种(在 CustomSymbolCreate 函数中指定第三个参数 origin 之后),编辑单个特性的需求最为迫切。
在其他情况下,批量更改特性可能会导致细微的影响。关键在于特性在内部是相互关联的,更改其中一个特性可能需要其他特性处于特定状态才能成功完成操作。此外,设置某些特性会导致其他特性自动更改。
在最简单的示例中,设置 SYMBOL_DIGITS 特性后,你会发现 SYMBOL_POINT 特性也已更改。下面是一个不太明显的例子:分配 SYMBOL_CURRENCY_MARGIN 或 SYMBOL_CURRENCY_PROFIT 对外汇交易品种没有影响,因为系统假定货币名称分别占据名称的前 3 个和后 3 个字母 ("XXXYYY[suffix]")。请注意,在创建“空白”交易品种后,默认被视为外汇交易品种,因此在未首先更改市场的情况下无法为其设置这些特性。
复制或设置交易品种特性时,请注意平台隐含了一些特殊性。特别是, SYMBOL_TRADE_CALC_MODE 特性的默认值为 0(在交易品种创建后,但在设置任何特性之前),而 ENUM_SYMBOL_CALC_MODE 枚举中的 0 对应于 SYMBOL_CALC_MODE_FOREX 成员。同时,对于形式为 XXXYYY(其中 XXX 和 YYY 是货币代码)加上可选后缀的外汇交易品种,隐含了特殊的命名规则。因此,如果你没有预先将 SYMBOL_TRADE_CALC_MODE 更改为其他所需模式,则指定交易品种名称的子字符串(第一和第二个三联符号)将自动归入基础货币 (SYMBOL_CURRENCY_BASE) 和利润货币 (SYMBOL_CURRENCY_PROFIT) 的特性中。例如,如果你指定名称 "Dummy",它将被拆分为两个伪货币 "Dum" 和 "my"。
另一个细微差别是,在设置精度为 N 位小数的 SYMBOL_POINT 值之前,你需要确保 SYMBOL_DIGITS 至少为 N。
本书随附了脚本 CustomSymbolProperties.mq5,它允许你试验创建当前图表交易品种的副本,并在实践中研究由此产生的效果。特别是,你可以选择交易品种的名称、其路径以及遍历(设置)所有支持特性的方向,即在语言中特性编号方面的正向或反向。该脚本使用一个特殊的类 CustomSymbolMonitor,它是上述内置函数的包装器:我们 稍后将对其进行描述。