
您能用移动平均线做什么呢
概述
我有若干个有效的交易系统。 一般来说,我不会在每次即时报价来临时都计算指标,而是用直线来替代。 但有时我会偶发一些想法,这些想法会改进我对价格图的看法,甚至完全改变我对交易的认知,尽管这需要一些计算。
本文介绍了一些与最流行、最容易理解的指标 — 移动平均线(МА)有关的思路。
在其最简单的版本中,指标值的计算采用众所周知的平均方程:
MA[i] = (Price[i]+Price[i+1]+...+Price[i+MAPeriod])/MAPeriod
此处,MA[i] 是顺序的下一个元素,曲线上的一个点。 Price[i] — 当前价格,MAPeriod — 参与均值计算的元素数量。
当然,我们可以自由地应用任何价格:开盘价、收盘价、最高价、最低价、加权平均值、等等。 标准指标允许选择所计算的价格和计算方法,包括比简单平均值更复杂的方法... 在提供示例的同时,我留下了选择计算方法的机会。 然而,这对于领会所研究方法背后的思路并不重要。 无论我们使用的是“简单”移动平均线(SMA)、指数移动平均线(EMA)、还是任何其它方法,所有示例都非常有效。 因此,默认情况下,所有屏幕截图选用 SMA,并采用默认指标设置。 如果未另行说明,所有指标均采用收盘价。 您可以随意地采用这些参数来改进它们。
当谈到单一曲线时,我通常会采用默认的周期值 10 根柱线。 如果在单个指标中用到多条具有不同周期的曲线,则应用的周期通常为 5 和 8。 我不会用到超过两条不同周期的曲线。
颜色如下:红色 — 快速;橙色 — 慢速... 如果我还用到了其它东西,我会在本中明确说明。
模板指标
我创建了若干个指标,为各种方式形成的曲线当作可视化信号触发器。 它们基于一个模板,与标准示例中的标准 MACD 非常相似。 我相信,在这里出示整个模板代码并无意义。
每个指标都用到一个或多个移动平均值,有时还会用到 ATR 来定义到箭头的距离,或绘制通道线。
有时,如果指标位于图表窗口中,则更容易把思路可视化;而有时则需要把指标置于单独的窗口中。 这是通过属性之一完成的。 以下属性可用于图表窗口内的指标:
#property indicator_chart_window
如果指标置于单独的窗口中,则应用以下属性:
#property indicator_separate_window
在这种情况下,我有时会用以下属性来设置窗口高度:
#property indicator_height 100
当然,属性值是可以更改的。
缓冲区名称的末尾有 “Buffer” 后缀。 例如,标准箭头缓冲区将被称为 ArrowDownBuffer 和 ArrowUpBuffer。 如果指标绘制线条,则根据线条函数来命名缓冲区。
我定义的所有全局变量都有 “ext” 前缀(如果它们不是缓冲区)。 例如,extATRData 是一个全局变量,包含 ATR 指标的源数据。
我在使用缓冲区时,不会切换到“序列”模式。
在初始化期间,我将所有空值设置为 0:
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0); PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
因此,我们只需要显示箭头或线条来示意条件触发,即全部保留在主循环之中。
我试图避免指标重绘,因此在零号烛条上执行绘制,而用于计算的数据均基于已收盘的烛条。
价格穿越指标线(趋势方向)
在最简单的情况下,只有“自然”形式的均线独演。 我确信,大家都在屏幕上看到过类似的画面:
图例 1. 简单均线
在大多数情况下,交易者参考 MA 来跟踪趋势。 趋势可以定义为一组烛条均位于曲线的一侧。 例如,如果有两根以上的烛条收盘价在该曲线以下,则趋势为熊市,此刻应考虑做空交易了。 如果收盘价高于该曲线,趋势为牛市,此刻应考虑做多... 如果价格越越曲线,我们就见证到趋势的变化。
允许我们跟踪均线突破的条件可能如下所示:
//--- main cycle for(i=start+3; i<rates_total && !IsStopped(); i++) { ArrowDownBuffer[i]=0; ArrowUpBuffer[i]=0; //--- if( ((close[i-1]<extMAData[i-1] && open[i-1]>extMAData[i-1] ) ||(close[i-2]>extMAData[i-2] && open[i-2]>extMAData[i-2] && close[i-1]<extMAData[i-1] && open[i-1]<extMAData[i-1] ) ) ) { ArrowDownBuffer[i]=high[i]+extATRData[i]/5; } else if( ((close[i-1]>extMAData[i-1] && open[i-1]<extMAData[i-1] ) ||(close[i-2]<extMAData[i-2] && open[i-2]<extMAData[i-2] && close[i-1]>extMAData[i-1] && open[i-1]>extMAData[i-1] ) ) ) { ArrowUpBuffer[i]=low[i]-extATRData[i]/5; } } // main cycle
取代检查开盘价,我们也许更要关注当前和之前柱线的收盘价。 如果它们位于曲线的不同侧面,我们就会看到一次突破。
指示文件 是 MA-Breaking.mq5。 在图表上运行它会产生以下图像(如果标准曲线周期为 10 根柱线):
图例 2. 均线突破
我相信,如果不经过额外的分拣,这种方法是没有用的。 看起来,即使在趋势区域,向上箭头的数量也几乎与向下箭头的数量相匹配。 当 МА 周期递增时,箭头的数量会减少,但这并无多大帮助,因为在趋势没有回滚的情况下出现急剧突破是非常罕见的。 在大多数情况下,剧烈走势之前会有一段横盘。 所以我们来寻找过滤器...
均线则作为支撑/阻力线
下一个相当明显的运用曲线的方式就是将其当作支撑线/阻力线。 如果价格触及该曲线,但尚未越过该曲线(在同一侧收盘),我们得到一个交易信号。 例如,在 2 月 17 日,我们可以看到 3 个向下移动点,如果没有额外的过滤器,则会产生一个向上移动点(在开始处)。
很自然,我们会依据这两个规则来开启第一笔交易,也可以在现有持仓的基础上加仓。
这一概念在 MA-Support.mq5 文件中得到了验证。
//--- main cycle for(i=start+3; i<rates_total && !IsStopped(); i++) { ArrowDownBuffer[i]=0; ArrowUpBuffer[i]=0; //--- if( (high[i-1]>=extMAData[i-1] && close[i-1]<extMAData[i-1] && open[i-1]<extMAData[i-1] ) ) { ArrowDownBuffer[i]=high[i]+extATRData[i]/5; } else if( (low[i-1]<=extMAData[i-1] && close[i-1]>extMAData[i-1] && open[i-1]>extMAData[i-1] ) ) { ArrowUpBuffer[i]=low[i]-extATRData[i]/5; } } // Main cycle end
以下是代码操作结果:
图例 3. 使用均线作为支撑/阻力线
这看起来比之前的选项更好。 如果我们使用止盈价位,甚至能简单地依据箭头累积订单,然后依据反向箭头离场(显然,是使用逆转),交易获利的可能性极高。
均线的周期越高,角度越低,距价格越远。 因此,遇到突破和回滚信号的频率较低,但随着支撑/阻力价位的变化,价位变得更可靠。 我给您看一张 20 周期的图表来进行比较。 我们可以看出回滚的频率较低。 然而,信号可能更可靠,因此止损价位可以降低。
图例 4. 大周期的均线(20)
例如,凌晨 4 点钟。 2 月 17 日,红色曲线提供买入信号,橙色曲线提供卖出信号,因此我们出现亏损。 然而,在红线的情况下,我们可以依据上午 8 点、上午 10 点和下午 3 点的信号来加仓。
在均线周期较高的情况下,信号到达的时间较晚,这可能会导致损失部分潜在利润,尽管交易的频率也许会降低。
坡度
直线坡度越陡,价格波动越快,下一根烛条上延续这种趋势的可能性就越大。
衡量坡度的最简单方法是使用当前值和以前值间的差值。 如果差值为正,曲线上行;如果差值为负,曲线下行。
MA-Slope.mq5 中主回路的代码如下所示:
//--- main cycle for(i=start+SlopeShift*2; i<rates_total && !IsStopped(); i++) { SlopeDownBuffer[i]=0; SlopeUpBuffer[i]=0; slopeIndex=(extMAData[i-1]-extMAData[i-1-SlopeShift]); //--- if( slopeIndex<0 ) { SlopeDownBuffer[i]=slopeIndex; } else if( slopeIndex>0 ) { SlopeUpBuffer[i]=slopeIndex; } } // main cycle
此处 SlopeShift 指定需传递的距离当前价格的柱线数量。 默认值为一。 但是我们可以通过增加这个值得到非常有趣的结果,例如,采用距均线二或三根柱线的差值。
我相信,结果曲线能够以直方图显示。 结果如下所示:
图例 5. 曲线坡度直方图
这张图片很有趣。
首先,很明显,我们可以很容易地跟踪和分拣随机走势波动。 事实上,如果曲线方向仅在一根、两根或三根柱线期间发生变化,那么谈论趋势变化可能还为时过早。 无论如何,我们都应该非常小心,不要错过它。
其次,比率的变化是立竿见影的。 正如我们所看到的,如果直方图柱线高度小于某个阈值,我们很可能就要面对一段横盘。 因此,顺着均线方向,若长于 2-3 根柱线的坡度很小,此时进行交易是不合理的。
第三,尽管趋势段上的曲线看起来几乎是单边上升或下降的,但真实的变化率在不同的柱线之间变化很大。 这意味着某种相对数值,这可能有助于揭示我们还看不到的东西。
尝试 (МА-Slope-Index-First.mq5)... 代码:
//--- main cycle for(i=start+SlopeShift*3; i<rates_total && !IsStopped(); i++) { SlopeDownBuffer[i]=0; SlopeUpBuffer[i]=0; slopeIndex=(extMAData[i-1]-extMAData[i-1-SlopeShift]+Point()/100) /(extMAData[i-2]-extMAData[i-2-SlopeShift]+Point()/100); //--- if( slopeIndex<0 ) { SlopeDownBuffer[i]=slopeIndex; } else if( slopeIndex>0 ) { SlopeUpBuffer[i]=slopeIndex; } } // main cycle
往被除数和除数中添加一个小数值(Point()/100)不会对结果产生太大的改变,但它允许我们避免除零错误。
图片如下:
图例 6. 均线坡度的相对指数
在交叉处可以看到尖峰。 如果我们将图表向左移动几根柱线,差值会变得更加明显。
图例 7. 均线坡度的相对指数 (向左移动)
图例 7 生动地展示了峰值是如何标记一段强劲走势的边界。 峰值与其余数据数组的差值相当大。 事实上,“峰值”在尺度上彼此如此不同,以及峰值和其余数据之间的差异也如此悬殊,这就导致了下一步。 由于方向变化如此显著,我并未看出分析相对坡度指数的直方图有什么意义。 取而代之,我们可以简单地将其二元化,令输出更粗略。 例如,像这样(МА-Slope-Index-Bin.mq5):
//--- main cycle for(i=start+SlopeShift*3; i<rates_total && !IsStopped(); i++) { SlopeDownBuffer[i]=0; SlopeUpBuffer[i]=0; slopeIndex=(extMAData[i-1]-extMAData[i-1-SlopeShift]+Point()/100) /(extMAData[i-2]-extMAData[i-2-SlopeShift]+Point()/100); //--- if( slopeIndex<=-SlopeThreshold ) { SlopeDownBuffer[i]=-1; } else if( slopeIndex>=SlopeThreshold ) { SlopeUpBuffer[i]=1; } } // Main cycle
此处,SlopeThreshold 是上一个示意图柱线高度的阈值,在该处触发信号。 在图像上,参数值等于 5。
图例 8. 均线坡度的相对指数 (二元). SlopeThreshold=5.
下一张图像上,SlopeThreshold=15
图例 9. 均线坡度的相对指数 (二元). SlopeThreshold=15.
这些条纹绝对值得仔细观察!
显然,这样的标记表明当前烛条的方向发生了变化,或于标记的烛条之后 2-3 根或更多根烛条之后出现变化。 在任何情况下,趋势都明显依赖于所标记的颜色、主力方向和实际烛条的组合。 当然,我们应该收集统计数据,例如,我在有关电子表格的文章中讲述的方式。 结合本文提供的其它方法,该指标看起来已经很有希望了...
当然,直方图上的二元条纹可以很容易地替换为箭头,与前面的指标类似。
基于单条移动平均线的通道
除上述方法外,我们还可以基于移动平均线建立通道,以便作为价格波动参考。 选项有很多。 我只研究这两个。
第一个非常简单,因为它只需要标准 MA 指标。 在图表上添加指标时,我们应该简单地加上级别。 唯一需要注意的是,每个时间帧都有自己的级别。 我将它们收集到一个“包”中,以避免每次切换时间帧时都要重新输入它们。 JPY 的图片如下所示:
图例 10. 通道级别列表
H1 上的最终图像如下所示:
图例 11. 级别外观(H1)
此处设置了回滚的级别。 故此,如果一根烛条触及某个级别,并从该级别上回滚(或非常接近该级别),那么就逆势入场。 例如,屏幕截图上的通道显示,2 月 22 日是做空的好时机。 我们可以在信号烛条的中段或结尾时下一笔订单(在此,如果我们在回滚后入场,订单可以设置在信号烛条的最低价位 - 115.100,而止损价位可以设置在 115.265)。 直接目标是触及平均值,而最终目标是触及同一通道的另一侧边界。
不过,在这种情况下,也可以在突破狭窄通道时进行交易。 例如,2 月 22 日,9 时的烛条在狭窄通道的边界之上收盘。 两根看涨烛条的收盘价高于平均水平,而两根看跌烛条之间的收盘价没有超出下边界。 均线坡度明显降低(如果我们查看图表上 MA-Slope 的设置,可以很清楚地看到这一点)。 所有这些都可以作为明确的做多信号。 停止价位可设置在 114.570,入场点可依据级别计算得出。 我们可以将其设定在 115.230。 备选,我们可以依据烛条或其它任何我们想要的方法来设定尾随停止。
请注意,在这段时间里只能看到两个通道:最内部的一个、和稍微大一点的一个。 如果我们切换到更高的时间帧,比如 D1,通道 +-50 几乎被隐藏;而 +-300 和 +-1500 可成为操作通道。 有时也可以看到月度通道。 它甚至可以提供信号,但最明显的通道会被当成主通道。
图例 12. 级别外观 (D1)
周线/月线都可以看到类似的图像。 第四个通道最适合它,而第三个通道可以用作内部和辅助通道。
最内部的通道是为 М1-М15 设计的。
调整原则是显而易见的:我们切换到必要的时间帧,选择级别的大小,这样我们就有了最小数量的接触点,同时它们之间也有了最大可能的振幅。 最简单的方法是测量当前时间帧内基础调整的幅度,并将其除以 2。 下面的动画演示了这个过程。
图例 13. 衡量通道波动性 (D1)
经过一些粗略评估后,我们可能需要更精确地调整大小,但这相当容易...
基于两条移动平均线的通道(ATR3x5)
上述通道很不错,但也有一些缺点。
首先,应该为每个时间帧和品种手工选择通道大小。 实现过程自动化似乎是一项艰巨的任务。
其次,这些级别不会存储在缓冲区当中,这意味着很难以编程方式取用它们。
基于移动平均线和 ATR 的通道则没有这样的缺点。 这个思路特简单。 我们采用 两条移动平均线指标,周期为 3。 其中一个应用最高价(high),另一个应用最低价(low)。 接下来,在相应方向上将所获曲线平移 5 周期 ATR的距离(向下的低点,向上的高点)。
通道准备就绪! 它完全适合任何品种,由于突破非常罕见,故它主要在回滚时工作。 我还添加了用于检测触及通道边界的箭头。
//--- main cycle for(i=start+3; i<rates_total && !IsStopped(); i++) { ArrowDownBuffer[i]=0; ArrowUpBuffer[i]=0; //--- MAUpBuffer[i]=extMAUpData[i]+extATRData[i]*DistanceCoefficient; MADownBuffer[i]=extMADownData[i]-extATRData[i]*DistanceCoefficient; if( (high[i-1]>=MAUpBuffer[i-1] && close[i-1]<MAUpBuffer[i-1]) ||( close[i-2]>MAUpBuffer[i-2] && close[i-1]<MAUpBuffer[i-1] ) ) { ArrowDownBuffer[i]=high[i]+extATRData[i]/5; } else if( (low[i-1]<=MADownBuffer[i-1] && close[i-1]>MADownBuffer[i-1]) ||( close[i-2]<MADownBuffer[i-2] &&close[i-1]>MADownBuffer[i-1] ) ) { ArrowUpBuffer[i]=low[i]-extATRData[i]/5; } }// main cycle
此处的 DistanceCoefficient 是一个指标参数,允许我们根据特定条件调整指标,改变到通道边界的距离。 该参数可以采用任何分数值。 然而,设置的数值超过 2 没有多大意义,因为在这种情况下箭头几乎完全消失,这意味着不会执行任何成交。
图例 14. ATR3x5 通道
当然,该指标可以与此处讲述(或未提到)的任何其它指标一起使用。
在查看图片时,关注价格如何与指标顶部和底部相互作用。 这也许会有帮助。
若干个不同周期的指标
到目前为止,我们已研究过用一条均线来接收入场买卖信号。 然而,许多交易员认为,若是添加另一个或若干个指标,可以大大提高入场的准确性。
故此,我们在创建图表时配合两条周期分别为 5 和 8 的曲线。 这些周期取自斐波那契级数。 其中一个周期描述的是“快速”线,而另一个描述的是“慢速”线。
图例 15. 一张图表上两条均线
除了已经研究过的特征,我们现在能够看到曲线的相对位置及其“同向性”(或发散)。 均线之间的距离也会显现。
每个参数都有可能增强或减弱每条曲线所显示的某些走势属性,并提供独立的入场信号。
相对位置。 均线交叉
如果快速均线位于慢速均线之上,我们很可能见证一个看涨趋势,下一根烛条看涨的概率非常高。 还应参考其它参数,例如信号线坡度斜率,以及其它参数。
如果快速均线低于慢速均线,我们有一个“全域”(当前时间帧)看跌趋势,随后每根烛条看跌的概率都会大幅增加,直到达到峰值...
如果快速均线突破了慢速均线,我们就认可趋势发生了变化。
我们来尝试开发针对均线交叉做出反应的指标。 此外,我们还应考虑到横盘,从而减少假入场。 这可以通过参考快速均线的坡度大小来完成。 在这种情况下,我们可以接收下一段代码来搜索信号(MA2-Breaking):
//--- main cycle for(i=start+3+SlopeShift*2; i<rates_total && !IsStopped(); i++) { ArrowDownBuffer[i]=0; ArrowUpBuffer[i]=0; //--- if( extMAFastData[i-1]<extMASlowData[i-1] && extMAFastData[i-2]>=extMASlowData[i-2] && MASlope(extMAFastData,i-1)<-SlopeThreshold && MASlope(extMASlowData,i-1)<SlopeThreshold/SlowDelimiter ) { ArrowDownBuffer[i]=high[i]+extATRData[i]/3; } else if( extMAFastData[i-1]>extMASlowData[i-1] && extMAFastData[i-2]<=extMASlowData[i-2] && MASlope(extMAFastData,i-1)>SlopeThreshold && MASlope(extMASlowData,i-1)>-SlopeThreshold/SlowDelimiter ) { ArrowUpBuffer[i]=low[i]-extATRData[i]/3; } } // main cycle
此处的 MASlope 是一个计算均线坡度的函数,其计算方式与坡度部分中提供的示例类似。 它接受所需曲线和柱线索引的数据数组作为参数执行计算。
SlopeTreshold — 快速均线坡度示意图的阈值。 您可能还记得,如果在穿越的瞬间,快速均线的坡度太小,我们很可能是在应对一段横盘。 这段横盘通常会受到大量误报所困扰,最终导致亏损。
SlowDelimiter — 慢速均线坡度阈值分隔符。 有时,当快速均线已经向下倾斜了,我们也许会得到一个非常好的信号,而慢速均线尽管接近反转,但却尚未反转。 换句话说,入场
MASlope(extMASlowData,i-1)>-SlopeThreshold/SlowDelimiter
它含义如下:慢速均线坡度可以有一个小的负数值(向下,尽管稍微向下),等于零,或者是正数值的,但不是急剧的负数值。
如果我们采用指标的“干净”形式,则应分别针对每种金融产品和时间帧来选择阈值和分隔符。 以下是 SlopeTreshold=0.017 和 SlowDelimiter=5 的情况下获得的 USDJPY H1 的结果:
图例 16. 参考坡度的均线交叉信号
图像没有曲线,如此箭头就可以看得更清楚。 如果我们选择正确的止盈值(或按级别退出),我们可以通过设置亏损不多的止损级别,几乎能从每个箭头中获利。
下图显示的是同一张图表(放大)。
图例 17. 参考坡度的均线穿越(放大)
您可能还记得,信号在零号烛条到达。 不过,分析是往前一个时间段。 所以,为了理解画箭头背后的原因,我们应该看看从绿线到左边的柱线之间的间隔。
为什么右边没有两个箭头? 坡度不超过慢速或快速均线的阈值,则指标认为该段为横盘。 然而,如果我依据这些信号在此区域进行交易,我很可能没有任何理由抱怨,因为若趋势进一步上升,则可能会生成更好的卖出价格。
图例 18. 交叉信号:趋势延续。
结束语
关于这件事我还有一些话要说,但这要放在另一篇文章里。
在本文中,我研究了与均线相关的基本问题,并允许我们跟踪总体价格走势方向。
此外,我还以图形方式展示了指标代码,展示了如何运用主要均线参数制定交易决策。
我已展示了通过组合知名指标的属性,并将其组合到一起来使用,从而改进交易策略的方法。
在下一篇文章中,我希望能揭示我们如何根据移动平均线的数据,和从它衍生出的指标来计算每根烛条的位置。
本文不保证此处包含的信息会为您的交易提供帮助。
愿盈利与您同在!
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/10479
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.


