Strategi kuantitatif crossover rata-rata pergerakan dinamis fusi multi-indikator

SMA EMA WMA VWMA HMA RMA ALMA MA
Tanggal Pembuatan: 2025-01-06 13:46:47 Akhirnya memodifikasi: 2025-01-06 13:46:47
menyalin: 2 Jumlah klik: 443
1
fokus pada
1617
Pengikut

Strategi kuantitatif crossover rata-rata pergerakan dinamis fusi multi-indikator

Ringkasan

Strategi ini adalah sistem perdagangan kuantitatif yang didasarkan pada beberapa sinyal persilangan rata-rata pergerakan. Menggabungkan tujuh jenis indikator rata-rata bergerak yang berbeda, termasuk rata-rata bergerak sederhana (SMA), rata-rata bergerak eksponensial (EMA), rata-rata bergerak tertimbang (WMA), rata-rata bergerak tertimbang volume (VWMA), rata-rata bergerak Hull (LME), dan banyak lagi. Rata-Rata Pergerakan Tinggi (HMA), Rata-Rata Pergerakan Kasar (RMA), dan Rata-Rata Pergerakan Arnold-Leguise (ALMA). Strategi ini mendukung sistem persilangan dua baris atau tiga baris, dan dapat secara fleksibel memilih untuk mengambil posisi panjang atau pendek sesuai dengan kondisi pasar.

Prinsip Strategi

Logika inti dari strategi ini adalah menilai tren pasar dengan mengamati hubungan silang antara rata-rata pergerakan dalam periode yang berbeda. Ketika rata-rata pergerakan cepat melintasi rata-rata pergerakan lambat ke atas, sinyal panjang dihasilkan; jika tidak, sinyal pendek dihasilkan. Sistem ini menyediakan dua metode entri: satu berdasarkan pada persilangan langsung rata-rata pergerakan, dan yang lainnya berdasarkan pada hubungan posisi harga penutupan relatif terhadap rata-rata pergerakan. Sistem tiga garis meningkatkan keandalan dan stabilitas sinyal dengan memperkenalkan rata-rata pergerakan jangka menengah.

Keunggulan Strategis

  1. Kemampuan beradaptasi yang kuat: Dengan mengintegrasikan tujuh moving average yang berbeda, strategi ini dapat beradaptasi dengan lingkungan pasar dan produk perdagangan yang berbeda
  2. Sinyal stabil: beberapa mekanisme konfirmasi digunakan untuk menghindari sinyal palsu
  3. Parameter fleksibel: mendukung pengaturan siklus khusus, mudah dioptimalkan dan diuji ulang
  4. Risiko dapat dikendalikan: Menyediakan mekanisme penjualan pendek untuk membantu memanfaatkan peluang perdagangan dua arah
  5. Visualisasi yang jelas: Strategi ini menyediakan antarmuka grafis yang intuitif, termasuk alat bantu visual seperti pengisian area tren

Risiko Strategis

  1. Lag: Rata-rata pergerakan pada dasarnya adalah indikator yang tertinggal dan mungkin kehilangan titik masuk terbaik di pasar yang bergejolak.
  2. Tidak cocok untuk pasar yang fluktuatif: Sinyal palsu yang sering terjadi dapat terjadi di pasar yang sideways dan fluktuatif
  3. Ketergantungan parameter: Kinerja kombinasi parameter yang berbeda sangat bervariasi dan perlu dioptimalkan secara terus-menerus
  4. Risiko sistemik: Mungkin tidak mungkin untuk menghentikan kerugian tepat waktu ketika peristiwa pasar terjadi.

Arah optimasi strategi

  1. Memperkenalkan indikator volatilitas: Disarankan untuk menggabungkan indikator volatilitas seperti ATR untuk menyesuaikan ukuran posisi secara dinamis
  2. Tambahkan filter lingkungan pasar: Anda dapat menambahkan indikator kekuatan tren untuk memfilter sinyal perdagangan di pasar yang bergejolak
  3. Optimalkan mekanisme stop loss: Disarankan untuk menambahkan fungsi trailing stop loss untuk meningkatkan kemampuan pengendalian risiko
  4. Tambahkan analisis volume: Disarankan untuk menggabungkan perubahan volume untuk mengonfirmasi validitas tren

Meringkaskan

Strategi ini adalah sistem pelacakan tren komprehensif yang memberi pedagang kerangka kerja perdagangan kuantitatif yang andal dengan mengintegrasikan beberapa indikator rata-rata pergerakan dan pengaturan parameter yang fleksibel. Meskipun ada keterlambatan tertentu, strategi tersebut masih memiliki nilai praktis yang baik melalui optimalisasi parameter yang wajar dan langkah-langkah pengendalian risiko. Disarankan agar pedagang melakukan optimasi yang tertarget dalam perdagangan nyata berdasarkan karakteristik pasar tertentu.

Kode Sumber Strategi
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Cruce de Medias Total", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100,max_bars_back=1000)

// Parámetros de entrada
periodo_rapida = input.int(50, title="Periodos para media rápida", minval=1)
periodo_lenta = input.int(200, title="Periodos para media lenta", minval=1)

// Selección del tipo de media móvil
tipo_de_media = input.string(title="Elige el tipo de media móvil", defval="Simple sma", options=["Simple sma", "Exponencial ema", "Ponderada wma", "Volumen ponderada vwma", "Hull hma", "Media suavizada rma", "Media de Arnaud Legoux alma"])

// Posibilidad de estrategia con cruce de tres medias móviles
tres_medias = input.bool(false, title="Estrategia con cruce de 3 medias móviles")
periodo_media = input.int(100, title="Periodos para media media", minval=1)

