移动平均线交叉策略


创建日期: 2023-09-21 10:28:27 最后修改: 2023-09-21 10:28:27
复制: 0 点击次数: 517
avatar of ChaoZhang ChaoZhang
1
关注
1295
关注者

概述

该策略是一种典型的移动平均线交叉交易策略。它利用快速移动平均线和慢速移动平均线的交叉点作为买卖信号。当快速移动平均线从下方上穿慢速移动平均线时,视为买入信号;当快速移动平均线从上方下穿慢速移动平均线时,视为卖出信号。该策略结合两个移动平均线,可以有效过滤市场噪音,识别趋势。

策略原理

该策略主要通过以下几个步骤来实现:

  1. 设置快速移动平均线周期fastMA和慢速移动平均线周期slowMA。

  2. 根据输入类型Type,计算快速移动平均线fast和慢速移动平均线slow。Type=1时为简单移动平均线,Type=2时为指数移动平均线。

  3. 设置回测时间范围start和finish。

  4. 定义交叉函数:当fast从下方上穿slow时,产生买入信号;当fast从上方下穿slow时,产生卖出信号。

  5. 在交叉函数触发时,如果在回测时间范围内,则发出买入开仓或卖出平仓指令。

  6. 在回测窗口结束时或交叉函数下穿时,发出卖出关闭指令。

  7. 绘制快速移动平均线fast和慢速移动平均线slow的趋势图。

该策略通过快慢移动平均线的交叉来判断持有期内的趋势,并据此产生交易信号。同时设置回测时间窗口来模拟真实交易。

优势分析

该策略具有以下优势:

  1. 利用移动平均线判断趋势效果好,可以有效过滤随机波动。

  2. 快慢移动平均线结合,可以识别趋势变化。

  3. 可以通过调整移动平均线参数来适应不同周期的趋势。

  4. 可以灵活选择简单移动平均线或指数移动平均线。

  5. 可以通过回测功能来测试和优化策略参数。

  6. 策略逻辑简单清晰,容易理解实现。

  7. 绘制移动平均线图形,可以直观判断趋势和效果。

风险分析

该策略也存在一些风险:

  1. 在盘整范围内,可能产生错误信号。

  2. 移动平均线具有滞后性,可能错过转折点。

  3. 只依赖均线交叉,没有结合其他指标或条件过滤。

  4. 没有考虑交易成本的影响。

  5. 没有设置止损策略。

  6. 参数设置不合理可能影响策略效果。

  7. 回测时间范围选择不当,可能产生过拟合。

优化方向

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

  1. 结合其他指标如MACD、RSI等来验证信号,提高准确率。

  2. 添加止损策略,控制单笔损失。

  3. 优化移动平均线参数,适应不同周期。

  4. 添加开仓仓位管理,不同市况采用不同仓位。

  5. 考虑交易成本,修改入场退出点位。

  6. 测试更长时间范围的数据,避免过拟合。

  7. 利用 walks forward analysis 不断优化参数。

总结

移动平均线交叉策略是一个简单实用的趋势跟踪策略。它可以过滤随机性波动,识别趋势方向。但也存在一些问题如滞后性,应该与其他指标组合使用。通过持续优化测试可以使策略效果更好,在实盘中应用也更安全可靠。整体来说,该策略适合对趋势判断要求不高的投资者。

策略源码
/*backtest
start: 2023-09-13 00:00:00
end: 2023-09-20 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy("MavCrossover v2", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

// Revision:        1
// Author:          @ToS_MavericK

// === INPUT SMA ===
fastMA  = input(defval = 13,  title = "FastMA", minval = 1, step = 1)
slowMA  = input(defval = 144,  title = "SlowMA", minval = 1, step = 1)
Type    = input(defval = 1,  title = "Type (1 = SMA, 2 = EMA)", minval = 1, maxval = 2, step = 1)
SlowMAIsFactor = input(false)

slowMA := SlowMAIsFactor == true ? round(fastMA * slowMA) : slowMA

// === 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 = 2018, title = "From Year", minval = 2012)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 2020, title = "To Year", minval = 2012)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

// === MA SETUP ===
fast = Type == 1 ? sma(close, fastMA) : ema(close, fastMA)
slow = Type == 1 ? sma(close, slowMA) : ema(close, slowMA)

// === EXECUTION ===
strategy.entry("L", strategy.long, when = crossover(fast, slow) and window())   // buy long when "within window of time" AND crossover
strategy.close("L", when = crossunder(fast, slow) or time > finish)             // sell long when window ends OR crossunder         

plot(fast, title = 'FastMA', color = yellow, linewidth = 2, style = line)  // plot FastMA
plot(slow, title = 'SlowMA', color = aqua, linewidth = 2, style = line)    // plot SlowMA