从零写第一个 EA:MA+ADX 分步指南
用 MA+ADX 范例,从向导建壳到测试器跑通第一个 EA
本文用 MA-8 趋势 + ADX 过滤做范例:先人工定义买卖条件,再逐步代码化,适合零基础。
一、先定策略,再写代码
别一上来就抠语法。先把“什么时候买、什么时候卖”用自然语言写清楚,再翻译成代码,效率最高。
二、用向导搭骨架
- Ctrl+N → 选 Expert Advisor → 填名称/作者;
- 生成 OnInit/OnDeinit/OnTick 骨架;
- 用 input 暴露止损、获利、周期等可调参数。
三、初始化与反初始化
OnInit 里取指标句柄(iMA、iADX)、按 _Digits 调整止损止盈点数;OnDeinit 用 IndicatorRelease 释放句柄,避免泄漏。
四、OnTick 核心逻辑
- 柱数 < 60 退出;
- 比对新柱;
- CopyBuffer 取 ADX/MA 值到数组;
- PositionSelect 查有无同方向仓;
- 5 位数品种止损乘 10,用 NormalizeDouble 标准化。
五、买卖条件
- 买入:MA 递增(0>1>2) 且前收 > MA 且 ADX > 22 且 +DI > -DI;
- 卖出:对称;
- 仅新柱检查、同方向无仓才开,一次一仓。
六、调试与测试
MetaEditor 设断点(F9)单步(F10/F11)监视变量;Strategy Tester(Ctrl+R)选品种/周期/日期,看图形与报表;可调周期、止损再优化。
七、ADX 阈值怎么调
ADX 衡量趋势强度而非方向:经验上 ADX<20 视为震荡、>25 视为有趋势,参数常用 14。别把 ADX 当买卖信号,它只回答「现在适不适合用趋势策略」;震荡市就切到均值回归或空仓,避免被双 MA 来回打脸。
八、信号逻辑:MA 交叉加 ADX 过滤
第一个 EA 用「快线穿慢线」做方向,再用 ADX 过滤「趋势够不够强」:ADX 低于阈值说明震荡市,交叉多是假信号,直接不开仓。这样把「什么时候交易」和「交易什么方向」拆成两层判断。
阈值别拍脑袋:ADX 用 20 还是 25,要看历史里哪种更能躲开震荡亏损。第一版宁严勿松,先保证少亏,再逐步放开。 一个省事的做法是按品种波动率动态设阈值:波动大的品种用更高的 ADX 门槛,过滤掉更多假突破;波动小的品种适当放低,避免长期空仓。
九、下单与手数计算
信号确认后用 CTrade 下单,手数不要写死,而是按账户净值与止损距离反推(风险百分比法),账户缩水自动减仓。这是新手最容易忽略、却最能保命的一环。
#include <Trade/Trade.mqh>
CTrade trade;
void OnTick()
{
if(CrossOver() && ADX() > 20)
trade.Buy(RiskLot(), _Symbol); // 风险百分比定手数
}
十、回测验证清单
上线前至少跑三年历史,看期望收益、最大回撤、盈利因子;再切一段没参与优化的样本外数据重跑,确认不是过拟合。两者都过关才敢用极小仓(0.01 手)上模拟盘。 三年里最好覆盖至少一次趋势市和一次震荡市,单看一段行情容易高估策略;若只在暴涨段回测漂亮,震荡段一上来就亏,那策略并不可靠。
清单逐条核对:信号是否去重(不会每 tick 都开)、止损是否真的挂上、部分成交是否处理。把这些写成检查项,比事后 debug 省十倍时间。 顺便把每次「想开仓却被风控拦下」的原因记进日志,跑一段时间你就知道自己的信号到底卡在哪类行情,反向优化信号比盲调参数有效。