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

均线交叉信号指标

hanlsen·1 小时前发布

基于EMA均线金叉死叉,在图表上标注做多做空信号点

均线交叉信号指标

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

MA_CrossSignal.mq5148 行
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
#property copyright "XAUOF指标工坊"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3

// 第一条线:均线
#property indicator_label1  "EMA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMaroon  // 深红色
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

// 第二条线:做多信号(蓝色圆点)
#property indicator_label2  "做多信号"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDodgerBlue  // 蓝色
#property indicator_width2  3

// 第三条线:做空信号(粉色菱形)
#property indicator_label3  "做空信号"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrHotPink  // 粉红色
#property indicator_width3  3

//--- 可调参数
input int    MaPeriod = 80;           // 均线周期(推荐50-100,周期越大越平滑)
input ENUM_MA_METHOD MaMethod = MODE_EMA; // 均线类型(EMA更灵敏,SMA更稳定)
input ENUM_APPLIED_PRICE MaPrice = PRICE_CLOSE; // 均线应用价格
input int    SignalOffset = 50;       // 信号箭头与K线的距离(单位:点)

//--- 指标缓冲区
double MaBuffer[];      // 均线值
double BuySignal[];     // 做多信号(蓝色圆点)
double SellSignal[];    // 做空信号(粉色菱形)

//--- 全局变量
int maHandle;           // 均线句柄

//+------------------------------------------------------------------+
//| 自定义指标初始化函数                                                |
//+------------------------------------------------------------------+
int OnInit()
{
   // 绑定指标缓冲区
   SetIndexBuffer(0, MaBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, BuySignal, INDICATOR_DATA);
   SetIndexBuffer(2, SellSignal, INDICATOR_DATA);
   
   // 设置信号箭头样式
   PlotIndexSetInteger(1, PLOT_ARROW, 159);  // 蓝色圆点
   PlotIndexSetInteger(2, PLOT_ARROW, 228);  // 粉色菱形
   
   // 设置空值
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   
   // 创建均线句柄
   maHandle = iMA(_Symbol, PERIOD_CURRENT, MaPeriod, 0, MaMethod, MaPrice);
   if(maHandle == INVALID_HANDLE)
   {
      Print("创建均线句柄失败,错误码:", GetLastError());
      return(INIT_FAILED);
   }
   
   // 设置指标标签
   IndicatorSetString(INDICATOR_SHORTNAME, StringFormat("均线交叉信号(%d)", MaPeriod));
   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(BarsCalculated(maHandle) < rates_total)
      return 0;
   
   // 将均线数据复制到缓冲区
   if(CopyBuffer(maHandle, 0, 0, rates_total, MaBuffer) < rates_total)
      return 0;
   
   // 确定计算起点
   int start = (prev_calculated > 0) ? prev_calculated - 1 : MaPeriod;
   
   // 初始化信号缓冲区
   if(prev_calculated == 0)
   {
      ArrayInitialize(BuySignal, EMPTY_VALUE);
      ArrayInitialize(SellSignal, EMPTY_VALUE);
   }
   
   // 计算信号距离(点数转换为价格单位)
   double offset = SignalOffset * _Point;
   
   // 主循环:检测金叉和死叉
   for(int i = start; i < rates_total && !IsStopped(); i++)
   {
      // 默认清空信号
      BuySignal[i] = EMPTY_VALUE;
      SellSignal[i] = EMPTY_VALUE;
      
      // 需要前一根K线数据,所以从第1根开始
      if(i < 1)
         continue;
      
      // 检测金叉:收盘价从下方突破均线(做多信号)
      // 当前K线收盘价在均线上方 且 前一根K线收盘价在均线下方或等于
      if(close[i] > MaBuffer[i] && close[i-1] <= MaBuffer[i-1])
      {
         BuySignal[i] = low[i] - offset;  // 在K线低点下方画蓝色圆点
      }
      
      // 检测死叉:收盘价从上方跌破均线(做空信号)
      // 当前K线收盘价在均线下方 且 前一根K线收盘价在均线上方或等于
      if(close[i] < MaBuffer[i] && close[i-1] >= MaBuffer[i-1])
      {
         SellSignal[i] = high[i] + offset;  // 在K线高点上方画粉色菱形
      }
   }
   
   // 返回当前已计算的K线数量
   return(rates_total);
}