我试着用你的指标MA-Slope-Index-Bin.mq5做实验。我注意到,即使在有明显下降趋势的地区,它产生的正值也比负值多得多。起初我以为问题在于我使用了大的MA值,由于这个原因,MA变成了很羊的,在一个小值的分子和分母上加上 Point()/100,你用的是小值,就开始引入 相当大的扭曲了。试图以这种方式来减少它。
这并没有帮助--指标继续给出的正值比负值多得多。然后我意识到一个显而易见的问题:用减法除以减法得到的是加法。我必须改变算法中的一些东西,使指标正确。我还不知道怎么做。
这并没有帮助--指标继续给出的正值比负值多得多。然后我意识到了一个显而易见的问题:用减法除以减法得到加法。我需要改变算法中的一些东西,使指标正确。到目前为止,我还不明白是怎么回事。
在这种情况下,明显的(对我来说)应用如下:正值只是斜率的急剧增加(在同一方向),负值--方向的急剧改变。
如果你让它,这个指标,对自己的交易有用,你可以,例如,在显示箭头之前,检查之前的斜率和当前的斜率,如果它们重合,不显示箭头,如果它们不同--显示相应颜色的箭头。
由于我喜欢水平,我只是观察价格在急剧倾斜跳跃后的表现,例如,在默里或江恩水平(记住,区别是默里建议将重要的间隔除以8,而江恩建议减半或除以3,取决于其他传入的)。这是我的例子,中枢和纤维也很好...最主要的是--如果我看到水平面的斜率突然变化--我可以假设是反转。
我加一张图片来澄清之前的想法 :-)
丁香色的线是极值时间,通过它来建立沙拉水平(我简单地把间隔分成两半,并把两个间隔向上和两个向下(+-100%和+-200%)。
此外,2022年1月28日,出现了坡度急剧变化的信号。我们可以看到,斜率的主要方向是向上的(通过主要斜率指标[底部图表]或MA-box本身)...也就是说,价格已经上升到当天的水平对角线,事实上,已经从对角线上反弹了。价格在MA曲线之上。主要趋势是上升,但从对角线上的反弹表明会有修正。可能的交易选择。
你好!能提供一个MA-ATR3*5的MT4版本嘛