Strategi ini menggunakan Bollinger Bands untuk mengenal pasti titik pecah untuk perdagangan panjang dan pendek, digabungkan dengan penunjuk ADX untuk menapis keadaan pasaran yang tidak baik dengan turun naik yang rendah, untuk mengikuti trend.
Strategi ini terutamanya berdasarkan penunjuk Bollinger Bands untuk menentukan arah panjang atau pendek. Band tengah Bollinger Bands adalah purata bergerak N hari harga penutupan, dan lebar band dikira menggunakan penyimpangan standard. Penembusan di bawah band bawah menandakan perdagangan panjang, sementara penembusan di atas band atas menandakan perdagangan pendek.
Untuk mengelakkan penembusan yang tidak sah dan perdagangan yang salah di pasaran yang bergolak, strategi ini menggabungkan penunjuk ADX untuk menapis keadaan pasaran turun naik yang rendah. Isyarat perdagangan hanya dihasilkan apabila nilai ADX di bawah ambang. Apabila ADX melebihi ambang, semua kedudukan ditutup untuk menunggu keadaan trend.
Strategi ini juga menetapkan stop loss dan mengambil keuntungan untuk perdagangan terbuka. Khususnya, selepas membuka kedudukan, harga terendah dan harga tertinggi N hari sebelumnya direkodkan sebagai stop loss dan mengambil tahap keuntungan untuk arah itu. Ini membolehkan mengunci keuntungan sambil mengurangkan kerugian dari pembalikan.
Dari logik kod, strategi pertama kali mengira Bollinger Bands dan parameter ADX. Kemudian ia memeriksa jika harga melanggar Bands band atas atau bawah, dan jika ADX di bawah ambang, untuk menjana isyarat perdagangan. Selepas itu tahap stop loss dan mengambil keuntungan dikemas kini secara dinamik dan dikesan berdasarkan arah kedudukan semasa.
Pertimbangkan untuk menggabungkan dengan penunjuk lain untuk mengesahkan penembusan dengan jumlah; mengoptimumkan penapis ADX menggunakan cerun untuk mengenal pasti perubahan trend; meluaskan julat stop loss dan mengambil keuntungan untuk mengelakkan keluar awal.
Strategi ini mempunyai logik yang jelas dan mudah, menggunakan Bollinger Bands untuk isyarat pecah yang jelas, disaring oleh ADX untuk keadaan trend, untuk menangkap peluang trend. Hentikan kerugian dan ambil keuntungan digunakan untuk mengawal risiko dan mengunci keuntungan. Mudah difahami dan dilaksanakan, strategi ini bernilai ujian dan pengoptimuman lanjut sebagai sistem trend berikut asas.
/*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)