Sumber daya yang dimuat... Pemuatan...

Strategi Reversi Rata-rata RSI Berbagai Tingkat dengan Penyesuaian Volatilitas Dinamis

Penulis:ChaoZhang, Tanggal: 2024-06-21 14:16:31
Tag:RSI, PIVOT

img

Gambaran umum

Strategi ini adalah sistem perdagangan reversi rata-rata multi-level berdasarkan indikator RSI dan volatilitas harga. Ini menggunakan nilai RSI ekstrem dan fluktuasi harga yang luar biasa besar sebagai sinyal masuk, sambil menggunakan skala posisi gaya piramida dan tingkat mengambil keuntungan dinamis untuk mengelola risiko dan mengoptimalkan pengembalian.

Prinsip Strategi

  1. Syarat masuk:

    • Menggunakan RSI 20 periode (RSI20) sebagai indikator utama
    • Mengatur beberapa ambang RSI (35/65, 30/70, 25/75, 20/80) dengan ambang volatilitas yang sesuai
    • Trigger sinyal masuk ketika RSI mencapai ambang batas dan ukuran tubuh lilin saat ini melebihi ambang volatilitas yang sesuai
    • Kondisi tambahan: harga harus menembus tingkat dukungan tinggi/rendah baru-baru ini dengan persentase tertentu
  2. Mekanisme Scaling Posisi:

    • Memungkinkan hingga 5 entri ( entri awal + 4 entri tambahan)
    • Setiap entri tambahan membutuhkan persyaratan RSI dan volatilitas yang lebih ketat.
  3. Mekanisme Keluar:

    • Menetapkan 5 tingkat berbeda dari mengambil keuntungan poin
    • Poin Take-profit dihitung secara dinamis berdasarkan level support/resistance pada saat masuk
    • Target mengambil keuntungan secara bertahap berkurang karena jumlah posisi terbuka meningkat
  4. Pengendalian Risiko:

    • Menggunakan model risiko persentase, dengan setiap perdagangan berisiko tetap 20% dari nilai akun
    • Menetapkan posisi terbuka bersamaan maksimum yang diizinkan menjadi 5, membatasi eksposur risiko keseluruhan

Keuntungan Strategi

  1. Multi-level Entry: Dengan menetapkan beberapa RSI dan ambang batas volatilitas, strategi dapat menangkap tingkat ekstrim pasar yang berbeda, meningkatkan peluang perdagangan.

  2. Dinamis Take-Profit: Take-profit poin yang dihitung berdasarkan tingkat dukungan / resistensi dapat menyesuaikan diri dengan struktur pasar, melindungi keuntungan tanpa keluar terlalu awal.

  3. Skala Posisi Gaya Piramida: Meningkatkan posisi seiring tren terus dapat secara signifikan meningkatkan potensi keuntungan.

  4. Manajemen Risiko: Risiko persentase tetap dan batas posisi maksimum secara efektif mengendalikan risiko untuk setiap perdagangan dan secara keseluruhan.

  5. Fleksibilitas: Banyak parameter yang dapat disesuaikan memungkinkan strategi untuk beradaptasi dengan lingkungan pasar dan instrumen perdagangan yang berbeda.

  6. Reversi rata-rata + Trend Following: Menggabungkan keuntungan dari reversi rata-rata dan trend berikut, menangkap pembalikan jangka pendek tanpa kehilangan tren utama.

Risiko Strategi

  1. Overtrading: Dapat memicu sinyal perdagangan yang sering terjadi di pasar yang sangat volatile, yang menyebabkan biaya yang berlebihan.

  2. False Breakouts: Pasar mungkin mengalami volatilitas ekstrim singkat diikuti dengan pembalikan cepat, menyebabkan sinyal palsu.

  3. Kerugian berturut-turut: Gerakan pasar unidirectional terus menerus dapat mengakibatkan kerugian yang signifikan setelah beberapa kenaikan posisi.

  4. Sensitivitas Parameter: Kinerja strategi mungkin sangat sensitif terhadap pengaturan parameter, berisiko overfit.

  5. Dampak slippage: Dapat menghadapi slippage yang parah selama periode volatilitas yang intens, mempengaruhi kinerja strategi.

  6. Ketergantungan pada Lingkungan Pasar: Strategi dapat berkinerja buruk dalam lingkungan pasar tertentu, seperti volatilitas rendah atau pasar tren yang kuat.

