渐变均线交易策略是一种基于两条不同参数设置的指数移动平均线(Exponential Moving Average,EMA)的交叉信号来进行交易的策略。它使用一条较短周期的EMA线和一条较长周期的EMA线,当它们交叉时来产生交易信号,由快线向上穿越慢线时做多,向下穿越时平仓。该策略还结合止损、追踪止损等风险管理手段来锁定利润、控制风险。
该策略的核心指标是两条EMA线:快线和慢线。快线参数默认设置为13日线,反应价格变化更为灵敏;慢线参数默认设置为48日线,对价格变化响应更为缓慢。当短线快速上涨,快线会先于慢线上涨;当短线下跌,快线也会比慢线更快下跌。因此,快线向上突破慢线是一个长线上涨信号;快线向下跌破慢线则是一个长线下跌信号。
根据这个原理,该策略在快线从下向上突破慢线时做多,表示价格开始上涨,可以买入;当快线从上向下跌破慢线时平仓,表示上涨趋势结束,应适时止盈了结。为控制风险,策略还设置了初始止损和追踪止损:初始止损距离为入场价的8%,追踪止损距离则默认为120点。这可以在价格反转时尽早止损,减小亏损。
代码实现上,该策略通过crossover和crossunder这两个函数来判定EMA交叉信号,在交叉发生时触发对应的entry和close来进行买入和平仓。
渐变均线交易策略具有以下优势:
策略信号简单明确,容易理解实现,适合新手学习;
均线指标对市场噪音的滤波效果好,可以发现趋势的变化;
可配置性强,快慢线参数、止损点位都可以自定义设置;
结合止损手段,可以有效控制风险。
具有一定的稳定性。
该策略也存在一定的风险:
在市场剧烈波动时,EMA交叉信号可能滞后,无法及时反映价格变化;
速度过快的均线指标参数调整,可能会产生更多错误信号;
行情趋势较弱时,EMA交叉也较少,无法有效捕捉价格行情。
策略本身没有考虑大级别的趋势分析,在市场整体趋势不明朗时,容易产生与大趋势背离的交易。
以上风险可以通过以下手段加以缓解:
结合其他指标来确认均线交叉信号,如MACD、KD等;
根据不同市场调整EMA参数,降低错误信号率;
增加趋势判断模块,参考长期均线判断整体行情方向。
该策略可以从以下几个方向进行优化:
增加开仓条件过滤,避免在震荡行情中产生过多不必要交易。可以结合波动率、交易量等指标来设定开仓阈值;
结合市场的高低点、支撑位等来设定止损止盈位置,提高止损止盈的准确性;
增加趋势判断模块,用更高时间框架下的长期趋势来过滤短期信号,避免与大趋势形成背离;
可以通过机器学习来训练和优化EMA参数,使其更加适合实际市场情况,降低错误信号率。
以上几点是该策略未来可以改进和优化的主要方向。适当结合更多指标和风险管理手段,会使该EMA交叉策略的效果更好。
渐变均线交易策略是一个基础的趋势跟随策略。它使用EMA快线和慢线交叉来判断价格趋势,并结合止损手段控制风险。该策略信号简单清晰,容易理解使用,特别适合新手学习,是量化入门的典型策略之一。但它也存在一定的滞后性和误报风险。未来可以通过引入更多指标和手段来优化和改进该策略,使其在更复杂的市场环境中稳定运行。
/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
// *** USE AT YOUR OWN RISK ***
//
strategy("EMA Strategy", shorttitle = "EMA Strategy", overlay=true, pyramiding = 3,default_qty_type = strategy.percent_of_equity, default_qty_value = 10)
// === Inputs ===
// short ma
maFastSource = input(defval = close, title = "Fast MA Source")
maFastLength = input(defval = 13, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource = input(defval = close, title = "Slow MA Source")
maSlowLength = input(defval = 48, title = "Slow MA Period", minval = 1)
// invert trade direction
tradeInvert = input(defval = false, title = "Invert Trade Direction?")
// risk management
useStop = input(defval = true, title = "Use Initial Stop Loss?")
slPoints = input(defval = 25, title = "Initial Stop Loss Points", minval = 1)
useTS = input(defval = true, title = "Use Trailing Stop?")
tslPoints = input(defval = 120, title = "Trail Points", minval = 1)
useTSO = input(defval = false, title = "Use Offset For Trailing Stop?")
tslOffset = input(defval = 20, title = "Trail Offset Points", minval = 1)
// === Vars and Series ===
fastMA = ema(maFastSource, maFastLength)
slowMA = ema(maSlowSource, maSlowLength)
plot(fastMA, color=blue)
plot(slowMA, color=purple)
goLong() => crossover(fastMA, slowMA)
killLong() => crossunder(fastMA, slowMA)
strategy.entry("Buy", strategy.long, when = goLong())
strategy.close("Buy", when = killLong())
// Shorting if using
goShort() => crossunder (fastMA, slowMA)
killShort() => crossover(fastMA, slowMA)
//strategy.entry("Sell", strategy.short, when = goShort())
//strategy.close("Sell", when = killShort())
if (useStop)
strategy.exit("XLS", from_entry ="Buy", stop = strategy.position_avg_price / 1.08 )
strategy.exit("XSS", from_entry ="Sell", stop = strategy.position_avg_price * 1.08)