
EMA, ATR, FIBONACCI
これはもう1つの退屈な均等策ではありません. 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日平均価格の1-2%で,このときより大きなEMA偏差が信号を誘発するために必要です.トレンド市場では,ATRは3-5%に拡大し,同じ評価値がより大きな価格移動に対応し,過度取引を回避します.
この設計は,戦略が異なる市場環境で一貫したリスク露出を可能にします.反省は,ATRの標準化が,従来の固定値下げ戦略のリトレイション波動が5〜25%の間にあるのに対し,最大リトレイションを8〜12%の範囲で制御することを示しています.
デフォルトパラメータは最適化されているが,万能ではない.高速EMA 12周期は短期的な動きを捉えるのに適しており,遅いEMA 50周期はトレンド背景を提供する.ATR 14周期はクラシックな設定ですが,高周波取引では7-10周期に短縮できます.
重要な修正案:
フィボナッチ回顧周期はデフォルトで10根のK線ですが,日線図では15-20根まで拡張し,時線図では5-8根まで縮小できます.目的は,短期的なノイズではなく,意味のある波動構造を捕捉することです.
策略は横盤振動市場では平気である.価格が狭い範囲内で波動するときは,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)