Sumber daya yang dimuat... Pemuatan...

Strategi Kuantitatif Crossover Rata-rata Bergerak Dinamis Multi-Indikator

Penulis:ChaoZhang, Tanggal: 2025-01-06 13:46:47
Tag:SMAEMAWMAVWMAHMARMAALMAMA

img

Gambaran umum

Strategi ini adalah sistem perdagangan kuantitatif berdasarkan beberapa sinyal crossover rata-rata bergerak. Strategi ini mengintegrasikan tujuh jenis rata-rata bergerak yang berbeda, termasuk Simple Moving Average (SMA), Exponential Moving Average (EMA), Weighted Moving Average (WMA), Volume Weighted Moving Average (VWMA), Hull Moving Average (HMA), Smoothed Moving Average (RMA), dan Arnaud Legoux Moving Average (ALMA).

Prinsip Strategi

Logika inti dari strategi ini adalah untuk menentukan tren pasar dengan mengamati hubungan silang antara rata-rata bergerak dari periode yang berbeda. Sinyal panjang dihasilkan ketika rata-rata bergerak cepat melintasi di atas rata-rata bergerak lambat, dan sebaliknya untuk sinyal pendek. Sistem ini menyediakan dua metode masuk: satu berdasarkan crossover rata-rata bergerak langsung, dan yang lain berdasarkan posisi harga penutupan relatif terhadap rata-rata bergerak.

Keuntungan Strategi

  1. Adaptabilitas tinggi: Integrasi tujuh rata-rata bergerak yang berbeda memungkinkan strategi untuk beradaptasi dengan berbagai lingkungan pasar dan instrumen perdagangan
  2. Stabilitas sinyal: Beberapa mekanisme konfirmasi membantu menghindari sinyal palsu
  3. Parameter Fleksibel: Mendukung pengaturan periode yang dapat disesuaikan untuk optimasi dan backtesting
  4. Pengendalian Risiko: Termasuk mekanisme short selling untuk memanfaatkan peluang perdagangan bilateral
  5. Visualisasi yang jelas: Strategi menyediakan antarmuka grafis yang intuitif dengan alat bantu visual seperti mengisi area tren

Risiko Strategi

  1. Efek Lag: Rata-rata bergerak secara inheren merupakan indikator yang tertinggal, berpotensi kehilangan titik masuk optimal di pasar yang tidak stabil
  2. Kinerja yang buruk di Pasar Bervariasi: Dapat menghasilkan sinyal palsu yang sering di pasar sampingan
  3. Keandalan Parameter: Kinerja bervariasi secara signifikan dengan kombinasi parameter yang berbeda, yang membutuhkan optimasi terus menerus
  4. Risiko sistematis: Mungkin tidak merespons dengan cukup cepat terhadap peristiwa pasar yang tiba-tiba untuk stop loss

Arah Optimasi Strategi

  1. Mengintegrasikan Indikator Volatilitas: Saran untuk mengintegrasikan ATR atau indikator serupa untuk ukuran posisi dinamis
  2. Tambahkan Filter Lingkungan Pasar: Dapat menyertakan indikator kekuatan tren untuk menyaring sinyal di berbagai pasar
  3. Mengoptimalkan Mekanisme Stop-Loss: Merekomendasikan menambahkan fungsi stop-loss trailing untuk meningkatkan kontrol risiko
  4. Analisis Volume yang Ditingkatkan: Saran untuk memasukkan perubahan volume untuk mengkonfirmasi validitas tren

Ringkasan

Strategi ini adalah sistem trend-following yang komprehensif yang menyediakan kerangka kerja perdagangan kuantitatif yang dapat diandalkan melalui integrasi beberapa indikator moving average dan pengaturan parameter yang fleksibel. Meskipun memiliki beberapa keterlambatan yang melekat, strategi ini mempertahankan nilai praktis melalui optimasi parameter yang tepat dan langkah-langkah pengendalian risiko.


/*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)


Berkaitan

Lebih banyak