移动平均线方向反转交易策略


创建日期: 2023-09-28 15:50:01 最后修改: 2023-09-28 15:50:01
复制: 2 点击次数: 538
avatar of ChaoZhang ChaoZhang
1
关注
1308
关注者

概述

移动平均线方向反转交易策略是一种当移动平均线连续几根柱出现同向上涨或下跌时,判断趋势发生转折的交易策略。该策略通过判断移动平均线的方向,来确定持续看涨或看跌的交易机会。

策略原理

移动平均线方向反转交易策略的核心逻辑是:

  1. 计算选择的移动平均线,可以选择简单移动平均线SMA、指数移动平均线EMA、加权移动平均线WMA或线性回归平均线。

  2. 判断当前周期移动平均线与上一周期移动平均线的大小关系,如果当前移动平均线高于上一周期,则赋值1,反之赋值0。

  3. 记录连续向上和连续向下的周期数。如果当前周期移动平均线高于上一周期,则连续向上周期数+1,连续向下周期数清零;如果当前周期移动平均线低于上一周期,则连续向下周期数+1,连续向上周期数清零。

  4. 当连续向上或连续向下的周期数超过用户定义的阈值时,进行相应的做多或做空操作。

  5. 同时,对K线柱颜色和背景颜色进行染色,以直观显示趋势方向。

  6. 可选地绘制移动平均线的变化曲线,标记转折点。

该策略通过统计移动平均线连续多少根K线的方向来判断趋势, timeout通过持续看涨或看跌时间的长短来进行交易,而不是单看一根K线的情况,可以有效过滤震荡对交易的影响。

策略优势

移动平均线方向反转交易策略具有以下优势:

  1. 使用移动平均线判断趋势方向,可以有效过滤市场噪音。

  2. 统计一定周期内移动平均线方向的持续变化,判断趋势反转时机,减少交易风险。

  3. 可以自定义移动平均线参数和统计周期参数,适应不同品种和行情环境。

  4. 对K线染色直观显示趋势方向变化,形成视觉辅助。

  5. 可以选择不同类型的移动平均线,具有灵活性。

  6. 描绘移动平均线变化曲线,可以清楚观察是否出现转折。

  7. 规则简单清晰,容易理解实现,适合新手学习使用。

策略风险

移动平均线方向反转交易策略也存在一定的风险:

  1. 移动平均线本身滞后性会影响及时抓取转折点。

  2. 统计一定周期延迟做多做空决策,可能错过较快反转的机会。

  3. 持续周期设定过长可能错过趋势,设定过短则容易被套。

  4. 震荡行情中可能产生大量空头交易信号。

  5. 仅依靠移动平均线方向不能完全判断真实趋势反转,存在一定的假信号风险。

  6. 行情剧烈变化时,移动平均线指标本身也会快速变动,产生错误信号的概率较大。

  7. 须关注移动平均线选取参数的合理性,否则会出现失效情况。

对应解决方法:

  1. 适当缩短移动平均线周期,提高灵敏性。

  2. 结合其他指标过滤信号,确认趋势反转。

  3. 优化统计周期参数,在反应速度和稳定性间找到平衡。

  4. 加大套利止损幅度,控制亏损。

  5. 采用多种移动平均线组合,提高准确性。

优化方向

移动平均线方向反转交易策略可从以下几个方面进行优化:

  1. 优化移动平均线参数,测试不同长度周期的移动平均线,找到最佳参数。可以尝试SMA、EMA、WMA三者组合。

  2. 结合其他辅助指标,如RSI、KD等,提高信号的可靠性。

  3. 优化统计连续周期数参数,确保反映趋势反转的同时尽可能过滤假信号。

  4. 添加止损机制,以控制单笔交易亏损。

  5. 测试不同品种参数优化效果,根据不同交易品种调整参数。

  6. 考虑将固定统计周期改为自适应统计周期,让策略更灵活。

  7. 尝试Breakout方式开仓,在移动平均线实际突破时入场。

  8. 增加对整体趋势方向的判断,避免逆势交易。

  9. 改进移动平均线曲线绘制方式,如增加曲线平滑度等。

