Sumber daya yang dimuat... Pemuatan...

SMA Crossover Long-Short Strategy dengan Peak Drawdown Control dan Auto-Termination

Penulis:ChaoZhang, Tanggal: 2024-07-29 14:16:58
Tag:SMA

img

Gambaran umum

Strategi ini adalah sistem perdagangan panjang-pendek yang menggabungkan sinyal crossover Simple Moving Average (SMA) dengan kontrol penarikan puncak. Ini menggunakan crossover SMA 14 periode dan 28 periode untuk menghasilkan sinyal perdagangan panjang dan pendek sambil secara bersamaan memantau penarikan puncak strategi. Ketika penarikan melebihi ambang batas yang telah ditetapkan, strategi secara otomatis menghentikan perdagangan. Selain itu, strategi ini mencakup fitur analisis siklus puncak hingga terendah yang rinci untuk membantu pedagang lebih memahami karakteristik risiko strategi.

Prinsip Strategi

  1. Generasi sinyal perdagangan:

    • Sinyal panjang dihasilkan ketika SMA 14 periode melintasi SMA 28 periode.
    • Sinyal pendek dihasilkan ketika SMA 14 periode melintasi SMA 28 periode.
  2. Kontrol Penarikan Puncak:

    • Pelacakan real-time kurva ekuitas strategi, mencatat titik tertinggi historis (puncak).
    • Ketika ekuitas saat ini turun di bawah puncak, ia memasuki keadaan penarikan, mencatat titik terendah (toll).
    • Persentase penarikan dihitung sebagai berikut: (Peak - Trough) / Peak * 100%.
    • Jika persentase penarikan melebihi ambang maksimum penarikan yang ditetapkan sebelumnya, strategi berhenti membuka posisi baru.
  3. Analisis Siklus dari Puncak ke Akhir:

    • Tetapkan persentase penarikan minimum untuk menentukan siklus puncak hingga terendah yang valid.
    • Untuk setiap siklus valid yang selesai, catat nomor siklus, persentase run-up sebelumnya, persentase drawdown, dan waktu akhir.
    • Analisis tampilan menghasilkan format tabel untuk meninjau kinerja historis strategi dengan mudah.

Keuntungan Strategi

  1. Menggabungkan trend berikut dan pengendalian risiko: Strategi crossover SMA adalah metode trend-following klasik, sementara kontrol penarikan puncak memberikan lapisan tambahan manajemen risiko. Kombinasi ini dapat secara efektif mengendalikan risiko penurunan sambil menangkap tren pasar.

  2. Kemampuan Beradaptasi Tinggi: Dengan parameterisasi ambang maksimum dan ambang minimum, strategi dapat disesuaikan secara fleksibel dengan lingkungan pasar yang berbeda dan preferensi risiko pribadi.

  3. Indikator risiko transparan: Analisis siklus puncak-ke-rendah memberikan informasi detil sejarah penarikan, memungkinkan pedagang untuk secara intuitif memahami karakteristik risiko strategi, membantu dalam keputusan perdagangan yang lebih tepat.

  4. Kontrol Risiko Otomatis: Ketika penarikan melebihi ambang batas yang telah ditetapkan, strategi secara otomatis menghentikan perdagangan.

  5. Analisis Kinerja yang Komprehensif: Selain metrik backtesting konvensional, strategi ini menyediakan data siklus puncak hingga terendah yang terperinci, termasuk persentase run-up, persentase drawdown, dan informasi waktu, yang memfasilitasi analisis mendalam kinerja strategi.

Risiko Strategi

  1. Terlalu bergantung pada data historis: Strategi crossover SMA didasarkan pada data harga historis dan dapat bereaksi lambat di pasar yang berubah dengan cepat, yang mengarah pada sinyal palsu.

  2. Perdagangan Sering: Di pasar yang berosilasi, SMA dapat sering melintasi, mengakibatkan perdagangan yang berlebihan dan biaya transaksi yang tinggi.

  3. Potensi Penarikan Besar: Terlepas dari pengendalian penarikan maksimum, penurunan besar tunggal selama volatilitas pasar yang parah masih dapat mengakibatkan kerugian yang signifikan.

  4. Sensitivitas parameter: Kinerja strategi sangat tergantung pada pilihan periode SMA dan ambang penarikan. pengaturan parameter yang tidak tepat dapat menyebabkan hasil yang tidak optimal.

  5. Kesempatan Melanggar: Ketika perdagangan berhenti setelah mencapai ambang maksimum penarikan, strategi dapat melewatkan peluang yang dibawa oleh pembalikan pasar.

