Sumber dimuat naik... memuat...

Strategi kuantitatif crossover purata bergerak dinamik pelbagai penunjuk

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

img

Ringkasan

Strategi ini adalah sistem perdagangan kuantitatif berdasarkan pelbagai isyarat crossover purata bergerak. Ia mengintegrasikan tujuh jenis purata bergerak yang berbeza, termasuk Purata Bergerak Sederhana (SMA), Purata Bergerak Eksponen (EMA), Purata Bergerak Bertimbang (WMA), Purata Bergerak Bertimbang Volume (VWMA), Purata Bergerak Hull (HMA), Purata Bergerak Lurus (RMA), dan Purata Bergerak Arnaud Legoux (ALMA). Strategi ini menyokong kedua-dua sistem crossover dua baris dan tiga baris dan menawarkan pilihan perdagangan panjang dan pendek yang fleksibel.

Prinsip Strategi

Logik teras strategi ini adalah untuk menentukan trend pasaran dengan memerhatikan hubungan silang antara purata bergerak dari tempoh yang berbeza. Isyarat panjang dihasilkan apabila purata bergerak pantas melintasi di atas purata bergerak perlahan, dan sebaliknya untuk isyarat pendek. Sistem ini menyediakan dua kaedah kemasukan: satu berdasarkan silang purata bergerak langsung, dan yang lain berdasarkan kedudukan harga penutupan berbanding purata bergerak. Sistem tiga baris memperkenalkan purata bergerak jangka menengah untuk meningkatkan kebolehpercayaan dan kestabilan isyarat.

Kelebihan Strategi

  1. Kemudahan penyesuaian yang tinggi: Integrasi tujuh purata bergerak yang berbeza membolehkan strategi untuk menyesuaikan diri dengan pelbagai persekitaran pasaran dan instrumen perdagangan
  2. Kestabilan isyarat: Mekanisme pengesahan berbilang membantu mengelakkan isyarat palsu
  3. Parameter fleksibel: Sokong tetapan tempoh yang boleh disesuaikan untuk pengoptimuman dan pengujian belakang
  4. Kawalan Risiko: Termasuk mekanisme jualan pendek untuk merebut peluang perdagangan dua hala
  5. Visualisasi yang jelas: Strategi menyediakan antara muka grafik yang intuitif dengan alat bantu visual seperti mengisi kawasan trend

Risiko Strategi

  1. Kesan Lag: Purata bergerak adalah penunjuk yang secara semula jadi ketinggalan, berpotensi kehilangan titik kemasukan optimum di pasaran yang tidak menentu
  2. Prestasi yang lemah di pasaran yang berbeza: Boleh menghasilkan isyarat palsu yang kerap di pasaran sampingan
  3. Kebergantungan Parameter: Prestasi berbeza dengan ketara dengan kombinasi parameter yang berbeza, yang memerlukan pengoptimuman berterusan
  4. Risiko sistematik: Mungkin tidak bertindak balas dengan cepat kepada peristiwa pasaran tiba-tiba untuk menghentikan kerugian

Arahan Pengoptimuman Strategi

  1. Menggabungkan Penunjuk Volatiliti: Cadangkan mengintegrasikan ATR atau penunjuk serupa untuk saiz kedudukan dinamik
  2. Tambah penapis persekitaran pasaran: Boleh termasuk penunjuk kekuatan trend untuk menapis isyarat di pasaran yang berbeza
  3. Mengoptimumkan Mekanisme Stop-Loss: Mencadangkan menambah fungsi stop-loss trailing untuk meningkatkan kawalan risiko
  4. Analisis Volume yang Ditingkatkan: Cadangkan memasukkan perubahan jumlah untuk mengesahkan kesahihan trend

Ringkasan

Strategi ini adalah sistem trend berikut yang komprehensif yang menyediakan kerangka perdagangan kuantitatif yang boleh dipercayai melalui integrasi beberapa penunjuk purata bergerak dan tetapan parameter yang fleksibel. Walaupun ia mempunyai beberapa kelewatan yang melekat, strategi ini mengekalkan nilai praktikal melalui pengoptimuman parameter yang betul dan langkah kawalan 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 lanjut