简介¶
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,建议你按下面的步骤开始。
确定程序逻辑¶
我们来实现一个简单的金叉建仓,死叉平仓的系统,使用移动平均线(MA)。
确定使用两个周期的指标,MA_10 和 MA_20。
- 确定是否需要入口参数。
需要,因为我可能还想能测试一下 MA_15 和 MA_30 并且不用重新编写一遍 EA,通过入口参数,我能动态地调整周期的各种组合。
- 理清程序逻辑
只有当 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]
开始编写¶
做多:
- 选取指标和设定参数。
- 比较数值。
- 金叉时计算止损并建仓。
- 死叉时平仓。
做空:
- 与金叉相同的指标和参数。
- 反向比较数值。
- 死叉时计算止损并建仓。
- 金叉时平仓。
编写的过程省略,如果模块面积太大你可以折叠它们。
下载、编译和回测¶
不会编译请看这篇:怎么编译 MT4 EA 源码
永远不要直接使用自己编写的 EA 到实盘中,你应该尽可能通过各种周期、品种、参数组合来回测自己的 EA,确认不会出现自己没有预料到的结果后再使用。
这个 EA 生成器可以帮助不会编程的人生成一个简单的 EA 系统去验证自己的想法,它可以让你体会一点编程的乐趣,但无法把你变成程序员,你要时刻警惕,即使经验丰富的人也会写出错误的逻辑。
参数的注意事项¶
- 建仓参数
止损和止盈的值,是基于价格计算的,而非点数。比如“高于现价 10 点”,你应当使用 现价 + 0.00010 或 现价 + 10 * 图表基点 来设置。
订单标记用来确认不会重复下单,通常你不需要修改它,除非你需要添加加仓的功能。
注解
待补充:加仓教程。
- 程序参数
- 生成器会自动提取你用到的参数作为程序的输入参数,你可以通过设置相同的名字来在多个地方使用同一个参数,但当你多次使用不同默认值的参数时,你应该为参数设置不同的名字,因为在同一时刻,同一个参数只能有一个值。在本例中,我们设置了 均线 1、均线 2 和 止损点数。当然你可以设置成其他的参数名。
注解
现在你可以先尝试自己去编写这个 EA,再回来对比和教程的有什么区别。
下一步¶
对 EA 进行回测;编写你自己的其他 EA。
我按你这例子编出来还是不下单,到底哪里的问题?
看这里:代码怎么不分段?
现在的前两根K线收盘价的值怎么用EA生成器实现? 也没有STO指标
“取值”分类里有“收盘价”的模块,下标填 0 就是现价,填 1 是前 1 根,即倒数第二根,以此类推。
内置指标只有两个没做,Stochastic Oscillator 和 Williams' Percent Range,还让你给赶上了,我看看下个月有没有时间补一下吧。
谢谢,历害,哈哈,学着编吧
报警没有,只做了基本的指标比较和建仓平仓,需要其他功能只能手写源码了。
我之前在另一帖解释过:
你可以参考一下此帖 3 楼的回复:能讲解一下几个用词的意思
我也不能生成有效的EA
如果 MT4 没有报错,那就检查自己的 EA 逻辑,有报错的话发上来我看看,至少目前还没有发现过由生成器造成的 Bug。
能帮我看一下有没有错误,下单条件是在5分钟K线,前3根k线高于10均线
没法发截图,请版主看看我站内的mq4文件,谢谢!!!
你用的 5 周期均线,而且我不知道你是否确定要用 3 根 K 线的“最低价”高于均线。
谢谢白杉,想请问:是否能实现跨周期?布林通道的周期是否可以设置?
你好,SMA和CCI结合的EA如何编写?
有视频教程吗?
新人来冒个泡,向各位前辈学习!
怎么设置移动止损
请问一下能不能设置多种条件开单?应该如何设置?
请问一下MACD大于零轴或者小于零轴如何表达?还有RSI大于50或小于50
为什么我转到软件编译没有问题,但是就是没有测试按钮是怎么会事?