在任何给定的 Expert Advisor 中大约有六个结构元素,其中五个是可选的,只有一个是必不可少的。 没错,EA 的结构可以简单到只知道一个基本部分,尽管您最终会想要了解所有部分。 在这个完整的 MQL4 智能交易系统模板和结构教程中学习如何添加变量和其他函数来帮助您对交易 EA 进行编程。
单击 Expert Advisor 向导(在 MetaEditor 中选择新建/文件,或工具栏上的新建按钮,或按键盘上的 Ctrl + N)时,很容易看到大部分结构件。 从对话框中选择“EA 交易”,按“下一步”,输入您想要的任何名称、作者和链接。 EA 将以所选名称保存到 \experts 文件夹中。
接下来,您可以添加一些外部变量。 单击添加按钮(这将向您的外部变量列表中添加一条新记录),每条记录都包含三个字段: 名称(双击以设置变量的名称); 类型(双击设置数据类型); 和初始值(双击给你的变量初始化值)。 我们刚刚向示例 BasicTemplate EA 添加了三个变量:
Name | Type | Initial Value |
---|---|---|
Lots | double | 0.1 |
TakeProfit | int | 250 |
StopLoss | int | 150 |
在这里放太多变量是浪费时间,因为大多数应该手动输入。 按下“完成”按钮,EA 模板将打开一个如下所示的文档(注意:我对其进行了一些修改,使其更加有用,一眼就能看出结构是什么)。
请注意:我记得当我第一次学习使用 mql4 编程时,我期待 Expert Advisor Wizard 帮助我翻译和编码我的交易想法。 实际上它除了呈现一个模板的空壳外什么都不做。 真是个可怜的巫师! 在后续的文章中,我会为您呈现更完整的模板,供您使用和学习。
//+——————————————————–+
//| BasicTemplate.mq4 |
//| Copyright © 2011, ExcelMarkets |
//| /school |
//+——————————————————–+
// Structure #1 (Optional): Directives
#property copyright “Copyright © 2011, excelmarkets.com”
#property link “/school”// Structure #2 (Optional): Input parameters
extern double Lots=0.1;
extern int TakeProfit = 250;
extern int StopLoss = 150;
// Structural #3 (Optional): expert initialization function
int init()
{
//—- start up code
return(0);
}
// Structure #4 (Optional): expert deinitialization function
<structural#4>
int deinit()
{
//—- shutdown code
return(0);
}
// Structure #5 (Essential): expert start function
int start()
{
//—- your trade conditions and orders
return(0);
}
// Structure #6 (Optional): Custom Functions
</structural#4>
int customfunction1(){
// your custom option conditions
return (0); }
void customfunction2(){
// your custom function conditions
}
以上就像任何给定 EA 的基本结构,没有赋予它生命的代码。 每个结构元素都值得解释一下。
MQL 模板中出现的第一个项目是预处理器指令,以# 开头,您可以看到该模板有两个:#property 版权,即作者姓名,以及#property 链接,这是您可以或 可能没有进入向导。 这是仅有的两个与 Expert Advisor 相关的属性指令,包含或不包含它们是完全可选的。
您可能会在某些 EA 中看到的另一种预处理器指令是#include 指令。 包含文件由编译时将包含在项目中的函数和源代码组成,其语法为:
#include < 文件名.mqh >
您可能会看到的标准包含文件是#include stdlib.mqh,它随 MetaEditor 一起提供,并包含几个程序员可能会觉得有用的函数。
如果您想使用已在另一个文件(例如另一个 EA、库文件或 Windows dll 文件)中编译的函数,您可以使用#import 指令将这些函数直接导入到您的项目中。
大多数库文件都是使用#import 指令调用的。
使用像#include 和#import 这样的预处理器指令通常是为高级程序员保留的。 我想我会把它们贴在这里,这样当您查看使用它们的专家顾问时,您就会知道它们是什么。
我们代码的下一部分是外部变量,它们非常有用。
变量就像一个小盒子,您可以在其中存储一些东西供以后使用,尤其是数字。 这个概念是从数学中借用的(记住语句 x = 10,其中 1 的值存储在变量 x 中)。 从那时起,直到 x 的值被更改,x 的值为 10。所有对 x 的引用都被 10 的值替换。
当然,我们可以在程序的不同部分内部声明任何变量,但是将变量放在本节的此处,并在其前面加上单词 extern 可以让您能够从外部(即从 Expert)看到变量 智能交易系统的属性对话框。
外部变量是您可以放置程序的可调整参数的地方,例如您的交易设置(手数、获利和止损)和指标设置。 当您打开智能交易系统的“专家属性”对话框时,您正在查看该程序的外部变量。
请注意,我们通过在变量前添加 extern 来指定外部变量。 Extern 确保变量是外部的,也就是说,它将出现在专家属性对话框中,用户可以查看和调整。
外部 int 止损 = 150;
正如我所暗示的,变量是任何编程语言的基本存储单元,保存程序运行所需的数据。 必须声明变量,为了声明一个变量,你把三个部分放在一起:
数据类型(例如:int)、空格、标识符(例如:StopLoss)、等号、默认值(例如:150)。
数据类型指定变量保存的信息类型,例如数字、文本字符串、日期或颜色。 有关变量的更多信息,请参阅我在 MQL4 基础教程中对变量的描述。
如果你不把 extern 放在变量前面,变量仍然有效,它只是内部的,也就是说,在专家属性对话框中不可见。 在本节中声明内部和外部变量的优点是它们是全局的,这意味着它可用于程序中的任何函数。 只要程序在运行,全局变量及其值就会保留在内存中,并且可以被程序中的任何函数引用。
注意:虽然在 EA 的这一部分声明外部和内部变量是统一和方便的,但这并不是绝对必要的。 您可以在任何函数内声明任何或所有内部(但不是外部)变量。 一个小缺点是该变量将仅适用于该功能,而不是全局适用于所有功能。
init() 函数是可选的,如果您不使用它可以省略。
这是在任何其他函数之前运行的函数。
init() 函数将开始运行:
程序附加到图表后;
客户端启动后;
交易品种和/或图表周期更改后;
在 metatrader 中重新编译程序后;
从专家窗口更改输入后;
更改帐户后。
start() 函数在第一次报价时运行,但 init() 在附加后立即运行(无论传入报价如何)。 如果没有连接到服务器,它将不会运行。 在程序循环中只会被调用一次,不会被再次调用。
使用 init() 函数时,通常会放置很少的代码。 我看到放置在此函数中的最常见的代码位是帐户保护方案(将 EA 锁定到用户帐号的代码位),并锁定程序以处理特定货币对和交易时间。
我通常将自动定义点和滑点值的代码放在该区域中,如您在此处所见。
deinit()函数也是可选的,不用的可以省略。 您可能不太可能在专家顾问中需要它。
这是程序在关闭后将调用的最后一个函数,您可以在此处放置您想要的任何删除。
该函数称为:
当我们使用 MetaTrader 4 完成工作时,或当我们关闭价格图表时;
当我们在交易账户之间切换时;
当我们更改时间表的时间段时;
当我们从价格图表中删除判断时;
当我们更改 expert 的参数时;
当我们在 MetaEditor 中重新编译程序时
大多数时候我看到 deinit() 从未被使用过。
该功能是智能交易系统最重要的功能,随时执行最重要的工作。 它通常是您的大部分代码所在的位置,除非您将大部分代码放在自定义函数中,因此它值得特别注意。
它总是以:
开始(){
并且总是以
返回(0); }
在开始和结束线之间可以放置所有打开和关闭交易的条件,以及任意数量的交易程序和条件。
start() 函数在每个 tick 上运行,并将继续为接收到的每个数据 tick 调用它。 将其视为一个循环,每次价格移动时都会触发启动函数,因此我们放入启动函数的所有内容都会被类似地触发。 启动函数就像是 EA 的 Movie Director。 它调用动作并告诉演员和工作人员他们应该做什么。 它设置代码并调用所有其他函数。
我看到许多 EA 的所有代码都放在这个函数中。
如果您想要检查包含这一结构元素以及一些外部变量的全功能 EA,您可以从 MetaEditor 中打开 MACD Sample.mq4。 您可以看到 EA 将其所有内部变量、指标和进入和退出条件写入启动函数内。 除了几个明显的外部变量外,没有其他结构部分。 它可能是您见过的编写最简单的 EA 之一,这可能就是每次 MT4 下载都包含它的原因。 可能收益不高,但是写的简单明了,有利于通知程序员学习。
在接下来的几篇文章中,我们将主要关注 start() 函数中的代码,以及一些自定义函数。
您的 EA 可能使用的任何其他函数都应该在 start() 函数之后声明。
这些自定义函数可以从 start()、init() 或 deinit() 函数或从主程序调用的其他函数调用。
创建自定义函数背后的想法是创建执行特定任务的代码块,然后一旦创建,您就可以从程序的任何部分调用这些特定任务。 自定义函数因此使事情变得非常整洁和方便。
自定义函数的一些示例是:
批量功能
订单计数功能
下单功能
订单关闭功能
追踪止损功能
很多很多
我见过许多程序员使用自定义函数来驱动他们的 EA,因此 start() 函数只需要很少的代码。 他们只是将自定义函数插入到启动函数中,然后 EA 关闭并运行。
当您从其他 EA 中找到有趣的自定义函数时,您可以将它们复制并粘贴到您自己的 Ea 中,并从程序的不同部分调用它们。 您不必完全理解自定义函数中的所有代码是如何工作的,只要了解它的工作原理即可。 您可以稍后找出具体细节。
在以后的文章中,我将详细介绍一些可以在任何 EA 中快速实施的有用的自定义函数。
注意:所有自定义函数都将位于启动函数下方。 它必须低于并且不在启动函数中。 如果它进入启动函数,它将混淆 EA,尽管它可能无法正确编译。