
この戦略は、複数の移動平均クロスオーバー信号に基づく定量的な取引システムです。単純移動平均 (SMA)、指数移動平均 (EMA)、加重移動平均 (WMA)、出来高加重移動平均 (VWMA)、ハル移動平均 (LME) など、7 種類の移動平均インジケーターを組み合わせたものです。高値移動平均 (HMA)、大まかな移動平均 (RMA)、およびアーノルド・ルギーズ移動平均 (ALMA)。この戦略は、2 ラインまたは 3 ラインのクロスオーバー システムをサポートし、市場の状況に応じてロングまたはショートを柔軟に選択できます。
この戦略の核となるロジックは、異なる期間の移動平均間の相互関係を観察して市場の動向を判断することです。高速移動平均が低速移動平均を上向きに交差すると、ロング シグナルが生成され、それ以外の場合はショート シグナルが生成されます。このシステムでは、移動平均線の直接クロスオーバーに基づくエントリー方法と、移動平均線に対する終値の位置関係に基づくエントリー方法の 2 つのエントリー方法を提供しています。 3 ライン システムは、中期移動平均を導入することで、信号の信頼性と安定性を高めます。
この戦略は、複数の移動平均インジケーターと柔軟なパラメータ設定を統合することで、トレーダーに信頼性の高い定量的な取引フレームワークを提供する包括的なトレンド追跡システムです。ある程度の遅れはあるものの、この戦略は、合理的なパラメータ最適化とリスク管理措置を通じて、依然として優れた実用的価値を持っています。トレーダーは、特定の市場特性に基づいて、実際の取引でターゲットを絞った最適化を実行することが推奨されます。
/*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)