Arah Optimasi Strategi

  1. Penyesuaian Parameter Dinamis: Memperkenalkan mekanisme adaptif untuk menyesuaikan RSI dan ambang volatilitas secara dinamis berdasarkan kondisi pasar.

  2. Analisis multi-frame time: Menggabungkan penilaian tren pasar jangka panjang untuk meningkatkan kualitas masuk.

  3. Optimasi Stop-Loss: Tambahkan stop-loss trailing atau stop-loss dinamis berbasis ATR untuk pengendalian risiko lebih lanjut.

  4. Penyaringan keadaan pasar: Sertakan kekuatan tren, siklus volatilitas, dan kondisi penyaringan lainnya untuk menghindari perdagangan di lingkungan pasar yang tidak cocok.

  5. Optimasi Manajemen Modal: Melakukan manajemen posisi yang lebih rinci, seperti menyesuaikan ukuran perdagangan berdasarkan tingkat sinyal yang berbeda.

  6. Integrasi Pembelajaran Mesin: Menggunakan algoritma pembelajaran mesin untuk mengoptimalkan proses pemilihan parameter dan generasi sinyal.

  7. Analisis korelasi: Menggabungkan analisis korelasi dengan aset lain untuk meningkatkan stabilitas dan keragaman strategi.

Kesimpulan

Strategi perdagangan reversi rata-rata RSI multi-level ini adalah sistem perdagangan kuantitatif yang dirancang dengan hati-hati yang dengan cerdas menggabungkan analisis teknis, manajemen risiko dinamis, dan teknik skala posisi gaya piramida. Dengan menangkap volatilitas pasar yang ekstrim dan mendapatkan keuntungan ketika harga berbalik, strategi menunjukkan potensi keuntungan yang kuat. Namun, strategi ini juga menghadapi tantangan seperti overtrading dan ketergantungan lingkungan pasar. Optimasi masa depan harus berfokus pada peningkatan kemampuan adaptasi strategi dan kemampuan pengendalian risiko agar sesuai dengan lingkungan pasar yang berbeda. Secara keseluruhan, ini adalah kerangka strategi dengan dasar yang kuat yang, melalui optimasi lebih lanjut dan backtesting, memiliki potensi untuk berkembang menjadi sistem perdagangan yang kuat.


