如何利用 MQL5 创建简单的多币种智能交易系统(第 2 部分):指标信号:多时间帧抛物线 SAR 指标(基础篇)
◍ 用 MQL5 拼一个跨周期 SAR 信号
多币种 EA 里最忌讳的就是每个品种各自算指标,浪费资源还难统一逻辑。MQL5 允许在某一品种上直接取另一时间帧的 iSAR 句柄,主图用 M15、信号参考 H1 的抛物线转向,就能让多币种共用同一套 SAR 判定。 实盘里 H1 的 SAR 点阵翻转往往比 M15 滞后但噪音少。若 M15 价格已跌破 M15 SAR、而 H1 SAR 仍在上轨,这种「小周期先动、大周期未确认」的组合,常出现在贵金属与欧元交叉盘的假突破前段,外汇与贵金属杠杆高,此类信号需结合仓位上限使用。 创建句柄时把时间帧参数显式传入,而不是依赖 Terminal 当前图表周期,否则回测切换品种会取到错误帧。下面这段是取 H1 SAR 句柄的最小写法,period 用 PERIOD_H1 写死即可。
class="type">int sarHandle = iSAR(_Symbol, PERIOD_H1, class="num">0.02, class="num">0.2); if(sarHandle == INVALID_HANDLE) { Print("SAR handle failed"); class="kw">return; }
「一套机器人同时扫 30 个货币对」
多币种智能交易系统在这里的定义很直接:挂在某一个品种图表上,却能对该图表以外的多个品种对执行开仓、平仓和订单管理(比如尾随止损、止盈)。本文实现的版本会同时交易 30 个货币对,而不是只盯当前图表那个标的。 信号源只用一个指标:抛物线 SAR(iSAR)。但它不是单周期取值,而是跨 PERIOD_M15 到 PERIOD_D1 多个时间帧共同给出信号,再汇总成交易决策。这种多时间帧叠加能过滤掉一部分单周期噪音,但具体过滤效果需要在 MT5 策略测试器里跑过才知道。 MT5 终端和策略测试器本身就原生支持多币种回测与实盘,这是 MQL5 提供的底层能力,不需要自己造轮子。对外汇和贵金属来说,30 个对同时持仓意味着保证金占用和滑点风险会被放大,实盘前务必在测试器里把杠杆和品种流动性参数调真实。
多币种覆盖与五周期 SAR 信号架构
这套 EA 的设计底色是跨品种铺开:外汇端列了 28 个常见直盘与交叉盘,再叠加 XAUUSD、XAGUSD 两个贵金属对,合计 30 个可交易符号。要注意经纪商若在品种名前后加前缀后缀(如 m. EURUSD),EA 不会识别,实盘前先在品种列表里核对一遍。 信号层只用 iSAR 一个指标,但拉了 M15、M30、H1、H4、D1 五个周期并行。EA 自身不绑定图表周期,你把它挂在 M1 或 MN1 上都能跑,底层永远按那五个 SAR 周期算信号。 开仓逻辑是五周期投票:五个 iSAR 全部给出上行(PRICE_LOW[0] > iSAR[0])才做多,全部下行(PRICE_HIGH[0] < iSAR[0])才做空。平仓分两层——盈利单若 M15 的 SAR 信号转弱就先撤;尾随止损和止盈则交给 H1 的 iSAR。外汇与贵金属杠杆高、跳空频繁,这种多品种共振信号也只提高概率,不消除隔夜风险。
◍ 多币种EA的止损止盈与尾随逻辑
这套多币种智能交易系统在订单管理上把止损、止盈、尾随拆成了三层开关。每层都能选「系统自动算」还是「人工给点数」,给了手动派和自动派各自的操作空间。 止损如果选「不使用」,EA不会直接扔掉风控,而是持续回检信号:持仓仍盈利且信号疲软就平单落袋,信号反向则砍亏损仓。选「使用」后,自动计算交给系统,手动模式则必须填点数止损值。 止盈逻辑同构:关掉就开单不带 TP;开启后自动算或自填点数二选一。 尾随止损/止盈是一个总开关。选「否」就完全不跟;选「是」且「自动尾随」开启时,止损锚定 H1 周期抛物线 SAR,止盈按变量 TPmin 跟进——两者同时生效。关掉自动尾随,就用输入参数里的固定值跑尾随。外汇与贵金属杠杆高,这类自动平仓逻辑在滑点行情中可能失效,开 MT5 前先核对输入项。
「给多币种EA加手动按钮才顺手」
多币种智能交易系统跑 30 个货币对时,纯靠输入参数很难应对盘中突变。原文设计在面板里放几个手动单击按钮,把订单管理从「改参数重加载」降级成「点一下」。 当输入参数里「使用订单止损」和/或「使用订单止盈」设为否,但盘中你改变主意,点「设置止损/止盈所有订单」按钮,EA 会批量修改全部持仓,把止损/止盈补上。类似地,「所有订单平仓」一键清仓,「所有盈利订单平仓」只挑浮盈持仓平掉,省去逐个右键的麻烦。 只在单一品种图表上交易 30 对时,若面板再给每个品种一个切换图表按钮,交易者点一下就能跳到对应品种窗口,不用手动在 MT5 市场报价里翻找。外汇与贵金属杠杆高、滑点跳空频繁,手动按钮只是提高效率,不降低仓位风险。
把多币种逻辑落进 EA 骨架
多币种 EA 的架子先从头文件与输入组说起。引入 Trade.mqh 等四个标准库后,用 CTrade、CSymbolInfo、CPositionInfo、CAccountInfo 四个对象统一接管下单、品种点值、持仓查询和账户权益,避免在跳价函数里反复 new。 YN 枚举只装 No/Yes 两个值,专门给星期开关做输入项;mmt 枚举区分 FixedLot 与 DynamLot,决定手数走固定还是按权益百分比动态。输入组里 Risk 默认 10.0,注释写明单笔权益风险下限 1.0% 上限 10.0%,Lots 默认 0.01 仅固定模式生效。 OnInit 里第一个要调的是 FXSAR_MTF_MCEA_Config(),它负责把要跑的品种、指标句柄和关键配置一次性挂好;之后 OnTick 只调 ExpertActionTrade(),开平仓、尾随止损止盈全塞进这个函数里跑。 星期开关默认周日周六为 No、周一到周五为 Yes,实盘前建议按自己盯盘时段改,贵金属与外汇品种跳空大,周末单风险可能偏高。
class="macro">#include <Trade\Trade.mqh> class="macro">#include <Trade\PositionInfo.mqh> class="macro">#include <Trade\SymbolInfo.mqh> class="macro">#include <Trade\AccountInfo.mqh> class=class="str">"cmt">//-- CTrade mc_trade; CSymbolInfo mc_symbol; CPositionInfo mc_position; CAccountInfo mc_account; class=class="str">"cmt">//--- enum YN { No, Yes }; class=class="str">"cmt">//-- enum mmt { FixedLot, class=class="str">"cmt">// Fixed Lot Size DynamLot class=class="str">"cmt">// Dynamic Lot Size }; class=class="str">"cmt">//-- class=class="str">"cmt">//--- class="kw">input group "=== Money Management Lot Size Parameter ==="; class=class="str">"cmt">// Money Management Lot Size Parameter class="kw">input mmt mmlot = DynamLot; class=class="str">"cmt">// Money Management Type class="kw">input class="type">class="kw">double Risk = class="num">10.0; class=class="str">"cmt">// Percent Equity Risk per Trade(Min=class="num">1.0% / Max=class="num">10.0%) class="kw">input class="type">class="kw">double Lots = class="num">0.01; class=class="str">"cmt">// Input Manual Lot Size FixedLot class=class="str">"cmt">//--Day Trading On/Off class="kw">input group "=== Day Trading On/Off ==="; class=class="str">"cmt">// Day Trading On/Off class="kw">input YN ttd0 = No; class=class="str">"cmt">// Select Trading on Sunday(Yes) or(No) class="kw">input YN ttd1 = Yes; class=class="str">"cmt">// Select Trading on Monday(Yes) or(No) class="kw">input YN ttd2 = Yes; class=class="str">"cmt">// Select Trading on Tuesday(Yes) or(No) class="kw">input YN ttd3 = Yes; class=class="str">"cmt">// Select Trading on Wednesday(Yes) or(No) class="kw">input YN ttd4 = Yes; class=class="str">"cmt">// Select Trading on Thursday(Yes) or(No) class="kw">input YN ttd5 = Yes; class=class="str">"cmt">// Select Trading on Friday(Yes) or(No) class="kw">input YN ttd6 = No; class=class="str">"cmt">// Select Trading on Saturday(Yes) or(No) class=class="str">"cmt">//--Trade & Order management Parameter