针对初学者以 MQL5 编写“EA 交易”的分步指南 - MQL5文章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Samuel | 4 十月, 2013 | 浏览次数: 1109 | Chinese
简介
本文的目标受众是想要学习如何以全新的 MQL5 语言编写简单“EA 交易”的初学者。首先,我们将定义我们的 EA(EA 交易)的功 能,接下来是 EA 如何实现这些功能。
1. 交易策略
EA 的功能:
EA 将监视一个特定的指标,当满足某一条件时(或满足某些条件时),它将基于当前满足的条件进行交易(卖出/出售或买 入/购买)。
//其他参数 …
这是单行注释
/* 这是一个多行注释
*/
5/24
这是多行注释。多行注释的起始和结束以符号对 /* 和 */ 标示。 在编译代码时,编译程序会忽略所有注释。
将单行注释用于输入参数是一个很好的方式,使 EA 用户可以理解那些参数的意义。 在 EA 输入属性上,我们的用户将不会看到参 数本身,而是看到如下所示的注释:
从上述各种数据类型的说明我们可以得知,无符号整数类型不是为存储负值而设计,任何设置负值的尝试可能导致意想不到的后 果。例如,若要存储负值,不能将其存储于无符号类型中(即 uchar、uint、ushort、ulong)。
回到有关 EA 的讨论。考察这些数据类型,您会同意我们使用 char 或 uchar 数据类型,因为我们要在这些参数中存储的数据分别 小于 127 或 255。要获得良好的内存管理,这么做是最合适的。但为了便于我们讨论,我们将继续使用 int 类型。
inputint TakeProfit=100; //获利
inputint ADX_Period=8; //ADX周期
inputint MA_Period=8; //移动平均周期
inputint EA_Magic=12345; //EA幻数
inputdouble Adx_Min=22.0; //ADX最小值
doubleallbars[20];//该数组可存储 20个元素
double mysum = 123.5678; double b7 = 0.09876;
交易手数 (Lot) 表示我们想要交易的金融工具的量。接下来我们声明将要使用的其他参数: adxHandle 用于存储 ADX 指标句柄,而 maHandle 将用于存储“平均移动线”指标的句柄。plsDI[]、minDI[]、adxVal[] 是动态 数组,用于保存图表上每个柱的 +DI、-DI 和(ADX 指标的)主 ADX 的值。maVal[] 是动态数组,用于保存图表上每个柱的“移动 平均线”指标的值。 在这里顺便说明一下什么是动态数组。动态数组是在声明时没有确定数组大小的数组。换言之,方括号对中没有指定任何值。与之 相对,静态数组在声明时定义了数组的大小。 示例:
在 EA 从图表移除时,OnDeinit 函数调用。 我们将为 EA 释放在初始化过程中在此部分为指标创建的句柄。
该函数处理 NewTick 事件,该事件在接收到交易品种的新报价时生成。 注意,如果在客户端中不允许使用“EA 交易”(按钮 "Auto Trading" (自动交易)),该“EA 交易”无法执行交易操作。
2/24
在 Name(名称)部分下双击并输入参数的名称,然后在 Type(类型)部分下双击以选择参数的数据类型,最后在 Initial value(初始值)部分下双击并输入参数的初始值。
完成上述步骤后,看到的画面应如下所示:
图 5. EA 输入参数的数据类型
如您在上图中所见,我为所有参数选择了整数 (int) 数据类型。接下来让我们就数据类型稍作论述。
以上被称之为交易策略。您必须首先开发您想要 EA 自动执行的策略,然后您才能编写 EA。所以在这种情况下,让我们修改上述 语句以使其反映我们想要在 EA 中开发的策略。
我们将使用时间周期为 8、名为“移动平均线”(Moving Average) 的指标(您可以选择任意时间周期,但出于策略的考虑我们 将使用 8)。 当“移动平均线-8”(为方便论述,下文将其简称为 MA-8)向上渐增且价格收在 MA-8 之上时,我们希望我们的 EA 实行买 入(购买)交易;当 MA-8 向下渐减且价格收在 MA-8 之下时,EA 将实行卖出(出售)交易。 我们还将使用时间周期同样为 8、名为“平均方向性运动”(Average Directional Movement, ADX) 的指标帮助我们确定市场是 否沿趋势运动。我们这样做是因为我们只想在市场沿趋势运动时进行交易,而在市场无方向性时(即无趋势)放松监控。 要达到此目的,我们将仅在上述条件满足且 ADX 值大于 22 时进行我们的交易(买入或卖出)。如果 ADX 大于 22 但渐 减,或 ADX 小于 22,即使条件 B 满足我们也不会进行交易。 我们还需要设置 30 点止损来保护自己;对于利润目标,我们将目标定在 100 点利润。 我们同样希望我们的 EA 仅在新柱形成时寻找买入/卖出机会,我们还将确保我们在买入条件满足而我们尚未建立买入头寸 时建立买入头寸,并在卖出条件满足且我们尚未建立卖出头寸时建立卖出头寸。
char: char 类型占用 1 字节内存(8 位),允许以二进制记数法表示 2^8=256 个值。char 类型可以是正数值也可以是负 数值。值的范围从 -128 到 127。 uchar:uchar 整数类型同样占用 1 字节内存,这和 char 类型是一样的,不同的是 uchar 仅用于正数值。最小的值为零, 最大的值是 255。uchar 类型名称的第一个字母 u 是 unsigned(无符号)的缩写。 short:short 类型的大小为 2 字节(16 位),相应地,它可以表示的值的范围为 2 的 16 次幂:2^16 = 65,536。 由于 short 类型是有符号的,它包含正数值和负数值,因此值的范围介于 -32,768 到 32,767 之间。 ushort:无符号 short 类型即类型 ushort,后者的大小同样为 2 字节。最小值为 0,最大值为 65,535。 int:int 类型的大小为 4 字节(32 位)。最小值为 -2,147,483,648,最大值为 2,147,483,647。 uint: 无符号整数类型即 uint。它占用 4 字节内存,可表示从 0 至 4,294,967,295 的整数。 long:long 类型的大小为 8 字节(64 位)。最小值为 -9,223,372,036,854,775,808,最大值为 9,223,372,036,854,775,807。 ulong:ulong 类型同样占用 8 字节内存,可存储从 0 至 18,446,744,073,709,551,615 的值。
图 3.“EA 交易”的一般属性 由于我们要能够更改 EA 的某些参数以找出哪些值可以带来最佳结果,我们应使用 "Add"(添加)按钮将这些参数添加进来。
/zh/articles/100
图 4. 设置 EA 输入参数 在 EA 中,我们需要能够尝试我们的“止损”、“获利”、“ADX 时间周期”以及“移动平均线时间周期”设置,因此我们将在此定义这些0.1;
//交易手数
//---其他参数
intadxHandle;//我们 ADX指标的句柄
intmaHandle; //我们移动平均指标的句柄
doubleplsDI[],minDI[],adxVal[];//保存每个柱 +DI,-DI和 ADX数值的动态数组
doublemaVal[];//保存每个柱移动平均值的动态数组
doublep_close;//保存一个柱收盘价的变量
intSTP,TKP; //将用于计算止损和获利值
如您所见,我们添加了更多的参数。在开始讨论新参数前,我们先讨论您现在可以看到的一些内容。我们可以使用正斜杠 '//' 在我 们的代码中添加注释。通过注释,我们能够了解变量的意义,或此时在代码的该处我们在做什么。注释还使得我们的代码更易于理 解。撰写注释有两种基本方式:
/zh/articles/100
图 6. 自动交易已启用 大部分实施我们先前开发的交易策略的代码将在该部分中编写。 现在看看我们 EA 代码的各个部分,让我们开始在“骨架”上添加“血肉”。 2.2 输入参数部分
//---输入参数
inputint StopLoss=30; //止损
完成所有必要参数的设置后,单击 Finished(完成)按钮,“MetaQuotes 语言编辑器”将为您创建如下图所示的代码框架。
/zh/articles/100
3/24
我们将代码分段,以便于您更好理解。
代码的顶部(头)是定义 EA 属性的所在。在这里您可以看到您在图 3 中填入“MQL5 向导”的值。 在该部分代码中,您可以定义诸如 description(说明)(EA 中的简短文字说明)的其他参数、声明常量、包含其他文件或导入函 数。
#define ABC #define COMPANY_NAME
100 "MetaQuotes Software Corp."
它会在代码中每次出现 COMPANY_NAME 时用字符串 "MetaQuotes Software Corp." 进行替换,或在每次出现 ABC 时用字符(或 整数) 100 进行替换。
图 7.“EA 交易”输入参数 现在,回到我们的代码本身... 我们决定为我们的 EA 添加更多参数。EA_Magic 是出自 EA 的所有订单的幻数。 最小 ADX 值 (Adx_Min) 将声明为 double 数据 类型。double 用于存储浮点常数,浮点常数包含整数部分、小数点和小数部分。 示例:
4/24
接下来是 EA 初始化函数。这是在 EA 启动或附加至图表时调用的第一个函数,且仅调用一次。
为确保我们的 EA 工作出色,该部分是进行某些重要检查的最佳所在。 我们可以了解图表是否有足够的柱用于 EA 的工作等。 这同样是获取我们将用于指标(ADX 和“平均移动线”指标)的句柄的最佳所在。
/zh/articles/100
1/24
图 2. 选择文档类型
在下一窗口中,将您想要为 EA 指定的名称键入 Name(名称)框中。在这里,我输入的是 My_First_EA。然后您可以在 Author(作者)框中输入您的名字,并在 Link(链接)框中输入您的网址或电子邮件地址(如有)。
我们完成了策略的开发,现在是时候开始编写代码。
2. 编写“EA 交易”
2.1 MQL5 向导 启动 MetaQuotes Language Editor 5(MetaQuotes 语言编辑器 5)开始。然后按下 Ctrl+N 或单击菜单栏上的 New(新建)按 钮。
图 1. 启动新的 MQL5 文档 如图 2 所示,在 MQL5 Wizard(MQL5 向导)窗口中选择 Expert Advisor(EA 交易),然后单击 "Next"(下一步):
您可以在 MQL5 手册中找到更多有关预处理程序指令的信息。现在我们继续我们的讨论。
代码头的第二部分是输入参数部分:
/zh/articles/100
我们在该部分指定将用于我们的 EA 的所有参数。这些参数包括所有我们将写入 EA 的函数将会用到的所有变量。 在该层面声明的变量称为全局变量,因为 EA 中的每一个可能需要它们的函数都能访问它们。 输入参数 是只能在我们的 EA 外部 进行更改的参数。我们还可以在该部分声明我们将在 EA 中使用而在 EA 外部不可用的其他变量。
图表交易品种可通过symbolsymbol函数获得当前图表的当前交易品种则为null图表时间周期时间表可通过periodperiod函数获得当前图表的当前时间表则为移动平均线平均周期之前我们在输入参数部分已定义指标相对于价格图表的平移此处平移为移动平均线平滑型可能是以下平均法的任意一种
针对初学者以 MQL5 编写“EA 交易”的分步指南
当语句以 # 符号开头时,它是调用一条预处理程序指令,且该语句不以分号 ';' 结束。预处理程序指令的其他示例包括: #define: #define 指令用于声明常量。它的书写形式为 #define 标识符 token_string 其作用是在代码中每次出现标识符时用值 token_string 进行替换。 示例:
相关文档
最新文档