리소스 로딩... 로딩...

다중 지표 동적 이동 평균 크로스오버 양적 전략

저자:차오장, 날짜: 2025-01-06 13:46:47
태그:SMAEMAWMAVWMAHMARMAALMAMA

img

전반적인 설명

이 전략은 여러 이동 평균 크로스오버 신호를 기반으로 하는 양적 거래 시스템이다. 이 전략은 간단한 이동 평균 (SMA), 기하급수적인 이동 평균 (EMA), 가중 이동 평균 (WMA), 볼륨 가중 이동 평균 (VWMA), 허ల్ 이동 평균 (HMA), 매끄러운 이동 평균 (RMA), 아르노 레고 이동 평균 (ALMA) 등 7 가지 다른 유형의 이동 평균을 통합한다. 이 전략은 두 라인 및 세 라인 크로스오버 시스템을 지원하며 유연한 긴 및 짧은 거래 옵션을 제공합니다.

전략 원칙

이 전략의 핵심 논리는 서로 다른 기간의 이동 평균 사이의 교차 관계를 관찰함으로써 시장 추세를 결정하는 것입니다. 빠른 이동 평균이 느린 이동 평균을 넘어서면 긴 신호가 생성되며, 짧은 신호는 반대로 발생합니다. 시스템은 두 가지 입구 방법을 제공합니다. 하나는 직접 이동 평균 교차를 기반으로하고 다른 하나는 이동 평균에 대한 폐쇄 가격의 위치를 기반으로합니다. 세 줄 시스템에서는 신호 신뢰성과 안정성을 향상시키기 위해 중장기 이동 평균을 도입합니다.

전략적 장점

  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)


관련

더 많은