Strategi Volatilitas Harga Pembalikan Rata-rata RSI


Tanggal Pembuatan: 2023-09-26 19:55:03 Akhirnya memodifikasi: 2023-09-26 19:55:03
menyalin: 2 Jumlah klik: 749
1
fokus pada
1617
Pengikut

Ringkasan

Strategi ini menggunakan indikator RSI untuk mengidentifikasi peluang oversold, masuk dalam batch ketika harga turun, dan mencapai keuntungan jangka panjang dengan terus-menerus menurunkan biaya kepemilikan dengan nilai rata-rata. Strategi ini juga bergabung dengan mekanisme DCA untuk mengendalikan risiko lebih lanjut.

Prinsip Strategi

Strategi ini pertama-tama menghitung indikator RSI untuk menentukan apakah pasar oversold. Ketika RSI di bawah 30, ini menandakan adanya peluang oversold. Pada saat ini, jika harga di bawah 100 siklus rata-rata, maka lebih banyak posisi dibuka.

Setelah membuka posisi, strategi akan mengatur 6 harga kembalian nilai rata-rata, masing-masing 98% , 97%, 95%, 90%, 84% dan 70% dari harga saat ini. Ketika harga menyentuh harga ini, posisi akan terus ditambahkan. Dengan demikian, biaya kepemilikan posisi dapat dikurangi dengan terus menerus rata-rata.

Selain itu, strategi ini juga menghitung harga rata-rata untuk memegang posisi. Jika harga naik lebih dari 5% dari harga rata-rata, mulailah berhenti. Sementara itu, jika harga terus naik, lebih dari 5% dari harga rata-rata dari harga berhenti, semuanya berhenti.

Akhirnya, strategi ini juga menambahkan mekanisme DCA. Setiap hari Senin, jika ada posisi yang dipegang, dan harganya lebih rendah dari harga rata-rata, posisi dengan jumlah tetap ditambahkan. Hal ini lebih lanjut mengurangi biaya kepemilikan.

Analisis Keunggulan

Keuntungan terbesar dari strategi ini adalah pengendalian risiko dengan menggunakan nilai rata-rata dan mekanisme DCA. Secara khusus, strategi ini mencakup:

  1. Dengan menggunakan strategi masuk dalam kelompok, Anda dapat menyebarkan risiko untuk membuka posisi dan menghindari kehilangan titik terendah.

  2. Mengatur beberapa nilai rata-rata harga pengembalian, Anda dapat terus-menerus mengurangi biaya kepemilikan posisi dan secara efektif mengendalikan risiko penurunan.

  3. Perhitungan harga rata-rata kepemilikan, penghentian tepat waktu setelah keuntungan, penguncian keuntungan.

  4. Menerapkan mekanisme DCA untuk mengurangi biaya kepemilikan dan mengendalikan risiko.

  5. Menggunakan indikator RSI untuk menentukan kapan pasar, hindari posisi di titik tinggi.

  6. Menggunakan filter linear untuk menghindari terbaliknya posisi.

Analisis risiko

Strategi ini juga memiliki beberapa risiko, yang meliputi:

  1. Strategi ini tidak dapat menentukan titik balik pasar, dan jika terjadi pasar yang terus-menerus rendah, terus-menerus melakukan lebih banyak akan meningkatkan kerugian.

  2. Strategi ini tidak mempertimbangkan mekanisme stop loss dan tidak dapat secara efektif mengendalikan kerugian tunggal.

  3. Strategi ini tidak membatasi jumlah posisi yang dibuka, dan posisi akan terus meningkat jika pasar mengalami penurunan tajam.

  4. DCA memiliki risiko waktu dan tidak menjamin bahwa posisi akan dibuka pada titik terendah.

Solusi yang sesuai:

  1. Struktur pasar dapat dilihat dengan kombinasi indikator lain untuk menghindari ketergantungan pada RSI saja.

  2. Peningkatan stop loss mobile atau stop loss scaling.

  3. Untuk mencegah terjadinya overload, membatasi jumlah deposit.

  4. Optimalkan waktu buka posisi DCA dengan cara yang lebih stabil.

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Optimalkan algoritma Regression Mean Value untuk menghitung Regression Value dengan cara yang lebih ilmiah.

  2. Optimalkan penangguhan dengan menggunakan penangguhan bergerak atau penangguhan tangga.

  3. Meningkatkan strategi stop loss untuk mengendalikan kerugian tunggal.

  4. Menghindari ketergantungan pada RSI saja, dengan menggunakan indikator lain untuk menilai struktur pasar.

  5. Mengoptimalkan logika pembukaan posisi DCA, menghindari risiko pembukaan posisi pada waktu yang tetap.

  6. Tambahkan modul manajemen posisi untuk mengoptimalkan ukuran posisi

  7. Pengaturan parameter yang dioptimalkan untuk membuat strategi lebih sesuai dengan karakteristik statistik pasar.

  8. Menambahkan logika switching, cara strategi switching dalam lingkungan pasar yang berbeda.

