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

고급 유연한 다기간 이동평균 크로스오버 전략

저자:차오장, 날짜: 2024-11-28 15:18:47
태그:MASMAEMAWMAHMASMMA

img

전반적인 설명

이 전략은 여러 이동 평균 및 시간 기간을 기반으로 한 고급 양적 거래 시스템입니다. 트레이더가 다양한 유형의 이동 평균 (SMA, EMA, WMA, HMA 및 SMMA를 포함하여) 을 유연하게 선택하고 시장 조건에 따라 매일, 주간 또는 월간 시간 프레임과 같은 여러 시간 기간을 전환 할 수 있습니다. 핵심 논리는 거래 정확성을 향상시키기 위해 다른 시간 기간 검토를 결합하면서 선택한 이동 평균 위치와 폐쇄 가격을 비교하여 구매 및 판매 신호를 결정합니다.

전략 원칙

이 전략은 이동 평균 유형 선택 모듈, 시간 기간 선택 모듈, 신호 생성 모듈 및 위치 관리 모듈의 네 가지 핵심 구성 요소로 구성된 모듈형 디자인을 사용합니다. 종료 가격이 선택된 이동 평균 이상으로 넘을 때 시스템은 다음 거래 기간의 시작에서 긴 신호를 생성합니다. 종료 가격이 이동 평균 이하로 넘을 때 시스템은 종료 신호를 생성합니다. 전략은 request.security 기능을 통해 기간 간 데이터 계산을 구현하여 다른 시간 프레임에 걸쳐 신호 정확성을 보장합니다. 또한 전략에는 자본 안전성을 보장하기 위해 백테스팅의 끝에서 자동 위치 폐쇄가 포함되어 있습니다.

전략적 장점

  1. 높은 유연성: 여러 이동 평균 유형과 시간 기간의 조합을 지원하며 다른 시장 환경에 적응합니다.
  2. 종합적인 위험 관리: 기간 종료 자동 검사 메커니즘을 통해 놓친 기회를 방지합니다.
  3. 합리적인 자본 관리: 효과적인 위험 통제를 위해 고용자 위치 비율 관리
  4. 강한 신호 안정성: 여러 확인 메커니즘을 통해 잘못된 신호를 줄입니다.
  5. 광범위한 적응성: 다양한 거래 도구 및 시장 환경에 적용됩니다.

전략 위험

  1. 지연 위험: 이동 평균 지표는 본질적으로 약간의 지연을 가지고 있으며, 잠재적으로 지연된 입출시기를 유발할 수 있습니다.
  2. 오스실레이션 위험: 옆 시장에서 빈번한 잘못된 브레이크 신호를 생성할 수 있습니다.
  3. 기간 간 위험: 서로 다른 기간의 신호가 서로 모순될 수 있으므로 효과적인 신호 우선 순위가 필요합니다.
  4. 자본 관리 위험: 특정 시장 조건에서 고정 비율 포지션은 너무 공격적일 수 있습니다.

전략 최적화 방향

  1. 변동성 지표를 포함합니다: 동적 포지션 사이즈링을 위해 ATR 또는 볼린거 밴드를 추가하는 것이 좋습니다.
  2. 트렌드 필터 추가: 주요 트렌드 방향의 오픈 포지션에만 장기 트렌드 판단 메커니즘을 추가 할 수 있습니다.
  3. 신호 확인을 최적화: 신호 신뢰성을 향상시키기 위해 볼륨 및 기타 보조 지표 도입을 고려하십시오.
  4. 스톱 로스 메커니즘 개선: 더 나은 이익 보호를 위해 후속 스톱 로스 기능을 추가하는 것이 제안됩니다.
  5. 시장 감정 지표 추가: 시장 과잉 구매/ 과잉 판매 상황을 판단하기 위해 RSI 또는 MACD를 도입하는 것이 제안됩니다.

요약

