Sumber daya yang dimuat... Pemuatan...

Strategi crossover rata-rata bergerak multi-periode yang fleksibel

Penulis:ChaoZhang, Tanggal: 2024-11-28 15:18:47
Tag:MASMAEMAWMAHMASMMA

img

Gambaran umum

Strategi ini adalah sistem perdagangan kuantitatif canggih yang didasarkan pada beberapa rata-rata bergerak dan periode waktu. Ini memungkinkan pedagang untuk secara fleksibel memilih berbagai jenis rata-rata bergerak (termasuk SMA, EMA, WMA, HMA, dan SMMA) dan beralih antara beberapa periode waktu seperti jangka waktu harian, mingguan, atau bulanan sesuai dengan kondisi pasar. Logika inti menentukan sinyal beli dan jual dengan membandingkan harga penutupan dengan posisi rata-rata bergerak yang dipilih, sambil menggabungkan tinjauan periode waktu yang berbeda untuk meningkatkan akurasi perdagangan.

Prinsip Strategi

Strategi ini menggunakan desain modular dengan empat komponen inti: modul pemilihan jenis rata-rata bergerak, modul pemilihan periode waktu, modul generasi sinyal, dan modul manajemen posisi. Ketika harga penutupan melintasi di atas rata-rata bergerak yang dipilih, sistem menghasilkan sinyal panjang pada awal periode perdagangan berikutnya; ketika harga penutupan melintasi di bawah rata-rata bergerak, sistem menghasilkan sinyal penutupan. Strategi ini menerapkan perhitungan data lintas periode melalui fungsi request.security, memastikan akurasi sinyal di berbagai kerangka waktu. Selain itu, strategi ini mencakup penutupan posisi otomatis pada akhir backtesting untuk memastikan keamanan modal.

Keuntungan Strategi

  1. Fleksibilitas tinggi: Mendukung kombinasi dari beberapa jenis rata-rata bergerak dan periode waktu, beradaptasi dengan lingkungan pasar yang berbeda
  2. Pengendalian Risiko yang Komprehensif: Menghindari kesempatan yang hilang melalui mekanisme pemeriksaan otomatis akhir periode
  3. Manajemen modal rasional: Manajemen persentase posisi karyawan untuk pengendalian risiko yang efektif
  4. Stabilitas sinyal yang kuat: Mengurangi sinyal palsu melalui beberapa mekanisme konfirmasi
  5. Adaptifitas luas: Berlaku pada berbagai instrumen perdagangan dan lingkungan pasar

Risiko Strategi

  1. Risiko keterlambatan: Indikator rata-rata bergerak secara inheren memiliki beberapa keterlambatan, berpotensi menyebabkan penundaan waktu masuk dan keluar
  2. Risiko osilasi: Dapat menghasilkan sinyal pecah palsu yang sering di pasar sampingan
  3. Risiko lintas periode: Sinyal dari periode waktu yang berbeda dapat saling bertentangan, yang membutuhkan prioritas sinyal yang efektif
  4. Risiko Pengelolaan Modal: Posisi persentase tetap mungkin terlalu agresif dalam kondisi pasar tertentu

Arah Optimasi Strategi

  1. Mengintegrasikan Indikator Volatilitas: Saran penambahan ATR atau Bollinger Bands untuk ukuran posisi dinamis
  2. Tambahkan Filter Tren: Dapat menambahkan mekanisme penilaian tren jangka panjang hanya untuk posisi terbuka di arah tren utama
  3. Mengoptimalkan Konfirmasi Sinyal: Pertimbangkan untuk memperkenalkan volume dan indikator tambahan lainnya untuk meningkatkan keandalan sinyal
  4. Memperbaiki Mekanisme Stop-Loss: Disarankan menambahkan fungsi stop-loss trailing untuk perlindungan keuntungan yang lebih baik
  5. Tambahkan Indikator Sentimen Pasar: Perkenalan RSI atau MACD yang disarankan untuk menilai kondisi pasar yang terlalu banyak dibeli/terlalu banyak dijual

