效果示意图 · AI 根据源码绘制
#property copyright "XAUOF指标工坊"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 4
// 画线1:快速EMA
#property indicator_label1 "EMA快线"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_width1 2
// 画线2:慢速EMA
#property indicator_label2 "EMA慢线"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrOrange
#property indicator_width2 2
// 画线3:上穿箭头
#property indicator_label3 "金叉"
#property indicator_type3 DRAW_ARROW
#property indicator_color3 clrLime
#property indicator_width3 3
// 画线4:下穿箭头
#property indicator_label4 "死叉"
#property indicator_type4 DRAW_ARROW
#property indicator_color4 clrRed
#property indicator_width4 3
//--- 可调参数
input int FastPeriod = 20; // 快线周期(推荐 20)
input int SlowPeriod = 60; // 慢线周期(推荐 60)
//--- 指标缓冲区
double FastBuffer[]; // 快线值
double SlowBuffer[]; // 慢线值
double UpArrow[]; // 上穿箭头
double DnArrow[]; // 下穿箭头
int fast_handle; // 快线句柄
int slow_handle; // 慢线句柄
//+------------------------------------------------------------------+
int OnInit()
{
// 参数合法性检查
if(FastPeriod <= 0 || SlowPeriod <= 0 || FastPeriod >= SlowPeriod)
{
Print("参数错误:快线周期必须小于慢线周期且均大于0");
return(INIT_PARAMETERS_INCORRECT);
}
// 创建 EMA 句柄
fast_handle = iMA(_Symbol, _Period, FastPeriod, 0, MODE_EMA, PRICE_CLOSE);
slow_handle = iMA(_Symbol, _Period, SlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
if(fast_handle == INVALID_HANDLE || slow_handle == INVALID_HANDLE)
{
Print("创建均线句柄失败");
return(INIT_FAILED);
}
// 绑定缓冲区
SetIndexBuffer(0, FastBuffer, INDICATOR_DATA);
SetIndexBuffer(1, SlowBuffer, INDICATOR_DATA);
SetIndexBuffer(2, UpArrow, INDICATOR_DATA);
SetIndexBuffer(3, DnArrow, INDICATOR_DATA);
// 设置数组为时间序列(索引0为最新)
ArraySetAsSeries(FastBuffer, true);
ArraySetAsSeries(SlowBuffer, true);
ArraySetAsSeries(UpArrow, true);
ArraySetAsSeries(DnArrow, true);
// 设置箭头符号(233=向上箭头,234=向下箭头)
PlotIndexSetInteger(2, PLOT_ARROW, 233);
PlotIndexSetInteger(3, PLOT_ARROW, 234);
// 设置空值
PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0);
PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 释放句柄
if(fast_handle != INVALID_HANDLE) IndicatorRelease(fast_handle);
if(slow_handle != INVALID_HANDLE) IndicatorRelease(slow_handle);
}
//+------------------------------------------------------------------+
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 < SlowPeriod) return(0);
// 设置价格数组为时间序列
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
// 从指标句柄复制数据
if(CopyBuffer(fast_handle, 0, 0, rates_total, FastBuffer) <= 0) return(0);
if(CopyBuffer(slow_handle, 0, 0, rates_total, SlowBuffer) <= 0) return(0);
// 确定计算起点
int start = prev_calculated > 0 ? prev_calculated - 1 : SlowPeriod;
if(start < 1) start = 1; // 至少从第1根开始(因为要判断前一根)
// 逐根K线计算交叉信号
for(int i = start; i < rates_total; i++)
{
// 清空箭头
UpArrow[i] = 0;
DnArrow[i] = 0;
// 判断交叉:当前快线在慢线上方 且 前一根快线在慢线下方 = 上穿
if(FastBuffer[i] > SlowBuffer[i] && FastBuffer[i-1] <= SlowBuffer[i-1])
{
UpArrow[i] = low[i] - 10 * _Point; // 画在K线下方
}
// 判断交叉:当前快线在慢线下方 且 前一根快线在慢线上方 = 下穿
if(FastBuffer[i] < SlowBuffer[i] && FastBuffer[i-1] >= SlowBuffer[i-1])
{
DnArrow[i] = high[i] + 10 * _Point; // 画在K线上方
}
}
return(rates_total);
}作品说明
这是一个经典的双均线交叉指标。在主图上画出 EMA20(快线)和 EMA60(慢线),当快线上穿慢线时在 K 线下方标记绿色买入箭头,下穿时在 K 线上方标记红色卖出箭头。
使用说明
- 安装方法:将代码保存为
EMA_Cross_Arrow.mq5,放入 MT5 的MQL5/Indicators目录,在导航器中编译后拖到图表即可。
- 参数设置:
- 快线周期:默认 20,可根据交易风格调整(越小越灵敏)
- 慢线周期:默认 60,通常是快线的 2-3 倍
- 信号解读:
- 绿色向上箭头:金叉信号(快线上穿慢线),看涨
- 红色向下箭头:死叉信号(快线下穿慢线),看跌
- 蓝色线:快速 EMA,反应灵敏
- 橙色线:慢速 EMA,趋势参考
- 注意事项:
- 箭头只在交叉瞬间出现,不会重复画
- 均线交叉有滞后性,建议结合其他指标确认
- 震荡行情中会频繁交叉产生假信号,适合趋势行情使用
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
一个在主图上画出两条 EMA 均线(20 周期快线、60 周期慢线)并在交叉瞬间标记箭头的指标。快线上穿慢线时在 K 线下方画绿色向上箭头(金叉),下穿时在 K 线上方画红色向下箭头(死叉)。
逻辑原理
指标调用 MT5 内置的 iMA 函数计算两条 EMA(指数移动平均线,对近期价格赋予更高权重)。每根 K 线收盘时,程序比较当前柱与前一根柱的快慢线位置关系:
- 金叉:当前快线 > 慢线,且前一根快线 ≤ 慢线 → 在当前 K 线最低价下方 10 点处画绿色箭头(符号 233)
- 死叉:当前快线 < 慢线,且前一根快线 ≥ 慢线 → 在当前 K 线最高价上方 10 点处画红色箭头(符号 234)
箭头只在交叉发生的那根 K 线出现一次,已画出的箭头不会消失或移动(不重绘)。
参数说明
- FastPeriod(默认 20):快速 EMA 的计算周期。越小越灵敏,越容易产生信号,但也越容易被噪音干扰。日内短线可降至 10-15,波段交易可保持 20。
- SlowPeriod(默认 60):慢速 EMA 的计算周期。通常设为快线的 2-3 倍。加大这个值会让信号更稳定但更滞后,减小则信号更频繁。代码强制要求慢线周期必须大于快线。
怎么用
将 .mq5 文件放入 MT5 数据文件夹的 MQL5/Indicators 目录,在 MetaEditor 中编译或直接在导航器窗口刷新后拖到任意品种任意周期的图表。指标会在主图显示蓝色快线、橙色慢线和交叉箭头。绿色箭头出现时可考虑做多,红色箭头出现时可考虑做空或平多单。
适用场景
适合单边趋势行情:金叉后价格持续上涨、死叉后持续下跌时,信号有效且盈亏比好。常用品种如 XAUUSD、EURUSD、原油、指数等均可使用,但效果取决于当时行情性质而非品种本身。
不适合震荡行情:价格在区间内反复横盘时,快慢线会频繁缠绕交叉,产生大量来回打脸的假信号。默认参数(20/60)在 H1 及以上周期相对稳定,M5、M15 等小周期噪音更多。
风险提示
- 滞后性:EMA 基于历史价格计算,交叉信号出现时趋势往往已走了一段,入场点可能不是最优。
- 假突破:震荡市中快慢线反复交叉,一个信号刚出现可能马上反向,导致连续止损。
- 无过滤:代码没有加入成交量、波动率、趋势强度等辅助条件,所有交叉一视同仁,需交易者自行结合其他工具筛选。
- 无止损止盈逻辑:这只是一个视觉指标,不会自动下单或管理仓位,必须手动或配合 EA 执行。
常见问题
- 这个指标会重绘吗?
- 不会。箭头是根据已收盘 K 线的快慢线位置关系判断的,一旦画出就不会消失或移动。
- 默认参数 20/60 适合什么周期?
- H1(1 小时)及以上周期相对稳定,信号频率适中。M15 以下小周期信号会很频繁且假信号多,建议缩小参数或加其他过滤。
- 能用在 XAUUSD 以外的品种吗?
- 可以。代码没有限制品种,外汇、贵金属、指数、原油等都能用,但均线交叉策略本身只在趋势行情中有效,震荡品种效果差。
- 金叉箭头出现后该立即入场吗?
- 代码只负责标记交叉,不判断趋势强度和位置。建议结合更大周期方向、支撑阻力位或其他指标确认后再入场,避免震荡市中被反复打脸。
- MT4 能用吗?
- 不能直接用。这是 MQL5 代码,只能在 MT5 上运行。MT4 需要用 MQL4 重写,语法和函数调用方式都不同。
EMA Dual Line Crossover Arrow Indicator for MT5
Displays EMA20 and EMA60 on the chart, marks golden cross with green up arrow and death cross with red down arrow. Suitable for trending markets; may produce false signals in ranging conditions.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论 (2)
这个指标有对应的提示词吗
测试评论,指标很好用