日线对冲EA实战:GBPJPY与EURJPY
⚖️

日线对冲EA实战:GBPJPY与EURJPY

基于TD Sequential的高相关性货币对每日对冲系统详解

技术分析基础 难度 · 进阶 2026-04-12 6 分钟阅读
#对冲策略#MQL4#日线交易#TDSequential

策略起源与核心思路

作者在尝试仅每日开仓一次、自动获取约100美元日收益的系统时,最初使用Tom DeMark的TD Sequential系统交易日线,虽信号不错但出现了不可接受的亏损。于是提出对冲两个高相关货币对的想法:GBPJPY与EURJPY日常相关性约90%,通过一买一卖锁定同向波动中的价差收益。手动测试一个月历史数据后表现良好,因此写成EA自动运行。

与传统对冲教授建议低相关性对冲不同,该日线系统反其道而行,要求相关性在0.9以上才允许对冲。原因是日线交易只看当天,需要两货币对当日几乎同涨同跌,才能确保一边盈利一边亏损,从而在摇摆中净赚差值,即便不盈利也比单边亏损少。

✦ 策略定位
本系统专为日内(日线周期)设计,不属于长期低相关对冲,切勿混用理念。

日线对冲的关键概念规划

在写代码前,作者明确了四个规划要点。第一,趋势信号选择:用简化版TD Sequential给出GBPJPY与EURJPY的当日方向。第二,对冲货币对选择:作者选EURJPY为基准对(Base),GBPJPY为对冲对(Hedge)。第三,基准与对冲角色:当EURJPY的TD信号为上涨,则买EURJPY并卖GBPJPY;若两对信号同向上才行动。第四,相关性约束:只用相关系数≥0.9的时段,且短中期周期都需满足。

手数比例上,系统默认基准与对冲手数比为1:1.5,即对冲对仓位更重,以平衡两货币对波动点对净值的影响。每日只平掉昨日对冲单,重新根据信号开仓,实现“每日清理、每日新建”的循环。

EA输入参数与初始化解析

EA外部参数中,BlockOpening可手动阻断开仓;PercentMaxRisk默认25%控制自动手数风险;Daily_Percent_ROI=7.98为日收益目标,AcceptableLoss_ROI=3.08为可接受亏损比例。内部固定BaseSymbol="GBPJPY"、H_Symbol="EURJPY"(注:文中叙述与代码变量名略有反置,实盘需核对)。CorPeriod_1=3、CorPeriod_2=5为相关性计算周期,H_B_LotsRatio=1.50为手数比,MagicNo=317用于识别订单。

init()函数获取两品种点差、点值、最小最大手数,并取较小点差gsp供后续开仓价判断。这些市场信息在D1周期挂载时一次性读取,若品种不可交易会导致后续计算异常。

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~External Input Parameters~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
extern bool BlockOpening= false ;
extern bool ShowStatus= true ;
extern string Auto_Lot_______________________= "_______" ; // Always Calculate The Lot Size Automatically
extern int PercentMaxRisk= 25 ; // With Max Risk Of 25% by default
extern string How_Much_You_Xpect?____________ = "_______" ; // The Getting Profit Part
extern double Daily_Percent_ROI= 7.98 ; // How many daily %ROI you wish.
extern double AcceptableLoss_ROI= 3.08 ; // daily Acceptable loss calculated in ROI scheme.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Internal Input Parameters~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
string BaseSymbol= "GBPJPY" ;
string H_Symbol= "EURJPY" ;
int CorPeriod_1= 3 ; // just for checking that short-term
int CorPeriod_2= 5 ; //& long-term Correlation are the same concederation level
bool AutoLot= true ;
double H_B_LotsRatio= 1.50 ; // always hedge those 2 pairs by 1:1.5 ratio
int MMBase= 3 ;

信号与相关性计算函数

DeMark()函数实现简化TD Sequential:取最近36根日线,比较收盘价与当日开盘收盘中值,向上计数返回正、向下返回负。Cor()函数用收盘价与SMA之差计算皮尔逊相关系数,要求两周期都高于0.9且低于1.05才不阻断。symboldif()与powdif()为辅助数学函数。

值得注意的是,相关性计算使用1440分钟周期(即日线)的shift数据,确保日线级别相关。若经纪商历史数据缺失,iClose等会返回0,导致相关系数失真,这是回测常见坑。

