移动平均线交叉策略是一种非常经典和常用的技术分析策略。该策略的核心思想是利用不同期间的移动平均线之间的交叉作为买卖信号。当短期移动平均线从下方上穿较长期的移动平均线时,产生买入信号;当短期移动平均线从上方下穿较长期的移动平均线时,产生卖出信号。
该策略通过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时止盈出场
针对风险,可以从以下方面进行优化:
该策略可以从以下几个方面进行优化:
移动平均线交叉策略是一个非常典型和常用的技术分析策略。该策略核心思路简单,容易实现,适用于各个市场,是量化交易的入门策略之一。但该策略也存在一些问题,如产生频繁信号,容易止损等。通过适当优化,可以大大提高该策略的实盘表现。总体来说,移动平均线交叉策略提供了一个非常好的策略开发框架,是量化交易策略学习的基石。
/*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] )