Meringkaskan

Strategi ini secara keseluruhan adalah strategi investasi jangka panjang dengan nilai rata-rata yang masuk dalam batch dengan menggunakan titik penilaian RSI. Ini sangat cocok untuk pasar mata uang digital yang sangat berfluktuasi saat ini, yang dapat secara efektif memanfaatkan zona getaran untuk manajemen biaya kepemilikan.

Kode Sumber Strategi
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
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/
//@version=4
// © A3Sh

// RSI Strategy that buys the dips, works with Price Averaging and has a Dollar Cost Average option.
// When the price drops below specified percentages of the price (6 PA layers), new entries are openend to average the price of the assets.
// Open entries are closed by a specified take profit.
// Entries can be reopened, after closing and consequently crossing a PA layer again.
// The idea is to lower the average position price to a point that when the market rises, the current price crosses over the average position price.
// When the current price crosses the average position size and reaches the specified take profit, all entries are closed at once.
// In case the market drops significantly, there is an option to activate DCA to lower the average price further.

// RSI code adapted from the Optimized RSI Buy the Dips strategy, by Coinrule
// https://www.tradingview.com/script/Pm1WAtyI-Optimized-RSI-Strategy-Buy-The-Dips-by-Coinrule/
// Pyramiding entries code adapted from Pyramiding Entries on Early Trends startegy, by Coinrule
// https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
// Plot entry layers code adapted from HOWTO Plot Entry Price by vitvlkv
// https://www.tradingview.com/script/bHTnipgY-HOWTO-Plot-Entry-Price/
// Buy every week code based on the following question in Stack Overflow
// https://stackoverflow.com/questions/59870411/in-pine-script-how-can-you-do-something-once-per-day-or-keep-track-if-somethin


strategy(title = "RSI+PA+DCA", pyramiding = 16, overlay = true, initial_capital = 400, default_qty_type = strategy.percent_of_equity, default_qty_value = 15, commission_type = strategy.commission.percent, commission_value = 0.075)