int DeMark( string sym, int s) {
 int i,pos= 36 ,num= 0 ,num1= 0 ,Rnum,w,m;
 for (i=pos; i>= 0 ; i--) {
  double midPt3=( iClose (sym, 0 ,i+s+cntTo)+ iOpen (sym, 0 ,i+s+cntTo))/ 2 ;
  if ( iClose (sym, 0 ,i+s+cntFrom)<midPt3) { w++;m= 0 ;num++; num1= 0 ; Rnum=- 1 *num; }
  else if ( iClose (sym, 0 ,i+cntFrom)>midPt3) { m++;w= 0 ;num1++;num= 0 ; Rnum=num1; }
  else {num1= 0 ;num = 0 ;Rnum= 0 ;}
 }
 return (Rnum);
}

double Cor( string base, string hedge, int CorPeriod) {
 double u1= 0 ,l1= 0 ,s1= 0 ;
 for ( int i=CorPeriod- 1 ;i >= 0 ;i--) {
  u1 +=u(symboldif(base,i,CorPeriod),symboldif(hedge,i,CorPeriod));
  l1 +=powdif(symboldif(base,i,CorPeriod));
  s1 +=powdif(symboldif(hedge,i,CorPeriod));
 }
 if (l1*s1 > 0 ) return (u1/ MathSqrt (l1*s1));
}

交易执行与仓位管理函数

Trade函数群包含TotalCurProfit计算浮动盈亏含掉期;CloseHedge平掉魔术码317所有单;SendH发单;ExistPositions/ExistOP查单;AutoBLots/AutoHLots按自由保证金与风险比算手数。Lots()函数用AccountFreeMargin*风险%/杠杆/10估算,再规范到手数步长。

代码中BUM、HUM分别从B317.csv、H317.csv读取已用保证金,用于ROI计算。文件若不存在则返回0,导致当日首 tick 的ROI分母为零,社区用户反馈过该除零错误。实盘前需手动创建或改逻辑。

double Lots( string symbol, double risk) {
 if (risk > 100 ) risk= 100 ;
 Lot= NormalizeDouble (Base(MMBase)*(risk/ 100 )/ AccountLeverage ()/ 10.0 , 2 );
 Lot= NormalizeDouble (Lot/lot_step, 0 )*lot_step;
 if (Lot < Min_Lot) Lot=Min_Lot;
 if (Lot > Max_Lot) Lot=Max_Lot;
 return (Lot);
}

double AutoHLots() {
 double HLot=AutoBLots()*H_B_LotsRatio;
 HLot= NormalizeDouble (HLot/lot_step, 0 )*lot_step;
 if (HLot < Min_Lot) HLot=Min_Lot;
 if (HLot > Max_Lot) HLot=Max_Lot;
 return (HLot);
}

主循环交易流程逻辑

start()首先限定时段必须为Period()==1440(D1)。新的一天day!=Day()时,若昨日对冲单仍在且非今日开,按可接受亏损或信号反转来CloseHedge;随后计算双周期相关性决定是否BlockOpen。当日价格接近日开盘±点差内才允许开仓,且TD信号两对同向上/下才触发买基准卖对冲或反向。

开仓前写B317.csv/H317.csv记录保证金;达到Daily_Percent_ROI或超AcceptableLoss_ROI会平仓并锁开仓。系统强提醒:不可同时跑其他EA,因AccountMargin类计算会互扰。挂载非D1会Alert并退出。

⚠ 常见故障
社区反馈原EA有发单错误、可接受亏损计算反向、文件打开过多、除零等bug;直接实盘前必须修正并充分回测。

状态显示与实战结论

ShowStatus用Comment显示阻塞状态、点差、当前订单与预期ROI。作者经一个月报告与回测认为日线对冲可行,但强调需6个月实盘验证。后续读者指出EURJPY与GBPJPY对冲实质等价于EURGBP单边,可简化;也有人建议换AUDJPY/CADJPY赚掉期。

本策略价值不在直接实盘,而在提供“高相关日线对冲+TD信号+自动手数”的可改框架。中文交易者可用MQL5重写相关性模块、修正文件IO与除零,并加入滑点控制,发展为自己的日频中性策略。

常见问题

它们是EA用来记录GBPJPY与EURJPY已用保证金的文件,首次运行会自动创建。系统读取其中数值作为ROI分母,若文件缺失返回0会导致除零错误,需手动建空文件或改代码。
因为策略只看当日,需要两货币对当天几乎同涨同跌,才能一边盈一边亏净赚差值;低相关适合长期对冲,日线高频循环必须用高相关保证方向一致。
社区指出有发单错误、AcceptableLoss_ROI计算反向、文件打开过多报错、除零错误。使用前必须修正文件IO、亏损判断逻辑并做历史回测。
等价于交易EURGBP单边,因为买EURJPY卖GBPJPY的净值变化近似欧元对英镑交叉盘。可据此简化代码或直接做EURGBP,但需注意点差与流动性差异。