기준 크로스 클라이피커 ATR 변동성 & HMA 트렌드 비아스 평균 역전 전략

저자:차오장, 날짜: 2024-01-17 16:37:23
태그:

img

전반적인 설명

이 전략은 양적 거래 전략에 대한 강력한 거래 신호를 생성하기 위해 기본 평균 반전 신호, ATR 변동성 필터 및 HMA 트렌드 필터를 통합합니다. 거래 신호를 구성하기 위해 서로 다른 기간을 가진 두 개의 이동 평균을 사용하고, 일부 유효하지 않은 신호를 필터링하기 위해 ATR 변동성 지표를 결합하고, 부정적인 선택을 피하기 위해 주요 트렌드 방향을 결정하기 위해 HMA를 사용합니다.

전략 논리

이 전략은 37 기간 이동 평균을 기본 라인으로 사용한다. 가격이 이 기본 라인에서 상향으로 돌파할 때, 구매 신호를 생성하고, 위에서 떨어질 때, 판매 신호를 생성한다. 잘못된 신호를 피하기 위해, 전략은 신호의 유효성을 확인하기 위해 기본 라인을 침투한 후 2xATR 변동성을 넘어가는 것을 요구한다. 또한, 전략은 주요 트렌드를 판단하기 위해 11 기간 HMA를 사용합니다. 불리한 선택을 방지하기 위해 가격 침투 기본 라인이 HMA 방향과 조화를 이루면만 유효 신호를 확인합니다.

이윤 취득을 위해 전략은 하나 또는 여러 (두 개 또는 세 개) 이익을 취득하는 수준을 사용합니다. 스톱 손실을 위해, 그것은 단순히 길고 짧은 포지션을위한 SL로 상위 및 하위 밴드 라인을 사용합니다.

이점 분석

간단한 이동 평균 브레이크아웃 전략과 비교하면, 이 전략은 많은 유효하지 않은 신호를 제거하는 ATR 변동성 필터를 추가합니다. 이것은 시각 패턴 브레이크아웃 기술과 매우 잘 일치하여 더 높은 승률으로 이어집니다. 또한, HMA 트렌드 편향은 부정적인 선택을 방지하고 불필요한 손실을 크게 줄여줍니다. 다중 취익 계획은 더 많은 이익을 잠금 할 수 있습니다.

위험 과 해결책

주요 위험은 ATR 변동성 필터가 일부 유효한 신호를 제거하여 포지션을 적시에 열지 못하는 원인이 될 수 있습니다. 또한 HMA 트렌드 판단은 가격이 반전이 아닌 단기적인 리트레이싱을 가지고있을 때 매우 중요하지 않습니다. 이것은 불필요한 스톱 로스로 이어질 수 있습니다. 위험을 줄이기 위해 더 많은 신호를 허용하기 위해 ATR 변동성 필터 매개 변수를 낮출 수 있습니다. 또한 단기 변동의 간섭을 방지하여 주요 트렌드를 판단하기 위해 장기적인 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)


더 많은