port = input(15, title = "Portfolio %", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
q = (strategy.equity / 100 * port) / open

// Long position entry layers. Percentage from the entry price of the the first long
PositionInputs = input("++++", title = "+++++ Long Positions VA Layers +++++")

ps2 = input(2,  title = "2nd Long Entry %", step = 0.1)
ps3 = input(3,  title = "3rd Long Entry %", step = 0.1)
ps4 = input(5,  title = "4th Long Entry %", step = 0.1)
ps5 = input(10, title = "5th Long Entry %", step = 0.1)
ps6 = input(16, title = "6th Long Entry %", step = 0.1)


// Calculate Moving Averages
maInput = input("++++", title = "+++++ Moving Average Filter +++++")

plotMA = input(title = "Plot Moving Average", defval = false)
movingaverage_signal = sma(close, input(100))
plot (plotMA ? movingaverage_signal : na, color = color.white)

// RSI inputs and calculations
rsiInput = input( "++++", title = "+++++ RSI Inputs +++++" )

length =     input( 14 )
overSold =   input( 30, title = "oversold, entry trigger long position" )
overBought = input( 70, title = "overbought, has no specific function")
price = close
vrsi = rsi(price, length)

// Long trigger (co)
co = crossover(vrsi, overSold) and close < movingaverage_signal

// Take profit
takeprofit = input("++++", title = "+++++ Take Profit +++++")

ProfitTarget_Percent = input(5)


// Store values to create and plot the different DCA layers
long1 = valuewhen(co, close, 0)
long2 = valuewhen(co, close - (close / 100 * ps2), 0)
long3 = valuewhen(co, close - (close / 100 * ps3), 0)
long4 = valuewhen(co, close - (close / 100 * ps4), 0)
long5 = valuewhen(co, close - (close / 100 * ps5), 0)
long6 = valuewhen(co, close - (close / 100 * ps6), 0)

eps1 = 0.00
eps1 := na(eps1[1]) ? na : eps1[1]

eps2 = 0.00
eps2 := na(eps2[1]) ? na : eps2[1]

eps3 = 0.00
eps3 := na(eps3[1]) ? na : eps3[1]

eps4 = 0.00
eps4 := na(eps4[1]) ? na : eps4[1]

eps5 = 0.00
eps5 := na(eps5[1]) ? na : eps5[1]

eps6 = 0.00
eps6 := na(eps6[1]) ? na : eps6[1]

plot (strategy.position_size > 0 ? eps1 : na, title = "Long entry 1", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps2 : na, title = "Long entry 2", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps3 : na, title = "Long entry 3", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps4 : na, title = "Long entry 4", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps5 : na, title = "Long entry 5", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps6 : na, title = "Long entry 6", style = plot.style_linebr)


// Plot position average price
plot (strategy.position_avg_price, title = "Average price", style = plot.style_linebr, color = color.red, linewidth = 2)


// Take profit and exit all on take profit above position average price
tpv = strategy.position_avg_price + (strategy.position_avg_price / 100 * ProfitTarget_Percent)

tpl1 = close < tpv ? eps1 + close * (ProfitTarget_Percent / 100) : tpv
tpl2 = close < tpv ? eps2 + close * (ProfitTarget_Percent / 100) : tpv
tpl3 = close < tpv ? eps3 + close * (ProfitTarget_Percent / 100) : tpv
tpl4 = close < tpv ? eps4 + close * (ProfitTarget_Percent / 100) : tpv
tpl5 = close < tpv ? eps5 + close * (ProfitTarget_Percent / 100) : tpv
tpl6 = close < tpv ? eps6 + close * (ProfitTarget_Percent / 100) : tpv


// Open DCA order once at the start of the week
dcaWeek = input("++++", title = "+++++ Open DCA order once every week +++++")

newWeek = change(time("W"))
dcatime = input(title = "Buy a fixed amount every Monday", defval = false)
fixedAmount = input(40, title = "Fixed amount currency for DCA orders", step = 0.1)
dcaq = fixedAmount / open
plotchar (dcatime ? newWeek : na, "buy at Week start", "▼", location.top, size = size.tiny, color = color.white)
bgcolor (dcatime and newWeek ? color.white : na, transp = 50)

// Submit entry orders
if (co and strategy.opentrades == 0)
    eps1 := long1
    eps2 := long2
    eps3 := long3
    eps4 := long4
    eps5 := long5
    eps6 := long6

    strategy.entry("Long1", strategy.long, q)

if (strategy.opentrades == 1)
    strategy.entry("Long2", strategy.long, q, limit = eps2)

    
if (strategy.opentrades == 2)
    strategy.entry("Long3", strategy.long, q, limit = eps3)


if (strategy.opentrades == 3)
    strategy.entry("Long4", strategy.long, q, limit = eps4)


if (strategy.opentrades == 4)
    strategy.entry("Long5", strategy.long, q, limit = eps5)

    
if (strategy.opentrades == 5) 
    strategy.entry("Long6", strategy.long, q, limit = eps6)
    
// Submit Weekly DCA order, only when price is below position average price and when a position is open
if (dcatime and newWeek and strategy.position_size > 0 and close < strategy.position_avg_price) 
    strategy.entry("DCA", strategy.long, dcaq)


// Exit orders
if (strategy.position_size > 0)
    strategy.exit(id = "Exit 1", from_entry = "Long1", limit = tpl1)
    strategy.exit(id = "Exit 2", from_entry = "Long2", limit = tpl2)
    strategy.exit(id = "Exit 3", from_entry = "Long3", limit = tpl3)
    strategy.exit(id = "Exit 4", from_entry = "Long4", limit = tpl4)
    strategy.exit(id = "Exit 5", from_entry = "Long5", limit = tpl5)
    strategy.exit(id = "Exit 6", from_entry = "Long6", limit = tpl6)
    strategy.exit(id = "Exit DCA", from_entry = "DCA", limit = tpv)
 

// Make sure that all open limit orders are canceled after exiting all the positions 
longClose = strategy.position_size[1] > 0 and strategy.position_size == 0 ? 1 : 0   
if longClose
    strategy.cancel_all()