Strategi ini adalah sistem perdagangan pendek panjang yang menggabungkan isyarat silang Purata Bergerak Sederhana (SMA) dengan kawalan penarikan puncak. Ia menggunakan penarikan 14 tempoh dan 28 tempoh SMA untuk menjana isyarat perdagangan panjang dan pendek sambil secara serentak memantau penarikan puncak strategi. Apabila penarikan melebihi ambang yang telah ditetapkan, strategi secara automatik menghentikan perdagangan. Di samping itu, strategi ini merangkumi ciri analisis kitaran puncak hingga terendah yang terperinci untuk membantu peniaga lebih memahami ciri risiko strategi.
Generasi Isyarat Perdagangan:
Kawalan Penarikan Puncak:
Analisis kitaran puncak hingga akhir:
Menggabungkan trend berikut dan kawalan risiko: Strategi silang SMA adalah kaedah trend-mengikuti klasik, manakala kawalan penarikan puncak menyediakan lapisan tambahan pengurusan risiko. Gabungan ini dapat mengawal risiko penurunan dengan berkesan sambil menangkap trend pasaran.
Kebolehsesuaian Tinggi: Dengan menetapkan parameter ambang maksimum dan minimum pengambilan, strategi boleh disesuaikan dengan fleksibel dengan persekitaran pasaran yang berbeza dan keutamaan risiko peribadi.
Penunjuk risiko telus: Analisis kitaran puncak ke bawah menyediakan maklumat pengeluaran sejarah yang terperinci, yang membolehkan peniaga memahami secara intuitif ciri risiko strategi, membantu dalam keputusan perdagangan yang lebih tepat.
Kawalan Risiko Automatik: Apabila pengeluaran melebihi ambang yang telah ditetapkan, strategi secara automatik menghentikan dagangan.
Analisis prestasi yang komprehensif: Sebagai tambahan kepada metrik backtesting konvensional, strategi menyediakan data kitaran puncak hingga terendah yang terperinci, termasuk peratusan permulaan, peratusan pengeluaran, dan maklumat masa, memudahkan analisis mendalam prestasi strategi.
Terlalu bergantung pada data sejarah: Strategi silang SMA berdasarkan data harga sejarah dan boleh bertindak balas perlahan dalam pasaran yang berubah dengan cepat, yang membawa kepada isyarat palsu.
Perdagangan kerap: Dalam pasaran yang berayun, SMA boleh menyeberang dengan kerap, mengakibatkan perdagangan yang berlebihan dan kos transaksi yang tinggi.
Potensi Pengeluaran Besar: Walaupun kawalan pengambilan maksimum, penurunan besar tunggal semasa turun naik pasaran yang teruk masih boleh menyebabkan kerugian yang ketara.
Sensitiviti parameter: Prestasi strategi sangat bergantung kepada pilihan tempoh SMA dan ambang pengeluaran. tetapan parameter yang tidak betul boleh membawa kepada hasil yang kurang optimum.
Peluang Pembalikan yang Hilang: Apabila perdagangan dihentikan selepas mencapai ambang pengeluaran maksimum, strategi mungkin terlepas peluang yang dibawa oleh pembalikan pasaran.
Memperkenalkan Penyesuaian Parameter Dinamik: Mempertimbangkan penyesuaian dinamik tempoh SMA dan ambang pengambilan berdasarkan turun naik pasaran untuk menyesuaikan diri dengan persekitaran pasaran yang berbeza.
Penapis pasaran tambahan: Menggabungkan penunjuk teknikal atau faktor asas lain, seperti RSI atau jumlah, untuk menapis isyarat palsu yang berpotensi.
Melaksanakan kemasukan dan keluar secara berperingkat: Daripada operasi semua-atau-tidak, melaksanakan pembinaan kedudukan dan penutupan secara berperingkat untuk mengurangkan risiko keputusan tunggal.
Tambahkan mekanisme mengambil keuntungan: Di atas kawalan pengeluaran, tambah fungsi mengambil keuntungan dinamik untuk mengunci keuntungan dan meningkatkan pulangan keseluruhan.
Mengoptimumkan Pengurusan Wang: Melaksanakan saiz kedudukan dinamik berdasarkan saiz akaun dan turun naik pasaran untuk kawalan risiko yang lebih baik.
Memperkenalkan algoritma pembelajaran mesin: Menggunakan teknik pembelajaran mesin untuk mengoptimumkan pemilihan parameter dan proses penjanaan isyarat, meningkatkan kebolehsesuaian strategi dan ketepatan.
Strategi SMA crossover long-short yang digabungkan dengan kawalan penarikan puncak dan penamatan automatik adalah sistem perdagangan kuantitatif yang menyeimbangkan trend berikut dan pengurusan risiko. Ia menangkap trend pasaran melalui crossover purata bergerak yang mudah sambil menguruskan risiko penurunan menggunakan kawalan penarikan puncak. Ciri unik strategi ini terletak pada analisis kitaran puncak hingga terendah yang terperinci, menyediakan peniaga dengan alat untuk memahami secara mendalam ciri risiko strategi.
Walaupun strategi ini mempunyai beberapa risiko yang melekat, seperti terlalu bergantung pada data sejarah dan kepekaan parameter, ia dapat meningkatkan ketahanan dan keuntungan dengan ketara melalui pengoptimuman dan penambahbaikan yang sesuai.
Secara keseluruhan, strategi ini menyediakan pedagang dengan titik permulaan yang baik yang boleh disesuaikan dan dioptimumkan untuk memenuhi matlamat perdagangan individu dan keutamaan risiko. Reka bentuk modular strategi juga memudahkan integrasi dengan strategi perdagangan atau teknik pengurusan risiko lain, meletakkan asas untuk membina sistem perdagangan yang lebih kompleks dan komprehensif.
/*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)