Strategi ini mengidentifikasi peluang oversold menggunakan indikator RSI dan mengambil posisi dalam batch ketika harga turun untuk secara bertahap menurunkan basis biaya dan mencapai keuntungan jangka panjang.
Strategi ini pertama-tama menghitung indikator RSI untuk menentukan apakah pasar terlalu laris. Ketika RSI di bawah 30, itu menandakan peluang oversold. Dalam hal ini, jika harga di bawah rata-rata bergerak 100 periode, posisi panjang akan dibuka.
Setelah membuka posisi, strategi menetapkan 6 tingkat harga reversi rata-rata pada 98%, 97%, 95%, 90%, 84% dan 70% dari harga saat ini. Ketika harga mencapai tingkat ini, lebih banyak posisi akan ditambahkan. Dengan terus rata-rata turun, dasar biaya posisi dapat diturunkan.
Selain itu, harga rata-rata posisi dihitung. mengambil keuntungan dimulai ketika harga naik lebih dari 5% di atas harga rata-rata. juga, jika harga terus naik di atas harga mengambil keuntungan 5% dari harga rata-rata, semua posisi akan ditutup.
Akhirnya, mekanisme DCA dimasukkan ke dalam strategi. setiap hari Senin, jika ada posisi terbuka dan harga di bawah harga rata-rata, jumlah tetap akan ditambahkan ke posisi. ini lebih mengurangi basis biaya.
Keuntungan terbesar dari strategi ini adalah penggunaan rata-rata turun dan mekanisme DCA untuk mengendalikan risiko.
Mengambil posisi dalam batch mendiversifikasi risiko pembukaan dan menghindari kehilangan titik terendah.
Menetapkan beberapa tingkat harga reversi rata-rata secara bertahap menurunkan basis biaya dan mengelola risiko penurunan.
Menghitung harga posisi rata-rata memungkinkan untuk mengambil keuntungan tepat waktu dan mengunci keuntungan ketika di hijau.
Menerapkan DCA lebih lanjut mengurangi dasar biaya dan mengontrol risiko.
Menggunakan indikator RSI mencegah membuka posisi di puncak.
Filter rata-rata bergerak menghindari perdagangan pembalikan.
Strategi ini juga memiliki beberapa risiko:
Strategi tidak dapat menentukan titik pembalikan pasar. posisi panjang yang terus menerus selama dasar pasar yang berkepanjangan akan meningkatkan kerugian.
Tidak ada mekanisme stop loss untuk secara efektif mengendalikan kerugian perdagangan tunggal.
Tidak ada batas pada jumlah posisi, yang dapat menyebabkan tambahan kabur jika pasar jatuh dengan keras.
DCA membawa risiko waktu dan tidak menjamin pembukaan posisi pada titik terendah.
Solusi yang mungkin:
Masukkan indikator lain untuk menilai struktur pasar daripada hanya mengandalkan RSI.
Tambahkan stop loss yang bergerak atau bertahap.
Batasi jumlah penambahan posisi.
Mengoptimalkan DCA masuk logika untuk mekanisme yang lebih stabil.
Strategi dapat ditingkatkan dengan cara berikut:
Mengoptimalkan algoritma reversi rata-rata untuk pendekatan yang lebih ilmiah.
Meningkatkan mekanisme pengambilan keuntungan, seperti trailing stop atau layered take profit.
Tambahkan stop loss untuk kontrol risiko perdagangan tunggal yang lebih baik.
Masukkan indikator lain untuk analisis struktur pasar alih-alih RSI murni.
Mengoptimalkan logika DCA untuk menghindari risiko entri waktu tetap.
Tambahkan ukuran posisi untuk mengoptimalkan ukuran posisi total.
Mengoptimalkan parameter agar sesuai dengan karakteristik statistik pasar.
Tambahkan logika switching untuk beradaptasi dengan rezim pasar yang berbeda.
Singkatnya, ini adalah strategi investasi jangka panjang yang memanfaatkan RSI untuk waktu dan rata-rata ke bawah dengan beberapa entri untuk dasar biaya yang lebih rendah. Ini sangat cocok untuk pasar cryptocurrency yang fluktuatif saat ini untuk mengelola biaya posisi selama periode yang bervariasi.
/*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()