"""How often would the strict reading of the 5% daily-loss rule fire?  Strict = equity-based (rules.json: 'equity based, so unrealised counts'),
daily drop measured from the previous day's closing EQUITY (here: the 21:00 UTC rollover, floating profit included).
A trade that is up f stop-distances at the last rollover and then stops out loses (1+f) r + c from that equity.
Real EURUSD hourly bars, deployed stop rule, walker.py (no broker)."""
import numpy as np, pandas as pd
from walker import trades
dfs=[trades(beta=0.75,floor=30.0,seed=s) for s in range(1,11)]
df=pd.concat(dfs); n=len(df)
f_last=np.array([b[-1] if len(b) else np.nan for b in df.bnd])
stopped=(df.res.to_numpy()==-1)
print(f"trades {n}; stopped out {stopped.mean():.1%}; crossed at least one rollover {np.mean(df.nbnd>0):.1%} (nights>0 {np.mean(df.nights>0):.1%})")
g=0.0335264
for r,label in ((0.03,"3% nominal (paper)"),(0.029,"2.90% (3% after flooring to 0.01 lot at 34.8 pips)"),(0.04,"4% (run_live.py FROZEN risk)"),(0.0315,"3.15% cap"),(0.0157,"1.575% funded")):
    fstar=(0.05-r*(1+g))/r
    breach=stopped&(f_last>fstar)
    print(f"risk {label:50s} f* = {fstar:5.2f} stop-distances; breaches {breach.sum():3d} of {n} trades = {breach.mean():.2%} per trade, {breach.sum()/max(stopped.sum(),1):.2%} of stop-outs")
# distribution of open profit at the last rollover
ff=f_last[~np.isnan(f_last)]
print("open profit at last rollover (stop units): quantiles 50/90/95/99:",np.nanpercentile(ff,[50,90,95,99]).round(2),"share above 0.63:",np.mean(ff>0.63).round(3))
