
이 전략은 쌍평평선 돌파신호와 ATR 변동성 필터링 및 HMA 트렌드 편차를 결합한 양적 거래 전략이다. 이 전략은 두 개의 서로 다른 주기의 평평선을 사용하여 거래 신호를 구성하고, 변동성 지표 ATR 필터링과 함께 유효하지 않은 신호의 일부를 필터링하여 HMA를 사용하여 트렌드 방향을 판단하여 역동작전을 피한다.
전략은 37주기 길이의 평균선을 기준평균선으로 사용하며, 가격이 이 평균선 아래에서 상향을 돌파할 때 구매 신호를 생성하고, 위쪽에서 상향을 돌파할 때 판매 신호를 생성한다. 잘못된 신호를 필터링하기 위해, 전략은 가격이 기준평균선을 돌파한 후 같은 방향으로 계속 이동하는 ATR의 2배 이상의 변동성을 확인한다. 또한, 전략은 11주기 길이의 HMA를 사용하여 큰 트렌드 방향을 판단한다. 가격이 기준평균선을 돌파할 때 HMA가 동향을 표시할 때만 신호를 확인한다. 반동으로 인한 손실을 방지하기 위해 신호를 효과적으로 생성한다.
이득 모드에서, 전략은 하나의 스톱 포스트를 사용하거나 두 개 또는 세 개의 다른 가격의 스톱 포스트를 사용하도록 지원합니다. 스톱 포스트의 경우, 전략은 직접 상하 궤도 라인을 장단 단위로 스톱 포스트로 사용합니다.
단일 평행 돌파 전략에 비해, 이 전략은 신호 생성 시 ATR 변동성 필터를 추가하여, 대부분의 무효 신호를 필터링할 수 있습니다. 이것은 시각적인 K선 형태 전략과 매우 일치하므로, 더 높은 승률을 얻을 수 있습니다. 동시에, HMA를 증가시켜 추세 편차를 판단하고, 역경 포지션을 피하여, 불필요한 손실을 크게 줄일 수 있습니다.
이 전략의 가장 큰 위험은 ATR 변동성 필터링이 일부 유효한 신호를 제거할 수 있기 때문에 전략이 적시에 포지션을 만들 수 없다는 것입니다. 또한, HMA는 큰 추세를 판단하는 효과가 보이지 않으며, 때로는 가격이 큰 추세 반전이 아닌 단기 조정일 뿐이며, 이로 인해 불필요한 손실이 발생할 수 있습니다. 위의 위험을 줄이기 위해 ATR 변동성 필터링의 매개 변수를 적절히 줄이고, 변동성의 범위를 확장하여 더 많은 K 선 모양 신호가 검증 지시로 생성 될 수 있습니다. 동시에 HMA 주기 매개 변수를 조정하여 더 긴 기간의 HMA를 사용하여 큰 추세를 판단하여 단기 조정의 방해를 피 할 수 있습니다.
이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.
더 많은 종류의 변수 조합을 테스트하여 최적의 변수 조합을 찾습니다. 기준 평균선 길이, ATR 주기, 변동성 필터링 계수 등이 조정 가능한 변수입니다.
더 많은 필터링 지표 또는 진동 지표가 시장 상황을 판단하여 전략의 건전성을 더욱 향상시킵니다.
수익방법 최적화 파라미터 설정. 다양한 수량과 가격 수준에 대한 스톱포인트 설정을 추가 테스트한다.
기계 학습 모델과 결합하여 더 효율적인 거래 신호를 생성합니다.
이 전략은 쌍평평선 돌파 핵심 신호, 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)