Strategi ini menggunakan Bollinger Bands untuk mengidentifikasi titik breakout untuk perdagangan panjang dan pendek, dikombinasikan dengan indikator ADX untuk menyaring kondisi pasar yang tidak menguntungkan dengan volatilitas rendah, untuk mengikuti tren.
Strategi ini terutama didasarkan pada indikator Bollinger Bands untuk menentukan arah panjang atau pendek. Band tengah Bollinger Bands adalah rata-rata pergerakan N-hari dari harga penutupan, dan lebar band dihitung menggunakan penyimpangan standar.
Untuk menghindari terobosan yang tidak valid dan perdagangan yang salah di pasar yang bergolak, strategi ini menggabungkan indikator ADX untuk menyaring kondisi pasar volatilitas rendah. Sinyal perdagangan hanya dihasilkan ketika nilai ADX berada di bawah ambang batas. Ketika ADX melampaui ambang batas, semua posisi ditutup untuk menunggu kondisi tren.
Strategi ini juga menetapkan stop loss dan take profit untuk perdagangan terbuka. Secara khusus, setelah membuka posisi, harga terendah dan harga tertinggi dari N hari sebelumnya dicatat sebagai stop loss dan take profit level untuk arah itu. Hal ini memungkinkan mengunci keuntungan sambil mengurangi kerugian dari pembalikan.
Dari logika kode, strategi pertama menghitung Bollinger Bands dan parameter ADX. Kemudian memeriksa apakah harga melanggar Bands band atas atau bawah, dan jika ADX berada di bawah ambang, untuk menghasilkan sinyal perdagangan. Setelah itu tingkat stop loss dan take profit secara dinamis diperbarui dan dilacak berdasarkan arah posisi saat ini.
Pertimbangkan untuk menggabungkan dengan indikator lain untuk mengkonfirmasi breakout dengan volume; mengoptimalkan filter ADX menggunakan kemiringan untuk mengidentifikasi perubahan tren; memperluas stop loss dan mengambil profit range untuk menghindari keluar prematur.
Strategi ini memiliki logika yang jelas dan sederhana, menggunakan Bollinger Bands untuk sinyal breakout yang jelas, disaring oleh ADX untuk kondisi tren, untuk menangkap peluang tren. Stop loss dan take profit digunakan untuk mengontrol risiko dan mengunci keuntungan. Mudah dipahami dan diimplementasikan, strategi ini layak untuk pengujian lebih lanjut dan optimasi sebagai sistem trend berikut dasar.
/*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)