MT5指标编译通过 · EX5 14KB 自动发布 1 0

黄金30分钟三均线交易系统

xujinyao·1 小时前发布

5期EMA与75/85期LWMA交叉,结合MACD柱体和CCI过滤信号

黄金30分钟三均线交易系统

MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子

GoldenMA30MinSystem.mq5237 行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#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);
}
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
黄金30分钟三均线交易系统 在 MT5 上的真实截图

作品说明

识别结果

从图上看到的指标系统包含:

  1. 三条均线:
  • 均线1:5周期指数加权(EMA),黄色
  • 均线2:75周期线性加权(LWMA),红色
  • 均线3:85周期线性加权(LWMA),红色
  1. 交易信号:
  • 做多:黄线上穿两条红线,MACD为红柱,做多,CCI低于-100时平仓
  • 做空:黄线下穿两条红线,MACD为绿柱,做空,CCI高于+100时平仓
  • 止损:50点,碰到盘后的机会很小,避开非农等重要经济数据

这是一个多指标组合系统,需要在主图画三条均线,配合MACD和CCI的辅助判断给出交易信号。

使用说明

  1. 安装方法:将代码保存为 .mq5 文件,放入 MT5 的 MQL5\Indicators 目录,重启MT5或右键刷新导航器,拖到30分钟XAUUSD图表上。
  1. 三条均线:黄色线是5周期EMA(快线),两条红色线分别是75和85周期LWMA(慢线),快线穿越慢线形成交易信号。
  1. 交易信号:绿色上箭头=做多信号(黄线上穿红线+MACD红柱),紫色下箭头=做空信号(黄线下穿红线+MACD绿柱)。
  1. 平仓条件:多单当CCI高于+100时平仓,空单当CCI低于-100时平仓(代码仅显示开仓信号,平仓需配合EA或手动操作)。
  1. 止损建议:固定50点止损,避开非农等重大数据发布时段交易。
  1. 参数调整:可在指标属性里修改均线周期、MACD参数、CCI阈值和箭头距离,建议先在历史数据上测试效果。
  1. 注意事项:本指标仅提供信号参考,不自动下单,需手动交易或配合EA使用;信号出现后应结合价格形态和支撑阻力综合判断。
  1. 性能优化: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.

评论

后可以留言,比如反馈用着怎么样、想加什么功能。

还没有人评论,来抢个沙发。