该策略通过SuperTrend指标识别长线入场机会。它利用平均真实范围ATR和乘数确定动态支撑位,进行长仓入场。策略重点关注长仓交易机会。
根据ATR周期和乘数计算上轨和下轨。当价格突破上轨时看涨,突破下轨时看跌。
计算当前趋势,1表示看涨,-1表示看跌。价格突破上轨时趋势由跌转涨,触发买入信号;突破下轨时趋势由涨转跌,触发卖出信号。
结合移动平均作为趋势过滤,突破上轨时要求价格高于MA才买入,突破下轨时要求价格低于MA才卖出,避免假突破。
可视化显示助手标记趋势、交易信号等情况,辅助判断。
该策略具有以下优点:
使用SuperTrend指标可以动态跟踪价格变化,及时反映趋势转折。
ATR止损方式可以根据市场波动调整止损位,有利锁定利润。
结合MA滤除假突破,可以有效过滤震荡市场的噪声交易信号。
可视化设计直观展示交易策略与市场情况,操作简便。
只交易趋势转折点,非常适合长线持仓。
该策略主要存在以下风险:
SuperTrend指标对参数敏感,多空线调整频繁,可能出现频繁交易。
在震荡行情中,止损线会被频繁触发。
未考虑交易成本,小资金会受交易费用影响较大。
未设置止损,回撤风险较大。
趋势滤波可能错过部分机会。
可以通过以下方式降低风险:
优化ATR参数,降低多空线调整频率。
增加等效K线过滤,避免被高频小波动止损。
设置止损止盈保护利润。
适当调整移动平均周期,平衡过滤效果。
优化资金管理,降低交易成本影响。
该策略可以从以下方面进行优化:
测试不同的价格源,如收盘价,最高价等。
尝试其他动态止损指标,如Chandelier Exit。
增加仓位管理模块,优化资金使用效率。
结合波动率指标refine入场时机。
添加止损、止盈模块,控制风险。
针对不同市场调整参数。
探索机器学习算法实现参数优化。
组合其他指标判断,提高过滤准确率。
该策略使用SuperTrend整合动态止损判断趋势,并辅以MA进行趋势过滤识别长线买入时机。可视化设计简化操作。通过优化参数设置和功能扩展,可以成为稳定可靠的长线交易策略。
/*backtest
start: 2020-09-13 00:00:00
end: 2023-09-19 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("SuperTrend Long Strategy", overlay=true, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=50000)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR = input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr = changeATR ? atr(Periods) : atr2
up = src - (Multiplier * atr)
up1 = nz(up[1], up)
up := close[1] > up1 ? max(up, up1) : up
dn = src + (Multiplier * atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
// Moving Average as Trend Filter
periodes_ma = input(title="Moving Average Period", type=input.integer, defval=20)
src_ma = input(title="Moving Average Source", type=input.source, defval=close)
ma = sma(src_ma, periodes_ma)
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1 and close > ma
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0))
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1 and close < ma
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0))
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.new(color.green, 70) : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.new(color.red, 70) : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highlighter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highlighter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2018, title = "From Year", minval = 999)
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 = 9999, title = "To Year", minval = 999)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish ? true : false
longCondition = buySignal
if (longCondition)
strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
strategy.close("BUY")
strategy.entry("SELL", strategy.short, when = window())
buy1 = barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)