Strategi ini dinamakan
Strategi ini mengintegrasikan indikator Bollinger Band dan RSI. Bollinger Band dengan jelas menilai trend di mana di atas band tengah bermaksud pasaran lembu dan di bawahnya bermaksud pasaran beruang. RSI menunjukkan situasi overbuy dan overselling. Strategi ini membina penunjuk MIX dengan menimbang penyimpangan Bollinger Band dan nilai K RSI. Isyarat panjang dihasilkan apabila penunjuk MIX memecahkan 20 dari bawah.
Untuk bahagian DCA progresif, kedudukan awal dibuka apabila MIX menembusi 20. Posisi tambahan ditambah pada jumlah tetap setiap kali harga jatuh dengan peratusan tetap. Ini diteruskan sehingga kedudukan maksimum dicapai atau stop loss / take profit dicetuskan. Dengan menambah kedudukan pada paras terendah pasaran beberapa kali, kos purata boleh diturunkan secara progresif.
Menggabungkan dua penunjuk meningkatkan ketepatan isyarat dengan penilaian trend yang lebih jelas.
DCA progresif mengurangkan asas kos semasa penurunan, mengurangkan risiko kerugian sambil meningkatkan julat keuntungan.
Mengambil keuntungan dan menghentikan kerugian syarat segera mengawal risiko dan mengunci dalam keuntungan separa.
Penapis julat tarikh yang ditambahkan membolehkan backtest tertumpu dan pengoptimuman tempoh tertentu.
Kedua-dua Bollinger Band dan RSI mungkin mengalami kegagalan. Kombinasi parameter yang berbeza boleh diuji untuk ketepatan isyarat yang terbaik.
DCA progresif boleh meningkatkan kerugian semasa kemalangan besar dengan terus menambah kedudukan.
Peristiwa angsa hitam dan pergerakan harga yang tidak normal tidak dapat diramalkan. penapis risiko sistem yang menggunakan indeks utama dapat membantu mengelakkan tempoh yang tidak normal.
Uji dan optimumkan parameter untuk penunjuk MIX untuk mendapatkan isyarat perdagangan yang lebih tepat.
Mengoptimumkan parameter stop loss, mengambil keuntungan untuk nisbah keuntungan / kerugian terbaik.
Uji saiz dan kekerapan kedudukan penjumlahan yang berbeza untuk mencari kombinasi yang optimum.
Pertimbangkan untuk menambah modul kawalan jumlah dagangan kepada strategi pembukaan/penutupan berdasarkan keadaan jumlah.
/*backtest start: 2023-01-11 00:00:00 end: 2024-01-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © lagobrian23 //@version=4 strategy(title = 'Bollinger Bands and RSI mix with DCA', shorttitle = 'BB/RSI with DCA',pyramiding = 20, calc_on_every_tick = true, overlay = false ) source=close smoothK = input(3, "K", minval=1) smoothD = input(3, "D", minval=1) lengthRSI = input(14, "RSI Length", minval=1) lengthStoch = input(14, "Stochastic Length", minval=1) src = input(close, title="RSI Source") rsi1 = rsi(src, lengthRSI) k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK) d = sma(k, smoothD) // Bollinger Band length = input(20,title = 'BB lookback length', minval=1) mult = input(2.0, minval=0.001, maxval=50, title="StdDev") basis = sma(src, length) dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev BBval = (src - basis)/dev*30+50 offset = input(0, title = "Offset", type = input.integer, minval = -500, maxval = 500) mix=(d + BBval)/2 //plot //plot(k, "K", color=#606060) plot(BBval, "BBval", color=#872323, offset = offset) plot(d, "D", color=#FF6A00) h0 = hline(80, "Upper Band", color=#606060) h1 = hline(20, "Lower Band", color=#606060) plot(mix, "MIX", color=#888888, linewidth=3) //background MIX bgcolor(mix < 20 ? color.green : color.white, transp=50) bgcolor(mix > 80 ? color.red : color.white, transp=50) // Choosing the date range fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12) fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31) fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 1970) toMonth = input(defval = 1, title = "To Month", type = input.integer, minval = 1, maxval = 12) toDay = input(defval = 1, title = "To Day", type = input.integer, minval = 1, maxval = 31) toYear = input(defval = 2112, title = "To Year", type = input.integer, minval = 1970) start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(toYear, toMonth, toDay, 23, 59) // backtest finish window window() => true // Initializing the strategy paraeters P = input(defval = 1, title = 'Amount (P)' , type = input.integer, minval = 1, maxval = 100) X = input(defval = 2, title = '% Price drop for consecutive entries(X)', type = input.float, minval = 1, maxval = 100) B_tp = input(defval = 10, title = '% Level for Take Profit (B)', type = input.float , minval = 1, maxval = 100) D_sl = input(defval = 10, title = '% Level for Stop Loss (D)', type = input.float, minval = 1, maxval = 100) A = input(defval = 5, title = 'Max consecutive entries (A)', type = input.integer, minval = 2, maxval = 20) Z = input(defval = 0.5, title = 'Z', type = input.float , minval = 0, maxval = 10) // Declaring key DCA variables entry_price = 0.0 entry_price := na(entry_price[1]) ? na : entry_price[1] new_entry = 0.0 consec_entryCondition = false // Implementing the strategy longEntry = crossover(mix,20) exitLongs = crossunder(mix, 80) if(longEntry) entry_price := close strategy.entry('main_LE', strategy.long , P, when = window() and longEntry) // Exiting conditions stoploss = strategy.position_avg_price*(1-(D_sl/100)) takeprofit = strategy.position_avg_price*(1+(B_tp/100)) slCondition = crossunder(close, stoploss) tpCondition = crossover(close, takeprofit) // We want to exit if the 'mix' indicator crosses 80, take profit is attained or stop loss is tagged. exitConditions = exitLongs or slCondition or tpCondition // Consecutive entries upto A times // strategy.risk.max_intraday_filled_orders(A) //Dollar-Cost-Averaging // Enter long whenever price goes down X%: amount set to (P+Y)*Z newAmount = (P+X)*Z // If we haven't reached max open trades, buy newAmount immediately price crosses under X% lower the previous entry price new_entry := entry_price - ((X/100)*entry_price) consec_entryCondition := crossunder(close, new_entry) if(consec_entryCondition and strategy.opentrades != A) strategy.entry('consec_LE', strategy.long, newAmount, oca_name = 'consecLongs', when = window() and consec_entryCondition) entry_price := close // Exiting // The main trade is closed only when the main exit conditions are satisfied strategy.close('main_LE', comment = 'Main Long Closed', when = window() and exitConditions) // A consective long is closed only when tp or sl is tagged strategy.exit('ext a consec', 'consec_LE', loss = D_sl*strategy.position_avg_price , profit = B_tp*strategy.position_avg_price, oca_name = 'consecLongs')