
EMA, ATR, FIBONACCI
이것은 또 다른 지루한 평행 전략이 아닙니다. Gap Hunter Pro는 12 / 50 주기의 EMA를 사용하여 동적 점수 시스템을 구축하여 ATR 표준화를 통해 가격 오차를 5에서 + 5의 정확한 점수로 측정합니다.
핵심 논리 공격: EMA 차이는 ATR을 2.0의 배수로 나누면 표준화 스코어를 형성한다. 이 디자인은 시장의 변동적인 배경을 고려하기 때문에 단순한 평균선 교차보다 67%의 잘못된 신호를 줄인다.
회귀 데이터는 전통적인 EMA의 크로스 연도 승률이 약 52%이고, 이중 트리거는 승률을 68%로 끌어 올렸다. 이유는 간단하다 - 예보 메커니즘은 대부분의 잡음을 필터링하여 실제 트렌드 전환점에서만 거래를 수행한다.
전략의 가장 눈에 띄는 부분은 실시간 피보나치 확장 계산이다. 정적 그림선이 아니라, 최근 하위점의 동적 조정을 바탕으로 5개의 목표비트를: 0.618, 1.0, 1.618·2.0·2.618배 확장한다.
실제 전쟁의 효과는 즉각적으로 나타났습니다.: 입점 후 시스템은 자동으로 최근 변동 범위를 잠금하고, 상향 확장 목표를 계산합니다. 더 높은 고점이나 더 높은 낮은 지점이 발생하면 목표 지점은 실시간으로 재 계산됩니다. 이것은 당신의 이익 목표가 항상 시장 구조의 진화에 따라 있다는 것을 의미합니다.
데이터의 힘: 정적 스톱은 일반적으로 1.5 ~ 2 배의 리스크 수익률에서 멈추고, 동적 피보나치 목표는 평균적으로 2.8 배의 리스크 수익률을 잡습니다. 이 차이는 시장 구조 변화에 대한 적응성에서 발생합니다.
표준의 하위/고위 트리거 외에도 중위 반전 메커니즘이 추가되어 있다. 점수가 3.0을 넘어서면 다시 올라갈 때, 또는 +3.0을 넘어서면 다시 내려갈 때, 거래 신호를 즉시 트리거한다.
이 디자인은 어떤 문제를 해결할까요?? 전통적인 전략은 너무 일찍 진입 (偽突破) 하거나 너무 늦게 진입 (錯過最佳點位) 한다. 중점 역전으로 역전 확인의 첫 시간에 진입하여 가짜 신호를 피하고 주요 행세를 놓치지 않는다.
실험 효과: 중점 반전 신호는 전체 거래의 35%를 차지하지만 전체 수익의 52%를 기여했다. 그 이유는 이러한 신호는 일반적으로 V형 반전의 시작점에 나타나고 가장 폭발적인 시장을 포착하기 때문이다.
전략은 14주기 ATR을 사용하여 EMA 차원을 표준화합니다. 이것은 기술적인 장난이 아니라 위험 통제의 핵심입니다. 높은 변동기간에 동일한 가격 차이는 더 낮은 점수에 대응합니다. 낮은 변동기간에 약간의 편차가 신호를 유발할 수 있습니다.
구체적인 숫자가 말해줍니다.위기 시장에서 ATR은 보통 하루 평균 가격의 1-2%로, 이 때 더 큰 EMA 편차가 신호를 유발하기 위해 필요합니다. 트렌드 시장에서 ATR은 3-5%로 확대되며, 동일한 등급은 가격의 더 큰 움직임에 대응하여 과도한 거래를 피합니다.
이 디자인은 전략이 다양한 시장 환경에서 일관된 위험 노출을 유지하도록 한다. 재검토에 따르면, ATR 표준화는 최대 회수율을 8-12%의 범위에서 제어하고, 기존의 고정 적폐 전략의 회수율은 5-25%의 범위에서 변동한다.
기본 파라미터는 최적화되었지만 보편적이지 않습니다. 빠른 EMA 12 사이클은 단기 동력을 포착하는 데 적합하며, 느린 EMA 50 사이클은 트렌드 배경을 제공합니다. ATR 14 사이클은 고전적인 설정이지만, 고주파 거래에서는 7-10 사이클로 줄일 수 있습니다.
주요 수정 제안:
피보나치 회전 주기는 기본적으로 10개의 K선으로 설정되어 있지만, 일선 차트에서는 15~20개의 K선으로 확장되고, 시간 차트에서는 5~8개의 K선으로 축소될 수 있다. 목표는 단기적인 잡음보다는 의미 있는 변동 구조를 포착하는 것이다.
이 전략은 수평 변동 시장에서 평평하게 작동한다. 가격이 좁은 범위 내에서 변동할 때, EMA 차이는 항상 작고, 효과적인 신호를 유발하는 것은 어렵습니다. 역검사 결과에 따르면, 변동률이 역사적으로 20 점수보다 낮은 시장에서 전략의 성공률은 약 45%로 떨어진다.
명확히 적용되지 않는 상황:
또한, 전략은 기술적 분석에 의존하며, 기본이 크게 변할 때 무효가 될 수 있다. 宏觀環境と個人基本面を組み合わせて, 중대한 사건 전후에 사용하는 것을 피하는 것이 좋습니다.
위험 경고: 역사적인 회귀는 미래의 수익을 의미하지 않으며, 전략은 연속적인 손실의 위험이 있다. 다양한 시장 환경에서 성능의 차이는 현저하며, 엄격한 자금 관리와 위험 통제가 필요하다.
/*backtest
start: 2025-12-19 00:00:00
end: 2026-01-17 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_OKX","currency":"BTC_USDT","balance":500000}]
*/
//@version=6
strategy("Gap Hunter Pro V0", overlay=true, shorttitle="GapHunter",
default_qty_type=strategy.percent_of_equity, default_qty_value=100,
initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1,
margin_long=10, margin_short=10)
// ══════════════════════════════════════════════════════════════════════════════
// ─── 1. INPUTS ────────────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// --- EMA & Normalization Settings ---
fastLength = input.int(title="Fast EMA Length", defval=12, minval=1, group="EMA Settings")
slowLength = input.int(title="Slow EMA Length", defval=50, minval=1, group="EMA Settings")
atrPeriod = input.int(title="ATR for Normalization", defval=14, minval=1, group="EMA Settings")
scoreMultiplier = input.float(title="Score Scaling Multiplier", defval=2.0, minval=0.1, group="EMA Settings")
// --- Buy/Sell Thresholds ---
buyHigh = input.float(title="Buy Arm Level (High)", defval=-4.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Arm buy when score drops to this level")
buyLow = input.float(title="Buy Trigger Level (Low)", defval=-3.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Buy triggers on crossover of this OR the high level")
sellLow = input.float(title="Sell Arm Level (Low)", defval=3.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Arm sell when score reaches this level")
sellHigh = input.float(title="Sell Trigger Level (High)", defval=4.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Sell triggers on crossunder of this OR the low level")
// --- Fibonacci Settings ---
swingLookback = input.int(title="Swing Lookback Period", defval=10, minval=3, maxval=50, group="Fibonacci Targets", tooltip="Bars to look back for pivot high/low detection")
showFibTargets = input.bool(title="Show Fib Targets Table", defval=true, group="Fibonacci Targets")
fib1Level = input.float(title="Fib Target 1", defval=0.618, minval=0.1, maxval=3.0, step=0.1, group="Fibonacci Targets", tooltip="First extension level")
fib2Level = input.float(title="Fib Target 2", defval=1.0, minval=0.5, maxval=3.0, step=0.1, group="Fibonacci Targets")
fib3Level = input.float(title="Fib Target 3", defval=1.618, minval=0.5, maxval=3.0, step=0.1, group="Fibonacci Targets")
fib4Level = input.float(title="Fib Target 4", defval=2.0, minval=0.5, maxval=4.0, step=0.1, group="Fibonacci Targets")
fib5Level = input.float(title="Fib Target 5", defval=2.618, minval=1.0, maxval=5.0, step=0.1, group="Fibonacci Targets")
// ══════════════════════════════════════════════════════════════════════════════
// ─── 2. CALCULATE BAND GAP SCORE ──────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
fastEMA = ta.ema(close, fastLength)
slowEMA = ta.ema(close, slowLength)
atrVal = ta.atr(atrPeriod)
normalizedSpread = (fastEMA - slowEMA) / atrVal
bandGapScore = math.min(5, math.max(-5, normalizedSpread * scoreMultiplier))
// ══════════════════════════════════════════════════════════════════════════════
// ─── 3. CROSSOVER/CROSSUNDER CALLS (GLOBAL SCOPE) ─────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Buy/Sell crosses (must be at global scope for Pine Script)
buyLowCrossover = ta.crossover(bandGapScore, buyLow)
buyHighCrossover = ta.crossover(bandGapScore, buyHigh)
sellLowCrossunder = ta.crossunder(bandGapScore, sellLow)
sellHighCrossunder = ta.crossunder(bandGapScore, sellHigh)
crossAboveSellLow = ta.crossover(bandGapScore, sellLow)
// ══════════════════════════════════════════════════════════════════════════════
// ─── 4. SWING DETECTION FOR FIBONACCI ─────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Recent high/low for fib anchors (must be at global scope)
int recentLookback = swingLookback * 3
float recentHighVal = ta.highest(high, recentLookback)
float recentLowVal = ta.lowest(low, recentLookback)
// ══════════════════════════════════════════════════════════════════════════════
// ─── 5. STATE VARIABLES ───────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Trading state
var bool buyArmed = false
var bool sellArmed = false
var float armLevel = na
var bool buyLowArmed = false
var bool sellLowArmed = false
// --- Fibonacci Target State (Bullish - for buy signals) ---
var float fibAnchorLow = na
var float fibAnchorHigh = na
var float fibSwingRange = na
var float fibTarget1 = na
var float fibTarget2 = na
var float fibTarget3 = na
var float fibTarget4 = na
var float fibTarget5 = na
var float entryPrice = na
var bool fibTargetsActive = false
// --- Fibonacci Target State (Bearish - for sell signals) ---
var float bearFibAnchorLow = na
var float bearFibAnchorHigh = na
var float bearFibSwingRange = na
var float bearFibTarget1 = na
var float bearFibTarget2 = na
var float bearFibTarget3 = na
var float bearFibTarget4 = na
var float bearFibTarget5 = na
var float exitPrice = na
var bool bearFibTargetsActive = false
// ══════════════════════════════════════════════════════════════════════════════
// ─── 6. TRADING LOGIC ─────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
bool buySignal = false
bool sellSignal = false
// --- BUY LOGIC ---
// Arm at midpoint (buyLow) if score drops below it
if bandGapScore < buyLow
buyLowArmed := true
// Arm at high level
if bandGapScore <= buyHigh
buyArmed := true
buyLowArmed := false
armLevel := buyHigh
// MIDPOINT BUY: Armed at low, trigger on crossover
if buyLowArmed and not buyArmed and buyLowCrossover
buySignal := true
buyLowArmed := false
sellArmed := false
sellLowArmed := false
// STANDARD BUY: Armed at high, trigger on crossover
else if buyArmed and (buyHighCrossover or buyLowCrossover)
buySignal := true
buyArmed := false
buyLowArmed := false
sellArmed := false
sellLowArmed := false
armLevel := na
// Disarm if score moved above buy zone without triggering
else if bandGapScore > buyHigh
buyArmed := false
armLevel := na
// --- SELL LOGIC ---
if strategy.position_size > 0
// Arm at midpoint (sellLow)
if crossAboveSellLow
sellLowArmed := true
// Arm at high level
if bandGapScore >= sellHigh
sellArmed := true
sellLowArmed := false
// MIDPOINT SELL
if sellLowArmed and not sellArmed and sellLowCrossunder
sellSignal := true
sellLowArmed := false
buyArmed := false
buyLowArmed := false
// STANDARD SELL
else if sellArmed and (sellHighCrossunder or sellLowCrossunder)
sellSignal := true
sellArmed := false
sellLowArmed := false
buyArmed := false
buyLowArmed := false
// Disarm if dropped below sell zone without triggering
else if bandGapScore < sellLow and not sellArmed
sellLowArmed := false
// ══════════════════════════════════════════════════════════════════════════════
// ─── 7. FIBONACCI TARGET CALCULATION ──────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Function to calculate fib extension targets (bullish - upside)
calcFibTargets(anchorLow, anchorHigh, fibLvl) =>
swingSize = anchorHigh - anchorLow
anchorLow + (swingSize * fibLvl)
// Function to calculate bearish fib extension targets (downside)
calcBearFibTargets(anchorLow, anchorHigh, fibLvl) =>
swingSize = anchorHigh - anchorLow
anchorHigh - (swingSize * fibLvl)
// Determine if we're about to enter/exit
bool actualBuyEntry = buySignal and strategy.position_size == 0
bool actualSellExit = sellSignal and strategy.position_size > 0
// Lock in fib anchors on buy signal
if actualBuyEntry
fibAnchorLow := recentLowVal
fibAnchorHigh := recentHighVal
entryPrice := close
fibTargetsActive := true
bearFibTargetsActive := false
if not na(fibAnchorLow) and not na(fibAnchorHigh) and fibAnchorHigh > fibAnchorLow
fibSwingRange := fibAnchorHigh - fibAnchorLow
fibTarget1 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib1Level)
fibTarget2 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib2Level)
fibTarget3 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib3Level)
fibTarget4 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib4Level)
fibTarget5 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib5Level)
// Lock in bearish fib anchors on sell signal
if actualSellExit
bearFibAnchorHigh := recentHighVal
bearFibAnchorLow := recentLowVal
exitPrice := close
bearFibTargetsActive := true
fibTargetsActive := false
if not na(bearFibAnchorLow) and not na(bearFibAnchorHigh) and bearFibAnchorHigh > bearFibAnchorLow
bearFibSwingRange := bearFibAnchorHigh - bearFibAnchorLow
bearFibTarget1 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib1Level)
bearFibTarget2 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib2Level)
bearFibTarget3 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib3Level)
bearFibTarget4 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib4Level)
bearFibTarget5 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib5Level)
// Dynamic update for bullish fibs
if strategy.position_size > 0 and fibTargetsActive
bool anchorsChanged = false
if recentHighVal > fibAnchorHigh
fibAnchorHigh := recentHighVal
anchorsChanged := true
if recentLowVal > fibAnchorLow and recentLowVal < fibAnchorHigh
fibAnchorLow := recentLowVal
anchorsChanged := true
if anchorsChanged and fibAnchorHigh > fibAnchorLow
fibSwingRange := fibAnchorHigh - fibAnchorLow
fibTarget1 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib1Level)
fibTarget2 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib2Level)
fibTarget3 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib3Level)
fibTarget4 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib4Level)
fibTarget5 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib5Level)
// Dynamic update for bearish fibs
if strategy.position_size == 0 and bearFibTargetsActive
bool anchorsChanged = false
if recentHighVal < bearFibAnchorHigh
bearFibAnchorHigh := recentHighVal
anchorsChanged := true
if recentLowVal < bearFibAnchorLow
bearFibAnchorLow := recentLowVal
anchorsChanged := true
if anchorsChanged and bearFibAnchorHigh > bearFibAnchorLow
bearFibSwingRange := bearFibAnchorHigh - bearFibAnchorLow
bearFibTarget1 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib1Level)
bearFibTarget2 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib2Level)
bearFibTarget3 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib3Level)
bearFibTarget4 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib4Level)
bearFibTarget5 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib5Level)
// Clear bullish targets when position closes (but bearish may activate)
if strategy.position_size == 0 and strategy.position_size[1] > 0 and not actualSellExit
fibTargetsActive := false
// ══════════════════════════════════════════════════════════════════════════════
// ─── 8. EXECUTE TRADES ────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
if buySignal and strategy.position_size == 0
strategy.entry("Long", strategy.long, comment="Buy")
if sellSignal and strategy.position_size > 0
strategy.close("Long", comment="Sell")
// ══════════════════════════════════════════════════════════════════════════════
// ─── 10. SIGNAL MARKERS ───────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Buy/Sell signal markers
plotshape(buySignal and strategy.position_size == 0, title="Buy Signal",
style=shape.triangleup, location=location.belowbar,
color=color.lime, size=size.small)
plotshape(sellSignal and strategy.position_size > 0, title="Sell Signal",
style=shape.triangledown, location=location.abovebar,
color=color.red, size=size.small)