//+------------------------------------------------------------------+
//| 指标清理函数                                                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // 释放均线句柄
   if(maHandle != INVALID_HANDLE)
      IndicatorRelease(maHandle);
}
//+------------------------------------------------------------------+
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
均线交叉信号指标 在 MT5 上的真实截图

作品说明

从图上识别到以下元素:

  1. 一条深红色平滑曲线 - 这是一条大周期移动平均线(从曲线的流畅度判断,应该是50-100周期的EMA)
  2. 蓝色圆点信号 - 出现在K线下方,标记做多机会(价格上穿均线时触发)
  3. 粉红色菱形信号 - 出现在K线上方,标记做空机会(价格下穿均线时触发)
  4. 信号逻辑 - 当收盘价从下方突破均线产生金叉时显示蓝色圆点;当收盘价从上方跌破均线产生死叉时显示粉色菱形

这是一个经典的均线交叉信号系统,适合捕捉趋势反转点。

使用说明

安装步骤

  1. 将代码保存为 MA_CrossSignal.mq5,放入 MT5 的 MQL5\Indicators 目录
  2. 在 MetaEditor 中编译(F7),确保无错误
  3. 在 MT5 图表上右键 → 插入指标 → 自定义 → MA_CrossSignal

参数调节

  • 均线周期(默认80):周期越大,均线越平滑,信号越少但越可靠;周期越小,信号越频繁但假信号也多。推荐黄金15分钟用50-80,H1用80-120
  • 均线类型:EMA(指数移动平均)对价格变化更敏感,SMA(简单移动平均)更平稳
  • 信号距离(默认50点):控制圆点和菱形距离K线的远近,纯视觉调整,不影响信号逻辑

信号解读

  • 蓝色圆点:出现在K线下方,表示收盘价上穿均线,金叉做多信号,可以考虑买入
  • 粉色菱形:出现在K线上方,表示收盘价下穿均线,死叉做空信号,可以考虑卖出
  • 深红色曲线:就是均线本身,价格在线上方为多头趋势,在线下方为空头趋势

注意事项

  1. 单纯的均线交叉会产生假突破,建议结合趋势和成交量过滤
  2. 震荡行情中信号频繁且不可靠,最好在明确趋势中使用
  3. 信号出现后不要盲目入场,等当前K线收盘确认后再操作更稳妥
  4. 可以配合其他指标(如RSI、MACD)进行二次确认,提高胜率

AI 解读根据源码逐行分析写成,供参考,以实际运行为准

这是什么

这是一个基于单均线与价格交叉的 MT5 信号指标。当收盘价从下方突破均线时,在 K 线下方画蓝色圆点提示做多机会;当收盘价从上方跌破均线时,在 K 线上方画粉色菱形提示做空机会。同时在图表上画出一条深红色均线作为参考。

逻辑原理

指标用 iMA() 函数生成一条移动平均线(默认 80 周期 EMA),每根 K 线收盘后检查价格与均线的位置关系。

金叉做多信号:当前 K 线收盘价在均线上方 且 前一根 K 线收盘价在均线下方或相等,判定为上穿,在当前 K 线低点下方(距离由 SignalOffset 参数控制)画蓝色圆点。

死叉做空信号:当前 K 线收盘价在均线下方 且 前一根 K 线收盘价在均线上方或相等,判定为下穿,在当前 K 线高点上方画粉色菱形。

均线本身画成深红色实线,线宽 2。信号只在交叉瞬间产生一次,不会持续显示,也不会重绘历史信号。

