적응형 트렌드 유동성 멀티 필터 트레이딩 전략

EMA SMA MACD ATR HLC3
생성 날짜: 2025-01-06 11:58:25 마지막으로 수정됨: 2025-01-06 11:58:25
복사: 0 클릭수: 617
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

적응형 트렌드 유동성 멀티 필터 트레이딩 전략

개요

이 전략은 다중 기술 지표 필터링을 기반으로 하는 적응형 추세 추적 시스템입니다. 지수 이동 평균(EMA), 단순 이동 평균(SMA), 이동 평균 수렴 발산(MACD) 등 여러 기술 지표를 결합하고, 다양한 시장 환경에 맞게 매개변수를 동적으로 조정하여 효율적인 추세 포착과 위험 관리를 달성합니다. 이 전략은 계층적 필터링 메커니즘을 채택하고 여러 기술 지표의 조정된 협력을 통해 거래 신호의 신뢰성을 크게 향상시킵니다.

전략 원칙

전략의 핵심 논리는 3단계 필터링 메커니즘을 기반으로 합니다.

  1. 적응형 트렌드 인식 레이어: 빠른 EMA와 느린 EMA를 조합하여 트렌드 기준선을 계산하고, 시장 변동성에 따라 상단 및 하단 추적선을 동적으로 조정합니다.
  2. SMA 필터: 단순 이동 평균을 사용하여 가격 움직임 방향이 전체 추세와 일치하는지 확인합니다.
  3. MACD 확인 레이어: MACD 지표의 추세 확인 기능을 사용하여 거래 신호의 유효성을 더욱 검증합니다.

거래 신호를 생성하려면 추세 변화, SMA 방향 확인, MACD 신호선 지원 등 모든 필터 조건을 충족해야 합니다. 이 전략에는 계정 자본을 기반으로 한 동적 포지션 관리 시스템도 포함되어 있으며, 레버리지 요소를 통해 포지션 크기를 자동으로 조정합니다.

전략적 이점

  1. 강력한 적응성: 매개변수를 동적으로 조정함으로써 전략은 다양한 시장 환경에 적응할 수 있습니다.
  2. 완벽한 위험 관리: 다양한 필터링 메커니즘을 통해 거짓 신호의 발생 가능성을 크게 줄입니다.
  3. 높은 사용자 정의성: 사용자는 개인 거래 스타일에 따라 다양한 매개변수를 조정할 수 있습니다.
  4. 높은 수준의 자동화: JSON 형식의 알림 메시지를 지원하므로 자동 거래 시스템과 쉽게 연결할 수 있습니다.
  5. 뛰어난 시각화 효과: 추세 대역, 신호 마커 등 풍부한 시각적 피드백을 제공합니다.

전략적 위험

  1. 추세 의존성: 변동성이 큰 시장에서는 거짓 신호가 자주 생성될 수 있습니다.
  2. 히스테리시스 위험: 여러 필터링 메커니즘으로 인해 진입 시점이 지연될 수 있습니다.
  3. 매개변수 민감도: 매개변수 조합이 다르면 전략 성과에 큰 차이가 생길 수 있습니다.
  4. 레버리지 위험: 과도한 레버리지는 손실을 확대할 수 있습니다.

전략 최적화 방향

  1. 변동성 적응: ATR에 기반한 동적 손절매 메커니즘이 추가되었습니다.
  2. 시장 환경 식별: 시장 상태 분류 시스템을 추가하고 다양한 시장 환경에서 다양한 매개변수 조합을 사용합니다.
  3. 신호 품질 평가: 신호 강도 평가 시스템을 구축하고 신호 강도에 따라 위치를 동적으로 조정합니다.
  4. 펀드 관리 최적화: 보다 정교한 포지션 제어를 달성하기 위해 더 복잡한 펀드 관리 알고리즘을 도입합니다.

요약하다

이 전략은 다중 계층 필터링 메커니즘과 동적 매개변수 조정을 통해 더욱 신뢰할 수 있는 추세 추적 효과를 달성합니다. 지연 및 매개변수 종속성으로 인한 특정 위험이 존재하지만, 합리적인 매개변수 최적화와 위험 관리 조치를 통해 실제 거래에서는 안정적인 성과를 달성할 수 있습니다. 트레이더는 실시간 사용에 앞서 백테스팅 검증을 철저히 수행하고 개인의 위험 허용 범위에 맞게 매개변수 설정을 조정하는 것이 좋습니다.