Arah Optimasi Strategi

  1. Memperkenalkan Penyesuaian Parameter Dinamis: Pertimbangkan untuk menyesuaikan periode SMA dan ambang penarikan secara dinamis berdasarkan volatilitas pasar untuk beradaptasi dengan lingkungan pasar yang berbeda.

  2. Filter Pasar Tambahan: Masukkan indikator teknis atau faktor fundamental lainnya, seperti RSI atau volume, untuk menyaring sinyal palsu potensial.

  3. Menerapkan Masuk dan Keluar Peringkat: Alih-alih operasi semua atau tidak ada, menerapkan pembentukan posisi bertahap dan penutupan untuk mengurangi risiko keputusan tunggal.

  4. Tambahkan mekanisme mengambil keuntungan: Di atas pengendalian penarikan, tambahkan fungsi mengambil keuntungan yang dinamis untuk mengunci keuntungan dan meningkatkan pengembalian keseluruhan.

  5. Mengoptimalkan Manajemen Uang: Menerapkan ukuran posisi dinamis berdasarkan ukuran akun dan volatilitas pasar untuk pengendalian risiko yang lebih baik.

  6. Memperkenalkan Algoritma Pembelajaran Mesin: Menggunakan teknik pembelajaran mesin untuk mengoptimalkan proses seleksi parameter dan generasi sinyal, meningkatkan kemampuan dan akurasi strategi.

Kesimpulan

Strategi SMA crossover long-short dikombinasikan dengan kontrol penarikan puncak dan penghentian otomatis adalah sistem perdagangan kuantitatif yang menyeimbangkan tren mengikuti dan manajemen risiko. Ini menangkap tren pasar melalui crossover rata-rata bergerak sederhana sambil mengelola risiko penurunan menggunakan kontrol penarikan puncak. Fitur unik dari strategi ini terletak pada analisis siklus puncak hingga terendah yang rinci, memberikan pedagang alat untuk memahami secara mendalam karakteristik risiko strategi.

Meskipun strategi ini memiliki beberapa risiko yang melekat, seperti ketergantungan yang berlebihan pada data historis dan sensitivitas parameter, itu dapat secara signifikan meningkatkan ketahanan dan profitabilitasnya melalui optimasi dan perbaikan yang sesuai.

Secara keseluruhan, strategi ini memberikan pedagang titik awal yang baik yang dapat disesuaikan dan dioptimalkan lebih lanjut untuk memenuhi tujuan perdagangan individu dan preferensi risiko.


/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Scriptâ„¢ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

capital = 10000

//@version=5
strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100)

// The code below is from Tradingwhale LLC
/// ==============================================================================
//  Peak-Trough Cycles with Date and Prev. RunUp
// Initialize variables
showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?")
min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.")
maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.")

var float equityPeak = na
var float equityTrough = na
var int cycleCount = 0
var bool inDrawdown = false
var float initialCapital = capital
var float prevTrough = initialCapital
var float prevRunUp = na
var bool useLighterGray = true
var int lastYear = na

// Variable to indicate whether the strategy should end
var bool end_strategy = false

// Table to display data
var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1)

// Function to convert float to percentage string
f_to_percent(value) =>
    str.tostring(value, "#.##") + "%"

// Function to get month/year string without commas
get_month_year_string() =>
    str.tostring(year) + "/" + str.tostring(month)

// Update the table headers
if (bar_index == 0 and showTable)
    table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal)

// Track peaks and troughs in equity
if (na(equityPeak) or strategy.equity > equityPeak)
    if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle
        drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
        if drawdownPercentage > min_trough
            cycleCount += 1
            prevRunUp := (equityPeak - prevTrough) / prevTrough * 100
            if cycleCount <= 20 and showTable
                currentYear = year
                if na(lastYear) or currentYear != lastYear
                    useLighterGray := not useLighterGray
                    lastYear := currentYear
                rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50)
                table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal)
            prevTrough := equityTrough
    equityPeak := strategy.equity
    equityTrough := na
    inDrawdown := false
else if (strategy.equity < equityPeak)
    equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity)
    inDrawdown := true

// Calculate if the strategy should end
if not na(equityPeak) and not na(equityTrough)
    drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
    if drawdownPercentage >= maxdraw
        end_strategy := true


// This code below is from Tradingview, but with additions where commented (see below)

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Short Entry Id", strategy.short)



Berkaitan

Lebih banyak