/*backtest
start: 2024-05-01 00:00:00
end: 2024-05-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Retorno_Pivots_5min_Novo_v3.3')

// Input variables
bars_left1 = input(1, title = "Entry - Pivot Left Bars")
bars_right1 = input(1, title = "Entry - Pivot Right Bars")
rsi20_longentry0 = input(35, title = "Entry 1 - RSI20 Long")
rsi20_shortentry0 = input(65, title = "Entry 1 - RSI20 Short")
bar_size_entry0 = input.float(1, title="Entry 1 - Bar Size")
rsi20_longentry1 = input(30, title = "Entry 2 - RSI20 Long")
rsi20_shortentry1 = input(70, title = "Entry 2 - RSI20 Short")
bar_size_entry1 = input.float(0.8, title="Entry 2 - Bar Size")
rsi20_longentry2 = input(25, title = "Entry 3 - RSI20 Long")
rsi20_shortentry2 = input(75, title = "Entry 3 - RSI20 Short")
bar_size_entry2 = input.float(0.7, title="Entry 3 - Bar Size")
rsi20_longentry3 = input(20, title = "Entry 4 - RSI20 Long")
rsi20_shortentry3 = input(80, title = "Entry 4 - RSI20 Short")
bar_size_entry3 = input.float(0.5, title="Entry 4 - Bar Size")
limit_perc1 = input.float(0.60, title="Profit Range 1")
limit_perc2 = input.float(0.40, title="Profit Range 2")
limit_perc3 = input.float(0.20, title="Profit Range 3")
limit_perc4 = input.float(0.00, title="Profit Range 4")
limit_perc5 = input.float(0.00, title="Profit Range 5")
minimum_pivot_distance = input.float(0, title="Minimum Pivot Distance %")
barsize_1h_input = input(288, title="Highest Bar Lookback")
rsi20 = ta.rsi(close, 20)
rsi200 = ta.rsi(close, 200)
Pivot_High_Last1 = ta.valuewhen(ta.pivothigh(high, bars_left1, bars_right1), ta.pivothigh(high, bars_left1, bars_right1), 0)
Pivot_Low_Last1 = ta.valuewhen(ta.pivotlow(low, bars_left1, bars_right1), ta.pivotlow(low, bars_left1, bars_right1), 0)

barsize = math.abs(close - open)
barsize_1h = ta.highest(barsize, barsize_1h_input)

Bar0Long = rsi20 < rsi20_longentry0 and barsize >= (barsize_1h * bar_size_entry0)
Bar1Long = rsi20 < rsi20_longentry1 and barsize >= (barsize_1h * bar_size_entry1)
Bar2Long = rsi20 < rsi20_longentry2 and barsize >= (barsize_1h * bar_size_entry2)
Bar3Long = rsi20 < rsi20_longentry3 and barsize >= (barsize_1h * bar_size_entry3)

// Long Entries
Long_Entry1 = strategy.opentrades == 0 and rsi20 < rsi20[1] and ((rsi20 < rsi20_longentry0 and barsize >= (barsize_1h * bar_size_entry0)) or (rsi20 < rsi20_longentry1 and barsize >= (barsize_1h * bar_size_entry1)) or (rsi20 < rsi20_longentry2 and barsize >= (barsize_1h * bar_size_entry2)) or (rsi20 < rsi20_longentry3 and barsize >= (barsize_1h * bar_size_entry3))) and close < (Pivot_Low_Last1 * (1 - (minimum_pivot_distance / 100)))
Long_Entry2 = strategy.opentrades == 1 and strategy.position_size > 0 and rsi20 < rsi20[1] and (Bar0Long or Bar1Long or Bar2Long or Bar3Long)
Long_Entry3 = strategy.opentrades == 2 and strategy.position_size > 0 and rsi20 < rsi20[1] and (Bar0Long or Bar1Long or Bar2Long or Bar3Long)
Long_Entry4 = strategy.opentrades == 3 and strategy.position_size > 0 and rsi20 < rsi20[1] and (Bar0Long or Bar1Long or Bar2Long or Bar3Long)
Long_Entry5 = strategy.opentrades == 4 and strategy.position_size > 0 and rsi20 < rsi20[1] and (Bar0Long or Bar1Long or Bar2Long or Bar3Long)
if Long_Entry1 or Long_Entry2 or Long_Entry3 or Long_Entry4 or Long_Entry5
    strategy.entry("Long", strategy.long, comment = "ENTER-LONG_BINANCE-FUTURES_BTCBUSD_Bot-BTC-1min_1M_970d2ee265390c27")
// Longs Exits
Long_Exit1 = strategy.opentrades == 1 and close > (strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc1))
Long_Exit2 = strategy.opentrades == 2 and close > (strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc2))
Long_Exit3 = strategy.opentrades == 3 and close > (strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc3))
Long_Exit4 = strategy.opentrades == 4 and close > (strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc4))
Long_Exit5 = strategy.opentrades == 5 and close > (strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc5))
if Long_Exit1 or Long_Exit2 or Long_Exit3 or Long_Exit4 or Long_Exit5
    strategy.close("Long", comment = "EXIT-LONG_BINANCE-FUTURES_BTCBUSD_Bot-BTC-1min_1M_970d2ee265390c27")

Bar0Short = rsi20 > rsi20_shortentry0 and barsize >= (barsize_1h * bar_size_entry0)
Bar1Short = rsi20 > rsi20_shortentry1 and barsize >= (barsize_1h * bar_size_entry1)
Bar2Short = rsi20 > rsi20_shortentry2 and barsize >= (barsize_1h * bar_size_entry2)
Bar3Short = rsi20 > rsi20_shortentry3 and barsize >= (barsize_1h * bar_size_entry3)

// Short Entries
Short_Entry1 = strategy.opentrades == 0 and rsi20 > rsi20[1] and ((rsi20 > rsi20_shortentry0 and barsize >= (barsize_1h * bar_size_entry0)) or (rsi20 > rsi20_shortentry1 and barsize >= (barsize_1h * bar_size_entry1)) or (rsi20 > rsi20_shortentry2 and barsize >= (barsize_1h * bar_size_entry2)) or (rsi20 > rsi20_shortentry2 and barsize >= (barsize_1h * bar_size_entry2))) and close > (Pivot_High_Last1 * (1 + (minimum_pivot_distance / 100)))
Short_Entry2 = strategy.opentrades == 1 and strategy.position_size < 0 and rsi20 > rsi20[1] and (Bar0Short or Bar1Short or Bar2Short or Bar3Short)
Short_Entry3 = strategy.opentrades == 2 and strategy.position_size < 0 and rsi20 > rsi20[1] and (Bar0Short or Bar1Short or Bar2Short or Bar3Short)
Short_Entry4 = strategy.opentrades == 3 and strategy.position_size < 0 and rsi20 > rsi20[1] and (Bar0Short or Bar1Short or Bar2Short or Bar3Short)
Short_Entry5 = strategy.opentrades == 4 and strategy.position_size < 0 and rsi20 > rsi20[1] and (Bar0Short or Bar1Short or Bar2Short or Bar3Short)
if Short_Entry1 or Short_Entry2 or Short_Entry3 or Short_Entry4 or Short_Entry5
    strategy.entry("Short", strategy.short, comment = "ENTER-SHORT_BINANCE-FUTURES_BTCBUSD_Bot-BTC-1min_1M_970d2ee265390c27")
// Short Exits
Short_Exit1 = strategy.opentrades == 1 and close < (strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc1))
Short_Exit2 = strategy.opentrades == 2 and close < (strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc2))
Short_Exit3 = strategy.opentrades == 3 and close < (strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc3))
Short_Exit4 = strategy.opentrades == 4 and close < (strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc4))
Short_Exit5 = strategy.opentrades == 5 and close < (strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc5))
if Short_Exit1 or Short_Exit2 or Short_Exit3 or Short_Exit4 or Short_Exit5
    strategy.close("Short", comment = "EXIT-SHORT_BINANCE-FUTURES_BTCBUSD_Bot-BTC-1min_1M_970d2ee265390c27")

// Plots
plot(rsi20, color=color.new(#fbff00, 0), linewidth=2)
plot(((strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc1))), color=color.new(#00ff2a, 0), linewidth=2)
plot(((strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc2))), color=color.new(#00ff2a, 50), linewidth=2)
plot(((strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc3))), color=color.new(#00ff2a, 80), linewidth=2)
plot(((strategy.position_avg_price + ((ta.valuewhen(strategy.opentrades == 0, Pivot_Low_Last1, 0) - (strategy.position_avg_price)) * limit_perc4))), color=color.new(#00ff2a, 100), linewidth=2)
plot((strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc1)), color=color.new(#ff0000, 0), linewidth=2)
plot((strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc2)), color=color.new(#ff0000, 50), linewidth=2)
plot((strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc3)), color=color.new(#ff0000, 80), linewidth=2)
plot((strategy.position_avg_price - ((strategy.position_avg_price - ta.valuewhen(strategy.opentrades == 0, Pivot_High_Last1, 0)) * limit_perc4)), color=color.new(#ff0000, 100), linewidth=2)
plot(strategy.position_avg_price, color=color.new(#ffc400, 0), linewidth=2)
plot(strategy.opentrades * (strategy.position_size / math.abs(strategy.position_size)), color=color.new(#ff00bb, 0), linewidth=2)
plot(((barsize / barsize_1h) * 100), color=color.new(#0000ff, 0), linewidth=2)

Berkaitan

Lebih banyak