该策略通过构建双层超趋势通道,结合价格突破通道进行交易信号产生。同时利用价格波动率调整通道宽度,实现自适应效果。属于趋势跟踪类策略。
计算价格的标准差和波动率ATR,根据波动率调整超趋势通道的宽度。
构建双层超趋势通道,内层通道更为灵敏,外层通道更稳定。
当价格突破内层或外层超趋势通道时,产生买入或卖出信号。
采用双层通道结构,可以过滤掉部分假突破。
波动率ATR用于调整通道宽度,当波动加大时通道宽度增加,实现自适应效果。
超趋势通道简单易用,可以较好跟踪趋势。
双层通道结构可以提高信号质量,过滤假突破。
波动率自适应调整通道宽度,使通道更符合不同市场环境。
易于实施,参数调整也较为简单。
可视化通道及突破情况,形成直观的交易信号。
突破信号可能出现误判,导致不必要的亏损。
无法判断趋势方向,存在逆势交易风险。
自适应调整可能过于灵敏,调整幅度过大。
参数优化不当可能导致过度优化。
作为趋势追踪策略,uddle行情下容易获利不足或亏损。
测试不同参数对通道自适应效果的影响。
尝试结合均线等指标判断大趋势方向。
优化突破确认机制,避免假突破。
添加止损策略,控制单笔亏损。
评估调整通道参数对交易频率的影响。
可以通过机器学习算法动态优化参数。
该策略使用双层自适应超趋势通道捕捉价格趋势。优点是简单直观,可以有效跟踪趋势。但也存在一些突破误判和趋势判断错误的风险。通过参数优化以及配套机制的补充,可以进一步改进策略效果,将其打造成一个稳定高效的趋势追踪系统。
/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("SuperTrend Cloud Strategy", shorttitle="SuperTrend Cloud Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital = 1000)
//Inputs
multi = input(title="Multiplier", type=input.float, step=0.1, defval=3, minval=1)
period = input(title="Period", type=input.integer, step=1, defval=10, minval=1)
SelfAdjust = input(title="Self-Adjusting", type=input.bool, defval = false)
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
// From Date Inputs
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 = 2019, title = "From Year", minval = 1970)
// To Date Inputs
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 = 1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
////////////////////////////////////////////////////////////////////////////////
dev = stdev(close, period)
stdDev = (dev / close) * 100 + 1
MultDev = SelfAdjust ? multi * stdDev : multi
up_lev1 = hl2 - MultDev * atr(period)
dn_lev1 = hl2 + MultDev * atr(period)
up_lev2 = hl2 - (MultDev * 2 * atr(period))
dn_lev2 = hl2 + (MultDev * 2 * atr(period))
up_trend1 = 0.0
up_trend1 := close[1] > up_trend1[1] ? max(up_lev1, up_trend1[1]) : up_lev1
up_trend2 = 0.0
up_trend2 := close[1] > up_trend2[1] ? max(up_lev2, up_trend2[1]) : up_lev2
down_trend1 = 0.0
down_trend1 := close[1] < down_trend1[1] ? min(dn_lev1, down_trend1[1]) : dn_lev1
down_trend2 = 0.0
down_trend2 := close[1] < down_trend2[1] ? min(dn_lev2, down_trend2[1]) : dn_lev2
trend1 = 0
trend1 := close > down_trend1[1] ? 1: close < up_trend1[1] ? -1 : nz(trend1[1], 1)
trend2 = 0
trend2 := close > down_trend2[1] ? 1: close < up_trend2[1] ? -1 : nz(trend2[1], 1)
st_line1 = trend1 == 1 ? up_trend1 : down_trend1
st_line2 = trend2 == 1 ? up_trend2 : down_trend2
// Plotting
plot1 = plot(st_line1, color = trend1 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 1")
plot2 = plot(st_line2, color = trend2 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 2")
fill(plot1, plot2, color = color.aqua, title = "Cloud")
buy = crossover(close, st_line1) and close > st_line2 or crossover(close, st_line2) and close > st_line1
sell = crossunder(close, st_line1) and close < st_line2 or crossunder(close, st_line2) and close < st_line1
if(buy and time_cond)
strategy.entry("long", long = true , comment="long")
if (close < st_line1 and time_cond or close < st_line2 and time_cond)
strategy.close("long")
if (not time_cond)
strategy.close_all()