趋势追踪EMA策略是一种基于EMA指标的趋势跟踪策略。该策略通过计算指定周期的EMA线,判断价格趋势方向,实现趋势追踪。当价格上穿EMA线时做空,当价格下穿EMA线时做多,属于典型的趋势跟踪策略。
该策略主要基于EMA指标来判断价格趋势。EMA指标是一种对价格的指数平滑移动平均,它对最近的价格赋予更高的权重,能更快地响应价格变化。策略通过计算EMA周期内的平均价格, Produce 平滑的曲线。当价格从下方上穿EMA线时,表示价格开始上涨,属于看涨信号;当价格从上方下穿EMA线时,表示价格开始下跌,属于看跌信号。
根据这个原理,该策略在价格上穿EMA时做空,下穿EMA时做多,通过追踪EMA线来跟踪价格趋势的变化。具体来说,它在代码中计算了一个8周期的EMA线,在关闭价上穿EMA线时开仓做空,下穿EMA线时开仓做多。并且设置了止损点来控制风险。
可能发生错过Tuning point的风险。当价格快速反转时,EMA线需要一定时间来做调整,可能错过最佳入场时机。解决方法是结合其他指标判断Tuning point。
存在增大亏损的风险。EMA线起到的是趋势跟踪作用,不能准确判断Tuning point。如果价格反转,可能造成较大亏损。解决方法是设置合理的止损位。
交易频率可能过高或过低。EMA周期不同,producage 策略的交易频率也不同。周期过短可能导致过度交易,周期过长可能错过机会。解决方法是测试不同EMA参数,找到最佳周期。
优化EMA参数,找到最佳平衡点。可以通过步进优化来确定最佳的EMA周期数值。
加入其他指标判断Tuning point。例如结合RSI等超买超卖指标,可以更好地判断价格拐点。
优化止损策略,找到最佳止损点。通过回测可以测试不同的止损点,找到最大限度锁住利润的止损位置。
优化品种选择。根据不同品种的特点,调整EMA周期参数,产生最佳效果。
趋势跟踪EMA策略是一个非常典型的基于指标的趋势跟踪策略。它简单直接,容易实现,适合初学者学习。同时也具有可扩展性,可通过加入其他指标或优化参数来进一步提升策略效果。通过不断优化与改进,该策略可以成为一个非常实用的趋势跟踪工具。
/*backtest start: 2022-10-09 00:00:00 end: 2023-10-15 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title = "EMA Close Strategy", shorttitle = "EMA Close",calc_on_order_fills=true,calc_on_every_tick =true, initial_capital=21000,commission_value=.25,overlay = true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100) EmaSource = input(defval = close, title = "EMA Source") EmaLength = input(defval = 8, title = "EMA Period", minval = 1) StartYear = input(2018, "Backtest Start Year") StartMonth = input(1, "Backtest Start Month") StartDay = input(1, "Backtest Start Day") stopLoss = input(30, title = "Stop loss percentage(0.1%)") UseStopLoss = input(true,"UseStopLoss") window() => time >= timestamp(StartYear, StartMonth, StartDay,00,00) ? true : false EMA = ema(EmaSource,EmaLength) plot(EMA, title = "EMA", color = green, linewidth = 2, style = line, transp = 50) long = crossunder(EMA, close) short= crossover(EMA, close) if (long) strategy.entry("LongId", strategy.long, when=window()) if (short) strategy.entry("ShortId", strategy.short, when=window()) if (UseStopLoss) strategy.exit("StopLoss", "LongId", loss = close * stopLoss / 1000 / syminfo.mintick) strategy.exit("StopLoss", "ShortId", loss = close * stopLoss / 1000 / syminfo.mintick)