日线对冲EA实战:GBPJPY与EURJPY
基于TD Sequential的高相关性货币对每日对冲系统详解
策略起源与核心思路
作者在尝试仅每日开仓一次、自动获取约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,即对冲对仓位更重,以平衡两货币对波动点对净值的影响。每日只平掉昨日对冲单,重新根据信号开仓,实现“每日清理、每日新建”的循环。
- 信号:简化TD Sequential判断UP/DN
- 基准对:EURJPY,对冲对:GBPJPY
- 相关性:CorPeriod_1=3与CorPeriod_2=5都需≥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并退出。
状态显示与实战结论
ShowStatus用Comment显示阻塞状态、点差、当前订单与预期ROI。作者经一个月报告与回测认为日线对冲可行,但强调需6个月实盘验证。后续读者指出EURJPY与GBPJPY对冲实质等价于EURGBP单边,可简化;也有人建议换AUDJPY/CADJPY赚掉期。
本策略价值不在直接实盘,而在提供“高相关日线对冲+TD信号+自动手数”的可改框架。中文交易者可用MQL5重写相关性模块、修正文件IO与除零,并加入滑点控制,发展为自己的日频中性策略。
- 原版仅MQL4,迁移MT5需重写文件与订单函数
- 相关性阈值0.9仅适合日线,长线请用低相关
- 手数1:1.5需按波动校准,勿硬抄
- 务必独立运行EA,避免保证金计算冲突