您能用移动平均线做什么呢(基础篇)
均线在 MT5 里到底能替你干什么
移动平均线在 MT5 里不只是画一条平滑曲线。它最直接的价值是把噪声价格压成趋势骨架,让你在 1 分钟到月线任何周期上快速判断方向偏好。 以一条 20 周期 SMA 为例,价格持续站在线上方,多头倾向更强;跌破且均线走平,则震荡或反转概率上升。这套判断不依赖指标叠加,单线即可操作。 实盘里常见用法是双线交叉:快线(如 10)上穿慢线(如 50),视为动能转多信号;下穿则转空。外汇与贵金属杠杆高,这类信号失败率也不低,需配合仓位控制。 在 MT5 里拖入 Moving Average 指标,改 period 和 shift 就能验证不同参数在历史行情上的反应,建议先用 2022 年 5 月至今的 XAUUSD H1 跑一遍直观感受。
◍ 从均线本源拆起
做价格行为的人手里大多攒了几套能跑的系统,但没人愿意每跳一次报价就重算一遍指标——多数时候用眼睛顺着线走就够了。不过偶尔冒出来的念头,会逼你重新算点东西,甚至把原先对盘面的理解推倒重来。 这里先只聊最朴素也最常被用的移动平均线。它的核心就是一段窗口内的价格平均:MA[i] 是曲线上第 i 个点,Price[i] 是当前价格,MAPeriod 是参与计算的柱线数量。开盘、收盘、最高、最低、加权都能塞进去,标准指标里随便选。 截图里我默认都用 SMA、收盘价、周期 10;若一个指标里画两条线,就取 5 和 8,不会超过两条。红色代表快线,橙色代表慢线,其它颜色用到了再单独说。方法选 SMA 还是 EMA 不影响思路本身,你完全可以换参数试。 外汇和贵金属波动大、杠杆高,任何均线思路都只是概率倾向,真要上 MT5 验证请先用模拟盘跑。
MA[i] = (Price[i]+Price[i+class="num">1]+...+Price[i+MAPeriod])/MAPeriod「模板化指标怎么搭骨架」
做信号触发器时,我习惯先写一套指标模板,再往里塞不同曲线逻辑。它长得像标准 MACD 示例,但每个实例都靠移动平均打底,偶尔接 ATR 去定箭头偏移或画通道,属性值随时能改,不用重编译。 摆放在主图还是独立窗口,靠 #property 切换:indicator_chart_window 贴图表,indicator_separate_window 进副窗,后者还能用 indicator_height 100 锁高度。缓冲区命名统一带 Buffer 尾缀,箭头就叫 ArrowDownBuffer / ArrowUpBuffer;非缓冲区的全局变量全加 ext 前缀,比如 extATRData 存 ATR 源数据,读起来不混。 关键是零重绘:绘制只落在零号烛条,计算全用已收盘烛条,初始化里把空值刷成 0,主循环只负责亮箭头或连线。外汇和贵金属波动剧烈、杠杆高风险大,这种不重绘的触发逻辑也只是降低视觉干扰,不保证信号胜率。 下面这段是模板里控制窗口与空值的最小代码片段,直接抄进 MQ5 就能改:
class="macro">#class="kw">property indicator_chart_window class="macro">#class="kw">property indicator_separate_window class="macro">#class="kw">property indicator_height class="num">100 PlotIndexSetDouble(class="num">0,PLOT_EMPTY_VALUE,class="num">0); PlotIndexSetDouble(class="num">1,PLOT_EMPTY_VALUE,class="num">0); PlotIndexSetDouble(class="num">2,PLOT_EMPTY_VALUE,class="num">0);
裸均线突破信号的噪声困境
把一条周期 10 的均线丢上图表,价格收在曲线下方超两根烛条就视作空头倾向、上方则多头倾向——这是多数人会做的第一反应。但直接在 MT5 里跑 MA-Breaking.mq5 这类只判收盘价穿越的脚本,你会发现即便处在明显趋势里,向上箭头和向下箭头数量也几乎对半开。 把均线周期拉长能压减箭头总数,可剧烈单向突破本身极少在毫无回滚时出现;实战里急拉前往往先横盘消耗。也就是说,不加筛选的穿越提示在外汇和贵金属这类高波动市场里参考意义很低,盲跟可能频繁吃假突破。 下面这段主循环展示了一种更挑剔的写法:不仅看当前柱,还回溯前一根甚至前两根的开收与均线位置关系,只有出现“收下穿但前收上挂”或连续两柱翻转时才标箭头。箭头位置用 ATR/5 做偏移,避开影线重叠。 逐行拆解:for 从 start+3 起遍历避免左侧数据不足;每根先清空上下箭头缓冲。第一组 if 捕捉做空信号——前一根收低于均线但开盘高于,或前两根收高开高、前一根收低开低,满足则在 high[i]+ATR/5 画下箭头。else if 对称处理做多:前一根收高于均线但开盘低于,或前两根收低开低、前一根收高开高,则在 low[i]-ATR/5 画上箭头。 开 MT5 把这段接进你自己的指标,把 ATR 除数从 5 改成 3 看看箭头密度变化,比单纯调 MA 周期更能筛掉横盘杂讯。
class=class="str">"cmt">//--- main cycle for(i=start+class="num">3; i<rates_total && !IsStopped(); i++) { ArrowDownBuffer[i]=class="num">0; ArrowUpBuffer[i]=class="num">0; class=class="str">"cmt">//--- if( ((close[i-class="num">1]<extMAData[i-class="num">1] && open[i-class="num">1]>extMAData[i-class="num">1] ) ||(close[i-class="num">2]>extMAData[i-class="num">2] && open[i-class="num">2]>extMAData[i-class="num">2] && close[i-class="num">1]<extMAData[i-class="num">1] && open[i-class="num">1]<extMAData[i-class="num">1] ) ) ) { ArrowDownBuffer[i]=high[i]+extATRData[i]/class="num">5; } else if( ((close[i-class="num">1]>extMAData[i-class="num">1] && open[i-class="num">1]<extMAData[i-class="num">1] ) ||(close[i-class="num">2]<extMAData[i-class="num">2] && open[i-class="num">2]<extMAData[i-class="num">2] && close[i-class="num">1]>extMAData[i-class="num">1] && open[i-class="num">1]>extMAData[i-class="num">1] ) ) ) { ArrowUpBuffer[i]=low[i]-extATRData[i]/class="num">5; } } class=class="str">"cmt">// main cycle