通用信号和通用跟踪模块 - MetaTrader 5 专家








MetaTrader 5 提供用于生成专家顾问的 MQL 向导基于标准库中的交易、跟踪和资金管理模块。该库提供有限数量的预定义信号,直到某些内置指标。该项目允许您根据任意信号生成 EA,不仅由标准驱动,而且还由自定义指标和表达式驱动。
免责声明。这是一个概念验证 (POC) 库。它可能无法提供您想要用于生成交易信号的所有方法。请使用源代码来扩展您认为合适的库。
新信号模块是 SignalUniversal.mqh(应放置在 MQL5/Include/Expert/Signal 中)。
新的跟踪模块是 TrailingUniversal.mqh(应放置在 MQL5/Include/Expert/Trailing 中)。
仅在编辑器重新启动后,这些模块才可在 MetaEditor 的 MQL 向导中使用。
Indicators and signals setup is based on the article:
在本文中,您可以找到受支持的指标列表、如何指定自定义指标、如何传递参数、如何构造信号以及其他内容,包括优化支持。核心是头文件 IndicatR.mqh(位于 MQL5/Include/IndStats/ 中,是原始 IndicatN.mqh 的改进版本)。
Custom indicators with maximum 20 parameters are supported. The core allows you to define 6 explicit indicators in inputs, and 8 signals in inputs, with optional 2 implicit indicators in each signal.显式指标在 __INDICATOR_1 .. __INDICATOR_6 组中定义,然后可以通过相应信号的 IndicatorX/Y 输入中的数字索引 (1..6) 从信号中引用这些指标。 Implicit indicators are specified in IndicatorX/Y inputs as strings of special format指标名称@buffer(param1,param2,...)[bar]。
通用信号相当于“所谓”型号/图案由模块提供。标准库的所有模块都遵循相同的原理。
SignalUniversal.mqh 支持 IndicatR.mqh 的以下信号:buy、sell、buyExit、sellExit(可以组合用于恢复)。
TrailingUniversal.mqh 支持 IndicatR.mqh 的以下信号:ModifySL、ModifyTP。
IndicatR.mqh 目前不支持止损单和限价单。
除了文中介绍的原有SignalCondition(如NotEmptyIndicatorX、IndicatorXcrossesIndicatorY、IndicatorXcrossesLevelX等)之外,还引入了新选项ExpressionByIndicatorX。它允许您通过数学表达式计算信号值。当启用 ExpressionByIndicatorX 时,应在所需信号的第一个 IndicatorX 输入中给出表达式。
表达式由文章中描述的解析器处理:
您不需要知道解析器如何工作,但文章提供了有关支持的运算符、函数和操作原理的有用信息。此处包含解析器的扩展版本 (v.1.2)。
1.2 版本中添加了新的函子:
要使用新的通用信号生成 EA,请选择文件 -> 新建 -> Expert Advisor(生成)在元编辑器中。在按下“添加”按钮后的第二步,在“信号模块参数”对话框中,您应该选择“来自任意指标的通用信号”。

该模块为 8 个信号中的每一个提供具有 Pattern_N 强度的输入参数。根据文章 [1],信号和基础指标的实际参数应在 IndicatR.mqh 公开的输入中指定。在向导的 3-d 步骤中,您可以选择“基于通用信号的追踪止损”(此处没有输入,所有设置均通过 IndicatR.mqh 公开的输入进行)。

创建 EA 后,您应该获得类似于此处所附的 UniversalSignalDemo.mq5 的源代码。
以下是演示 EA 设置的示例。它使用自定义指标SilverTrend_信号。这是一个信号指标,在买入和卖出条件下在图表上放置项目符号。第 0 个缓冲区保存卖出信号,第 1 个缓冲区保存买入信号。通常,信号指标应对所有没有信号的柱使用 EMPTY_VALUE 值。对于此类正确的指标,库提供了特殊条件 NotEmptyIndicatorX(它根据 EMPTY_VALUE 检查值并为任何其他数字返回 true)。然而 SilverTrend_Signal 使用 0 表示空值。为了解决这种特殊性,我们可以使用不同的方法。首先,存在 IndicatorXrelatesToLevelX 条件,可用于将指标值与 0(默认为级别)进行比较。其次,我们可以使用带有内置条件 ExpressionByIndicatorX 的表达式。对于第一个指标,来自所需缓冲区和柱编号的值可用作 C1,对于第二个指标,可用作 C2,依此类推。下面您可以看到“C1!= 0”和“C2!= 0”用于卖出和买入的设置。

通过带有表达式的自定义指标 SilverTrend_Signal 发出买入和卖出信号
该指标有 2 个参数(RISK 和 NumberofAlerts),在设置中被忽略,因此将使用默认值 3 和 2。如果我们需要给出特定参数,则应将它们填写在参数输入中,以逗号分隔列表的形式,例如“5,1”。信号名称是任意字符串,当满足相应条件时,信号名称将显示在日志和警报中。
可以通过 INDn 函数读取显式指标值,而不是变量 Cn。因此可以通过以下方式更改相同的设置。

通过另一个表达式使用 SilverTrend_Signal 买入和卖出信号
可以直接在相应信号的输入 IndicatorX 中隐式设置相同的指标,例如:SilverTrend_Signal@0(3,2)[1]出售(缓冲区 0,柱 1)。这样就不需要使用显式的指标组。
我们可以使用通用尾随指标。

MA 通用尾随(仅用于演示目的)
最后,这就是从表达式访问符号属性的方式。

买卖信号以 10 点差为单位
以下屏幕截图显示了通过自定义信号进行的测试交易。

不幸的是,默认情况下,库的所有输入都位于 EA 的工作参数之前,因为库包含在 EA 输入之前。您可以将所有包含内容移至生成的源代码中的输入之后。
附件下载
📎 rubbarray.mqh (2.33 KB)
📎 fmtprnt3.mqh (3.86 KB)
📎 indicatr.mqh (64.74 KB)
📎 expressioncompiler.mqh (2.23 KB)
📎 expressionevaluator.mqh (1.94 KB)
📎 expressionpratt.mqh (6 KB)
📎 expressionprecedence.mqh (3.03 KB)
📎 expressionprocessor.mqh (14.55 KB)
📎 expressionpromise.mqh (16.76 KB)
📎 expressionshuntingyard.mqh (6.16 KB)
📎 functors.mqh (3.92 KB)
📎 hashmapsimple.mqh (2.85 KB)
📎 indicators.mqh (1.41 KB)
📎 nans.mqh (1.23 KB)
📎 variabletable.mqh (5.63 KB)
📎 globalvars.mqh (1.16 KB)
📎 indicators.mqh (5.13 KB)
📎 series.mqh (2.32 KB)
📎 symbolprops.mqh (2.05 KB)
📎 signaluniversal.mqh (6.59 KB)
📎 trailinguniversal.mqh (3.71 KB)
📎 universalsignaldemo.mq5 (7.66 KB)
📎 universalsignaldemo.set (8.65 KB)
Source: MQL5 #32107
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
