Bollinger Band dan RSI Bercampur dengan Strategi DCA

Penulis:ChaoZhang, Tanggal: 2024-01-18 11:23:15
Tag:

img

Gambaran umum

Strategi ini disebut Bollinger Band dan RSI Mixing with DCA. Ini membangun sinyal perdagangan berdasarkan indikator Bollinger Band dan Relative Strength Index (RSI) dan mengelola risiko menggunakan rata-rata biaya dolar progresif (DCA).

Prinsip Strategi

Strategi ini mengintegrasikan indikator Bollinger Band dan RSI. Bollinger Band dengan jelas menilai tren di mana di atas band tengah berarti pasar bull dan di bawahnya berarti pasar bear. RSI menunjukkan situasi overbuy dan overselling. Strategi ini membangun indikator MIX dengan mempertimbangkan deviasi Bollinger Band dan nilai K dari RSI. Sinyal panjang dihasilkan ketika indikator MIX menerobos 20 dari bawah.

Untuk bagian DCA progresif, posisi awal dibuka ketika MIX menembus 20. Posisi tambahan ditambahkan dengan jumlah tetap setiap kali harga turun sebesar persentase tetap. Ini dilanjutkan sampai posisi maksimum tercapai atau stop loss / take profit dipicu. Dengan menambahkan posisi pada titik terendah pasar beberapa kali, biaya rata-rata dapat diturunkan secara progresif.

Keuntungan dari Strategi

  1. Menggabungkan dua indikator meningkatkan akurasi sinyal dengan penilaian tren yang lebih jelas.

  2. DCA progresif menurunkan basis biaya selama penurunan, mengurangi risiko kerugian sambil meningkatkan rentang keuntungan.

  3. Mengambil keuntungan dan menghentikan kerugian kondisi segera mengendalikan risiko dan mengunci sebagian keuntungan.

  4. Filter rentang tanggal yang ditambahkan memungkinkan backtest terfokus dan pengoptimalan periode tertentu.

Risiko dan Solusi

  1. Kedua Bollinger Band dan RSI dapat mengalami kegagalan. Kombinasi parameter yang berbeda dapat diuji untuk akurasi sinyal terbaik.

  2. DCA progresif dapat meningkatkan kerugian selama kecelakaan besar dengan terus menambahkan posisi. entri maksimum dapat ditetapkan bersama dengan tingkat stop loss yang tepat untuk pengendalian risiko yang lebih baik.

  3. Peristiwa angsa hitam dan pergerakan harga yang tidak normal tidak dapat diprediksi.

Arahan Optimasi

  1. Uji dan optimalkan parameter untuk indikator MIX untuk mendapatkan sinyal perdagangan yang lebih akurat.

  2. Optimalkan stop loss, ambil parameter keuntungan untuk rasio profit/loss terbaik.

  3. Uji ukuran dan frekuensi posisi penjumlahan yang berbeda untuk menemukan kombinasi yang optimal.

  4. Pertimbangkan untuk menambahkan modul kontrol volume perdagangan ke strategi buka/tutup berdasarkan kondisi volume.

Ringkasan

Bollinger Band dan RSI Mixing with DCA Strategy menggabungkan beberapa teknik dan metode kuantitatif. Ini membangun indikator penilaian tren yang jelas dan menurunkan dasar biaya melalui penambahan progresif. Metode pengendalian risiko yang ketat termasuk stop loss dan take profit membuatnya praktis. Pengujian dan optimalisasi lebih lanjut dapat membuka keunggulan uniknya menjadi sistem perdagangan yang menguntungkan.


/*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')


Lebih banyak