Sumber dimuat naik... memuat...

Strategi crossover purata bergerak berbilang tempoh yang fleksibel

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

img

Ringkasan

Strategi ini adalah sistem perdagangan kuantitatif canggih berdasarkan pelbagai purata bergerak dan tempoh masa. Ia membolehkan peniaga memilih pelbagai jenis purata bergerak (termasuk SMA, EMA, WMA, HMA, dan SMMA) dengan fleksibel dan beralih antara pelbagai tempoh masa seperti jangka masa harian, mingguan, atau bulanan mengikut keadaan pasaran. Logik teras menentukan isyarat beli dan jual dengan membandingkan harga penutupan dengan kedudukan purata bergerak yang dipilih, sambil menggabungkan tinjauan tempoh masa yang berbeza untuk meningkatkan ketepatan perdagangan.

Prinsip Strategi

Strategi ini menggunakan reka bentuk modular dengan empat komponen teras: modul pemilihan jenis purata bergerak, modul pemilihan tempoh masa, modul penjanaan isyarat, dan modul pengurusan kedudukan. Apabila harga penutupan melintasi di atas purata bergerak yang dipilih, sistem menghasilkan isyarat panjang pada awal tempoh perdagangan seterusnya; apabila harga penutupan melintasi di bawah purata bergerak, sistem menghasilkan isyarat penutupan. Strategi ini melaksanakan pengiraan data lintas tempoh melalui fungsi permintaan. keselamatan, memastikan ketepatan isyarat di pelbagai bingkai masa. Di samping itu, strategi ini termasuk penutupan kedudukan automatik pada akhir backtesting untuk memastikan keselamatan modal.

Kelebihan Strategi

  1. Kemudahan yang tinggi: Menyokong kombinasi pelbagai jenis purata bergerak dan tempoh masa, menyesuaikan diri dengan persekitaran pasaran yang berbeza
  2. Kawalan Risiko Komprehensif: Menghalang peluang yang hilang melalui mekanisme pemeriksaan automatik akhir tempoh
  3. Pengurusan Modal Rasional: Pengurusan Peratusan Kedudukan Pekerja untuk kawalan risiko yang berkesan
  4. Kestabilan isyarat yang kuat: Mengurangkan isyarat palsu melalui pelbagai mekanisme pengesahan
  5. Kebolehsesuaian luas: Boleh digunakan untuk pelbagai instrumen dagangan dan persekitaran pasaran

Risiko Strategi

  1. Risiko Lag: Penunjuk purata bergerak secara semula jadi mempunyai beberapa lag, berpotensi menyebabkan masa masuk dan keluar yang tertunda
  2. Risiko goyangan: Boleh menghasilkan isyarat pecah palsu yang kerap di pasaran sampingan
  3. Risiko lintas tempoh: Isyarat dari tempoh masa yang berbeza mungkin bertentangan antara satu sama lain, yang memerlukan keutamaan isyarat yang berkesan
  4. Risiko Pengurusan Modal: Posisi peratusan tetap mungkin terlalu agresif dalam keadaan pasaran tertentu

Arahan Pengoptimuman Strategi

  1. Menggabungkan Penunjuk Volatiliti: Cadangan penambahan ATR atau Bollinger Band untuk saiz kedudukan dinamik
  2. Tambah Penapis Trend: Boleh menambah mekanisme penghakiman trend jangka panjang hanya untuk kedudukan terbuka dalam arah trend utama
  3. Mengoptimumkan Pengesahan Isyarat: Pertimbangkan untuk memperkenalkan jumlah dan penunjuk tambahan lain untuk meningkatkan kebolehpercayaan isyarat
  4. Mempertingkatkan Mekanisme Stop-Loss: Mencadangkan penambahan fungsi stop-loss yang beransur untuk perlindungan keuntungan yang lebih baik
  5. Tambah Penunjuk Sentimen Pasaran: Cadangan pengenalan RSI atau MACD untuk menilai keadaan pasaran yang terlalu banyak dibeli / terlalu banyak dijual

Ringkasan

Strategi ini adalah sistem dagangan yang direka dengan baik dengan logik yang jelas, menyediakan peniaga dengan alat dagangan yang boleh dipercayai melalui tetapan parameter yang fleksibel dan pelbagai mekanisme pengesahan. Reka bentuk modular strategi memberikan skalabiliti yang kuat, dan prestasi dapat ditingkatkan lagi melalui pengoptimuman berterusan.


/*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 lanjut