该策略是一种典型的移动平均线交叉交易策略。它利用快速移动平均线和慢速移动平均线的交叉点作为买卖信号。当快速移动平均线从下方上穿慢速移动平均线时,视为买入信号;当快速移动平均线从上方下穿慢速移动平均线时,视为卖出信号。该策略结合两个移动平均线,可以有效过滤市场噪音,识别趋势。
该策略主要通过以下几个步骤来实现:
设置快速移动平均线周期fastMA和慢速移动平均线周期slowMA。
根据输入类型Type,计算快速移动平均线fast和慢速移动平均线slow。Type=1时为简单移动平均线,Type=2时为指数移动平均线。
设置回测时间范围start和finish。
定义交叉函数:当fast从下方上穿slow时,产生买入信号;当fast从上方下穿slow时,产生卖出信号。
在交叉函数触发时,如果在回测时间范围内,则发出买入开仓或卖出平仓指令。
在回测窗口结束时或交叉函数下穿时,发出卖出关闭指令。
绘制快速移动平均线fast和慢速移动平均线slow的趋势图。
该策略通过快慢移动平均线的交叉来判断持有期内的趋势,并据此产生交易信号。同时设置回测时间窗口来模拟真实交易。
该策略具有以下优势:
利用移动平均线判断趋势效果好,可以有效过滤随机波动。
快慢移动平均线结合,可以识别趋势变化。
可以通过调整移动平均线参数来适应不同周期的趋势。
可以灵活选择简单移动平均线或指数移动平均线。
可以通过回测功能来测试和优化策略参数。
策略逻辑简单清晰,容易理解实现。
绘制移动平均线图形,可以直观判断趋势和效果。
该策略也存在一些风险:
在盘整范围内,可能产生错误信号。
移动平均线具有滞后性,可能错过转折点。
只依赖均线交叉,没有结合其他指标或条件过滤。
没有考虑交易成本的影响。
没有设置止损策略。
参数设置不合理可能影响策略效果。
回测时间范围选择不当,可能产生过拟合。
该策略可以从以下几个方面进行优化:
结合其他指标如MACD、RSI等来验证信号,提高准确率。
添加止损策略,控制单笔损失。
优化移动平均线参数,适应不同周期。
添加开仓仓位管理,不同市况采用不同仓位。
考虑交易成本,修改入场退出点位。
测试更长时间范围的数据,避免过拟合。
利用 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