이 전략은 명확한 논리를 가진 잘 설계된 거래 시스템이며, 유연한 매개 변수 설정과 여러 확인 메커니즘을 통해 거래자에게 신뢰할 수있는 거래 도구를 제공합니다. 전략의 모듈형 설계는 강력한 확장성을 부여하며 지속적인 최적화를 통해 성능을 더욱 향상시킬 수 있습니다. 거래자가 라이브 거래 전에 백테스팅 환경에서 다양한 매개 변수 조합을 완전히 테스트하여 자신의 필요에 가장 적합한 전략 구성을 찾는 것이 좋습니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Flexible Moving Average Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Input to select the review frequency (Daily, Weekly, Monthly)
check_frequency = input.string("Weekly", title="Review Frequency", options=["Daily", "Weekly", "Monthly"])

// Input to select the Moving Average method (SMA, EMA, WMA, HMA, SMMA)
ma_method = input.string("EMA", title="Moving Average Method", options=["SMA", "EMA", "WMA", "HMA", "SMMA"])

// Input to select the length of the Moving Average
ma_length = input.int(30, title="Moving Average Length", minval=1)

// Input to select the timeframe for Moving Average calculation
ma_timeframe = input.string("W", title="Moving Average Timeframe", options=["D", "W", "M"])

// Calculate all Moving Averages on the selected timeframe
sma_value = request.security(syminfo.tickerid, ma_timeframe, ta.sma(close, ma_length), lookahead=barmerge.lookahead_off)
ema_value = request.security(syminfo.tickerid, ma_timeframe, ta.ema(close, ma_length), lookahead=barmerge.lookahead_off)
wma_value = request.security(syminfo.tickerid, ma_timeframe, ta.wma(close, ma_length), lookahead=barmerge.lookahead_off)
hma_value = request.security(syminfo.tickerid, ma_timeframe, ta.hma(close, ma_length), lookahead=barmerge.lookahead_off)
smma_value = request.security(syminfo.tickerid, ma_timeframe, ta.rma(close, ma_length), lookahead=barmerge.lookahead_off) // Smoothed Moving Average (SMMA)

// Select the appropriate Moving Average based on user input
ma = ma_method == "SMA" ? sma_value : 
     ma_method == "EMA" ? ema_value :
     ma_method == "WMA" ? wma_value :
     ma_method == "HMA" ? hma_value :
     smma_value  // Default to SMMA

// Variable initialization
var float previous_close = na
var float previous_ma = na
var float close_to_compare = na
var float ma_to_compare = na

// Detect the end of the period (Daily, Weekly, or Monthly) based on the selected frequency
var bool is_period_end = false

if check_frequency == "Daily"
    is_period_end := ta.change(time('D')) != 0
else if check_frequency == "Weekly"
    is_period_end := ta.change(time('W')) != 0
else if check_frequency == "Monthly"
    is_period_end := ta.change(time('M')) != 0

// Store the close and Moving Average values at the end of the period
if is_period_end
    previous_close := close[0]  // Closing price of the last day of the period
    previous_ma := ma[0]  // Moving Average value at the end of the period

// Strategy logic
is_period_start = is_period_end

// Check if this is the first bar of the backtest
is_first_bar = barstate.isfirst

if (is_period_start or is_first_bar)
    // If the previous period values are not available, use current values
    close_to_compare := not na(previous_close) ? previous_close : close[0]
    ma_to_compare := not na(previous_ma) ? previous_ma : ma[0]
    
    if close_to_compare < ma_to_compare
        // Close price below the MA -> Sell
        if strategy.position_size > 0
            strategy.close("Long")
    else
        // Close price above the MA -> Buy/Hold
        if strategy.position_size == 0
            strategy.entry("Long", strategy.long)

// Close all positions at the end of the backtest period
if barstate.islastconfirmedhistory
    strategy.close_all(comment="Backtest End")

// Plot the previous period's close price for comparison
plot(previous_close, color=color.red, title="Previous Period Close", style=plot.style_stepline)
plot(close_to_compare, color=color.blue, title="Close to Compare", style=plot.style_line)

// Plot the selected Moving Average
plot(ma, color=color.white, title="Moving Average", style=plot.style_line, linewidth=3)

관련

더 많은