マルチ指標融合動的移動平均クロスオーバー定量戦略

SMA EMA WMA VWMA HMA RMA ALMA MA
作成日: 2025-01-06 13:46:47 最終変更日: 2025-01-06 13:46:47
コピー: 2 クリック数: 443
1
フォロー
1617
フォロワー

マルチ指標融合動的移動平均クロスオーバー定量戦略

概要

この戦略は、複数の移動平均クロスオーバー信号に基づく定量的な取引システムです。単純移動平均 (SMA)、指数移動平均 (EMA)、加重移動平均 (WMA)、出来高加重移動平均 (VWMA)、ハル移動平均 (LME) など、7 種類の移動平均インジケーターを組み合わせたものです。高値移動平均 (HMA)、大まかな移動平均 (RMA)、およびアーノルド・ルギーズ移動平均 (ALMA)。この戦略は、2 ラインまたは 3 ラインのクロスオーバー システムをサポートし、市場の状況に応じてロングまたはショートを柔軟に選択できます。

戦略原則

この戦略の核となるロジックは、異なる期間の移動平均間の相互関係を観察して市場の動向を判断することです。高速移動平均が低速移動平均を上向きに交差すると、ロング シグナルが生成され、それ以外の場合はショート シグナルが生成されます。このシステムでは、移動平均線の直接クロスオーバーに基づくエントリー方法と、移動平均線に対する終値の位置関係に基づくエントリー方法の 2 つのエントリー方法を提供しています。 3 ライン システムは、中期移動平均を導入することで、信号の信頼性と安定性を高めます。

戦略的優位性

  1. 強い適応性:7つの異なる移動平均を統合することで、この戦略はさまざまな市場環境や取引商品に適応できます。
  2. 安定した信号: 誤った信号を避けるために複数の確認メカニズムが使用されています
  3. 柔軟なパラメータ: カスタムサイクル設定をサポートし、最適化とバックテストが簡単
  4. リスク管理可能: 双方向の取引機会を捉えるための空売りメカニズムを提供する
  5. 明確な視覚化: この戦略は、トレンドエリアの塗りつぶしなどの視覚的な補助を含む直感的なグラフィカルインターフェイスを提供します。

戦略リスク

  1. 遅れ: 移動平均は本質的に遅行指標であり、不安定な市場では最適なエントリーポイントを逃す可能性があります。
  2. 不安定な市場には適していません。横ばいで不安定な市場では、頻繁に誤ったシグナルが発生する可能性があります。
  3. パラメータ依存性: 異なるパラメータの組み合わせのパフォーマンスは大きく異なるため、継続的に最適化する必要があります。
  4. システムリスク: 市場でイベントが発生したときに、損失を時間内に止めることができない可能性があります。

戦略最適化の方向性

  1. ボラティリティ指標の導入: ATRなどのボラティリティ指標を組み合わせてポジションサイズを動的に調整することをお勧めします。
  2. 市場環境フィルターの追加: 変動の激しい市場での取引シグナルをフィルターするためにトレンド強度インジケーターを追加できます
  3. ストップロスメカニズムの最適化:リスク管理能力を向上させるために、トレーリングストップロス機能を追加することをお勧めします。
  4. ボリューム分析を追加: トレンドの妥当性を確認するためにボリュームの変化を組み合わせることをお勧めします。

要約する

この戦略は、複数の移動平均インジケーターと柔軟なパラメータ設定を統合することで、トレーダーに信頼性の高い定量的な取引フレームワークを提供する包括的なトレンド追跡システムです。ある程度の遅れはあるものの、この戦略は、合理的なパラメータ最適化とリスク管理措置を通じて、依然として優れた実用的価値を持っています。トレーダーは、特定の市場特性に基づいて、実際の取引でターゲットを絞った最適化を実行することが推奨されます。

ストラテジーソースコード
/*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)