
この戦略は,多空の突破点を探すためにブリン帯の指標を使用し,ADX指標と組み合わせて低波動の不利な動きをフィルターして,トレンド追跡を実現する.
この戦略は,主にブリン帯の指標に基づいて多空方向を判断する.ブリン帯の中央線は,N日の閉盘価格の移動平均であり,帯域は標準差で計算される.価格が下軌道に突入すると,多頭信号として判断する.価格が上軌道に突入すると,空頭信号として判断する.
非トレンドの動きの無効突破による誤った取引を避けるために,この戦略はADX指標を融合して低波動的動きをフィルターする.ADX値が設定された値を下回った場合にのみ,買入シグナルを発信する.ADX値が値を超えると,すべてのポジションを平らにして,トレンドの逆転を待つ.
この戦略はまた,リセットストップと上向き追尾ストップを設定している.具体的には,開設したポジションごとに,前N日の最低価格をその方向のリセットストップとして記録し,最高価格を上向き追尾ストップとして記録する.これは,利潤をロックし,同時に逆転による損失を最小限に抑えることができる.
コード論理からすると,この戦略はまずブリン帯とADX指標パラメータを計算する.その後,価格がブリン帯を突破して下落したかどうかを判断し,ADX値が値より低いかどうかを判断し,満たされた場合,買入シグナルを生成する.その後,ポジションとポジションの方向性に応じて,リアルタイムで更新し,ストップ・ロスの位置を追跡する.
他の指標の判断量サポートを組み合わせて,VALIDを突破することを保証する;トレンド転換点を判断するためにADX曲線の斜率を使用してADXフィルタリング条件を最適化する;ストップオフの範囲を適切に緩め,ストップオフに近すぎないようにする.
この戦略の全体的な構想は明快で簡潔で,ブリン帯で明確な多空突破信号を判断し,ADX指標で明確なトレンドがないChoppy取引をフィルタリングしてトレンドの機会をロックする.同時に,リスクを管理し,利益をロックするためにリコール・ストップと追跡ストップを設定する.この戦略は,実装を容易に理解し,さらなるテストと最適化に値し,基本的なトレンド追跡戦略になることができる.
/*backtest
start: 2023-10-26 00:00:00
end: 2023-11-02 00:00:00
period: 1m
basePeriod: 1m
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/
// © tweakerID
// This strategy uses Bollinger Bands to buy when the price
// crosses over the lower band and sell when it crosses down
// the upper band. It only takes trades when the ADX is
// below a certain level, and exits all trades when it's above it.
//@version=4
strategy("BB + ADX Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100)
//Inputs
i_reverse=input(false, title="Reverse Trades")
i_ADXClose=input(true, title="ADX Close")
i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(20, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=0, step=.5, title="SL Expander")
i_TPExpander=input(defval=0, step=.5, title="TP Expander")
//ADX Calculations
adxlen = input(14, title="ADX Smoothing")
dilen = input(20, title="DI Length")
dirmov(len) =>
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
adxlevel=input(30, step=5)
//BB Calculations
BBCALC=input(false, title="-----------BB Inputs-----------")
length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50)
MAlen=input(defval=9)
source = close
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev
//Entry Logic
BUY = crossover(source, lower) and sig < adxlevel
SELL = crossunder(source, upper) and sig < adxlevel
//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander)
lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander))
sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0
SL= islong ? LSL : isshort ? SSL : na
TP= islong ? lTP : isshort ? sTP : na
//Entries
strategy.entry("long", long=i_reverse?false:true, when=BUY)
strategy.entry("short", long=i_reverse?true:false, when=SELL)
//EXITS
if i_ADXClose
strategy.close_all(when=sig > adxlevel)
if i_SL
strategy.exit("longexit", "long", stop=SL, limit=TP)
strategy.exit("shortexit", "short", stop=SL, limit=TP)
//Plots
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL")
plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP")
plot(upper)
plot(lower)