常用移动平均线交叉策略


创建日期: 2023-11-03 17:23:54 最后修改: 2023-11-03 17:23:54
复制: 0 点击次数: 579
avatar of ChaoZhang ChaoZhang
1
关注
1333
关注者

常用移动平均线交叉策略

概述

移动平均线交叉策略是一种非常经典和常用的技术分析策略。该策略的核心思想是利用不同期间的移动平均线之间的交叉作为买卖信号。当短期移动平均线从下方上穿较长期的移动平均线时,产生买入信号;当短期移动平均线从上方下穿较长期的移动平均线时,产生卖出信号。

策略原理

该策略通过input设置输入移动平均线的类型(SMA,EMA,WMA,RMA)和周期长度,以及回测的时间范围。

在variant函数中计算不同类型的移动平均线。计算出的移动平均线通过ma变量保存。

当close价格上穿ma时,产生买入信号;当close价格下穿ma时,产生卖出信号。

为了设置止损,通过atr计算出14周期的平均真实波动幅度。以穿越点作为参考,向上或向下加减2倍atr作为止损范围。

具体入场和出场逻辑如下:

多头入场:close上穿ma且在回测时间内,止损点为入场点close 多头出场:close下穿 ma减去2倍atr时止损出场,或最高价超过入场点close加2倍atr时止盈出场 空头入场:close下穿ma且在回测时间内,止损点为入场点close 空头出场:close上穿ma加上2倍atr时止损出场,或最低价低于入场点close减2倍atr时止盈出场

策略优势

  1. 策略思路简单明晰,容易理解和实现
  2. 应用广泛,适用于不同市场和品种
  3. 参数设置灵活,移动平均线类型和周期可调
  4. 采用ATR止损,有助于控制风险

策略风险

  1. 移动平均线策略容易产生频繁交易和止损,降低盈利空间
  2. 大幅震荡行情中,移动平均线产生误导信号的可能性较大
  3. ATR止损范围可能过大或过小,无法达到防止巨额亏损的效果

针对风险,可以从以下方面进行优化:

  1. 调整移动平均线周期,采用较长周期平均线
  2. 增加过滤条件,避免在震荡行情中频繁交易
  3. 优化ATR的参数或采用其他止损方式
  4. 结合趋势指标判断大趋势,避免逆势操作

策略优化方向

该策略可以从以下几个方面进行优化:

  1. 增加过滤条件,如交易量,波动率等,避免非理性突破
  2. 采用自适应ATR止损方式,让止损范围随市场波动率变化
  3. 结合 Stoch,RSI等指标进行多因子验证,提高信号质量
  4. 增加趋势判断,避免逆势操作
  5. 采用时间EXIT,避免长期兑现亏损
  6. 优化移动平均线周期参数,寻找最佳参数组合

总结

移动平均线交叉策略是一个非常典型和常用的技术分析策略。该策略核心思路简单,容易实现,适用于各个市场,是量化交易的入门策略之一。但该策略也存在一些问题,如产生频繁信号,容易止损等。通过适当优化,可以大大提高该策略的实盘表现。总体来说,移动平均线交叉策略提供了一个非常好的策略开发框架,是量化交易策略学习的基石。

策略源码
/*backtest
start: 2023-10-03 00:00:00
end: 2023-11-02 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MA Cross Strategy", overlay=true,commission_value = 0.1)

type = input(defval = "WMA", title = "MA Type: ", options=["RMA", "SMA", "EMA", "WMA"])

length = input(28)
source = close



// === INPUT BACKTEST RANGE ===
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2000, title = "From Year", minval = 2000)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(9999, 1, 1, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"



variant(type, src, len) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v5 = wma(src, len)                                                  // Weighted
    v7 = rma(src, len)                                                  // Smoothed
    type=="EMA"?v2 : type=="WMA"?v5 : type=="RMA"?v7 : v1
ma = variant(type,source, length)


atr = security(syminfo.tickerid, "D", atr(14))

range = valuewhen(cross(close,ma), (atr*2), na)

ep = valuewhen(cross(close,ma), close, na)

plot(ma,color=ma>ma[1]?color.blue:color.red,transp=0,linewidth=1)
plot(ep,color=#2196f3,transp=100,trackprice=true, offset=-9999)
plot(ep+range,color=#2196f3,transp=100,trackprice=true, offset=-9999)
plot(ep-range,color=#2196f3,transp=100,trackprice=true, offset=-9999)

strategy.entry("Long Entry", true, when = crossover(close,ma)  and window() , stop  = ep ) 
strategy.exit("Long Exit", "Long Entry", stop  = ep-range) 
strategy.exit("Long Exit", "Long Entry", when = high > ep+range ,stop = ep[1] ) 

strategy.entry("Short Entry", false, when = crossunder(close,ma)  and window() , stop  = ep ) 
strategy.exit("Short Exit", "Short Entry", stop  = ep+range) 
strategy.exit("Short Exit", "Short Entry", when = low < ep-range ,stop = ep[1] )