构建自动运行的 EA(第 13 部分):自动化(V)
概述
现在我们已经完成了基本框架的创建,我们能够完结自动化 EA,令其 100% 自动运行,同时遵循我们定义的操作规则。 本文的目的不是构建操作模型,而是通过将手动 EA 交易转换为自动化交易,来展示和准备使用此处建议的系统。
我认为大多数想要使用 100% 自动化 EA 的交易者(亲爱的读者,不一定是您的情况)的最大问题是他们对编程一无所知,或者更糟糕的是,他们对金融市场也一无所知,不想探求这个领域。
许多人只是想运行一个神奇地赚钱的计算机程序,而并未真正明白幕后发生的事情。 我看到很多人谈论特定平台、系统、或 EA 的优劣。 但绝大多数人对他们所处的风险等级茫然无知,他们想象一个用 MQL5 编写的,或用任何其它编程语言开发的简单计算机程序,放到 MetaTrader 5 上运行就会成为 ATM。
很多人都有这个“梦想”,或者说“幻觉”。 他们认为有些程序员,甚至他们自己都可以开发一种方法、程序或算法,在他们的经纪账户中神奇地生产金钱。 他们中的许多人其实更需要学习金融市场的基础知识,但他们不喜欢听到任何人告诉他们的所作所为是错的。
所有的一切,都是绝对可用的,已创建、测试和开发的东西能以某种方式试图将程序变成金融市场上的造币工厂。 有些事情已被证明是不合适的,而另一些事情拥有良好的风险控制,能设法在一段时间内产生一些利润。
因此,如果您是那种希望找到最终可以令您致富的魔法系统的人之一,请立即停止阅读本文,因为这些内容不是针对您的。 这同样适用于任何希望在本文中看到神奇公式的人:哦,请不要再继续阅读了。
在此,我将向您展示如何开发一个触发器,令已在使用的系统自动化。
我们搞清楚如何自动化智能交易系统。 我们从规划我们实际需要做什么开始。
规划自动化
首先,您要进行什么交易并不重要。 您将使用哪些指标、图表时间帧或信号,也并不重要。 自动化过程将始终遵循相同类型的计划。 唯一的区别在于触发器的构建方式,但规划则始终相同。
为了规划计划自动化系统如何公国,您必须首先拥有一个已实战一段时间的交易模型。 这是最重要的。 不要盲目尝试未知自动化模型。 您需要养成使用该特定模型的习惯。
好的,这是自动化的第一个需求:您必须知道所选模型如何使用。 现在您需要明确定义执行交易的规则。 这应该以明确和客观的方式完成。 事情不应该像这样:如果像这样,当也许此处是另一种方式时,我希望这样会成功。 这是错误的。 规则应该是这样的:如果发生这种情况,卖出;如果发生这种情况 — 买入。 规则必须是客观的。 请记住,我们是在教导一个没有情绪或感觉的机器人。 它感觉不到恐惧或悔恨。 所以,要客观。
敲定明确的规则后,是时候开始创建编程逻辑了。 许多人在这一点上迷失了,因为直到编程时,他们还再试图发明新的规则,试图令系统更好、或更有利可图。 而再一次,这是错误的。 EA 必须执行与模型相同的操作。 一模一样。
例如,我们看看如何为拉瑞·威廉姆斯(Larry Williams)模型创建规则,已知它被称为 9-周期指数移动平均线。 该模型有许多变体,但这个原始模型极其简单。 请注意,这只是一个示例,如果您实际上不了解它是如何工作的,我不建议您使用它。 那么,我们就来看看如何规划这个模型的规则。
如果柱线收于 9-周期指数移动平均线上方,则买入;如果收盘价低于它,则卖出。
这是对模型进行编程的关键规则:一切都是清晰客观的。 如果要添加尾随停止,方法必须像以下示例一样简单:
对于买入交易,交易止损应始终比收盘柱线的最低点高一个基点;对于卖出交易,交易止损将始终比收盘柱线的最高点低一个基点。
同样,规则很简单。 这就是您应该如何创建自己的规则。 为了让它更清楚,我们来看另一个使用 RSI 指标的示例。 该逻辑亦适用于任何其它指标。 此处的目的是展示正确的方式:
如果指标高于 80 水平,则等待卖出入场。 一旦跌破 80,卖出。 如果指标低于 20,准备买入交易入场。 一旦升至20以上,买入。
此规则简单有效,但仍需要止损水平或尾随停止规则。 为此,我们可以使用另一个指标,甚至是相同的指标。 同样,只要规则明确,这些都无关紧要。 然后,我们根据 20 周期的算术平均值定义一个规则。 规则可能如下所示:
无论是买入还是卖出,止损级别都放置于 20-周期算术移动平均线对应的价位。
但您也可以按如下方式更改此规则:
当做多时,如果价格收盘价低于 20-周期算术均线,则平仓。 对于做空持仓,如果价格收盘价高于 20-周期算术均线,则平仓。
现在清楚实际当中应该如何做吗? 没有中间地带,一切都必须是黑白分明的,没有编造或想象的可能性。
有因于此,在自动化之前,您必须养成使用所需模式的习惯。 这里没有不确定性的余地。 规则是严格的,且须严格遵守。 记住:您是在告诉机器人要计算什么。 没有办法告诉它如何抱有偏见,试图遵守游戏规则。 即使是自适应系统,仍应遵循严格且定义明确的规则。 它们能够适应市场的事实,只是因为在这些严格的规则当中,我们放置了某些它可以接受的错误。
在系统中添加可接受的错误等级可能会令它们更加主观,如此您开始告诉它们“也许买入”、“也许卖出”。 虽然这种方式看起来很有趣,但它会令控制复杂化。 不从编程或数学的角度,困难在于控制 EA 的交易者:这需要对市场的深入了解,以便分析 EA 行为,并判定它是否做错了什么。
为了明白如何令系统能够自适应,我们采用 9-周期指数移动平均线的示例。 此示例可以通过添加适合模型的规则,即可应用于任何模型。 买入规则如下所示:
当柱线收于 9-周期指数移动平均线上方时,分析前 5 根柱线:如果它们形成较低的高点,则不可入场交易。
我们为系统增加了一定程度的数学主观性。 以前,如果柱线收盘价高于平均水平,我们买入。 现在买入还取决于以前的高点。 要实时分析所有这些,您必须是经验丰富的交易者。
请注意,即使有一些主观性,规则仍然严格。 如果您查看 EA 的工作原理,它似乎可以适应市场。 但其实这只是一个幻觉,因为它的运作仍然受到严格规则的约束。
有些人经常使用数据分析编程来生成这些相同的规则。 通过这种类型的编程,有些人可能会说系统开始运用人工智能。
但是,根据我的编程经验,我可以说这根本是无稽之谈。 我们实际上只是用算法根据观察到的形态创建数学曲线和时机图形。
这些时机曲线导致了严格规则均基于数学分析,而不是主观市场观察和经验。 问题是这样的系统无法快速适应市场变化,因为我们和机器面对的市场是不理性。 它们只是纯粹的计算器,在编程之前什么都做不了。
现在您可能明白我们能走多远了。 寻找一个魔幻系统是没有意义的,我们必须清晰客观地确定需要做什么。 现在,我们可以继续下一步。
将思路转化为代码
许多人可能会保持警惕,认为将一个思路转化为代码是非常复杂的事情,只有编程领域的专家、硕士或博士才能做到。 但事实并非如此。 任何有常识、谨慎、纪律、好奇心和兴趣的人,只要清楚客观地陈述这个思路,实际上都可以将他们的思路变成代码。 如果您无法清楚地定义要实现的思路,请返回上一步,并以清晰简单的方式将您的想法写在纸上。
现在我们来看看如何将这个思路转化为代码。 如果思路太短,请给出详细的描述。 描述分步过程,以及事件将如何展开。 我们在描述中包含的步骤越多越好。
若要知晓描述是否足够,请确保您能够完成以下流程图:
图例 01 - 实现框图
我知道很多人会看着这张照片,并觉得它很奇怪。 可能,他们从未见过有人使用这样的东西,尤其是程序员。
图例 01 是广泛用于编程和其它领域的流程图。 但是由于我们正在应对编程,我们就要关注这一点。 我们在图例 01 中可以看到机制应如何操作,无论是手动还是自动。 每个程序都有自己的框图,如图例 01 所示。 如果您可以正确填写每个点,您实际上就能够创建程序,从而令它完美运行。 这样的流程图基于分形工作。
但这怎么可能呢? 流程图如何成为分形,并表示我们应该如何编程? 😵😱 我们来搞清楚图例 01 如何变为能够构建任何东西的分形。 不管事情有多复杂,只要它能在这个图表的框架内表示,那么它就可以被构建出来。
每个进程都从 P1 开始。接下来,我们一路前进,并在 P2 点制定某种决策。决策是无所谓。 我们将始终选择其中一条路径:通往 P3 点的路径,或通往 P4 点的路径。所要选取的路径需在 P2 判定。
P3 和 P4 都可以表示成与图例 01 类似的图像,其中重复该过程直到最终结束。 然而,为了简化解释,我们假设 P3 和 P4 是一些简单的计算或调用,很快就能返回。 最终,两者都将收敛到 P5。
在此,我们根据 P3 或 P4 告诉我们的内容制定新的决策。 取决于 P5 的决策,我们可以返回 P2,或转到 P6。 如果我们回到 P2,这个过程将重复,创建一个反馈系统。 如果我们去 P6,这个过程就会结束。
感谢这种动态性,离开 P1 到达 P6,我们拥有了一条消息或执行流。 同样的流转也可能发生在 P3 和 P4 处。 如果发生这种情况,分形将出现在 P3 或 P4 处,但不会出现在流程图中的其它地方。
我们回到编程。 在 MQL5 中,P2 和 P5 可以替换为 IF ELSE 或 SWITCH CASE。 故此,只要您能在此流程图中表达出您的想法,并正确解释和描述它,就可以在没有编程知识的情况下创建任何东西。
P1 可以是函数或过程接收的一组参数,也可以是将代码放置在图表上时开始执行代码的起点。 重要的是要明白我们把所有初始值和必要值放在 P1 中。
P6 可以是 RETURN 命令,或其它根据 P1 处输入的值提供响应的内容。
至于 P3 和 P4,它们可以是展示如何决策的另一个流程图,也可以是处理 P1 值的简单分解。 我们的目的是描述图例 01 中的系统,以便将其自动化。
为了便于理解,我们来看一些示例。 我们从 9-周期指数移动平均线开始,我们把过程的描述转换为可编程形式,并将其放入流程图之中。 考虑以下事项:
示例 01 - 使用 9-周期指数移动平均线买入或卖出:
- 在 P1 中,我们输入 MA 值,和柱线收盘价。
- 在 P2 中,我们检查价格收盘价是高于还是低于给定平均值。
- 如果价格收盘更高,则转到 P4(买入看涨)。
- 如果收盘价更低,则转到 P3(卖出看跌)。
- 买入或卖出后,转到 P5 点。
- 如果 EA 是自动化的,我们返回到 P2,以便检查下一根柱线上的过程。 如果 EA 是手动的,我们转到 P6,因为没有其它操作要执行。
- 在 P1 处,指示所需的利润和当前柱线价格。
- 在 P2 处,检查持仓是否达到预期利润:如果是,则执行 P3;如果没有,则为 P4。
- 在 P3 中,我们开始一个新的流程图(P1 - 我们指定止损价的值)。
- 在 P2 处的这个新流程图中,我们检查盈亏平衡是否已经发生(如果没有,则执行 P3;如果是,则执行 P4)。
- 如果未执行盈亏平衡,则进一步处置。 转到 P5 和 P6,返回到上一个流程图,并等待新的尾随停止和盈亏平衡过程调用。
- 回到嵌套流程图的 P2,我们检查是否发生了盈亏平衡。 如果答案是肯定的,则执行 P4(尾随停止)。
- 当调用 P4 时,我们打开一个新的流程图,来检查价格是否可以修改,这可以使用其它流程图,以多种方式完成。 最后,我们返回主流程图,并退出该过程,等待新的调用。
示例 03 - 据 RSI 或 IFR 操控:
流程图与图例 01 类似。 这就是:
- 在 P1 中,我们得到指标值。
- 在 P2 中检查该值是大于 80 还是小于 20(注意:出于演示,显示任意值)。
- 如果高于 80,则执行 P3(卖出)。
- 如果小于 20,则 P4(买入)。
- 无论结果如何,请转到 P5;如果系统是自动的,则返回 P2;否则,则转到 P6,因为不需要进一步操作。
现在清楚它是如何工作的吗?😁 如果您可以做到这一点,那么您正走在创建自动 EA 的路上。
我理解您可能迫不及待地想看代码。 别担心,因为代码是最简单的部分。 最主要的事情应是理解如何实现这一目标,以及如何创建自己的自动化 EA。 我要向所有人展示,无论是专业程序员与否,都可以创建 EA,并取用最合适的模型,且无需依赖混乱和不安全的编程。
故请保持耐心,我们很快就会得到代码。 我将向您展示如何创建自动化 EA,但首先您需要知道如何使用该系统。 否则,您将仅限于提供的代码,但系统其实可以提供更多的可能性。 在这个简短的系列中,我分享了我的一些知识。
理解和实现自动化
如果您理解了上一个主题,就可以继续阅读代码。 然而,本文不会涵盖这些内容:我打算稍后详细解释如何构建代码。 这部分需要非常详细的解释,故此我不建议使用特定的模型。
本系列文章的目的是教授如何将已经测试和手动操作的模型转换为自动化系统,而非创建特定的操作模型。 在本文中,我将向您展示如何运用类来创建智能系统。 不过,由于上述原因,我们将留待下一篇文章中真正实现。
本系列中介绍的 EA 具有简洁的功能列表,但能够涵盖几乎 100% 的情况。 好吧,可能存在不可预测的情况,也可能需要添加代码,但这种情况非常罕见。 由于大多数用户会用到指标,因此所提议的类系统会令它们更易于使用,从而防止用户编写更大的代码。 您可能需要打开一些警报来通知您 EA 正在做什么,因为在图表上不需要挂载指标来接收数据和指标值。 也许指标在图表上运行,便于我们观察交易,但这对 EA 来说无所谓。
另一个重要情况是,当我们需要添加额外的代码来覆盖特定模型时。 这应该在类系统中完成,保留封装和继承的概念,以免损害代码安全性,或产生与编译相关的问题。 生成的代码。
正如我在前面的文章中曾提到的,请注意编译器生成的警告消息。 不应忽略它们,除非在解决方案尚未完成的测试阶段。 然而,一旦代码变得更加具体,即使代码已经通过编译,也不要忽略编译器消息。 警告的存在表明代码可能存在安全隐患,或者可能没有足够的稳定性和准确性来确保 100% 自动运行。 编辑我们在此处创建的系统时,请记住这一点。
我们看看手动操作的系统结构如图例 02 所示。
图例 02 - 手动系统
在此图例中,我们似乎正直接应对 EA 或其类之一。 然而,事实并非如此。 交易者实际上是在应对平台,而 EA 响应平台生成的命令,而不是用户的命令。
记住这一点非常重要,因为许多人认为当他们操控 EA 时,他们是在与 EA 直接交互,而实际上是与向 EA 发送命令的平台交互。 这在本系列的前几篇文章中已经讨论和解释过。 在自动化 EA 之前,您应该了解图例 02。 尽管形式可能因程序员而异,但原理是相同的:您与平台交互,而非与 EA 交互。
有基于此,我们可以思考在哪里放置一个触发系统。 请注意,图例 02 显示的是文件的结构,而不是类的内部结构。 如果您要以任何方式修改系统,请记住这一点。 我只尝试解释清楚,任何修改都必须小心,以免破坏系统的稳定性,或者更糟糕的是,不要使其表面上可靠,而实际上它是一个定时炸弹,随时准备爆炸。
我们来研究一下系统是如何工作的:作为交易者,您通过与 C_Mouse 类互动,告知 MetaTrader 5 平台您打算以特定价格买入或卖出。
该类还与接收鼠标移动事件的 EA 连接,并通知 C_Mouse 类在何处放置价格线。 单击鼠标后,从 C_Mouse 将该点位传递到 EA,并分析交易者是买入还是卖出。 然后,EA 向 C_Manager 类发送请求,该类检查 C_ControlOfTime 时间的条件。
取决于 C_Manager 类中的创建参数,可以接受或拒绝请求。 如果它被接受,相应的订单被发送到 C_Orders 类,而该类又将请求发送到交易服务器。 当服务器响应请求时,MetaTrader 5 平台中会触发一个新事件,通过 OnTradeTransaction 事件通知 EA 服务器上发生的情况。
而 EA 应分析这些信息,并根据上下文向交易者通知 C_Manager 和 C_Orders 类的请求结果。 故此,通过与 EA 中存在的代码交互来开仓、修改或平仓。 不过,交易者可用工具栏关闭或修改 EA 在服务器上开立的订单或仓位。 如果发生了这种情况,MetaTrader 5 平台会调用 OnTradeTransaction 生成一个事件,通知交易者变化。 然后,EA 应将信息传递给 C_Manager 类(如果适用)。
明晰了它是如何工作的,您就可看出自动化系统应该替换 C_Mouse 类,其中初始化整个触发器系统。 尽管在自动化系统时将删除 C_Mouse 类,自动化不会发生,因为 C_Mouse 将继续与 EA 交互,这将生成对C_Manager类的调用。
C_Mouse 类甚至可以在 EA 和 C_Manager 类之间建立一些连接。 但由于我们事先知道 C_Mouse 类将会从系统中删除,因此整个系统设计为可以轻松排除它。 自动化发生在此步骤当中。
尽管如此,我们仍然必须应对由交易者触发的与 MetaTrader 5 平台交互事件引起的相关问题。 在这种情况下,EA 简单地忽略任何请求,它只会通知 C_Manager 类与订单系统相关的事件,如此来了解交易者的操作。 在下一篇文章中这个过程将变得更加清晰,我们将更详细地研究自动化。
结束语
在本文中,我们研究了如何使用流程图来设置操作规则。 在讨论人工智能时经常会出现这样的问题。 但这个主意本身并不新鲜。 不过,我最近经常看到人们谈论有关它的事情。 无论如何,这里介绍的材料是有价值的,尽管它只是现有潜力的一小部分。
我邀请读者花时间研究这篇文章和相关文章,以便理解提到的每个步骤。 在下一篇文章中,我们将根据在此解释的内容,看到系统如何自动工作,就像变魔术一样,因此对本材料的良好理解将帮助您明了整个文章系列的成果。
本文由MetaQuotes Ltd译自葡萄牙语
原文地址: https://www.mql5.com/pt/articles/11310