from __future__ import annotations import json from pathlib import Path from typing import Any ROOT = Path(__file__).resolve().parents[1] DEFAULT_JSON = ROOT / "GatherTradingData.json" DEFAULT_OUT = ROOT / "Temp" / "anti_whipsaw_gate_v1.json" def _load_json(path: Path) -> dict[str, Any]: if not path.exists(): return {} try: payload = json.loads(path.read_text(encoding="utf-8")) except Exception: return {} return payload if isinstance(payload, dict) else {} def _parse_jsonish(value: Any) -> Any: if isinstance(value, (dict, list)): return value if isinstance(value, str) and value.strip(): try: return json.loads(value) except Exception: return value return value def main() -> int: gtd = _load_json(DEFAULT_JSON) h = ((gtd.get("data") or {}).get("_harness_context") or {}) rows = _parse_jsonish(h.get("anti_whipsaw_gate_json")) if not isinstance(rows, list): rows = [] rows = [r for r in rows if isinstance(r, dict)] gates = [str(r.get("anti_whipsaw_gate") or "").upper() for r in rows] if "WHIPSAW_AUTO_RELEASED" in gates: status = "WHIPSAW_AUTO_RELEASED" elif "WHIPSAW_WEAKENING" in gates: status = "WHIPSAW_WEAKENING" elif "WHIPSAW_CONFIRMED" in gates: status = "WHIPSAW_CONFIRMED" elif "CONFIRMED_SELL" in gates: status = "CONFIRMED_SELL" elif rows: status = gates[0] or "INCONCLUSIVE" else: status = "DATA_MISSING" payload = { "formula_id": "ANTI_WHIPSAW_GATE_V1", "gate": "PASS" if rows else "DATA_MISSING", "anti_whipsaw_status": status, "rows": len(rows), "source": "anti_whipsaw_gate_json", } DEFAULT_OUT.parent.mkdir(parents=True, exist_ok=True) DEFAULT_OUT.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") print(json.dumps(payload, ensure_ascii=False, indent=2)) return 0 if __name__ == "__main__": raise SystemExit(main())