Sumber dimuat naik... memuat...

Strategi jangka pendek SMA Crossover dengan Kawalan Penarikan Puncak dan Pengakhiran Otomatik

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

img

Ringkasan

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.

Prinsip Strategi

  1. Generasi Isyarat Perdagangan:

    • Isyarat panjang dihasilkan apabila SMA 14 tempoh melintasi di atas SMA 28 tempoh.
    • Isyarat pendek dihasilkan apabila SMA 14 tempoh melintasi di bawah SMA 28 tempoh.
  2. Kawalan Penarikan Puncak:

    • Pengesanan masa nyata kurva ekuiti strategi, merekod titik tinggi sejarah (puncak).
    • Apabila ekuiti semasa jatuh di bawah puncak, ia memasuki keadaan pengeluaran, merekodkan titik terendah (tembung).
    • Peratusan penggunaan dikira sebagai: (Pacak - Trough) / Peak * 100%.
    • Jika peratusan pengambilan melebihi ambang maksimum pengambilan yang telah ditetapkan, strategi berhenti membuka kedudukan baru.
  3. Analisis kitaran puncak hingga akhir:

    • Tetapkan peratusan pengambilan minimum untuk menentukan kitaran puncak hingga terendah yang sah.
    • Untuk setiap kitaran sah yang diselesaikan, catat nombor kitaran, peratusan berjalan sebelumnya, peratusan pengambilan, dan masa akhir.
    • Analisis paparan menghasilkan format jadual untuk kajian mudah prestasi sejarah strategi.

Kelebihan Strategi

  1. 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.

  2. Kebolehsesuaian Tinggi: Dengan menetapkan parameter ambang maksimum dan minimum pengambilan, strategi boleh disesuaikan dengan fleksibel dengan persekitaran pasaran yang berbeza dan keutamaan risiko peribadi.

  3. 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.

  4. Kawalan Risiko Automatik: Apabila pengeluaran melebihi ambang yang telah ditetapkan, strategi secara automatik menghentikan dagangan.

  5. 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.

Risiko Strategi

  1. 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.

  2. Perdagangan kerap: Dalam pasaran yang berayun, SMA boleh menyeberang dengan kerap, mengakibatkan perdagangan yang berlebihan dan kos transaksi yang tinggi.

  3. Potensi Pengeluaran Besar: Walaupun kawalan pengambilan maksimum, penurunan besar tunggal semasa turun naik pasaran yang teruk masih boleh menyebabkan kerugian yang ketara.

  4. 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.

  5. Peluang Pembalikan yang Hilang: Apabila perdagangan dihentikan selepas mencapai ambang pengeluaran maksimum, strategi mungkin terlepas peluang yang dibawa oleh pembalikan pasaran.

Arahan Pengoptimuman Strategi

  1. Memperkenalkan Penyesuaian Parameter Dinamik: Mempertimbangkan penyesuaian dinamik tempoh SMA dan ambang pengambilan berdasarkan turun naik pasaran untuk menyesuaikan diri dengan persekitaran pasaran yang berbeza.

  2. Penapis pasaran tambahan: Menggabungkan penunjuk teknikal atau faktor asas lain, seperti RSI atau jumlah, untuk menapis isyarat palsu yang berpotensi.

  3. Melaksanakan kemasukan dan keluar secara berperingkat: Daripada operasi semua-atau-tidak, melaksanakan pembinaan kedudukan dan penutupan secara berperingkat untuk mengurangkan risiko keputusan tunggal.

  4. Tambahkan mekanisme mengambil keuntungan: Di atas kawalan pengeluaran, tambah fungsi mengambil keuntungan dinamik untuk mengunci keuntungan dan meningkatkan pulangan keseluruhan.

  5. Mengoptimumkan Pengurusan Wang: Melaksanakan saiz kedudukan dinamik berdasarkan saiz akaun dan turun naik pasaran untuk kawalan risiko yang lebih baik.

  6. Memperkenalkan algoritma pembelajaran mesin: Menggunakan teknik pembelajaran mesin untuk mengoptimumkan pemilihan parameter dan proses penjanaan isyarat, meningkatkan kebolehsesuaian strategi dan ketepatan.

Kesimpulan

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)



Berkaitan

Lebih lanjut