|
先说个真事。 去年我刚接触外汇EA,在EAHub上看到各种"月收益30%""回撤不到5%"的EA,心动得不行。一口气买了5个,从200块到800块的都有,总共花了差不多三千块本金。 结果呢? 三个月时间,账户从8000亏到不到6000,亏了两万多人民币。 最气人的不是亏钱——是我根本不知道为什么会亏。EA在跑,单子在开,但每次爆仓都是事后才发现:"哦,原来那天非农数据出来EA还在加仓。" 后来我痛定思痛,决定不再买别人的黑盒EA,自己学MQL4写策略。 没想到,这条路比我想象的简单得多。 为什么你应该自己写EA三个理由: - 你知道每一行代码在干什么——不会买了EA才发现它是马丁策略
- 参数你自己定——止盈止损、仓位大小、交易时段,全部可控
- 0成本——MetaEditor是免费的,MT4自带的
今天我就带你从零写出人生第一个能自动交易的EA。不需要任何编程基础。 第一步:打开MetaEditor打开你电脑上的MT4,按键盘上的 F4,MetaEditor就弹出来了。 然后点顶部菜单:文件 → 新建 → EA交易(模板)→ 下一步。 名字填 MyFirstEA,点完成。系统会自动生成一个EA模板,代码大概长这样: //+------------------------------------------------------------------+//| MyFirstEA.mq4 |//| 郭教授 |//| https://eaceping.com |#property copyright "郭教授"#property link "https://eaceping.com"#property version "1.00"#property strict//| Expert initialization function |int OnInit() {//--- 创建EA时执行一次 return(INIT_SUCCEEDED); }//| Expert deinitialization function |void OnDeinit(const int reason) {//--- 移除EA时执行一次 }//| Expert tick function |void OnTick() {//--- 每次价格变动都执行(重要!) }
别被这些英文吓到,我逐行解释: - OnInit() → EA刚挂上图表时跑一次(初始化)
- OnDeinit() → EA从图表上移除时跑一次(清理)
- OnTick() → 核心! 价格每跳动一下就跑一次,你的策略逻辑全写在这里
你只需要在 OnTick() 里面写策略就行了。 第二步:理解你的第一个策略在写代码之前,先把策略说清楚——代码只是把人的想法翻译给电脑: 当短期均线(5周期)从下方上穿长期均线(20周期)时,做多一单;当短期均线下穿长期均线时,平掉多单。
这就是经典的均线金叉策略,也是全球无数量化交易者的入门第一课。 第三步:写代码(30行搞定)把下面这段代码完整替换 OnTick() 函数里的大括号内容: void OnTick() { //--- 1. 计算两条均线的值 double maFast_0 = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 0); // 5均线,当前K线 double maSlow_0 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0); // 20均线,当前K线 double maFast_1 = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 1); // 5均线,前一根K线 double maSlow_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1); // 20均线,前一根K线 //--- 2. 判断有没有持仓 bool hasBuy = false; // 默认没有多单 for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderType() == OP_BUY) { hasBuy = true; // 找到了一个多单 break; } } } //--- 3. 金叉出现 + 没有持仓 → 开多单 if(maFast_1 <= maSlow_1 && maFast_0 > maSlow_0 && !hasBuy) { double stopLoss = Ask - 500 * Point; // 止损500点 double takeProfit = Ask + 1000 * Point; // 止盈1000点 int ticket = OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, stopLoss, takeProfit, "金叉开多", 777, 0, clrGreen); } //--- 4. 死叉出现 + 有多单 → 平仓 if(maFast_1 >= maSlow_1 && maFast_0 < maSlow_0 && hasBuy) { for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderType() == OP_BUY) { OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrRed); } } } } }
代码逐行拆解(配合上面数字标注的4个步骤看): 第1步:计算均线值- iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 0) →
- NULL 当前图表品种(不用改)
- 0 当前时间周期(不用改)
- 5 均线周期——改这里就能调整快慢均线
- MODE_SMA 简单移动平均
- PRICE_CLOSE 用收盘价计算
- 0 当前K线(1=前一根K线)
- 我们算了两次:当前K线和前一根K线,用来判断"金叉"(交叉发生的瞬间)
第2步:判断有没有持仓- OrdersTotal() 总订单数
- OrderSelect() 选出某一单
- OrderType() == OP_BUY 判断是不是多单
- 如果已经有单了就不重复开
第3步:金叉开多- maFast_1 <= maSlow_1 前一根K线快线在慢线下方(或交叉)
- maFast_0 > maSlow_0 当前K线快线跑到慢线上方了 = 金叉!
- OrderSend() 下多单:0.01手、止损500点、止盈1000点
第4步:死叉平仓- maFast_1 >= maSlow_1 前一根快线在上方
- maFast_0 < maSlow_0 当前快线跑到下方了 = 死叉!
- OrderClose() 平掉多单
第四步:回测看看效果代码写好后,按 F7 编译。如果左下角没有报错,恭喜你——你的第一个EA已经可以跑了。 在MT4里按 Ctrl+R 打开策略测试,选你的 MyFirstEA,品种选EURUSD、周期选H1,点开始。 等测试跑完,你就能看到这个EA到底能不能赚钱了。 你可以自己改的三个参数[td]
| 参数 | 在哪里改 | 作用 | 快均线周期 | 代码里的 5 | 金叉灵敏度:越小越敏感 | 慢均线周期 | 代码里的 20 | 趋势判断:越大越稳定 | 止损止盈 | 代码里的 500 / 1000 | 风险控制 |
写在最后这只是一个最基础的入门策略,实盘大概率赚不到钱。但它的意义在于——从这一刻开始,你不再是一个只会花钱买EA的人,你开始理解EA背后的逻辑了。 我最初写这个策略的时候,EURUSD H1回测结果是亏损的。然后我开始调整参数、加过滤条件、换品种测试,慢慢地账户曲线开始往上走了。 那种感觉,比买到一个赚钱的EA爽一百倍。
你买过几个EA?现在还活着的还有几个?评论区聊聊,我帮你分析问题出在哪。
下一篇预告:如何用MT5回测数据判断一个EA是马丁策略——1分钟教你看穿黑盒EA的把戏 |