"""
overlap_check_v1.py — do backtest EU trades ever overlap?
Run: python src\\research\\overlap_check_v1.py
Settles whether EU-on-EU stacking exists in the trade list, and whether
exit_time parses (a parse failure would fake 52h holds and phantom stacks).
"""
import csv, sys
from pathlib import Path
from datetime import datetime, timedelta
from collections import defaultdict

def resolve_base():
    for b in [Path(r"C:\Users\Administrator\OneDrive\fx_macro_intraday"),
              Path(r"C:\Users\paul_\OneDrive\fx_macro_intraday"),
              Path(__file__).resolve().parents[2]]:
        if b.exists(): return b
    sys.exit("base not found")
BASE=resolve_base()

def parse_dt(s):
    s=(s or "").strip()
    for f in ("%Y-%m-%d %H:%M:%S","%Y-%m-%d %H:%M","%Y.%m.%d %H:%M:%S",
              "%Y.%m.%d %H:%M","%d/%m/%Y %H:%M"):
        try: return datetime.strptime(s[:19], f)
        except ValueError: continue
    return None

p=BASE/"data"/"processed"/"trades"/"trades_real_costs.csv"
with open(p, newline="", encoding="utf-8-sig") as f:
    reader=csv.DictReader(f)
    print("Columns:", reader.fieldnames)
    rows=list(reader)

n=len(rows); ok=0; fails=[]
T=[]
for r in rows:
    e=parse_dt(r.get("entry_time")); x=parse_dt(r.get("exit_time"))
    if e is None: continue
    if x is None: fails.append(r.get("exit_time"))
    else: ok+=1
    T.append((e, x if x else e+timedelta(hours=52)))
T.sort()
print(f"\nTrades: {n} | exit_time parsed OK: {ok} ({100*ok/n:.1f}%)")
if fails: print(f"  UNPARSED exit_time samples: {fails[:3]!r}")

# hold duration distribution
durs=[(x-e).total_seconds()/3600 for e,x in T]
import statistics
print(f"Hold hours: median {statistics.median(durs):.1f} | "
      f"mean {statistics.mean(durs):.1f} | max {max(durs):.1f}")
buckets=defaultdict(int)
for d in durs:
    buckets["<4h" if d<4 else "4-12h" if d<12 else "12-24h" if d<24
            else "24-52h" if d<52 else "52h+"]+=1
print("  " + "  ".join(f"{k}:{v}" for k,v in buckets.items()))

# overlap: max concurrent + count of entries while another trade open
events=[]
for e,x in T:
    events.append((e,1)); events.append((x,-1))
events.sort()
cur=0; mx=0; mx_at=None
for t,v in events:
    cur+=v
    if cur>mx: mx=cur; mx_at=t
overlap_entries=0
open_x=[]
for e,x in T:
    open_x=[o for o in open_x if o>e]
    if open_x: overlap_entries+=1
    open_x.append(x)
print(f"\nMax concurrent EU positions ever: {mx} (at {mx_at})")
print(f"Entries made while another EU trade still open: "
      f"{overlap_entries}/{len(T)} ({100*overlap_entries/len(T):.1f}%)")
print("\nVERDICT: if max concurrent = 1 and overlap entries = 0, the EU")
print("backtest is single-position — EU-on-EU stacking never happens and")
print("the boost MC (and any float model assuming 52h holds) overstated risk.")
