English Русский Español Deutsch 日本語 Português
preview
构建自动运行的 EA(第 01 部分):概念和结构

构建自动运行的 EA(第 01 部分):概念和结构

MetaTrader 5EA交易 | 6 三月 2023, 09:46
5 769 1
Daniel Jose
Daniel Jose

概述

近期一段时间,有几位读过我关于如何从头开始创建 EA 文章的读者,他们联系我,请求为他们创建一个 EA,或给他们一些关于如何开发的指南。 对于所有这些请求,我回复说,自动运行 EA 的编程并不是迄今为止最复杂的任务。 我总是激励并给予那些真正想要学习和深化知识的人适当的指导,无论是爱好者、还是想要自行创建 EA 的人,这些 EA 将在全自动模式下遵循特定的操作流程。

我还注意到,这些人中的许多人对如何开始编程有着基本相同的疑问。 但最让我惊讶的是,由于某种原因,他们中的许多人对如何实现这种类型的 EA 有一个完全错误的认知。 一些用户甚至没有正确理解与创建和使用自动化系统过程相关的风险。 在这种情况下,所说的自动化 EA 系统,是指无需任何控制即可工作的系统,并且可以在没有交易者直接或间接干预的情况下买卖资产。

因此,我决定解释这些观点,如此每个人都可以理解它们,或就这个话题进行争论。 一步一步,我将为您展示,业余爱好者乃至本主题的初学者,如何以简单但安全的方式从头开始逐步编程自动交易 EA,整个过程基本上只用到原生 MQL5。 不要迷信会有奇迹般的解决方案或类似的东西。

在这个早期阶段,我不会涉及复杂的细节,也不会用到漂亮而华丽的图表。 我不会试图欺您可能没有足够的统计学知识,我也不会宣扬这里奉献的 EA 能充当交易仆从,从您这里赚钱为生。 恰恰相反:创建 EA 是一项非常漫长的任务,如果您想创建真正有价值的东西,则需要大量的研究和奉献精神。 不仅仅是因为编程,还因为我们将在这里研究的操作和其它问题。

正如许多人可能错误地认为的那样,最大的问题不在于编程部分本身。 问题是,在许多情况下,我们的损失将远超实际盈利。 我再重复一遍:问题不在于编程,而在于为 EA 设计执行哪种类型操作系统的人缺乏经验。错误从来都不在程序员身上,尽管如果他认为自己是一位伟大的程序员,并且人们盲目地信任他,他们肯定是有问题。但如果这人知道自己在做什么,他就会对自己所做的工作完全冷静。 鉴于这一事实,问题不在于编程,而可能来自请求开发自动智能系统的人所设计的交易系统之中。


您如何拆分自动 EA? 它实际上是如何工作的?

在我们开始任何与编写代码直接相关的事情之前,我们需要让每位阅读这篇简短文章的人都清楚。 如果您已经知道自动 EA 的实际工作原理,那么该系列很可能不会增加您的知识点。 但如果您尚不明白它是如何工作的,或者为了让 EA 工作需要什么,那么跟随这些文章至少可以获取基础知识。 因为没有这些知识,您就会完全迷失。 如果您想迈出第一步,或掌握要学习和分析的内容,那么请与我一起阅读本系列。

为了开始解释,我们来看一看下面的图例 01

图例 1

图例 01. 自动 EA 操作思维逻辑示意图


此图以非常简单和通用的形式展示了自动 EA 的实际工作原理。 请注意,EA 有两个内部结构:订单系统,对于所有 EA 始终相同;以及第二个结构,触发系统,负责 EA 的自动操作。

如上所述,订单系统将始终相同。 因此,一旦系统创建完成,并且运行稳定,若您完全信任它 — 因为它是您所创建 EA 的一部分 — 您就可以移到出问题最多的触发系统。

但在我们开始研究要构建的系统之前,您需要了解如何将它们分离。 请注意这一点,因为许多人在尝试创建自动化 EA 时,会把事情混淆,并完全迷失方向。 特别是对于初学者,因为他们尚未明白最基本的概念。