Ringkasan

Strategi ini adalah sistem perdagangan yang dirancang dengan baik dengan logika yang jelas, menyediakan pedagang dengan alat perdagangan yang dapat diandalkan melalui pengaturan parameter yang fleksibel dan beberapa mekanisme konfirmasi.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Flexible Moving Average Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Input to select the review frequency (Daily, Weekly, Monthly)
check_frequency = input.string("Weekly", title="Review Frequency", options=["Daily", "Weekly", "Monthly"])

// Input to select the Moving Average method (SMA, EMA, WMA, HMA, SMMA)
ma_method = input.string("EMA", title="Moving Average Method", options=["SMA", "EMA", "WMA", "HMA", "SMMA"])

// Input to select the length of the Moving Average
ma_length = input.int(30, title="Moving Average Length", minval=1)

// Input to select the timeframe for Moving Average calculation
ma_timeframe = input.string("W", title="Moving Average Timeframe", options=["D", "W", "M"])

// Calculate all Moving Averages on the selected timeframe
sma_value = request.security(syminfo.tickerid, ma_timeframe, ta.sma(close, ma_length), lookahead=barmerge.lookahead_off)
ema_value = request.security(syminfo.tickerid, ma_timeframe, ta.ema(close, ma_length), lookahead=barmerge.lookahead_off)
wma_value = request.security(syminfo.tickerid, ma_timeframe, ta.wma(close, ma_length), lookahead=barmerge.lookahead_off)
hma_value = request.security(syminfo.tickerid, ma_timeframe, ta.hma(close, ma_length), lookahead=barmerge.lookahead_off)
smma_value = request.security(syminfo.tickerid, ma_timeframe, ta.rma(close, ma_length), lookahead=barmerge.lookahead_off) // Smoothed Moving Average (SMMA)

// Select the appropriate Moving Average based on user input
ma = ma_method == "SMA" ? sma_value : 
     ma_method == "EMA" ? ema_value :
     ma_method == "WMA" ? wma_value :
     ma_method == "HMA" ? hma_value :
     smma_value  // Default to SMMA

// Variable initialization
var float previous_close = na
var float previous_ma = na
var float close_to_compare = na
var float ma_to_compare = na

// Detect the end of the period (Daily, Weekly, or Monthly) based on the selected frequency
var bool is_period_end = false

if check_frequency == "Daily"
    is_period_end := ta.change(time('D')) != 0
else if check_frequency == "Weekly"
    is_period_end := ta.change(time('W')) != 0
else if check_frequency == "Monthly"
    is_period_end := ta.change(time('M')) != 0

// Store the close and Moving Average values at the end of the period
if is_period_end
    previous_close := close[0]  // Closing price of the last day of the period
    previous_ma := ma[0]  // Moving Average value at the end of the period

// Strategy logic
is_period_start = is_period_end

// Check if this is the first bar of the backtest
is_first_bar = barstate.isfirst

if (is_period_start or is_first_bar)
    // If the previous period values are not available, use current values
    close_to_compare := not na(previous_close) ? previous_close : close[0]
    ma_to_compare := not na(previous_ma) ? previous_ma : ma[0]
    
    if close_to_compare < ma_to_compare
        // Close price below the MA -> Sell
        if strategy.position_size > 0
            strategy.close("Long")
    else
        // Close price above the MA -> Buy/Hold
        if strategy.position_size == 0
            strategy.entry("Long", strategy.long)

// Close all positions at the end of the backtest period
if barstate.islastconfirmedhistory
    strategy.close_all(comment="Backtest End")

// Plot the previous period's close price for comparison
plot(previous_close, color=color.red, title="Previous Period Close", style=plot.style_stepline)
plot(close_to_compare, color=color.blue, title="Close to Compare", style=plot.style_line)

// Plot the selected Moving Average
plot(ma, color=color.white, title="Moving Average", style=plot.style_line, linewidth=3)

Berkaitan

Lebih banyak