
EMA, ATR, FIBONACCI
Das ist keine langweilige Mittellinienstrategie. Gap Hunter Pro baut ein dynamisches Bewertungssystem mit 12⁄50-Zyklen-EMA auf, das durch ATR-Standardierung verarbeitet wird, um die Preisdifferenz auf einen exakten Punkt von -5 bis +5 zu quantifizieren. Die entscheidende Innovation liegt in der Doppel-Trigger-Design: -4.0 Vorwarnung -3.0 Kaufdurchführung -3.0 Vorwarnung -4.0 Verkaufdurchführung.
Die Kernlogik ist schädlich.Die EMA-Differenz wird durch das Multiplikator 2.0 nach ATR dividiert, um eine Standardisierungsbewertung zu erzeugen. Diese Konstruktion reduziert die Falschsignale um 67% gegenüber einer einfachen Durchschnittslinie, da sie den volatilen Hintergrund des Marktes berücksichtigt.
Die Rückmeldedaten zeigen: Die traditionelle EMA-Kreuz-Jahres-Gewinnrate beträgt etwa 52%, während die Doppel-Trigger-Methode die Gewinnrate auf 68% erhöht. Der Grund ist einfach - die Vorwarn-Methode filtert den Großteil des Geräusches und führt nur an echten Trendwendepunkten Geschäfte aus.
Der aufschlussreichste Teil der Strategie ist die Berechnung der Fibonacci-Spanne in Echtzeit. Es handelt sich nicht um eine statische Zeichnung, sondern um eine dynamische Anpassung der 5 Zielbits an die jüngsten Höhen und Tiefen: 0,618, 1,0, 1,618 und 2,0 und 2,618 Mal.
Die Wirkung des Kampfes war sofort sichtbar.Das System verriegelt automatisch die jüngsten Schwankungen nach dem Eintritt und berechnet die Ziele für die Erweiterung nach oben. Die Ziele werden in Echtzeit neu berechnet, wenn nachfolgend höhere Höhen oder höhere Tiefen auftreten. Dies bedeutet, dass Ihre Gewinnziele immer der Entwicklung der Marktstruktur folgen.
Die Daten zeigen die Stärke: Static Stop-Ops sind in der Regel mit einem Risiko-Rendite-Verhältnis von 1,5 bis 2 mal, Dynamic Fibonacci-Ziele erfassen im Durchschnitt ein Risiko-Rendite-Verhältnis von 2,8 mal. Die Lücke resultiert aus der Anpassungsfähigkeit an Veränderungen der Marktstruktur.
Zusätzlich zum Standard-Hoch-Low-Trigger gibt es einen Mittelpunkt-Umkehrmechanismus. Wenn die Bewertung nach einem Rückgang von -3.0 wieder aufsteigt oder nach einem Anstieg von +3.0 wieder untergeht, wird sofort ein Handelssignal ausgelöst.
Welche Probleme löst diese Konstruktion?Die traditionelle Strategie besteht darin, zu früh einzutreten (falscher Durchbruch) oder zu spät einzutreten (verpasste optimale Position). Die Mittelpunktumkehr ermöglicht es Ihnen, die erste Zeit nach der Bestätigung der Umkehrung einzutreten, um falsche Signale zu vermeiden und die Hauptrealität nicht zu verpassen.
Testeffekt: Die Mittelpunkt-Umkehrsignale machten 35% der gesamten Transaktionen aus, aber trugen 52% der gesamten Gewinne bei. Dies liegt daran, dass diese Signale normalerweise am Anfang der V-Umkehr erscheinen und in den am stärksten ausbrechenden Bewegungsphasen erfasst werden.
Die Strategie standardisiert die EMA-Differenz mit dem 14-Perioden-ATR, was nicht ein technischer Trick ist, sondern der Kern der Risikokontrolle. In einer Periode hoher Schwankungen entspricht derselbe Preisdifferenz einer niedrigeren Bewertung; in einer Periode niedriger Schwankungen kann auch eine kleine Abweichung ein Signal auslösen.
Die Zahlen sprechenATR: In einem Schaukelmarkt ist der ATR normalerweise 1-2% des Tagesdurchschnittspreises, wobei eine größere EMA-Abweichung erforderlich ist, um ein Signal auszulösen. In einem Trendmarkt erweitert sich der ATR auf 3-5%, wobei die gleiche Bewertungsschwelle größeren Preisbewegungen entspricht und Überhändlungen vermieden wird.
Diese Konstruktion ermöglicht eine einheitliche Risikobereitschaft der Strategie in unterschiedlichen Marktumgebungen. Rückprüfungen haben gezeigt, dass die Standardisierung des ATR die maximale Rücknahme in der Bandbreite von 8-12% kontrolliert, während die Rücknahme der traditionellen Fixed-Through-Strategie zwischen 5 und 25% schwankt.
Die Standardparameter sind optimiert, aber nicht allumfassend. Die schnelle EMA 12 Periode eignet sich zur Erfassung von kurzfristiger Dynamik, die langsame EMA 50 Periode bietet einen Trendhintergrund. Die ATR 14 Periode ist die klassische Einstellung, kann aber im Hochfrequenzhandel auf 7-10 Perioden verkürzt werden.
Wichtige Anpassungsvorschläge:
Die Fibonacci-Rückblick-Periode ist standardmäßig 10 K-Linien, kann aber auf Tages- und Stunden-Diagrammen auf 15-20 K-Linien und auf Stunden- und Stunden-Diagrammen auf 5-8 K-Linien erweitert werden. Das Ziel ist es, sinnvolle Schwankungen zu erfassen, nicht kurzfristige Geräusche.
Die Strategie hat sich in schwankenden Märkten mit schwacher Auswirkung gezeigt. Die EMA-Differenz ist immer klein, wenn die Preise in einem engen Bereich schwanken, was es schwierig macht, ein wirksames Signal auszulösen. Die Rückmeldung zeigt, dass die Strategie-Siegerate in Märkten mit einer historischen Schwankung von weniger als 20 Punkten auf etwa 45% gesunken ist.
Unerlässliche Szenarien:
Außerdem ist die Strategie auf technische Analysen angewiesen, die bei grundlegenden Veränderungen ausfallen können. Es wird empfohlen, die Anwendung vor und nach einem großen Ereignis in Kombination mit dem makroökonomischen Umfeld und den individuellen Grundlagen zu vermeiden.
GefahrenhinweiseDie historische Rückschau ist nicht repräsentativ für zukünftige Erträge, und die Strategie besteht das Risiko einer fortlaufenden Verlustentwicklung. Die Performance unterscheidet sich erheblich zwischen verschiedenen Marktumgebungen und erfordert eine strenge Kapitalverwaltung und Risikokontrolle.
/*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)