ATR 변동성과 HMA 추세 편차를 기반으로 한 이중 이동 평균 돌파 전략


생성 날짜: 2024-01-17 16:37:23 마지막으로 수정됨: 2024-01-17 16:37:23
복사: 2 클릭수: 529
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

ATR 변동성과 HMA 추세 편차를 기반으로 한 이중 이동 평균 돌파 전략

개요

이 전략은 쌍평평선 돌파신호와 ATR 변동성 필터링 및 HMA 트렌드 편차를 결합한 양적 거래 전략이다. 이 전략은 두 개의 서로 다른 주기의 평평선을 사용하여 거래 신호를 구성하고, 변동성 지표 ATR 필터링과 함께 유효하지 않은 신호의 일부를 필터링하여 HMA를 사용하여 트렌드 방향을 판단하여 역동작전을 피한다.

전략 원칙

전략은 37주기 길이의 평균선을 기준평균선으로 사용하며, 가격이 이 평균선 아래에서 상향을 돌파할 때 구매 신호를 생성하고, 위쪽에서 상향을 돌파할 때 판매 신호를 생성한다. 잘못된 신호를 필터링하기 위해, 전략은 가격이 기준평균선을 돌파한 후 같은 방향으로 계속 이동하는 ATR의 2배 이상의 변동성을 확인한다. 또한, 전략은 11주기 길이의 HMA를 사용하여 큰 트렌드 방향을 판단한다. 가격이 기준평균선을 돌파할 때 HMA가 동향을 표시할 때만 신호를 확인한다. 반동으로 인한 손실을 방지하기 위해 신호를 효과적으로 생성한다.

이득 모드에서, 전략은 하나의 스톱 포스트를 사용하거나 두 개 또는 세 개의 다른 가격의 스톱 포스트를 사용하도록 지원합니다. 스톱 포스트의 경우, 전략은 직접 상하 궤도 라인을 장단 단위로 스톱 포스트로 사용합니다.

전략적 강점 분석

단일 평행 돌파 전략에 비해, 이 전략은 신호 생성 시 ATR 변동성 필터를 추가하여, 대부분의 무효 신호를 필터링할 수 있습니다. 이것은 시각적인 K선 형태 전략과 매우 일치하므로, 더 높은 승률을 얻을 수 있습니다. 동시에, HMA를 증가시켜 추세 편차를 판단하고, 역경 포지션을 피하여, 불필요한 손실을 크게 줄일 수 있습니다.

위험과 해결방안 분석

이 전략의 가장 큰 위험은 ATR 변동성 필터링이 일부 유효한 신호를 제거할 수 있기 때문에 전략이 적시에 포지션을 만들 수 없다는 것입니다. 또한, HMA는 큰 추세를 판단하는 효과가 보이지 않으며, 때로는 가격이 큰 추세 반전이 아닌 단기 조정일 뿐이며, 이로 인해 불필요한 손실이 발생할 수 있습니다. 위의 위험을 줄이기 위해 ATR 변동성 필터링의 매개 변수를 적절히 줄이고, 변동성의 범위를 확장하여 더 많은 K 선 모양 신호가 검증 지시로 생성 될 수 있습니다. 동시에 HMA 주기 매개 변수를 조정하여 더 긴 기간의 HMA를 사용하여 큰 추세를 판단하여 단기 조정의 방해를 피 할 수 있습니다.

전략 최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 더 많은 종류의 변수 조합을 테스트하여 최적의 변수 조합을 찾습니다. 기준 평균선 길이, ATR 주기, 변동성 필터링 계수 등이 조정 가능한 변수입니다.

  2. 더 많은 필터링 지표 또는 진동 지표가 시장 상황을 판단하여 전략의 건전성을 더욱 향상시킵니다.

  3. 수익방법 최적화 파라미터 설정. 다양한 수량과 가격 수준에 대한 스톱포인트 설정을 추가 테스트한다.

  4. 기계 학습 모델과 결합하여 더 효율적인 거래 신호를 생성합니다.

요약하다

이 전략은 쌍평평선 돌파 핵심 신호, ATR 변동성 필터링 무효 신호를 통합하고, HMA를 사용하여 큰 추세 편차를 판단하여 역경 구축을 피하는 것이 매우 실용적인 양적 거래 전략이다. 전략 매개 변수를 최적화 할 수있는 공간이 넓고, 효과는 여전히 향상 할 수있는 공간이 있으며, 추가 연구 및 최적화 실행에 적합하다.

전략 소스 코드
/*backtest
start: 2023-01-10 00:00:00
end: 2024-01-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © sevencampbell

//@version=5
strategy(title="Baseline Cross Qualifier Volatility Strategy with HMA Trend Bias", overlay=true)

// --- User Inputs ---

// Baseline Inputs
baselineLength = input.int(title="Baseline Length", defval=20)
baseline = ta.sma(close, baselineLength)

// PBCQ Inputs
pbcqEnabled = input.bool(title="Post Baseline Cross Qualifier Enabled", defval=true)
pbcqBarsAgo = input.int(title="Post Baseline Cross Qualifier Bars Ago", defval=3)

// Volatility Inputs
atrLength = input.int(title="ATR Length", defval=14)
multiplier = input.float(title="Volatility Multiplier", defval=2.0)
rangeMultiplier = input.float(title="Volatility Range Multiplier", defval=1.0)
qualifierMultiplier = input.float(title="Volatility Qualifier Multiplier", defval=0.5)

// Take Profit Inputs
takeProfitType = input.string(title="Take Profit Type", options=["1 Take Profit", "2 Take Profits", "3 Take Profits"], defval="1 Take Profit")

// HMA Inputs
hmaLength = input.int(title="HMA Length", defval=50)

// --- Calculations ---

// ATR
atr = ta.atr(atrLength)

// Range Calculation
rangeHigh = baseline + rangeMultiplier * atr
rangeLow = baseline - rangeMultiplier * atr
rangeColor = rangeLow <= close and close <= rangeHigh ? color.yellow : na
bgcolor(rangeColor, transp=90)

// Qualifier Calculation
qualifier = qualifierMultiplier * atr

// Dot Calculation
isLong = close > baseline and (close - baseline) >= qualifier and close > ta.hma(close, hmaLength)
isShort = close < baseline and (baseline - close) >= qualifier and close < ta.hma(close, hmaLength)
colorDot = isLong ? color.green : isShort ? color.red : na
plot(isLong or isShort ? baseline : na, color=colorDot, style=plot.style_circles, linewidth=3)

// --- Strategy Logic ---

// PBCQ
pbcqValid = not pbcqEnabled or low[pbcqBarsAgo] > baseline

// Entry Logic
longCondition = isLong and pbcqValid
shortCondition = isShort and pbcqValid
if (longCondition)
    strategy.entry("Long", strategy.long)
if (shortCondition)
    strategy.entry("Short", strategy.short)

// Exit Logic
if (takeProfitType == "1 Take Profit")
    strategy.exit("TP/SL", "Long", limit=rangeHigh, stop=rangeLow)
    strategy.exit("TP/SL", "Short", limit=rangeLow, stop=rangeHigh)
else if (takeProfitType == "2 Take Profits")
    strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2)
    strategy.exit("TP2", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh)
    strategy.exit("TP1", "Short", qty=strategy.position_size * 0.5, limit=rangeLow / 2)
    strategy.exit("TP2", "Short", qty=strategy.position_size * 0.5, limit=rangeLow)
else if (takeProfitType == "3 Take Profits")
    strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2)
    strategy.exit("TP2", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 0.75)
    strategy.exit("TP3", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 1.5)