总结

移动平均线方向反转交易策略通过统计移动平均线连续上涨或下跌周期数,来判断持续跟踪趋势的时机。它可以有效过滤市场噪音,在趋势发生转折时及时抓取机会。该策略通过可自定义的移动平均线参数和统计周期数,可以灵活适应不同交易品种和市场环境。但移动平均线本身的滞后性,容易对快速反转产生识别延迟。因此需要对参数进行优化调整,并辅助其他技术指标来提升信号准确性。总体来说,移动平均线方向反转交易策略具有易于掌握的优点,是一种实用且值得推荐的交易策略。

策略源码
/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Moving Average Consecutive Up/Down Strategy (by ChartArt)", overlay=true)

// ChartArt's Moving Average Consecutive Up/Down Strategy
//
// Version 1.0
// Idea by ChartArt on December 30, 2015.
//
// This strategy goes long (or short) if there are several
// consecutive increasing (or decreasing) moving average
// values in a row in the same direction.
//
// The bars can be colored using the raw moving average trend.
// And the background can be colored using the consecutive
// moving average trend setting. In addition a experimental
// line of the moving average change can be drawn.
//
// The strategy is based upon the "Consecutive Up/Down Strategy"
// created by Tradingview.


// Input
Switch1 = input(true, title="Enable Bar Color?")
Switch2 = input(true, title="Enable Background Color?")
Switch3 = input(false, title="Enable Moving Average Trend Line?")

ConsecutiveBars = input(4,title="Consecutive Trend in Bars",minval=1)

// MA Calculation
MAlen = input(1,title="Moving Average Length: (1 = off)",minval=1)
SelectMA = input(2, minval=1, maxval=4, title='Moving Average: (1 = SMA), (2 = EMA), (3 = WMA), (4 = Linear)')
Price = input(close, title="Price Source")
Current =
 SelectMA == 1 ? sma(Price, MAlen) :
 SelectMA == 2 ? ema(Price, MAlen) :
 SelectMA == 3 ? wma(Price, MAlen) :
 SelectMA == 4 ? linreg(Price, MAlen,0) :
 na
Last =
 SelectMA == 1 ? sma(Price[1], MAlen) :
 SelectMA == 2 ? ema(Price[1], MAlen) :
 SelectMA == 3 ? wma(Price[1], MAlen) :
 SelectMA == 4 ? linreg(Price[1], MAlen,0) :
 na

// Calculation
MovingAverageTrend = if Current > Last
    1
else
    0

ConsecutiveBarsUp = MovingAverageTrend > 0.5 ? nz(ConsecutiveBarsUp[1]) + 1 : 0
ConsecutiveBarsDown = MovingAverageTrend < 0.5 ? nz(ConsecutiveBarsDown[1]) + 1 : 0
BarColor = MovingAverageTrend > 0.5 ? green : MovingAverageTrend < 0.5 ? red : blue
BackgroundColor = ConsecutiveBarsUp >= ConsecutiveBars ? green : ConsecutiveBarsDown >= ConsecutiveBars ? red : gray
MovingAverageLine = change(MovingAverageTrend) != 0 ? close : na

// Strategy
if (ConsecutiveBarsUp >= ConsecutiveBars)
    strategy.entry("ConsUpLE", strategy.long, comment="Bullish")
    
if (ConsecutiveBarsDown >= ConsecutiveBars)
    strategy.entry("ConsDnSE", strategy.short, comment="Bearish")

// output
barcolor(Switch1?BarColor:na)
bgcolor(Switch2?BackgroundColor:na)
plot(Switch3?MovingAverageLine:na, color=change(MovingAverageTrend)<0?green:red, linewidth=4)
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)