EA 生成器快速入门

简介

EA 生成器是一个帮助不懂编程的人快速构建自己的 EA 系统的工具,内置了一些基本指标,能够自动生成可编译的 MQL4 源文件。它只能实现一些简单的逻辑,复杂的算法仍需手工编写代码。

它的正式名字是“Visual EA”,但本文档多使用“EA 生成器”这个名字以便中文阅读。

注意

如果你有编程经验,需格外注意价格是怎么排序的

基本概念

MT4 还是 MQL4

MT4 是软件的名字,它使用一种叫 MQL4 的语言来提供指标和 EA 开发的功能。

MQL4 源码文件的后缀为 .mq4,需要编译成后缀为 .ex4 的执行文件才能由 MT4 执行。

EA 生成器能够生成 .mq4 源码文件,你需要将其编译一次,之后就可以使用了。

什么是变量

跟数学里的 x 一样,如果你赋值 x = 1,那么 x 就是一个变量。通常用一个单词来命名变量,比如 age = 5,然后在程序中其他地方,你可以用 age 来代替 5,并可以随时改变 age 的值来达到存储各种数据的目的。

在 EA 生成器中,变量只用于定义参数

什么是数据类型

MQL4 所有的变量必须明确指定类型,我们主要使用 2 个数字类型,整数和小数是不同的两种数据类型:整数型(int)和小数型(double),虽然多数时候程序可以自动转换,但你需要明确两种数字是不一样的,这在编程的排错中很有用。

int

常用的整数类型,范围:-2147483647 到 2147483648。

除了 int 型,还有 long 型,它可以表示比 int 范围更大的整数,但通常 int 就可以满足需求。

double

一个范围非常大的小数,类似整数的 long 型。另一个常用的是 float 型小数,为了方便,常用 double 型。

boolean

布尔型,用于逻辑判断,其他语言中也可能用缩写 bool 表示,它只有两个值:True(真)和 False(假),但除了 bool 型,也可以用整数和小数的 0 表示“假”,其他数字(包括负数)都是“真”。

string

字符串型,通常在 EA 生成器里用不到,用引号包裹的一段字符就是字符串,一个空字符串 '' 在逻辑上是 False。

什么是数组

同样类型的多个连在一起的变量称之为“数组”,通常写作:

array_name[index]

其中 index 是需要取值的序号。MQL4 用数组来存储价格。在程序中它类似这样存储:

price[] = [1.1, 1.2, 1.5, 1.7, 1.3, 1.5, ...]

当你想取第三个数字(1.5)时,调用 price[3]。

价格是怎么排序的

MQL4 使用数组保存价格,图表中的 K 线编号是从当前时间往回数的,比如你开启了 H1 的图表,price[1] 表示第一根 K 线也就是当前的价格,price[2] 表示第二个根 K 线(上一个小时)的价格,以此类推。

注解

在编程的时候,数组是从 0 号开始排序的,所以第 3 个价格应当调用 price[2],但由于无编程经验的人在这里总是会出错,所以 EA 生成器从数字 1 开始处理索引,你只需要想“我需要第几根 K 线的价格”,就是对应的 index

如何定义输入参数

MT4 的指标或 EA,通过定义(也叫“声明”)一个特殊的变量(实际上是一个常量)来实现“程序入口参数”的传入,当你打开一个 EA 时,通常需要先输入几个参数,对应到程序中就是一些变量。

在 EA 生成器中会自动帮你处理定义的问题,你只需要在任意地方插入 参数 模块,它会自动为你声明一个变量,但你可能需要看一下下面实例中的参数的注意事项

技巧

定义参数时,参数名就是一个变量名,EA 生成器会自动帮你处理字符的问题,所以你可以使用中文词汇来命名参数。

注解

当前版本只支持 int 型的输入参数。

什么是逻辑判断

通过比较一组或几组表达式的 boolean 值,来决定执行哪一段代码。你可能会用到:

如果 A
    执行 甲
否则如果 B
    执行 乙
否则如果 C
    执行 丙
否则
    执行 丁

如果 D
    执行 戊

其中 只可能执行其中一个,因为 A B C 和随后的 否则 不可能同时为 。接下来 是否执行只跟 D 有关,跟前面的 A B C 没有关系。

一个逻辑段中至少有一个 如果,最多有一个 否则否则如果 不限制个数。

更多的时候你会组合各种逻辑:

如果 满足 A 并且 B
    执行 甲
否则如果 B
    执行 乙

如果 B
    执行 丙

这时候如果执行了 就一定不会执行 ,但一定会执行

更复杂的逻辑关系运算你可能需要搜些资料复习一下,尤其是嵌套的时候容易出错。这是高中数学里的,但分数比重小,很多人甚至不记得自己学过。

什么时候进行逻辑判断

价格的每一次跳动,都会完整地判断一遍你 EA 中所有的逻辑,并执行相应的模块。

好了,这就是全部基本概念了。

准备

注册一个账号,用来保存生成的 EA。