// Opción de operar en corto
permitir_corto = input.bool(false, title="Permitir operaciones en corto")

// Opción de cuando comprar
cuando_comprar = input.string(title="Cuando comprar", defval="Cruce de medias", options=["Vela anterior cierra por encima de las medias", "Cruce de medias"])
// Opción de cuando vender
cuando_vender = input.string(title="Cuando vender", defval="Cruce de medias", options=["Vela anterior cierra por debajo de las medias", "Cruce de medias"])

float media_mov_rapida = na
float media_mov_media = na
float media_mov_lenta = na

// Definición de las medias móviles
if tipo_de_media == "Simple sma"
    media_mov_rapida := ta.sma(close, periodo_rapida)
    media_mov_media := ta.sma(close, periodo_media)
    media_mov_lenta := ta.sma(close, periodo_lenta)
else if tipo_de_media == "Exponencial ema"
    media_mov_rapida := ta.ema(close, periodo_rapida)
    media_mov_media := ta.ema(close, periodo_media)
    media_mov_lenta := ta.ema(close, periodo_lenta)
else if tipo_de_media == "Ponderada wma"
    media_mov_rapida := ta.wma(close, periodo_rapida)
    media_mov_media := ta.wma(close, periodo_media)
    media_mov_lenta := ta.wma(close, periodo_lenta)
else if tipo_de_media == "Volumen ponderada vwma"
    media_mov_rapida := ta.vwma(close, periodo_rapida)
    media_mov_media := ta.vwma(close, periodo_media)
    media_mov_lenta := ta.vwma(close, periodo_lenta)
else if tipo_de_media == "Hull hma"
    media_mov_rapida := ta.hma(close, periodo_rapida)
    media_mov_media := ta.hma(close, periodo_media)
    media_mov_lenta := ta.hma(close, periodo_lenta)
else if tipo_de_media == "Media suavizada rma"
    media_mov_rapida := ta.rma(close, periodo_rapida)
    media_mov_media := ta.rma(close, periodo_media)
    media_mov_lenta := ta.rma(close, periodo_lenta)
else if tipo_de_media == "Media de Arnaud Legoux alma"
    offset = input.int(0, title="Desfase para ALMA", minval=-100, maxval=100)
    sigma = input.float(6, title="Sigma para ALMA", minval=0.1, maxval=10)
    media_mov_rapida := ta.alma(close, periodo_rapida, offset, sigma)
    media_mov_media := ta.alma(close, periodo_media, offset, sigma)
    media_mov_lenta := ta.alma(close, periodo_lenta, offset, sigma)

// Graficar las medias móviles en el gráfico
plot_rapida = plot(media_mov_rapida, color=color.green, linewidth=2, title="Media Móvil Rápida")
plot_media = plot(tres_medias ? media_mov_media : na, color=color.blue, linewidth=2, title="Media Móvil Media")
plot_lenta = plot(media_mov_lenta, color=color.red, linewidth=2, title="Media Móvil Lenta")

// Rellenar el área entre las medias móviles con color condicionado
fill(plot_rapida, plot_lenta, media_mov_rapida > media_mov_lenta ? color.new(color.green, 90) : color.new(color.red, 90), title="Relleno entre Medias")

// Lógica de la estrategia para cruce de medias
comprado = strategy.position_size > 0  // Verifica si ya hay una posición abierta
vendido = strategy.position_size < 0 

if not comprado  // Solo compra si no hay una posición abierta
    if tres_medias and cuando_comprar == "Cruce de medias"
        if media_mov_rapida > media_mov_media and media_mov_media > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if not tres_medias and cuando_comprar == "Cruce de medias"
        if ta.crossover(media_mov_rapida, media_mov_lenta)
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if tres_medias and cuando_comprar == "Vela anterior cierra por encima de las medias"
        if close[1] > media_mov_rapida and close[1] > media_mov_media and close[1] > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if not tres_medias and cuando_comprar == "Vela anterior cierra por encima de las medias"
        if close[1] > media_mov_rapida and close[1] > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)

// Condición de cierre de la posición
if comprado
    if tres_medias and cuando_vender == "Cruce de medias"
        if media_mov_rapida < media_mov_media and media_mov_media < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if not tres_medias and cuando_vender == "Cruce de medias"
        if ta.crossunder(media_mov_rapida, media_mov_lenta)
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if tres_medias and cuando_vender == "Vela anterior cierra por debajo de las medias"
        if close[1] < media_mov_rapida and close[1] < media_mov_media and close[1] < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if not tres_medias and cuando_vender == "Vela anterior cierra por debajo de las medias"
        if close[1] < media_mov_rapida and close[1] < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)

// Condición de entrar en corto
if not vendido and permitir_corto
    if tres_medias
        if media_mov_rapida < media_mov_media and media_mov_media < media_mov_lenta
            strategy.entry("Short", strategy.short)
            label.new(bar_index, low, "Short", style=label.style_label_up, color=color.blue, textcolor=color.white)
    else
        if ta.crossunder(media_mov_rapida, media_mov_lenta)
            strategy.entry("Short", strategy.short)
            label.new(bar_index, low, "Short", style=label.style_label_up, color=color.blue, textcolor=color.white)

// Condición de cierre de posición corta
if vendido
    if tres_medias
        if media_mov_rapida > media_mov_media and media_mov_media > media_mov_lenta
            strategy.close("Short")
            label.new(bar_index, high, "Cierre Short", style=label.style_label_down, color=color.purple, textcolor=color.white)
    else
        if ta.crossover(media_mov_rapida, media_mov_lenta)
            strategy.close("Short")
            label.new(bar_index, high, "Cierre Short", style=label.style_label_down, color=color.purple, textcolor=color.white)