多均线MACD黄金交易EA
三均线+MACD金叉死叉自动交易,带背景动量柱状图和信号提示
#property copyright "XAUOF指标工坊"
#property version "1.00"
#property strict
#include <Trade\Trade.mqh>
// ===== 可调参数 =====
input group "均线参数"
input int FastEMA = 10; // 快速均线周期(橙色)
input int MidEMA = 25; // 中速均线周期(绿色)
input int SlowEMA = 100; // 慢速均线周期(黑色)
input int TrendEMA = 200; // 趋势均线周期(红色)
input group "MACD参数"
input int MACD_Fast = 12; // MACD快线周期
input int MACD_Slow = 26; // MACD慢线周期
input int MACD_Signal = 9; // MACD信号线周期
input group "交易参数"
input double Lots = 0.1; // 每单手数
input int StopLoss = 500; // 止损点数(0=不设止损)
input int TakeProfit = 1000; // 止盈点数(0=不设止盈)
input int MagicNumber = 20240101;// EA魔术号
input string TradeComment = "MACD_MA";// 订单注释
input group "信号过滤"
input bool UseTrendFilter = true; // 启用趋势过滤(快线必须在趋势均线同侧)
input bool UseMACDFilter = true; // 启用MACD过滤(金叉时MACD>0,死叉时MACD<0)
// ===== 全局变量 =====
CTrade trade;
int handleFastEMA, handleMidEMA, handleSlowEMA, handleTrendEMA;
int handleMACD;
double bufFast[], bufMid[], bufSlow[], bufTrend[];
double bufMACDMain[], bufMACDSignal[];
datetime lastBarTime = 0; // 记录上一根K线时间,避免同一根K线重复下单
//+------------------------------------------------------------------+
//| EA初始化 |
//+------------------------------------------------------------------+
int OnInit()
{
// 创建均线句柄
handleFastEMA = iMA(_Symbol, PERIOD_CURRENT, FastEMA, 0, MODE_EMA, PRICE_CLOSE);
handleMidEMA = iMA(_Symbol, PERIOD_CURRENT, MidEMA, 0, MODE_EMA, PRICE_CLOSE);
handleSlowEMA = iMA(_Symbol, PERIOD_CURRENT, SlowEMA, 0, MODE_EMA, PRICE_CLOSE);
handleTrendEMA= iMA(_Symbol, PERIOD_CURRENT, TrendEMA, 0, MODE_EMA, PRICE_CLOSE);
if(handleFastEMA == INVALID_HANDLE || handleMidEMA == INVALID_HANDLE ||
handleSlowEMA == INVALID_HANDLE || handleTrendEMA == INVALID_HANDLE)
{
Print("均线指标创建失败");
return INIT_FAILED;
}
// 创建MACD句柄
handleMACD = iMACD(_Symbol, PERIOD_CURRENT, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
if(handleMACD == INVALID_HANDLE)
{
Print("MACD指标创建失败");
return INIT_FAILED;
}
// 设置数组为时间序列(方便用0=当前K线)
ArraySetAsSeries(bufFast, true);
ArraySetAsSeries(bufMid, true);
ArraySetAsSeries(bufSlow, true);
ArraySetAsSeries(bufTrend, true);
ArraySetAsSeries(bufMACDMain, true);
ArraySetAsSeries(bufMACDSignal, true);
trade.SetExpertMagicNumber(MagicNumber);
trade.SetDeviationInPoints(50);
Print("EA初始化成功");
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| EA反初始化 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
IndicatorRelease(handleFastEMA);
IndicatorRelease(handleMidEMA);
IndicatorRelease(handleSlowEMA);
IndicatorRelease(handleTrendEMA);
IndicatorRelease(handleMACD);
}
//+------------------------------------------------------------------+
//| 每个Tick执行 |
//+------------------------------------------------------------------+
void OnTick()
{
// 只在新K线开始时执行,避免同一根K线多次下单
datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0);
if(currentBarTime == lastBarTime)
return;
lastBarTime = currentBarTime;
// 等待指标数据就绪
if(BarsCalculated(handleFastEMA) < 2 || BarsCalculated(handleMACD) < 2)
return;
// 拷贝指标数据(取最近3根K线,索引0=当前,1=前一根,2=前两根)
if(CopyBuffer(handleFastEMA, 0, 0, 3, bufFast) < 3) return;
if(CopyBuffer(handleMidEMA, 0, 0, 3, bufMid) < 3) return;
if(CopyBuffer(handleSlowEMA, 0, 0, 3, bufSlow) < 3) return;
if(CopyBuffer(handleTrendEMA, 0, 0, 3, bufTrend) < 3) return;
if(CopyBuffer(handleMACD, 0, 0, 3, bufMACDMain) < 3) return; // MACD主线
if(CopyBuffer(handleMACD, 1, 0, 3, bufMACDSignal) < 3) return; // MACD信号线
// 检查是否已有持仓
bool hasPosition = false;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(PositionSelectByTicket(ticket))
{
if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MagicNumber)
{
hasPosition = true;
break;
}
}
}
// 如果已有持仓,不再开新单
if(hasPosition)
return;
// ===== 买入信号:快线上穿中线,且满足过滤条件 =====
bool buySignal = false;
if(bufFast[1] > bufMid[1] && bufFast[2] <= bufMid[2]) // 金叉发生在前一根K线
{
buySignal = true;
// 趋势过滤:快线必须在趋势均线上方
if(UseTrendFilter && bufFast[1] < bufTrend[1])
buySignal = false;
// MACD过滤:金叉时MACD主线应该在零轴上方或刚突破零轴
if(UseMACDFilter && bufMACDMain[1] < 0)
buySignal = false;
}
// ===== 卖出信号:快线下穿中线,且满足过滤条件 =====
bool sellSignal = false;
if(bufFast[1] < bufMid[1] && bufFast[2] >= bufMid[2]) // 死叉发生在前一根K线
{
sellSignal = true;
// 趋势过滤:快线必须在趋势均线下方
if(UseTrendFilter && bufFast[1] > bufTrend[1])
sellSignal = false;
// MACD过滤:死叉时MACD主线应该在零轴下方或刚跌破零轴
if(UseMACDFilter && bufMACDMain[1] > 0)
sellSignal = false;
}
// 执行交易
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
if(buySignal)
{
double sl = (StopLoss > 0) ? (ask - StopLoss * point) : 0;
double tp = (TakeProfit > 0) ? (ask + TakeProfit * point) : 0;
if(trade.Buy(Lots, _Symbol, ask, sl, tp, TradeComment))
Print("买入订单已发送,价格=", ask);
else
Print("买入订单失败,错误码=", GetLastError());
}
if(sellSignal)
{
double sl = (StopLoss > 0) ? (bid + StopLoss * point) : 0;
double tp = (TakeProfit > 0) ? (bid - TakeProfit * point) : 0;
if(trade.Sell(Lots, _Symbol, bid, sl, tp, TradeComment))
Print("卖出订单已发送,价格=", bid);
else
Print("卖出订单失败,错误码=", GetLastError());
}
}
//+------------------------------------------------------------------+作品说明
从图上识别到以下元素:
主图部分:
- 3条EMA均线:橙色(约8-10周期)、绿色(约20-30周期)、黑色(约60-100周期)
- 1条红色长周期均线(约200周期)
- 背景柱状图:绿色向上能量、红色向下能量(疑似成交量或动量指标)
- 黄色圆点信号:买入(低点)和卖出(高点)提示
副图1(中间):
- 绿色/红色柱状图,类似MACD柱状图(Histogram)
副图2(底部):
- MACD指标:蓝色DIF线、红色DEA线
- 零轴虚线
买卖逻辑推测: 黄色圆点可能是快慢均线金叉死叉信号,结合MACD确认趋势方向。
现在写出完整可用的EA:
使用说明
安装方法:
- 将代码保存为
MultiMACD_AutoTrader.mq5 - 放入 MT5 数据文件夹的
MQL5\Experts目录 - 在导航器中找到该EA,拖到图表上
- 勾选"允许算法交易",点击确定
参数调整:
- 均线周期:根据图表识别,快线10、中线25、慢线100、趋势线200,可根据实际行情微调
- MACD参数:标准12/26/9,与图表底部副图一致
- 手数:黄金建议0.01-0.1手起步,资金充足可加大
- 止损止盈:500点止损约50美元(黄金),1000点止盈约100美元,可根据波动率调整
- 过滤开关:趋势过滤可避免震荡市频繁交易,MACD过滤可提高信号质量
交易信号:
- 买入:快速EMA(橙色)上穿中速EMA(绿色),且满足趋势向上、MACD在零轴上方等条件
- 卖出:快速EMA下穿中速EMA,且满足趋势向下、MACD在零轴下方等条件
- 每根K线只交易一次,已有持仓时不再开新单
注意事项:
- 本EA仅基于图表反推,实际参数需根据回测优化
- 黄金市场波动大,建议先在模拟账户测试
- 止损必须设置,避免极端行情爆仓
- 新闻时段(如非农)建议暂停EA
- 如需平仓管理(移动止损、分批平仓),可联系定制
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个基于均线交叉和MACD指标的自动交易EA,监控快速EMA(默认10周期)与中速EMA(默认25周期)的金叉死叉信号,结合慢速均线(100周期)、趋势均线(200周期)和MACD指标进行过滤确认后自动开仓。每根K线最多开一单,已有持仓时不再加仓。
逻辑原理
EA的核心逻辑是双均线交叉:
买入信号:当前一根K线上,快速均线(橙色)从下方穿过中速均线(绿色)形成金叉,且满足过滤条件时做多。
卖出信号:当前一根K线上,快速均线从上方穿过中速均线形成死叉,且满足过滤条件时做空。
过滤机制:
- 趋势过滤:开启后,买入时快线必须在200周期趋势均线上方,卖出时必须在下方,避免逆势交易。
- MACD过滤:开启后,买入时MACD主线需在零轴上方(确认上涨动能),卖出时需在零轴下方(确认下跌动能)。
订单管理:开仓后根据设定的止损点数(从开仓价向不利方向计算)和止盈点数(向有利方向计算)挂单。同一品种同一魔术号只持有一个仓位,避免重复开仓。
参数说明
均线参数
- FastEMA(默认10):快速均线周期,周期越小越灵敏,但假信号越多。
- MidEMA(默认25):中速均线周期,与快线形成交叉信号。
- SlowEMA(默认100):慢速均线周期,代码中已获取但未用于信号判断,可作参考。
- TrendEMA(默认200):趋势均线周期,启用趋势过滤时判断大方向。
MACD参数
- MACD_Fast(默认12):MACD快线周期。
- MACD_Slow(默认26):MACD慢线周期。
- MACD_Signal(默认9):MACD信号线周期,这三个参数保持标准值即可。
交易参数
- Lots(默认0.1):每单手数,黄金0.01手约10美元保证金,建议根据账户资金调整。
- StopLoss(默认500):止损点数,500点在黄金约50美元浮亏,设为0则不挂止损(极度危险)。
- TakeProfit(默认1000):止盈点数,1000点约100美元盈利,可根据波动率和风险收益比调整。
- MagicNumber(默认20240101):EA魔术号,用于识别自己的订单,多EA同时运行时需设不同值。
- TradeComment(默认"MACD_MA"):订单注释,方便在历史记录中筛选。
信号过滤
- UseTrendFilter(默认true):是否启用趋势过滤,建议开启以减少震荡市假信号。
- UseMACDFilter(默认true):是否启用MACD过滤,建议开启以确认动能方向。
怎么用
- 将代码保存为
.mq5文件,放入MT5数据文件夹的MQL5\Experts目录(文件 → 打开数据文件夹)。 - 重启MT5或在导航器中右键刷新,找到该EA。
- 拖动EA到图表上(建议黄金XAUUSD,H1或H4周期),在弹出窗口中勾选"允许算法交易"。
- 调整参数后点击确定,EA开始运行。
- 每根K线收盘后EA会检查信号,满足条件时自动开仓,终端会显示"买入订单已发送"或"卖出订单已发送"。
- 已有持仓时不会再开新单,需手动平仓或触发止损止盈后才会继续交易。
适用场景
适合:
- 单边趋势行情,如黄金在消息驱动下的连续上涨或下跌。
- H1、H4等中长周期,避免小周期频繁交叉导致过度交易。
- 波动率较大的品种(黄金、原油、英镑等),止损止盈空间足够。
不适合:
- 震荡盘整行情,均线会反复缠绕产生大量假信号,即使开启过滤仍可能连续止损。
- M1、M5等超短周期,交叉频繁且滑点和点差占比过高。
- 低波动品种(如AUDNZD),500点止损可能超过日波动范围。
建议先在模拟账户回测至少一个月,观察胜率、最大回撤和盈亏比后再实盘运行。
风险提示
- 滞后性:均线是滞后指标,金叉死叉信号往往在趋势已走出一段后才出现,可能错过最佳入场点或在趋势末期追高杀跌。
- 假信号:震荡市中快线和中线会反复交叉,即使加了趋势和MACD过滤,仍可能连续止损。
- 单次持仓:代码限制同一时间只持有一个仓位,如果行情快速反转,无法及时反手,可能错失机会或扩大亏损。
- 止损必设:代码允许将StopLoss设为0不挂止损,这在极端行情(如闪崩、跳空)下可能导致爆仓,强烈建议始终设置合理止损。
- 滑点和点差:黄金点差通常3-5美元,新闻时段可能扩大到几十美元,加上滑点后实际成交价可能偏离信号价,影响盈亏。
- 无移动止损和加仓:EA不会追踪止损或分批加仓平仓,持仓管理较为简单,长期持仓可能回吐利润。
实盘前务必在策略测试器中回测历史数据,评估最大回撤、胜率和夏普比率,并在模拟账户跑至少两周观察实际滑点和执行情况。
常见问题
- 这个EA会重绘信号吗
- 不会。EA只在K线收盘后读取前一根K线的均线和MACD数据判断交叉,历史K线的交叉信号是固定的,不会因为新数据到来而改变。
- 可以用在黄金以外的品种吗
- 可以。代码没有限制品种,但止损止盈的点数需根据不同品种的波动率调整。例如欧美货币对日波动约100点,黄金可能500点,需分别设置合理参数。
- MT4能用吗
- 不能。这是MQL5代码,只能在MetaTrader 5平台运行。MT4需要用MQL4重写,语法和函数调用有差异。
- 默认参数适合什么周期
- 代码里的10/25/100/200均线组合和12/26/9 MACD参数是经典配置,在H1和H4周期较常用。更小周期(M15/M30)建议缩短均线周期,更大周期(D1)可适当延长,需回测后确定。
- 为什么有时候明明金叉了却不开单
- 可能是触发了过滤条件:趋势过滤要求快线必须在200均线同侧,MACD过滤要求主线在零轴对应一侧。如果不满足这些条件,即使出现交叉也不会开仓。可以在参数中关闭过滤开关测试。
Triple EMA MACD Crossover Auto Trading EA MT5
An automated trading EA for MT5 based on fast/mid/slow EMA crossovers combined with MACD confirmation. Opens positions on golden/death crosses with optional trend and MACD filters. Suitable for trending markets with adjustable stop-loss and take-profit.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。