Add chart-pattern entry archetype (XAU_CP) — disabled by default
Third entry archetype: completion of classical chart patterns (double bottom/top, H&S top / inverse H&S, bull/bear flag) — the tight canon with the strongest documented stats. New chart_patterns.py detector module (pure functions, ATR-unit geometry, closed-bar slices only, first-close-beyond trigger discipline so a breakout fires exactly once and never repaints). Pipeline step 10 in analyze_from_dataframes: fills only empty setup slots, allows weak-composite F grades (normal at reversal completion) but inherits session/day blocks, mirrors MTF-opposition + SELL vol/hour + M5 protections. Geometry: SL = pattern anchor -/+ 0.5 ATR (min $8), TP1 = measured move, $9 spread gate, trailing exit does the real work. Strategy tag XAU_CP. cp_enabled defaults to False everywhere — per-TF adoption happens in pair_signals/xauusd.py only after the standard validation rule passes. Backtester: --cp / --cp-patterns flags to test the candidate, XAU_CP tag recognition. Suite: 183/183 (21 new tests: detectors, trigger discipline, invalidation, gates, pipeline, default-off safety). Claude-Session: https://claude.ai/code/session_015kby7M9JwpYi8NQT2yoxAi
This commit is contained in:
@@ -274,6 +274,34 @@ class XauStrategyConfig:
|
||||
# Price must have touched EMA21/KC-mid within this many bars.
|
||||
m5_pullback_touch_bars: int = 3
|
||||
|
||||
# ── Chart-pattern entry (XAU_CP) ──────────────────────────────
|
||||
# Third entry archetype: completion of a classical chart pattern
|
||||
# (see chart_patterns.py for the pattern set and design contract).
|
||||
# Defaults are textbook geometry, NOT tuned values. Disabled by
|
||||
# default — per-TF adoption happens in pair_signals/xauusd.py only
|
||||
# after the pattern book passes the standard validation rule
|
||||
# (positive R both halves of ≥12mo, PF ≥ 1.3, $0.30 spread,
|
||||
# trailing exits, next-open fills).
|
||||
cp_enabled: bool = False
|
||||
cp_patterns: List[str] = field(default_factory=lambda: [
|
||||
"inv_hs", "hs_top", "double_bottom", "double_top",
|
||||
"bull_flag", "bear_flag",
|
||||
])
|
||||
cp_lookback: int = 72 # bars scanned for pattern structure
|
||||
cp_swing_window: int = 3 # bars each side to confirm a swing
|
||||
cp_recency_bars: int = 20 # last extreme must be this fresh
|
||||
cp_min_sep_bars: int = 8 # min bars between double extremes
|
||||
cp_tolerance_atr: float = 0.5 # double top/bottom level match tol
|
||||
cp_min_height_atr: float = 1.5 # pattern height floor (noise gate)
|
||||
cp_max_height_atr: float = 8.0 # pattern height ceiling
|
||||
cp_hs_head_min_atr: float = 0.5 # head must exceed shoulders by this
|
||||
cp_hs_shoulder_tol_atr: float = 1.0 # shoulder level match tol
|
||||
cp_flag_pole_atr: float = 3.0 # min pole size
|
||||
cp_flag_pole_bars: int = 12 # pole measured over ≤ this many bars
|
||||
cp_flag_min_bars: int = 3 # flag consolidation length bounds
|
||||
cp_flag_max_bars: int = 12
|
||||
cp_flag_retrace: tuple = (0.1, 0.5) # flag depth as fraction of pole
|
||||
|
||||
|
||||
@dataclass
|
||||
class FilterConfig:
|
||||
|
||||
Reference in New Issue
Block a user