この戦略は,トレンドを追跡するために,波リンジャー帯を使用して,低波動性の不利な市場条件をフィルタリングするために,ADX指標と組み合わせて,長期と短期の取引のブレイクポイントを特定します.
戦略は主に長または短方向を決定するためのボリンジャーバンド指標に基づいている.ボリンジャーバンドの中央帯は閉店価格のN日移動平均値であり,帯幅は標準偏差を使用して計算される.下帯の下のブレイクアウトはロングトレードをシグナルし,上帯上のブレイクアウトはショートトレードをシグナルする.
非トレンド変動市場における無効なブレイクアウトや誤った取引を避けるため,戦略は低変動市場の条件をフィルタリングするためにADX指標を組み込む. ADX値が限界値を下回る場合にのみ取引信号が生成される. ADXが限界値を超えると,トレンド条件を待つためにすべてのポジションが閉鎖される.
ストップ・ロスは,オープン・トレードでストップ・ロスを設定し,プロフィートを取る.具体的には,ポジションを開いた後,前N日の最低価格と最高価格がストップ・ロストとプロフィートのレベルとして記録される.これは,逆転による損失を削減しながら,利益をロックすることができます.
コードロジックから,戦略は最初にボリンジャーバンドとADXパラメータを計算する.その後,価格がバンド上または下帯を突破し,ADXが
他の指標と組み合わせてブレイクアウトをボリュームで確認する.傾向の変化を特定するために傾斜を使用したADXフィルターを最適化する.早速離脱を避けるためにストップ・ロスを拡大し,利益範囲を拡大する.
この戦略は,トレンドの機会を把握するために,トレンド条件のためにADXによってフィルタリングされた,明らかなブレイクアウト信号のためのボリンジャーバンドを使用して,明確でシンプルな論理を持っています.ストップ損失と利益を取ることはリスクを制御し利益をロックするために使用されます.理解し,実装するのが簡単で,戦略は基本的なトレンドフォローシステムとしてさらなるテストと最適化に価値があります.
/*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)