理解如何创建订单系统

在此,我希望您按以下照做: 阅读从头开始开发交易 EA 系列文章,因为在该系列中,我展示了开发订单系统所需的每个步骤。 而在本系列中,我不会详解订单系统中能够(但不一定)存在的一些东西。

其中两个细节是盈亏平衡,它令 EA 自动将止损价位移到您净赚、且不再冒亏损风险的位置,以及尾随停止,它将首先创建于盈亏平衡点,然后随行情移动,从而确保利润...

尽管许多人不知道,尾随停止机制默认存在于 MetaTrader 5 平台当中。 但是要使用它,您必须逐一为每笔持仓启用它,并调整相应值... 我知道这样做似乎不是很有希望,也没有回报,但在尚未真正针对订单系统开发和测试尾随停止的情况下,最好的选择是使用 MetaTrader 5 平台中存在的机制,因为它稳定可靠。

故此,订单系统不可或缺的那部分,始自出现在图表上的指示线,并允许我们分析正在发生的状况,直到尾随停止机制,所有这些都是订单系统的一部分,您应该完全单独创建,并进行人工测试,即实际使用它一段您认为合适的时间。

在此期间,您将不得不调整、纠正、和测试可能发生的所有故障和错误。 相信我,您不会希望订单系统崩溃,或在图表上生成任何不能真正代表 EA 正在做什么的信息。 若出现这种情况,您将希望能撤消和修改 EA 所做的一切。

这些测试应该在模拟账户上长期进行,其中您没有亏损的风险,当然也未真正赚取。 测试必须非常密集。

测试所有内容,以及不可或缺的所有东西,直到您相信该系统可靠,舒适且易于使用,即您能够轻松驾驭它。 先不要继续下一步,而是停留在这里调整和测试订单系统。 再次,如果您尚无最低限度的思路来如何创建一个体面的订单系统,请阅读我上面提到的系列文章。 研究代码,了解所有事情是如何工作的,以及如何修改和调整它们,从而令系统对您来说更舒适,如此您就能够将其自动化。

别着急,慢慢来。 相信我,您不希望订单系统在实际交易中崩溃。 这根本不是玩笑。 您不会责怪平台或市场,因为真正负责问题的唯一责任人只有您自己。

一旦您拥有一款已完成的工作订单系统,它按照您所想的方式运行,并期望它工作,您就可以继续下一步。 考虑到它更简单,但这并不意味着您据其操作时,可以无视必要的预防措施。 我正说的是触发系统。


理解触发系统

触发系统也许是众多不了解编程、或数学的人,开始学习和关注金融市场时最兴奋的部分。 触发系统一旦连接到订单系统,就会发生“魔变”的部分,给人的印象是 EA 是一位真正的交易者,可以一年 52 周,每周 7 天,每天 24 小时运行,而不会感到疲倦、或遭受任何压力,以至畏惧入场或离场交易。

事实上,触发系统是非常有趣的东西,不是因为编程本身,而是因为它能体现出数学思维。 每位关注市场的人一定听说过拥有超酷交易系统的交易者,而且获利丰厚。 例如,谁不知道拉里·理查德·威廉姆斯(Larry Richard Williams)的故事,不想成为交易员呢?

我很遗憾地通知您,如今市场上有种类繁多的算法,它们比拉里·威廉姆斯曾用来赚钱、并获得认可的算法更有效。 这并不意味着他曾用过的触发系统不再有效。 与之对比,它仍然是可盈利的,如果您有足够的风险控制,您就能够以同样的算法赚很多钱。 触发系统应该很简单,如此 EA 才可以利用它的优势。 甚至,越简单的系统越容易测试。

如果您不能把它归纳入一个可以编程的简单数学公式中,那么创建一个充满复杂和怪异规则,以及奢侈分析的触发系统是毫无意义的。 所以,请忘记那些怪异的事情,譬如查看与资产 X 相关的指标 Z,以便在当前 K 时交易 Y,同时监控激进性价位 P,分析市场深度,寻找意图 W 的发生率,以便能够入场卖买持仓。 统统忘掉。 这种事情是行不通的,或者至少它会让事情变得如此怪异,以至于您无法测试算法。

