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.
Generasi sinyal perdagangan:
Kontrol Penarikan Puncak:
Analisis Siklus dari Puncak ke Akhir:
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.
Kemampuan Beradaptasi Tinggi: Dengan parameterisasi ambang maksimum dan ambang minimum, strategi dapat disesuaikan secara fleksibel dengan lingkungan pasar yang berbeda dan preferensi risiko pribadi.
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.
Kontrol Risiko Otomatis: Ketika penarikan melebihi ambang batas yang telah ditetapkan, strategi secara otomatis menghentikan perdagangan.
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.
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.
Perdagangan Sering: Di pasar yang berosilasi, SMA dapat sering melintasi, mengakibatkan perdagangan yang berlebihan dan biaya transaksi yang tinggi.
Potensi Penarikan Besar: Terlepas dari pengendalian penarikan maksimum, penurunan besar tunggal selama volatilitas pasar yang parah masih dapat mengakibatkan kerugian yang signifikan.
Sensitivitas parameter: Kinerja strategi sangat tergantung pada pilihan periode SMA dan ambang penarikan. pengaturan parameter yang tidak tepat dapat menyebabkan hasil yang tidak optimal.
Kesempatan Melanggar: Ketika perdagangan berhenti setelah mencapai ambang maksimum penarikan, strategi dapat melewatkan peluang yang dibawa oleh pembalikan pasar.
Memperkenalkan Penyesuaian Parameter Dinamis: Pertimbangkan untuk menyesuaikan periode SMA dan ambang penarikan secara dinamis berdasarkan volatilitas pasar untuk beradaptasi dengan lingkungan pasar yang berbeda.
Filter Pasar Tambahan: Masukkan indikator teknis atau faktor fundamental lainnya, seperti RSI atau volume, untuk menyaring sinyal palsu potensial.
Menerapkan Masuk dan Keluar Peringkat: Alih-alih operasi semua atau tidak ada, menerapkan pembentukan posisi bertahap dan penutupan untuk mengurangi risiko keputusan tunggal.
Tambahkan mekanisme mengambil keuntungan: Di atas pengendalian penarikan, tambahkan fungsi mengambil keuntungan yang dinamis untuk mengunci keuntungan dan meningkatkan pengembalian keseluruhan.
Mengoptimalkan Manajemen Uang: Menerapkan ukuran posisi dinamis berdasarkan ukuran akun dan volatilitas pasar untuk pengendalian risiko yang lebih baik.
Memperkenalkan Algoritma Pembelajaran Mesin: Menggunakan teknik pembelajaran mesin untuk mengoptimalkan proses seleksi parameter dan generasi sinyal, meningkatkan kemampuan dan akurasi strategi.
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)