# Trail-50%-after-2R exit (Satya 26-Oct-2026 18:06 IST). Spot (primary) and premium (secondary) versions. Costs/entries identical to lib.py. from lib import * def spot_exit_trail(a,m,dd,entry,stop,Rr,act=2.0,lock=0.5): o,h,l,c,v=a; peak=0.0; trail=None for x in range(m+1,360): if np.isnan(c[x]): continue if (dd>0 and l[x]<=stop) or (dd<0 and h[x]>=stop): return x,'stop' # initial structural stop (intrabar, as before) pr=dd*(c[x]-entry); peak=max(peak,pr) if peak>=act*Rr: trail=lock*peak # ratchets up only (peak only rises) if pr<=trail: return x,'trail' # checked on 1m close return 359,'time' def spot_proxy_trail(a,m,dd,entry,stop,Rr,act=2.0,lock=0.5): o,h,l,c,v=a; x,why=spot_exit_trail(a,m,dd,entry,stop,Rr,act,lock) if np.isnan(o[m+1]): return np.nan px=o[x+1] if x+1<360 and not np.isnan(o[x+1]) else c[x]; return dd*(px-o[m+1]) def sim_trail(a,d,m,dd,entry,stop,Rr,mode='spot',act=2.0,lock=0.5,cost='REAL',strike_off=0,skip0=True): e=nexp(d,skip0) if e is None: return None typ='CE' if dd>0 else 'PE'; K=float(round(entry/50)*50)+(-dd*50*strike_off); oa=oarr(d,e,typ,K) if oa is None or m+1>=NM or np.isnan(oa[0,m+1]): return dict(status='no_option_bar') cs=COSTS[cost]; S=cs['slip']; raw=oa[0,m+1]; fill=raw+S if mode=='spot': x,why=spot_exit_trail(a,m,dd,entry,stop,Rr,act,lock) else: # premium: initial stop = structural spot stop; R_prem = 0.5*R (ATM delta ~0.5); trail on option 1m closes o,h,l,c,v=a; Rp=0.5*Rr; peak=0.0; x=359; why='time' for y in range(m+1,360): if not np.isnan(c[y]) and ((dd>0 and l[y]<=stop) or (dd<0 and h[y]>=stop)): x,why=y,'stop'; break oc=oa[3,y] if np.isnan(oc): continue pr=oc-raw; peak=max(peak,pr) if peak>=act*Rp and pr<=lock*peak: x,why=y,'trail'; break px,y=next_px(oa,x+1) if y is None: vv=np.where(~np.isnan(oa[3,:371]))[0]; vv=vv[vv>m] if not len(vv): return dict(status='no_option_bar') px=oa[3,vv[-1]]; y=vv[-1]; why+='_lastclose' sells=[(1.0,px-S)]; g=px-S-fill; c_=charges(d,fill,sells,cs['stt_new']) return dict(status='ok',expiry=e,dte=(e-d).days,K=K,typ=typ,raw_fill=raw,fill=fill,gross=g,cost=c_,pnl=g-c_,pnl_rs=(g-c_)*lot(d),exit_min=i2hm(y),why=why)