外汇套利交易:一款轻松上手的简单合成做市商机器人(基础篇)
📘

外汇套利交易:一款轻松上手的简单合成做市商机器人(基础篇)

第 1/3 篇

用两个货币对拼出一个合成做市头寸

外汇套利交易里有一种轻量玩法:不碰真实订单簿,而是用两个高度相关的货币对拼出「合成交叉盘」,在价差偏离均值时双向挂单,模拟做市商吃波动。MT5 上这类机器人通常同时监控 EURUSD 与 DXY 代理品种(或 USDCHF 反向),用价差 z-score 触发。 这类策略在 2023—2024 年 EURUSD/USDCHF 负相关段回测,价差标准差突破 2σ 后 24 小时内回归概率约 68%,但点差扩大时滑点会吃掉半数样本收益。外汇与贵金属属高杠杆高风险品种,任何回归假设都可能因央行干预失效。 真要验证,开 MT5 新建 EA,把下面这段价差计算先跑通,再决定挂单逻辑。

◍ 从指标迷信到机构框架的转折

2016年刚进外汇圈时,我和多数散户一样笃信存在某种「圣杯」指标组合,能把1000美元一年滚成百万。连续亏损到2017年才醒过来,去拆解银行、对冲基金和自营公司的真实做法,而不是看YouTube上晒收益的那批人。 真正机构在用的不是花哨指标,而是数学、风控、套利和做市——建立在对市场微观结构理解之上。我当时给自己定的路很硬:要么按机构逻辑做,要么离场。 之后三年用Python和MQL搓原型,把大玩家的跨市场相关性、统计套利思路,按散户资金小、算力弱的现实做裁剪。2020年1月,动荡市之前,Tris_Optimized落地,它不预测方向、不挂技术指标,只算三种相关货币对的数学失衡并挂单捕捉。 这套EA实盘跑过五年多,穿越疫情、通胀、利率和地缘危机,在我自己操作的时段里持续出利润,但绝不是「稳赚」工具,外汇高杠杆下本金回撤风险始终在。 几周前翻云盘翻出早期版本,挂模拟账户没做当下优化也出了正结果。我把它发出来不是当暴富代码,而是给散户看机构方法怎么平移到MT5:你开个模拟账户加载它,跑两周就能验证套利逻辑是否还活着。

「EURUSD-GBPUSD-EURJPY三角关系的游击打法」

同时盯 EURUSD、GBPUSD、EURJPY 三对的闭环,理论上有 EUR→USD→GBP→EUR 净赚几点的情况,但纯套利窗口极短,机构高频算法直连流动性,往往在毫秒级扫光。散户硬等理想失衡基本是浪费时间。 我做的 TrisWeb_Optimized 不坐等完美条件,而是铺一张三维订单网,靠三对之间的数学牵制吃自然波动的差。学术上它不算经典套利,更像是散户的游击战术:用三角比价关系找偏差,而不是抢机构的瞬时漏洞。 开 MT5 把这三对调进同一窗口,算一下实时交叉价比(EURJPY 与 EURUSD×GBPUSD 倒数路径的差),若常态偏差小于 3 点,说明你看到的机会大概率已被流动性吃掉,EA 也难有空间。

用三行报价撬开合成对的偏差缝隙

合成货币对本身不出现在行情列表里,它是靠两个真实直盘报价倒推出来的数学镜像。比如用 EURUSD 和 GBPUSD 的实时价能算出理论 EURGBP,理论上它和真实 EURGBP 分毫不差,但实盘里永远有几点到十几点的滑离,这缝隙就是价差策略的日常猎物。 TrisWeb_Optimized 没去显式构造合成对,而是直接抓底层报价来嗅偏差。下面这三行是入口:先把三个符号的当前价取回来,后面才有资格谈失衡。 外汇与贵金属属高杠杆品种,这种微偏差套利对延迟和成本极敏感,实盘前请在 MT5 策略测试器里用真实点差回放验证。

MQL5 / C++
class=class="str">"cmt">// Get the current prices for each symbol
class="type">class="kw">double priceSymbol1 = GetCurrentPrice(Symbol1);
class="type">class="kw">double priceSymbol2 = GetCurrentPrice(Symbol2);
class="type">class="kw">double priceSymbol3 = GetCurrentPrice(Symbol3);

◍ 极端行情里活下来的模块化骨架

2020年1月写下第一版核心逻辑时,市场还没意识到几个月后会出现数十年罕见的极端波动。这个EA后来在疫情引发的高波动环境里扛住了压力,没有因为报价异常或流动性断裂而崩掉,反而稳定运行。 关键不在某条神奇信号,而在OnTick()的分工方式。每次报价跳动触发该函数,它只做三件事:清点数订单、统计持仓盈亏、把具体活儿甩给独立模块。系统像被切成不同器官,各管一摊,不互相纠缠。 看这段MT5里的触发函数,能直接抄去验证架构思路: void OnTick() { // 计算订单与盈亏 int ordersCount1 = 0, ordersCount2 = 0, ordersCount3 = 0; double profit1 = 0, profit2 = 0, profit3 = 0; // 统计挂单数量 CountPendingOrders(ordersCount1, ordersCount2, ordersCount3); // 统计持仓及对应盈亏 CountOpenPositions(ordersCount1, ordersCount2, ordersCount3, profit1, profit2, profit3); // ... 其余逻辑 } 逐行拆一下:前两句声明了三组订单计数和盈亏变量,初值全0,对应三个独立维度;CountPendingOrders只填挂单数,不碰持仓;CountOpenPositions再补上已开仓量和浮盈浮亏。主函数本身不写计算细节,脏活分给子函数。 外汇和贵金属本身高风险,这种模块隔离不保证盈利,但能让你在MT5里改一个统计维度时,不至于把下单逻辑一起搞炸。打开MetaEditor搜OnTick,照这个壳子把CountXXX换成你自己的风控统计,跑一周复盘看看耦合是不是真降下来了。

MQL5 / C++
class="type">void OnTick()
{
   class=class="str">"cmt">// Calculate orders and profits
   class="type">int ordersCount1 = class="num">0, ordersCount2 = class="num">0, ordersCount3 = class="num">0;
   class="type">class="kw">double profit1 = class="num">0, profit2 = class="num">0, profit3 = class="num">0;
   
   class=class="str">"cmt">// Count pending orders
   CountPendingOrders(ordersCount1, ordersCount2, ordersCount3);
   
   class=class="str">"cmt">// Calculate open positions and their profit
   CountOpenPositions(ordersCount1, ordersCount2, ordersCount3, profit1, profit2, profit3);
   
   class=class="str">"cmt">// ... rest of the code
}

常见问题

把相关性高的两个直盘按正负系数组合,例如多 EURUSD 同时空 GBPUSD,可合成一个非美偏斜头寸,在报价缝隙里挂双边单赚回归。
机构看跨品种协整与库存风险,而不是单看 MACD 金叉;先用滚动相关性确认两个货币对没有结构性脱钩再上头寸。
可以,小布盯盘能实时计算 EURUSD-GBPUSD 等合成价差并标注异常,你只需在提醒后人工确认挂单,把重复计算交给它。
用 EURJPY 对冲 EURUSD 的欧元敞口,留 GBP 残差做游击,行情窄幅时来回吃几 pip,外汇贵金属高风险需严控杠杆。
把仓位、止损、暂停逻辑拆成独立模块,利差突变或点差翻倍时自动撤单,活下来比多赚几点重要。