参数说明

  • MaPeriod(默认 80):均线周期。周期越大均线越平滑,信号越少但越可靠;周期越小信号越频繁但假突破也多。黄金 15 分钟图建议 50-80,H1 图建议 80-120。
  • MaMethod(默认 MODE_EMA):均线类型,可选 EMA、SMA、SMMA、LWMA。EMA 对价格变化更敏感,SMA 更平稳滞后。
  • MaPrice(默认 PRICE_CLOSE):均线计算用的价格,可选收盘价、开盘价、最高价、最低价等。一般保持收盘价即可。
  • SignalOffset(默认 50):信号箭头距离 K 线的距离,单位是点(0.00001 或 0.01,取决于品种报价精度)。纯视觉调整,不影响信号逻辑,图表拥挤时可以调大。

怎么用

将代码保存为 MA_CrossSignal.mq5,放到 MT5 安装目录的 MQL5\Indicators 文件夹,在 MetaEditor 中编译(F7)无错后,在图表上右键 → 插入指标 → 自定义 → MA_CrossSignal。

指标会在主图窗口显示,深红色线是均线,蓝色圆点是做多信号,粉色菱形是做空信号。看到蓝点可以考虑买入,看到粉色菱形可以考虑卖出。建议等当前 K 线收盘后再确认信号,避免 K 线内价格反复波动导致误判。

可以叠加其他指标(如 RSI、MACD)做二次确认,或结合更大周期趋势过滤信号。

适用场景

适合有明确趋势的品种和周期,比如黄金(XAUUSD)、主要外汇对(EURUSD、GBPUSD)、原油等波动较规律的品种。15 分钟到 H1 周期效果相对稳定,太小的周期(M1、M5)噪音大,太大的周期(H4、D1)信号少且滞后。

在趋势行情中,金叉或死叉后价格会顺着方向走一段,信号有效性较高。不适合窄幅震荡行情,价格在均线附近反复穿越会产生大量无效信号。

风险提示

假突破频繁:震荡行情中价格会反复上下穿越均线,产生连续的买卖信号,但价格并未真正启动趋势,容易被来回止损。

滞后性:均线本身是滞后指标,信号出现时价格往往已经走了一段,入场点不是最优,遇到反转或假突破时亏损会比较明显。

无止损止盈:代码只负责画信号,没有内置止损止盈逻辑,需要交易者自己设定风控规则。单纯跟信号容易扛单或过早离场。

参数敏感:不同周期和品种的最优均线参数不同,默认 80 期不一定适合所有情况,需要回测调优。参数调得太激进(比如周期 10)会让信号变成噪音。

建议在模拟盘测试一段时间,熟悉信号特点后再实盘使用,并结合趋势判断和其他过滤条件提高胜率。

常见问题

这个指标会重绘吗
不会。代码在 OnCalculate 中从 prev_calculated - 1 开始计算,历史 K 线的信号一旦生成就不会改变,只有当前未收盘的 K 线可能因价格波动而信号消失或出现,收盘后就固定了。
默认 80 周期适合什么时间框架
代码里没有限制周期,80 期相对平滑,适合 15 分钟到 H1 图。更小的周期(M5、M1)建议降到 30-50 期,更大的周期(H4、D1)可以提高到 100-200 期,需根据品种波动特性自行测试。
能用在外汇和加密货币上吗
可以。代码使用 _Symbol 和 PERIOD_CURRENT,会自动适应当前图表的品种和周期,外汇、黄金、原油、加密货币、股指都能用,但不同品种的最优参数可能不同。
为什么有时候信号很密集
信号密集说明价格在均线附近反复震荡,这是典型的横盘整理或无趋势行情。此时信号质量差,容易假突破,建议不操作或切换到更大周期均线过滤。
可以改成两条均线交叉吗
当前代码是价格与单均线交叉。如果要改成双均线(快线穿慢线),需要新建第二个 iMA 句柄,把 close[i] 和 MaBuffer[i] 的比较改成 FastMaBuffer[i] 和 SlowMaBuffer[i] 的比较,逻辑类似但代码需要修改。

EMA Price Crossover Signal Indicator for MT5

An MT5 indicator that marks buy and sell signals when price crosses an EMA line. Blue dots appear below candles when price crosses above the MA (golden cross), and pink diamonds appear above when price crosses below (death cross). Default 80-period EMA with adjustable type, period, and signal offset.

Source code is shown above. Compiled EX5 files are available to VIP members.

评论

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

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