MetaTrader平台的MQL语言体系中有三类可执行程序,它们各有职责、互不替代:
| 维度 | 自定义指标 (Indicator) | 智能交易 (EA) | 脚本 (Script) |
|---|---|---|---|
| 文件后缀 | .mq4 / .mq5 | .mq4 / .mq5 | .mq4 / .mq5 |
| 编译后缀 | .ex4 / .ex5 | .ex4 / .ex5 | .ex4 / .ex5 |
| 核心功能 | 在图表上绘制可视化信号(箭头、线段、直方图等) | 根据逻辑自动开仓、平仓、修改订单 | 执行一次性任务后自动退出 |
| 能否下单 | ❌ 不能 | ✅ 可以 | ✅ 可以 |
| 运行方式 | 持续运行,每个Tick/K线刷新 | 持续运行,每个Tick触发OnTick() | 执行一次后自动卸载 |
| 每图表限制 | 可挂载多个 | 仅能挂1个 | 仅能挂1个 |
| 典型用途 | MACD、RSI变体、自定义信号箭头 | 网格交易、趋势跟踪、马丁格尔 | 一键全部平仓、批量修改止损、导出数据 |
| 安装目录 | MQL4(5)/Indicators/ | MQL4(5)/Experts/ | MQL4(5)/Scripts/ |
指标是纯视觉工具,它通过数学运算将价格/成交量数据转化为图表上的可视化元素(线条、箭头、柱状图、色块等),帮助交易者识别市场状态。指标不能自动下单,但可以发出弹窗/声音/推送报警。
indicator_plots,使用 SetIndexBuffer(idx, buf, INDICATOR_DATA) 三参数形式,内置指标通过句柄 (handle) 访问而非直接函数调用,且缓冲区索引方向为正序(0=最旧)而非MT4的倒序。
| 绘制模式 | 效果 | 典型应用 |
|---|---|---|
DRAW_LINE | 连续折线 | 均线、布林带中轨 |
DRAW_HISTOGRAM | 零轴柱状图 | MACD柱、成交量 |
DRAW_ARROW | 独立箭头/符号 | 买卖信号标记 |
DRAW_SECTION | 折线连接(跳过空值) | ZigZag指标 |
DRAW_NONE | 不绘制(仅数据输出) | 给EA提供数据 |
DRAW_FILLING MT5 | 两线间填色 | 一目均衡表云层 |
DRAW_COLOR_LINE MT5 | 逐段变色线 | 趋势颜色线 |
DRAW_CANDLES MT5 | 自定义蜡烛 | 平均K线(Heikin Ashi) |
EA是自动交易机器人。它可以独立监控市场、判断条件、自动下单、管理仓位、设置止损止盈——完全不需要人工干预。EA是MQL体系中唯一能持续自动交易的组件。
OnTick() 是EA的心脏——每次价格变动都会触发一次。你的全部交易逻辑都写在这个函数里。
OrderSend() 一个函数搞定一切;MT5用 CTrade 交易类(或 OrderSend(MqlTradeRequest) 结构体)。MT5区分挂单(pending orders)和持仓(positions)——这是最大的迁移陷阱。脚本是一次性执行的程序——拖到图表上 → 运行 → 完成任务 → 自动退出。不会像指标和EA那样持续运行。最常见的用途是"一键全平"、"批量修改止损"、"导出交易记录"等应急/批量操作。
Ctrl+Shift+X,实现紧急一键清仓。.mq4/.mq5 文件复制到对应目录。MT4: MQL4/Indicators/;MT5: MQL5/Indicators/。可通过 文件 → 打开数据文件夹 快速定位。0 errors。编译成功后会生成 .ex4/.ex5 文件。MQL4/Experts/(或MQL5/Experts/),在MetaEditor中编译(F7)。Ctrl+R 或菜单 查看 → 策略测试器。| 指标 | 含义 | 合格标准 |
|---|---|---|
| Total Net Profit | 净利润 | > 0(基本要求) |
| Profit Factor | 盈亏比 = 总盈利/总亏损 | > 1.5 为良好 |
| Max Drawdown | 最大回撤(峰值到谷值的最大跌幅) | < 20% 为可控 |
| Total Trades | 总交易次数 | > 100 才有统计意义 |
| Win Rate | 胜率 | 取决于盈亏比(低胜率+高盈亏比也可盈利) |
| Expected Payoff | 每笔交易的期望收益 | > 0 且 > 点差成本 |
| Sharpe Ratio MT5 | 风险调整后收益 | > 1.0 为优秀 |
| 功能 | MT4 (MQL4) | MT5 (MQL5) |
|---|---|---|
| 下单 | OrderSend(...) |
CTrade::Buy() / Sell()或 OrderSend(MqlTradeRequest) |
| 遍历持仓 | OrdersTotal() + OrderSelect() |
PositionsTotal() + PositionGetTicket() |
| 遍历挂单 | 同上(OrderType()>OP_SELL) | OrdersTotal() + OrderGetTicket() |
| 内置指标调用 | iMA(sym,tf,period,...,shift) 直接返回值 |
int h = iMA(...) 返回句柄+ CopyBuffer(h,...) 获取值 |
| 价格数据 | Open[], Close[], High[], Low[] 全局数组(倒序,0=当前) |
OnCalculate()参数传入(正序,0=最旧) |
| 获取Ask/Bid | Ask, Bid 全局变量 |
SymbolInfoDouble(_Symbol, SYMBOL_ASK/BID) |
| 指标缓冲区 | SetIndexBuffer(idx, buf) |
SetIndexBuffer(idx, buf, INDICATOR_DATA) |
| plots声明 | 不需要 | #property indicator_plots N 必须声明 |
| 对冲 | 天然支持(同品种可多空同时持仓) | 需开启Hedging账户模式(非默认的Netting) |
| 策略测试器 | 单线程,单品种 | 多线程,多品种,真实Tick,云优化 |
| # | 错误 | 后果 | 正确做法 |
|---|---|---|---|
| 1 | 忘记开AutoTrading开关 | EA静默不下单 | 每次开机第一件事:检查绿色按钮 |
| 2 | 正序遍历订单并平仓 | 跳过一半订单 | 始终倒序遍历:for(i=Total-1; i>=0; i--) |
| 3 | 不用MagicNumber | EA误操作其他EA的订单 | 每个EA分配唯一的MagicNumber |
| 4 | 在指标中调用OrderSend | 编译报错或崩溃 | 指标只能画图和报警,下单逻辑写在EA中 |
| 5 | MT5用MT4语法下单 | 编译失败 | MT5必须用CTrade类或MqlTradeRequest结构 |
| 6 | 不检查OrderSend返回值 | 下单失败无感知 | 始终检查返回值并记录GetLastError() |
| 7 | 回测用"仅开盘价"模式测试剥头皮EA | 回测结果严重失真 | 剥头皮策略必须用"每个Tick"模式 |
| 8 | 在OnCalculate()中用Sleep() | 界面冻结 | 指标中禁止用Sleep/MessageBox等阻塞函数 |
| 9 | 不释放MT5指标句柄 | 内存泄漏 | OnDeinit()中调用IndicatorRelease(handle) |
| 10 | 直接在实盘跑未经回测的EA | 资金灾难 | 先回测 → 再模拟盘 → 最后小资金实盘 |