전략 소스 코드
/*backtest
start: 2024-12-29 00:00:00
end: 2025-01-05 00:00:00
period: 45m
basePeriod: 45m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Adaptive Trend Flow Strategy with Filters for SPX", overlay=true, max_labels_count=500, 
     initial_capital=1000, commission_type=strategy.commission.cash_per_order, commission_value=0.01, slippage=2,
     margin_long=20, margin_short=20, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// User-defined inputs for trend logic
atr           = input.int(14, "Main Length", minval=2, group = "Find more strategies like this on pineindicators.com")
length        = input.int(2, "Main Length", minval=2)
smooth_len    = input.int(2, "Smoothing Length", minval=2)
sensitivity   = input.float(2.0, "Sensitivity", step=0.1)

// User-defined inputs for SMA filter
use_sma_filter = input.bool(true, "Enable SMA Filter?")
sma_length = input.int(4, "SMA Length", minval=1)

// User-defined inputs for MACD filter
use_macd_filter = input.bool(true, "Enable MACD Filter?")
macd_fast_length = input.int(2, "MACD Fast Length", minval=1)
macd_slow_length = input.int(7, "MACD Slow Length", minval=1)
macd_signal_length = input.int(2, "MACD Signal Length", minval=1)
// User-defined inputs for leverage
leverage_factor = input.float(4.5, "Leverage Factor", minval=1.0, step=0.1)
id           = input("besttrader123", title= "Your TradingView username", group = "Automate this strategy with plugpine.com")
key           = input("nc739ja84gf", title= "Unique identifier (UID)")
ticker        = input("SPX", title= "Ticker/symbol of your broker")
bullcolor     = #0097a7
bearcolor     = #ff195f
showbars      = input.bool(true, "Color Bars?")
showbg        = input.bool(true, "Background Color?")
showsignals   = input.bool(true, "Show Signals?")


// Trend calculation functions
calculate_trend_levels() =>
    typical = hlc3
    fast_ema = ta.ema(typical, length)
    slow_ema = ta.ema(typical, length * 2)
    basis = (fast_ema + slow_ema) / 2
    vol = ta.stdev(typical, length)
    smooth_vol = ta.ema(vol, smooth_len)
    upper = basis + (smooth_vol * sensitivity)
    lower = basis - (smooth_vol * sensitivity)
    [basis, upper, lower]

get_trend_state(upper, lower, basis) =>
    var float prev_level = na
    var int trend = 0
    if na(prev_level)
        trend := close > basis ? 1 : -1
        prev_level := trend == 1 ? lower : upper
    if trend == 1
        if close < lower
            trend := -1
            prev_level := upper
        else
            prev_level := lower
    else
        if close > upper
            trend := 1
            prev_level := lower
        else
            prev_level := upper
    [trend, prev_level]

[basis, upper, lower] = calculate_trend_levels()
[trend, level] = get_trend_state(upper, lower, basis)

// SMA filter
sma_value = ta.sma(close, sma_length)
sma_condition = use_sma_filter ? close > sma_value : true

// MACD filter
[macd_line, signal_line, _] = ta.macd(close, macd_fast_length, macd_slow_length, macd_signal_length)
macd_condition = use_macd_filter ? macd_line > signal_line : true

// Signal detection with filters
long_signal = trend == 1 and trend[1] == -1 and sma_condition and macd_condition
short_signal = trend == -1 and trend[1] == 1

// Plotting visuals
p2 = plot(basis, color=trend == 1 ? bullcolor : bearcolor, linewidth=2)
p1 = plot(level, color=close > level ? bullcolor : bearcolor, linewidth=2, style=plot.style_linebr)
// if showsignals and ta.crossover(close, level)
//     label.new(bar_index, level, "▲", color=bullcolor, textcolor=chart.bg_color, style=label.style_label_upper_right)
// if showsignals and ta.crossunder(close, level)
//     label.new(bar_index, level, "▼", color=bearcolor, textcolor=chart.fg_color, style=label.style_label_lower_right)

qty = strategy.equity / close * leverage_factor

// Automated alerts
if long_signal
    alert('{"AccountID": "' + id + '","Key": "' + key + '", "symbol": "' + ticker + '", "action": "long", "volume": ' + str.tostring(qty) + '}', alert.freq_once_per_bar)
if short_signal
    alert('{"AccountID": "' + id + '","Key": "' + key + '", "symbol": "' + ticker + '", "action": "closelong"}', alert.freq_once_per_bar)

// Strategy entries and exits
if long_signal
    strategy.entry("Long", strategy.long, qty=qty)
if short_signal
    strategy.close("Long")

// Optional SMA and MACD plot
plot(use_sma_filter ? sma_value : na, color=color.new(color.blue, 80), title="SMA")
plot(use_macd_filter ? macd_line : na, color=color.new(color.orange, 80), title="MACD Line")
plot(use_macd_filter ? signal_line : na, color=color.new(color.red, 80), title="Signal Line")