stocks / scripts /verify_presets.py
Arrechenash's picture
Initial Commit
3aed849
Raw
History Blame Contribute Delete
3 kB
"""Verify all pattern presets parse correctly."""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from core.dsl.grammar import GrammarParser
p = GrammarParser()
presets = [
("52-Week Breakout", "close > max(close, 252) and volume > 1_000_000"),
("Gap&Crap (estándar)", "gap_pct > 15% and run_pct < 0 and volume > avg(volume, 60) * 2 sort gap_pct desc"),
(
"Gap&Crap Reversal",
"gap_pct > 30% and volume > avg(volume, 60) * 5 and run_pct < 0 sort gap_pct desc"
" | time > '09:30' and time < '10:00' and close < vwap and close < open and volume > 500000"
" | time > '10:00' and time < '15:50' and close > vwap and close > open and low > session_low",
),
(
"Gap and Go",
"gap_pct > 15% and volume > avg(volume, 60) * 3 and run_pct > 0 sort gap_pct desc"
" | time >= '09:30' and time <= '10:30' and close > pm_high and close > open",
),
(
"Red to Green",
"close < max(close, 252) * 0.6 and volume > avg(volume, 60) and run_pct < 0"
" | time >= '09:30' and time <= '10:30' and close < vwap and close < open"
" | time >= '10:00' and time <= '15:50' and close > vwap and close > open and close > session_low",
),
(
"VWAP Bounce",
"volume > avg(volume, 60) * 5 and close > vwap sort volume desc"
" | time >= '09:30' and time <= '11:30' and low < vwap and close > vwap"
" and (session_high - vwap) / vwap > 0.10",
),
(
"VWAP Reclaim",
"close > open and volume > avg(volume, 60) * 3"
" | time >= '09:30' and time <= '11:00' and (session_high - vwap) / vwap > 0.10"
" | time >= '10:00' and time <= '12:00' and close < vwap"
" | time >= '11:00' and time <= '15:30' and close > vwap and volume > avg(volume, 20) * 2",
),
(
"Dip Buying Panics",
"streak_run_pct > 100% and volume > avg(volume, 60) * 3 sort streak_run_pct desc"
" | time >= '09:30' and time <= '10:30' and (session_high - close) / session_high > 0.20 and close < vwap"
" | time >= '09:45' and time <= '11:00' and close > vwap and volume > avg(volume, 20) * 2",
),
(
"Swing 1er Día Verde",
"run_pct > 20% and volume > avg(volume, 60) * 5 and close > vwap and close > session_high * 0.95 sort volume desc",
),
(
"Rebote 1er Día Verde",
"close > open and (max(high, 20) - close) / max(high, 20) > 0.25"
" and (max(high, 20) - close) / max(high, 20) < 0.50"
" and volume < avg(volume, 20) * 2",
),
]
print(f"{'Status':8} {'Name':28} {'Phases':6} {'Pipes':5} {'Sort':5}")
print("-" * 60)
for name, expr in presets:
try:
r = p.parse(expr)
named_phases = sum(1 for s in r.stages if s.name)
print(f"{'✅':8} {name:28} {named_phases:6} {len(r.stages):5} {str(r.sort is not None):5}")
except Exception as e:
print(f"{'❌':8} {name:28} parse error: {e}")