请记住:简单永远是第一选择。始终尽可能保持简单。 如此可令失败次数下降到一定水平,确保触发系统不会产生触发效果,即它开始向系统发送巨量买入或卖出订单,最终不仅会令账户爆仓,还会耗干您的所有资产。

我想在这里声明一条警告。 尽可能避免创建一类触发系统,其中 EA 开始持续在买入或卖出方向加仓,即摊平价格,无论上涨或下跌,因为这种触发器通常会引发很多问题。 理想情况下,EA 应该在尝试开立新仓位之前平仓,无论其是买入亦或卖出。

甚至,有几种方式可在一段时间内阻止订单的发送,或者令 EA 在已有持仓时不会发送订单。 在创建和设计触发系统时,请考虑这一点,因为许多 EA 最终会进入一个无限循环 — 当这种情况发生时,您的所有资金都会在几分钟、甚至几秒钟内损失殆尽。

关于触发系统,另一个值得一提的重要事情是背景的重要性。 如果您还没有接触过,我建议您去了解一些。 您可能听说过 1987 年的崩盘,也被称为“黑色星期一”。

如果您未曾听说过,那么在继续创建 EA 之前,请先发掘一下这次崩盘的内幕。 因为它完全是由触发系统引起的。 所以先研究一下,因为您也许并不比那些先您入行的人更优秀。 至少您还没有具备必需的知识。 不要被那些量化交易如何创造奇迹,以及 EA 如何在未来主导市场的人言所欺骗。 在依赖任何信息或意见之前都要谨慎小心。

停下来想一想:如果量化交易真的像许多人声称的那样简单有效,那为什么拥有更强大经济实力、以及对攫取盈利欲望更高的大公司不热衷采用这种机制? 为什么他们会聘请最好的程序员、数学家和统计学家,因为他们可以投资一款永远不会亏损的触发系统,并添加合同条款来防止任何人复制它? 故此,在您断定您已经发现了圣杯之前,请好好学习;因为每个认真研究过的人都知道它根本不存在。

现在我已经给出了这些警告,并向您展示了生成自动 EA 的方式,以及需要什么,我们继续最有趣的部分:代码


初步规划

现在,既然您已经领略了毕生都应记住的想法和概念,无论您是程序员、初学者还是专业交易者,我们继续下一步:这是编程技能真正变得重要的地方。 这是许多人犯错误的地方,因为他们认为编程就是编写一系列的命令,并未显现出任何逻辑意义。 他们想当然地认为一切都会奏效,只是因为他们希望事情奏效。

编程并不复杂或神秘,只有大师或计算机科学博士,拥有广泛而巨大的学术背景才能真正产生一些东西。 这都是来自知识水平低之人的胡说八道,他们想显得比别人聪明。

若要编程,尤其是像 MQL5 这样与 C 和 C++ 非常相似的语言,您不需要很多知识。 事实上,您只需要知道 4 件基本的事情,并具备 2 种基本品质。 您需要了解的 4 件事是:

  • 没有程序不能用简单的命令执行,所以在用更复杂的命令之前学习和掌握简单的命令。
  • 了解如何使用以下命令:IF、FOR 和基本运算符:相等(=)、加法(+)、减法(-)、除法(/)、乘法(*)和模数(%)。
  • 理解使用位和字节之间的区别,以及布尔运算符的作用:非(!)、或(|)、与(&)和异或(^)。
  • 理解函数和过程、全局变量和局部变量、事件处理和过程调用之间的区别。

编程中的所有内容都归结为这 4 件事。 无论程序多么复杂、或可能变得多么复杂,如果您不能将您的代码归纳为这 4 件事,您就在试图以错误的方式构建一些东西。 现在,两个基本品质是:

  • 请阅读语言文档(在本例中为 MQL5 文档)— 它随时为您提供帮助。
  • 学会分解任务、组织、注释您仍然不理解的代码部分,并始终进行测试,无论结果如何。 无论如何都要测试,并写下测试结果。