几个小技巧

  1. 如果有重复的逻辑,右键单击模块可以复制。
  2. 如果模块组太大,右键可以折叠它们,不影响生成代码。
  3. 右键 禁用块 可以保留模块,但不生成相应代码。

第一个例子

生成器的模块大多是用中文命名的,鼠标悬停在模块上一般会有一个简短的说明,尽量做到“开箱即用”。

如果你是初次编写自己的 EA,建议你按下面的步骤开始。

确定程序逻辑

我们来实现一个简单的金叉建仓,死叉平仓的系统,使用移动平均线(MA)。

  1. 确定使用两个周期的指标,MA_10MA_20

  2. 确定是否需要入口参数。

    需要,因为我可能还想能测试一下 MA_15MA_30 并且不用重新编写一遍 EA,通过入口参数,我能动态地调整周期的各种组合。

  3. 理清程序逻辑

    只有当 MA_10 从下向上穿过 MA_20 的那一刻才是金叉,所以判断条件应该是:

    MA_10[2] <= MA_20[2]
    
    并且
    
    MA_10[1] > MA_20[1]
    

    同理死叉就是:

    MA_10[2] >= MA_20[2]
    
    并且
    
    MA_10[1] < MA_20[1]
    

    技巧

    其中一个条件要包含“等于”,避免漏掉刚好两条均线值相等的情况。

    如果你只想在每个整时刻收盘之后才判断怎么办?你可以“往前挪一步”。什么意思?思考这个公式:

    MA_10[3] <= MA_20[3] 并且 MA_10[2] > MA_20[2]
    

开始编写

做多:

  1. 选取指标和设定参数。
  2. 比较数值。
  3. 金叉时计算止损并建仓。
  4. 死叉时平仓。

做空:

  1. 与金叉相同的指标和参数。
  2. 反向比较数值。
  3. 死叉时计算止损并建仓。
  4. 金叉时平仓。

编写的过程省略,如果模块面积太大你可以折叠它们。

下载、编译和回测

不会编译请看这篇:怎么编译 MT4 EA 源码

永远不要直接使用自己编写的 EA 到实盘中,你应该尽可能通过各种周期、品种、参数组合来回测自己的 EA,确认不会出现自己没有预料到的结果后再使用。

这个 EA 生成器可以帮助不会编程的人生成一个简单的 EA 系统去验证自己的想法,它可以让你体会一点编程的乐趣,但无法把你变成程序员,你要时刻警惕,即使经验丰富的人也会写出错误的逻辑。

参数的注意事项

建仓参数

止损和止盈的值,是基于价格计算的,而非点数。比如“高于现价 10 点”,你应当使用 现价 + 0.00010现价 + 10 * 图表基点 来设置。

订单标记用来确认不会重复下单,通常你不需要修改它,除非你需要添加加仓的功能。

注解

待补充:加仓教程。

程序参数
生成器会自动提取你用到的参数作为程序的输入参数,你可以通过设置相同的名字来在多个地方使用同一个参数,但当你多次使用不同默认值的参数时,你应该为参数设置不同的名字,因为在同一时刻,同一个参数只能有一个值。在本例中,我们设置了 均线 1均线 2止损点数。当然你可以设置成其他的参数名。

注解

现在你可以先尝试自己去编写这个 EA,再回来对比和教程的有什么区别。

EA 截图

提示

此图是开发期间截的,可能和实际样式有些许差异。

/upload/image/2018/03/03/287219261351710465-lg.jpeg

下一步

对 EA 进行回测;编写你自己的其他 EA。

  • 2456

我按你这例子编出来还是不下单,到底哪里的问题?

白杉 回复 #1

现在的前两根K线收盘价的值怎么用EA生成器实现? 也没有STO指标

白杉 回复 #3

“取值”分类里有“收盘价”的模块,下标填 0 就是现价,填 1 是前 1 根,即倒数第二根,以此类推。

内置指标只有两个没做,Stochastic Oscillator 和 Williams' Percent Range,还让你给赶上了,我看看下个月有没有时间补一下吧。

谢谢,历害,哈哈,学着编吧

接触两天,昨天成功用这个编出来个EA,基本实现了我的想法,虽然结果亏损,呵呵,这个系统不错,支持下作者哈。
不过功能有点少,教程有点简单,望作者有空增加上,顶一个。 另问个问题,我想弄个辅助报警EA,帮助盯盘,但是在系统中没有找到报警这个操作功能,求指点
白杉 回复 #6

报警没有,只做了基本的指标比较和建仓平仓,需要其他功能只能手写源码了。

我之前在另一帖解释过:

功能强大和复杂性正相关,太复杂了不仅我开发费事,而且使用上也不如手写方便了,我做的生成器最适合给零基础的人体验一下怎么实现一个小 EA,想要进阶肯定是要学一下编程的。

你可以参考一下此帖 3 楼的回复:能讲解一下几个用词的意思

回复内容较长可以拖右下角↑
回到
顶部