RSI Rata-rata Strategi Fluktuasi Harga Pembalikan

Penulis:ChaoZhang, Tarikh: 2023-09-26 19:55:03
Tag:

Ringkasan

Strategi ini mengenal pasti peluang oversold menggunakan penunjuk RSI dan mengambil kedudukan dalam batch apabila harga jatuh untuk secara beransur-ansur menurunkan asas kos dan mencapai keuntungan jangka panjang.

Logika Strategi

Strategi ini mula-mula mengira penunjuk RSI untuk menentukan sama ada pasaran terlalu laris. Apabila RSI di bawah 30, ia menandakan peluang terlalu laris. Dalam kes ini, jika harga di bawah purata bergerak 100 tempoh, kedudukan panjang akan dibuka.

Selepas membuka kedudukan, strategi menetapkan 6 tahap harga pembalikan purata pada 98%, 97%, 95%, 90%, 84% dan 70% daripada harga semasa. Apabila harga mencapai tahap ini, lebih banyak kedudukan akan ditambah. Dengan terus-menerus rata-rata ke bawah, asas kos kedudukan boleh diturunkan.

Selain itu, harga purata kedudukan dikira. mengambil keuntungan bermula apabila harga meningkat lebih daripada 5% di atas harga purata. juga, jika harga terus meningkat di atas harga mengambil keuntungan 5% dari harga purata, semua kedudukan akan ditutup.

Akhirnya, mekanisme DCA dimasukkan ke dalam strategi. setiap hari Isnin, jika terdapat kedudukan terbuka dan harga di bawah harga purata, jumlah tetap akan ditambahkan ke kedudukan. ini semakin mengurangkan asas kos.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah penggunaan purata ke bawah dan mekanisme DCA untuk mengawal risiko.

  1. Mengambil kedudukan dalam kumpulan mempelbagaikan risiko pembukaan dan mengelakkan kehilangan titik terendah.

  2. Menetapkan pelbagai tahap harga pembalikan purata secara berterusan menurunkan asas kos dan menguruskan risiko penurunan.

  3. Mengira harga kedudukan purata membolehkan mengambil keuntungan tepat pada masanya dan mengunci keuntungan apabila dalam hijau.

  4. Menggunakan DCA mengurangkan lagi asas kos dan mengawal risiko.

  5. Menggunakan penunjuk RSI menghalang pembukaan kedudukan di puncak.

  6. Penapis purata bergerak mengelakkan perdagangan pembalikan.

Analisis Risiko

Strategi ini juga mempunyai beberapa risiko:

  1. Strategi ini tidak dapat menentukan titik pembalikan pasaran. Posisi panjang yang berterusan semasa bahagian bawah pasaran yang berpanjangan akan meningkatkan kerugian.

  2. Tidak ada mekanisme stop loss untuk mengawal kerugian perdagangan tunggal dengan berkesan.

  3. Tidak ada had pada jumlah kedudukan, yang boleh membawa kepada penambahan yang melarikan diri jika pasaran jatuh dengan ganas.

  4. DCA membawa risiko masa dan tidak menjamin pembukaan kedudukan pada titik terendah.

Penyelesaian yang mungkin:

  1. Menggabungkan penunjuk lain untuk menilai struktur pasaran dan bukannya hanya bergantung kepada RSI.

  2. Tambah pergerakan atau stop loss yang tercetak.

  3. Batasi jumlah penambahan kedudukan.

  4. Mengoptimumkan logik kemasukan DCA kepada mekanisme yang lebih stabil.

Arahan pengoptimuman

Strategi ini boleh ditingkatkan dengan cara berikut:

  1. Mengoptimumkan algoritma pembalikan purata kepada pendekatan yang lebih saintifik.

  2. Mempertingkatkan mekanisme mengambil keuntungan, seperti hentian atau mengambil keuntungan berlapis.

  3. Tambah stop loss untuk kawalan risiko perdagangan tunggal yang lebih baik.

  4. Menggabungkan penunjuk lain untuk analisis struktur pasaran dan bukannya RSI semata-mata.

  5. Mengoptimumkan logik DCA untuk mengelakkan risiko kemasukan masa tetap.

  6. Tambah saiz kedudukan untuk mengoptimumkan saiz kedudukan keseluruhan.

  7. Mengoptimumkan parameter untuk memenuhi ciri statistik pasaran.

  8. Tambah logik beralih untuk menyesuaikan diri dengan rejimen pasaran yang berbeza.

Kesimpulan

Ringkasnya, ini adalah strategi pelaburan jangka panjang yang menggunakan RSI untuk masa dan purata ke bawah dengan pelbagai entri untuk asas kos yang lebih rendah. Ia sangat sesuai untuk pasaran mata wang kripto yang tidak menentu semasa untuk menguruskan kos kedudukan semasa tempoh yang berbeza.


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





Lebih lanjut