基于这些前提,随着时间的推移,您肯定会成为一名优秀的程序员,但您需要鞭策自己并不断学习。 不要等待别人简单地告诉您如何做某事,始终寻求知识和学习 — 随着时间的推移,事情会变得更简单、更清晰。 但最主要的是:

谦虚,人不可能知道一切,您也永远不会。 接受总有人比您懂得更多。

现在您知道创建第一个自动化 EA 需要做什么,那么我们就开始编写其代码。 记住我上面所说的:首先,我们需要创建一个最能适应我们需求、且安全、稳定和强大的订单系统。 创造一些有效的东西,而不是华而不实的东西。


真正的规划

我们来完结代码。 对不对? 不, 还没有。 不要着急。 现在您可以打开代码编辑器 MetaEditor。 您需要做的第一件事是从头开始创建 EA。 这应该是干净的代码,而不是您从朋友那里借来的,或从网上下载的代码。 我们要真正从头开始。

对于那些不知道该怎么做的人:打开 MetaEditor 后,在左上角您将看到一个名为浏览器的窗口。 在那里,您将有一个目录结构,每个目录都以 MQL5 开头。 将此窗口视为文件资源管理器 — 这样您将更容易遵循说明。

在同一窗口中,有一个名为 “Experts” 的文件夹。 此处,我们放置创建的所有 EA 代码。 还有用于其它意图的文件夹,但现在我们只关注 Experts。 单击此文件夹,您可以打开它,并查看其中包含的代码。 最有可能的是,现有代码按相关顺序进行组织,每个都代表不同的 EA。 习惯这种结构 — 维护某个组织很重要,否则您将完全迷失在众多文件之中,并且无法在需要时细化所需的代码。

那么,我们迈出第一步。 它们非常简单,因此只需按照下面显示的图像进行操作:

图例 1

图例 02. 选择要创建的内容

图例 03

图例 03. 指定代码所在的目录

图例 04

图例 04. 为 EA 命名(扩展是可选的)。

图例 05

图例 05. 点击下一步

图例 06

图例 06. 点击完成


当您完成上图所示的步骤时,MetaEditor 将创建一个绝对清晰和安全的代码。 您将看到类似于以下代码的内容:

#property copyright "Daniel Jose"
#property link      "https://www.mql5.com/pt/articles/11216"
#property version   "1.00"
//+------------------------------------------------------------------+
int OnInit()
{
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+

不必担心 #property 预编译指令。 它们不会影响我们将在这里所做的事情。 它们于此是为了配置当您在图表上启动 EA 时将打开的窗口。 所以不要担心它们。 但其它事情您都应该担心。

如您所见,MetaEditor 创建了三个过程:OnInitOnDeInitOnTick。 这些过程实际上是事件管理函数。 因此,MQL5 编程与其它语言不同。 MQL5 是一种事件处理语言,不同于其它语言,我们在其内按过程操作。 基于事件的语言一开始可能会令人困惑,但随着时间的推移,您开始明白如何在其中执行操作。

在此,无需过多赘述,您将按如下工作:MetaTrader 5 平台生成一个事件,您响应该事件,即当您将 EA 放在图表上时,MetaTrader 5 触发 Init 事件,这将引发平台在加载的 EA(在本例中)代码中查找 OnInit 函数,并启动执行。 完成操作后,将不会再次调用此函数。 这只是一般描述,因为在每次 MetaTrader 5 将 EA 放置在图表上时都将调用该函数 — 请记住这一点。

此处,我们还有 OnDeInit 函数。 MetaTrader 5 平台将在 DeInit 形成时调用它,它告诉所有元素(EA 和指标),发生了一些事情,它们将被从图表中删除。 若要找出程序删除的原因,需检查 MetaTrader 5 平台返回的原因代码。

最后,我们有 OnTick 函数,每次 Tick 事件发生时 MetaTrader 5 平台都会调用它。 每次有新的跳价到达时,都会发生此事件。 换言之,当在交易服务器上执行新操作时,无论如何,都会生成 Tick 事件,进而触发 OnTick 函数,并进入其中代码执行。

可以想象,OnTick 函数对我们的系统非常重要,但它通常是许多 EA 交易的致命弱点。 这是因为许多程序员由于缺乏经验或疏忽,把所有计算密集型代码都放在这个函数当中,这可能会令它超负荷,并令 EA 不太稳定,更容易发生崩溃和严重错误。 最难修复的错误之一就是运行时错误,它可能是由复杂、且难以重现的交互引起的。 但我们将在未来的一篇文章中更详尽地看到这一点。

故而,正因为如此,该平台及其 MQL5 语言,促进了操控函数的其它方式,以便将事情保持在最低的安全性和可靠性等级内。我们还有其它类型的事件,我们可以据其改进一些常遇的事情。 但我们稍后会看到这一点,因为我不想在脑海中制造任何太大的混乱,特别若您是第一次看到这个,并且不知道 MQL5 通过处理由 MetaTrader 5 平台触发的事件来工作,且无需创建程序代码,我们有一个入口点和一个退出点, 而这两点之间的所有事情都必须由程序管理,由程序员处理。

在此,在 MQL5 中,我们只处理我们需要的事件。 考虑到这是一款智能交易系统,程序必须包含两个事件:处理智能交易系统初始化的 OnInit,以及处理跳价事件的 OnTick。 OnDeInit 事件可能存在,也可能不存在,但在某些特殊情况下可能很实用。

为了学习如何阅读文档,并有兴趣研究文档所解释的内容,我们来看看它对可以触发的事件有什么说法,特别是关于上述三个事件,当我们开始构建 EA 时,它们是由 MetaEditor 自动创建的:OnInit、OnDeInit 和 OnTick。 不要忘记也看看预编译指令 property

了解本文中描述的第一步非常重要,否则您将在本系列其它文章的解释中彻底迷失。

在下一篇文章中,我将向您展示如何创建一个简单明了的订单系统,允许您直接从图表提交买入和卖出订单。 因此,请继续关注下一篇文章,因为对于那些想要创建在自动模式下工作的 EA 的人来说,该主题将非常有趣。



本文由MetaQuotes Ltd译自葡萄牙语
原文地址: https://www.mql5.com/pt/articles/11216

最近评论 | 前往讨论 (1)
Peter Huang
Peter Huang | 20 7月 2023 在 19:14
感謝你的分享,很棒而且很用心的文章。
构建自动运行的 EA(第 02 部分):开始编码 构建自动运行的 EA(第 02 部分):开始编码
今天,我们将看到如何创建一个在自动模式下简单安全地工作的智能系统。 在上一篇文章中,我们讨论了任何人在继续创建自动交易的智能系统之前需要了解的第一步。 我们首先研究了概念和结构。
DoEasy. 控件 (第 26 部分): 完成 ToolTip(工具提示)WinForms 对象,并转移至 ProgressBar(进度条)开发 DoEasy. 控件 (第 26 部分): 完成 ToolTip(工具提示)WinForms 对象,并转移至 ProgressBar(进度条)开发
在本文中,我将完成 ToolTip(工具提示)控件的开发,并启动 ProgressBar(进度条) WinForms 对象开发。 在处理对象时,我将针对控件及其组件开发动画处理的通用功能。
构建自动运行的 EA(第 03 部分):新函数 构建自动运行的 EA(第 03 部分):新函数
今天,我们将看到如何创建一个在自动模式下简单安全地工作的智能系统。 在上一篇文章中,我们已启动开发一个在自动化 EA 中使用的订单系统。 然而,我们只创建了一个必要的函数。
如何利用 MQL5 处理指示线 如何利用 MQL5 处理指示线
在本文中,您将发现利用 MQL5 处理最重要的指示线(如趋势线、支撑线和阻力线)的方法。