黄金30分钟三均线交易系统
5期EMA与75/85期LWMA交叉,结合MACD柱体和CCI过滤信号
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
#property copyright "XAUOF指标工坊"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 5
// 均线1 - 黄色快线
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrYellow
#property indicator_width1 2
#property indicator_label1 "MA5-EMA"
// 均线2 - 红色慢线1
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_width2 2
#property indicator_label2 "MA75-LWMA"
// 均线3 - 红色慢线2
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrRed
#property indicator_width3 2
#property indicator_label3 "MA85-LWMA"
// 做多箭头
#property indicator_type4 DRAW_ARROW
#property indicator_color4 clrLime
#property indicator_width4 3
#property indicator_label4 "买入信号"
// 做空箭头
#property indicator_type5 DRAW_ARROW
#property indicator_color5 clrMagenta
#property indicator_width5 3
#property indicator_label5 "卖出信号"
//--- 输入参数
input int MA1_Period = 5; // 快线周期(EMA)
input int MA2_Period = 75; // 慢线1周期(LWMA)
input int MA3_Period = 85; // 慢线2周期(LWMA)
input int MACD_Fast = 12; // MACD快线周期
input int MACD_Slow = 26; // MACD慢线周期
input int MACD_Signal = 9; // MACD信号线周期
input int CCI_Period = 14; // CCI周期
input int CCI_BuyExit = 100; // CCI平多仓阈值
input int CCI_SellExit = -100; // CCI平空仓阈值
input int ArrowDistance = 20; // 箭头距离K线点数
//--- 指标缓冲区
double MA1_Buffer[];
double MA2_Buffer[];
double MA3_Buffer[];
double BuyArrow[];
double SellArrow[];
//--- 指标句柄
int ma1_handle;
int ma2_handle;
int ma3_handle;
int macd_handle;
int cci_handle;
//--- MACD和CCI临时缓冲区
double macd_main[];
double cci_buffer[];
//+------------------------------------------------------------------+
//| 自定义指标初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 设置缓冲区为指标缓冲区
SetIndexBuffer(0, MA1_Buffer, INDICATOR_DATA);
SetIndexBuffer(1, MA2_Buffer, INDICATOR_DATA);
SetIndexBuffer(2, MA3_Buffer, INDICATOR_DATA);
SetIndexBuffer(3, BuyArrow, INDICATOR_DATA);
SetIndexBuffer(4, SellArrow, INDICATOR_DATA);
// 设置箭头符号
PlotIndexSetInteger(3, PLOT_ARROW, 233); // 上箭头
PlotIndexSetInteger(4, PLOT_ARROW, 234); // 下箭头
// 设置空值
PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, EMPTY_VALUE);
// 创建均线句柄
ma1_handle = iMA(_Symbol, PERIOD_CURRENT, MA1_Period, 0, MODE_EMA, PRICE_CLOSE);
if(ma1_handle == INVALID_HANDLE)
{
Print("创建MA1句柄失败,错误代码: ", GetLastError());
return INIT_FAILED;
}
ma2_handle = iMA(_Symbol, PERIOD_CURRENT, MA2_Period, 0, MODE_LWMA, PRICE_CLOSE);
if(ma2_handle == INVALID_HANDLE)
{
Print("创建MA2句柄失败,错误代码: ", GetLastError());
return INIT_FAILED;
}
ma3_handle = iMA(_Symbol, PERIOD_CURRENT, MA3_Period, 0, MODE_LWMA, PRICE_CLOSE);
if(ma3_handle == INVALID_HANDLE)
{
Print("创建MA3句柄失败,错误代码: ", GetLastError());
return INIT_FAILED;
}
// 创建MACD句柄
macd_handle = iMACD(_Symbol, PERIOD_CURRENT, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
if(macd_handle == INVALID_HANDLE)
{
Print("创建MACD句柄失败,错误代码: ", GetLastError());
return INIT_FAILED;
}
// 创建CCI句柄
cci_handle = iCCI(_Symbol, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL);
if(cci_handle == INVALID_HANDLE)
{
Print("创建CCI句柄失败,错误代码: ", GetLastError());
return INIT_FAILED;
}
// 设置指标名称
IndicatorSetString(INDICATOR_SHORTNAME, "黄金30分钟三均线系统");
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| 自定义指标迭代函数 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// 检查数据是否足够
if(rates_total < MA3_Period)
return 0;
// 检查指标句柄是否计算完成
if(BarsCalculated(ma1_handle) < rates_total) return 0;
if(BarsCalculated(ma2_handle) < rates_total) return 0;
if(BarsCalculated(ma3_handle) < rates_total) return 0;
if(BarsCalculated(macd_handle) < rates_total) return 0;
if(BarsCalculated(cci_handle) < rates_total) return 0;
// 复制均线数据
if(CopyBuffer(ma1_handle, 0, 0, rates_total, MA1_Buffer) < rates_total) return 0;
if(CopyBuffer(ma2_handle, 0, 0, rates_total, MA2_Buffer) < rates_total) return 0;
if(CopyBuffer(ma3_handle, 0, 0, rates_total, MA3_Buffer) < rates_total) return 0;
// 准备MACD和CCI临时数组
ArrayResize(macd_main, rates_total);
ArrayResize(cci_buffer, rates_total);
// 复制MACD主线(柱体)数据
if(CopyBuffer(macd_handle, 0, 0, rates_total, macd_main) < rates_total) return 0;
// 复制CCI数据
if(CopyBuffer(cci_handle, 0, 0, rates_total, cci_buffer) < rates_total) return 0;
// 确定起始计算位置
int start = (prev_calculated > 0) ? prev_calculated - 1 : MA3_Period;
// 首次计算时初始化箭头缓冲区
if(prev_calculated == 0)
{
ArrayInitialize(BuyArrow, EMPTY_VALUE);
ArrayInitialize(SellArrow, EMPTY_VALUE);
}
// 计算信号
for(int i = start; i < rates_total && !IsStopped(); i++)
{
// 默认无信号
BuyArrow[i] = EMPTY_VALUE;
SellArrow[i] = EMPTY_VALUE;
// 需要前一根K线数据才能判断交叉
if(i < 1)
continue;
// 做多信号:黄线上穿两条红线,MACD为红柱(主线>0)
// 黄线上穿慢线1:当前黄>慢1,前一根黄<=慢1
// 黄线上穿慢线2:当前黄>慢2,前一根黄<=慢2
bool golden_cross_ma2 = (MA1_Buffer[i] > MA2_Buffer[i] && MA1_Buffer[i-1] <= MA2_Buffer[i-1]);
bool golden_cross_ma3 = (MA1_Buffer[i] > MA3_Buffer[i] && MA1_Buffer[i-1] <= MA3_Buffer[i-1]);
bool macd_bullish = (macd_main[i] > 0); // MACD主线大于0表示红柱
// 做空信号:黄线下穿两条红线,MACD为绿柱(主线<0)
bool death_cross_ma2 = (MA1_Buffer[i] < MA2_Buffer[i] && MA1_Buffer[i-1] >= MA2_Buffer[i-1]);
bool death_cross_ma3 = (MA1_Buffer[i] < MA3_Buffer[i] && MA1_Buffer[i-1] >= MA3_Buffer[i-1]);
bool macd_bearish = (macd_main[i] < 0); // MACD主线小于0表示绿柱
// 黄线同时上穿两条红线且MACD红柱,做多
if((golden_cross_ma2 || golden_cross_ma3) && macd_bullish)
{
BuyArrow[i] = low[i] - ArrowDistance * _Point;
}
// 黄线同时下穿两条红线且MACD绿柱,做空
if((death_cross_ma2 || death_cross_ma3) && macd_bearish)
{
SellArrow[i] = high[i] + ArrowDistance * _Point;
}
}
return rates_total;
}
//+------------------------------------------------------------------+
//| 清理函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 释放指标句柄
if(ma1_handle != INVALID_HANDLE)
IndicatorRelease(ma1_handle);
if(ma2_handle != INVALID_HANDLE)
IndicatorRelease(ma2_handle);
if(ma3_handle != INVALID_HANDLE)
IndicatorRelease(ma3_handle);
if(macd_handle != INVALID_HANDLE)
IndicatorRelease(macd_handle);
if(cci_handle != INVALID_HANDLE)
IndicatorRelease(cci_handle);
}作品说明
识别结果
从图上看到的指标系统包含:
- 三条均线:
- 均线1:5周期指数加权(EMA),黄色
- 均线2:75周期线性加权(LWMA),红色
- 均线3:85周期线性加权(LWMA),红色
- 交易信号:
- 做多:黄线上穿两条红线,MACD为红柱,做多,CCI低于-100时平仓
- 做空:黄线下穿两条红线,MACD为绿柱,做空,CCI高于+100时平仓
- 止损:50点,碰到盘后的机会很小,避开非农等重要经济数据
这是一个多指标组合系统,需要在主图画三条均线,配合MACD和CCI的辅助判断给出交易信号。
使用说明
- 安装方法:将代码保存为
.mq5文件,放入 MT5 的MQL5\Indicators目录,重启MT5或右键刷新导航器,拖到30分钟XAUUSD图表上。
- 三条均线:黄色线是5周期EMA(快线),两条红色线分别是75和85周期LWMA(慢线),快线穿越慢线形成交易信号。
- 交易信号:绿色上箭头=做多信号(黄线上穿红线+MACD红柱),紫色下箭头=做空信号(黄线下穿红线+MACD绿柱)。
- 平仓条件:多单当CCI高于+100时平仓,空单当CCI低于-100时平仓(代码仅显示开仓信号,平仓需配合EA或手动操作)。
- 止损建议:固定50点止损,避开非农等重大数据发布时段交易。
- 参数调整:可在指标属性里修改均线周期、MACD参数、CCI阈值和箭头距离,建议先在历史数据上测试效果。
- 注意事项:本指标仅提供信号参考,不自动下单,需手动交易或配合EA使用;信号出现后应结合价格形态和支撑阻力综合判断。
- 性能优化:30分钟周期下计算负担较小,多品种同时运行无压力;如需用于更短周期,可适当减小均线周期参数。
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个三均线交叉指标,在主图上画出5周期EMA(黄色快线)和75、85周期LWMA(两条红色慢线),当快线穿越慢线且MACD柱体颜色符合方向时,在K线下方显示绿色上箭头(做多信号)或上方显示紫色下箭头(做空信号)。专为30分钟黄金图表设计,帮助交易者捕捉趋势启动时机。
逻辑原理
指标同时计算三条均线:5周期指数移动平均(EMA,对近期价格反应更灵敏)作为快线,75和85周期线性加权移动平均(LWMA,对近期价格有一定权重但更平滑)作为慢线。信号生成逻辑是:
做多信号:黄色快线上穿75或85红色慢线中的任意一条(只要穿过其中一条就算),同时MACD主线大于零(柱体显示为红色/多头)。
做空信号:黄色快线下穿75或85红色慢线中的任意一条,同时MACD主线小于零(柱体显示为绿色/空头)。
MACD用标准参数12/26/9计算,作为过滤器避免在震荡行情中均线频繁交叉产生假信号。代码里准备了CCI参数但实际信号生成不使用CCI,CCI的平仓阈值仅作为交易参考,指标本身只显示开仓箭头。
参数说明
- MA1_Period(默认5):快线EMA周期,越小越灵敏但噪音越多,建议3-10之间
- MA2_Period(默认75):第一条慢线LWMA周期,构成主要支撑阻力参考
- MA3_Period(默认85):第二条慢线LWMA周期,与MA2配合形成慢线区间
- MACD_Fast(默认12):MACD快线周期,标准值,一般不改
- MACD_Slow(默认26):MACD慢线周期,标准值
- MACD_Signal(默认9):MACD信号线周期,标准值
- CCI_Period(默认14):CCI计算周期,代码中未用于信号判断
- CCI_BuyExit(默认100):建议多单平仓的CCI阈值,需手动监控
- CCI_SellExit(默认-100):建议空单平仓的CCI阈值,需手动监控
- ArrowDistance(默认20):箭头距离K线的点数,纯显示参数,调整箭头位置方便观察
怎么用
将代码保存为 .mq5 文件,放到MT5数据文件夹的 MQL5\Indicators 目录(文件→打开数据文件夹),重启MT5或在导航器中右键刷新。打开30分钟XAUUSD图表,从导航器的指标列表拖到图上。三条均线会自动画出,绿色上箭头出现时考虑做多,紫色下箭头出现时考虑做空。指标不自动下单,需手动操作或配合EA执行。可双击指标打开属性窗口调整参数和颜色。
适用场景
适合:趋势明确的行情,特别是欧美盘黄金有方向性波动时效果较好;30分钟周期平衡了噪音和灵敏度,日内波段交易合适;XAUUSD这类波动大、趋势延续性较强的品种。
不适合:亚盘窄幅震荡时均线频繁缠绕产生假信号;重大数据(非农、CPI、美联储决议)发布前后价格跳动剧烈;横盘整理阶段快线来回穿越慢线。其他品种(外汇、股指)需重新测试参数,默认参数专为黄金30分钟优化。
风险提示
均线交叉系统天生滞后,信号出现时价格已经走了一段,追高或追低风险较大。两条慢线周期接近(75和85),实际上形成的是一个慢线区间,代码用OR逻辑,快线穿过任意一条就触发信号,在慢线粘合时可能产生连续信号。MACD过滤有帮助但无法完全避免震荡市的假突破。
代码中定义了CCI平仓参数但指标本身不显示平仓信号,交易者需要另外监控CCI指标或手动判断出场。没有内置止损止盈逻辑,50点止损是作者建议值但需自己设置。箭头出现后价格可能回调,建议等K线收盘确认或结合支撑阻力位入场,不要见箭头就冲。
常见问题
- 这个指标的CCI平仓功能在哪里?
- 代码里定义了CCI参数(CCI_BuyExit和CCI_SellExit)但指标只显示开仓箭头,不显示平仓信号。你需要自己在副图加载CCI指标,当CCI突破±100时手动平仓,或者配合EA自动执行出场逻辑。
- 能用在其他品种或周期吗?
- 可以用,代码没有限制品种和周期,但默认参数(5/75/85均线)是针对30分钟XAUUSD调校的。用在其他品种(如EURUSD、原油)或更短周期(5分钟、15分钟)需要重新回测并调整均线周期,否则信号质量会下降。
- 箭头出现就能直接入场吗?
- 不建议。均线交叉信号会在K线走势中实时变化,最好等当前K线收盘确认箭头再入场。震荡行情中快线可能在慢线附近反复穿梭,产生多个箭头后又消失,盲目追单容易被套。
- 为什么有时黄线穿过一条红线就有信号,有时要穿两条?
- 代码逻辑是"穿过75或85其中任意一条"就算,不需要同时穿越两条。75和85周期接近,价格趋势启动时快线通常会依次穿过它们,任何一次穿越配合MACD条件都会触发箭头。
- 指标会重绘吗?
- 均线本身不重绘,历史K线的均线值固定。但信号判断依赖当前K线与前一根的交叉关系,当前未收盘K线的箭头可能随价格波动出现或消失,收盘后信号就固定了。严格来说当前K线的箭头属于"未确认信号",会重绘。
EMA & LWMA Triple MA Crossover Indicator with MACD Filter for MT5
A triple moving average crossover system combining 5-period EMA with 75/85-period LWMA, filtered by MACD histogram color. Designed for 30-minute XAUUSD charts, displays buy/sell arrows when fast line crosses slow lines with MACD confirmation.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。