Bollinger Band dan RSI Bercampur dengan Strategi DCA

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

img

Ringkasan

Strategi ini dinamakan Bollinger Band dan RSI Campuran dengan DCA. Ia membina isyarat perdagangan berdasarkan penunjuk Bollinger Band dan Indeks Kekuatan Relatif (RSI) dan menguruskan risiko menggunakan purata kos dolar progresif (DCA).

Prinsip Strategi

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.

Kelebihan Strategi

  1. Menggabungkan dua penunjuk meningkatkan ketepatan isyarat dengan penilaian trend yang lebih jelas.

  2. DCA progresif mengurangkan asas kos semasa penurunan, mengurangkan risiko kerugian sambil meningkatkan julat keuntungan.

  3. Mengambil keuntungan dan menghentikan kerugian syarat segera mengawal risiko dan mengunci dalam keuntungan separa.

  4. Penapis julat tarikh yang ditambahkan membolehkan backtest tertumpu dan pengoptimuman tempoh tertentu.

Risiko dan Penyelesaian

  1. Kedua-dua Bollinger Band dan RSI mungkin mengalami kegagalan. Kombinasi parameter yang berbeza boleh diuji untuk ketepatan isyarat yang terbaik.

  2. DCA progresif boleh meningkatkan kerugian semasa kemalangan besar dengan terus menambah kedudukan.

  3. 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.

Arahan pengoptimuman

  1. Uji dan optimumkan parameter untuk penunjuk MIX untuk mendapatkan isyarat perdagangan yang lebih tepat.

  2. Mengoptimumkan parameter stop loss, mengambil keuntungan untuk nisbah keuntungan / kerugian terbaik.

  3. Uji saiz dan kekerapan kedudukan penjumlahan yang berbeza untuk mencari kombinasi yang optimum.

  4. Pertimbangkan untuk menambah modul kawalan jumlah dagangan kepada strategi pembukaan/penutupan berdasarkan keadaan jumlah.

Ringkasan

Bollinger Band dan RSI Campuran dengan Strategi DCA menggabungkan pelbagai teknik dan kaedah kuantitatif. Ia membina penunjuk penghakiman trend yang jelas dan menurunkan asas kos melalui penambahan progresif. Kaedah kawalan risiko yang ketat termasuk stop loss dan mengambil keuntungan menjadikannya praktikal. Ujian dan pengoptimuman lanjut dapat membuka kelebihan uniknya ke dalam sistem perdagangan yang menguntungkan. Dengan kedua-dua mencari keuntungan dan kawalan risiko dalam fikiran, ia bernilai disahkan dengan perdagangan langsung dan aplikasi.


/*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 lanjut