该策略基于平均真实波幅指标ATR来判断趋势方向,在趋势上涨时做多,在趋势下跌时做空,属于趋势跟踪类型的策略。
该策略首先计算价格的简单移动平均线sma和指数移动平均线ema。然后计算ATR指标,即过去N天的平均波动范围。
策略通过ema平均线、上轨(ema + ATR * 系数)和下轨(ema - ATR * 系数)来判断趋势方向。当价格上穿上轨时,做多;当价格下穿下轨时,做空。
代码主要逻辑:
通过ATR动态调整仓位,能够有效跟踪趋势 Directions。
解决方法: 1. 大幅震荡市场下,宜暂停策略,或采用其他指标 2. 优化参数,降低开仓频率 3. 针对重要数据事件,提高止损比率 4. 根据具体品种,调整ATR取值范围
该ATR趋势追踪策略整体思路清晰,通过ATR指标判断趋势方向,属于典型的趋势跟踪策略。策略优点是简单易操作,能够有效跟踪趋势;但也存在一定风险,需要针对不同市场环境进行优化调整,才能发挥策略的最大效用。总体来说,该策略作为一种量化交易工具还具有很大的拓展空间和运用价值。
/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Investoz
//@version=4
strategy("ATR Strategy FOREX", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
len = input(26, type=input.integer, minval=1, title="Length")
mul = input(2.618, type=input.float, minval=0, title="Length")
mullow = input(2.386, type=input.float, minval=0, title="Length")
price = sma(close, 1)
average = ema(close, len)
diff = atr(len) * mul
difflow = atr(len) * mullow
bull_level = average + diff
bear_level = average - difflow
bull_cross = crossunder(price, bear_level)
bear_cross = crossunder(bull_level, price)
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 18, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2008, title = "From Year", minval = 2008)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 2020, title = "To Year", minval = 2019)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
startTimeOk() => true
if (startTimeOk()) and ema(close,1) > ema(close,528)
strategy.entry("KOP", strategy.long, when=bull_cross)
strategy.close("KOP", when=bear_cross)
if (startTimeOk()) and ema(close,1) < ema(close,528)
strategy.entry("SALJ", strategy.short, when=bear_cross)
strategy.close("SALJ", when=bull_cross)
plot(price, title="price", color=color.black, transp=50, linewidth=2)
a0 = plot(average, title="average", color=color.red, transp=50, linewidth=1)
a1 = plot(bull_level, title="bull", color=color.green, transp=50, linewidth=1)
a2 = plot(bear_level, title="bear", color=color.red, transp=50, linewidth=1)
fill(a0, a1, color=color.green, transp=97)
fill(a0, a2, color=color.red, transp=97)