o
    í¿jK  ã                   @   sÎ   d Z ddlZddlZddlZddlmZ ddlZeeƒ 	¡ j
Zej deeƒ¡ ej dd¡ ddlZddlZdddœdddœdd	dœd
œZd\ZZZZdd„ Zdd„ Zdd„ Zedkreeejd ƒ dS dS )a  
sf_batch.py -- [2026-10-01] STAR FOLLOW (star_follow.py rules, unchanged) over many stock-days.
Per stock-day the per-minute reference signals (reference buys / sells in the last 5 min,
150 closest earlier days re-matched every minute) are computed ONCE, then each variant is
played out on the same signals:
   nostop        no stop, Star Follow controls the exit alone (+ 15:55)
   stop1         1% safety stop
   nostop_skip   no stop, no buys before 9:45 (skips the opening signal)
    python3 sf_batch.py 2026-08-27..2026-10-01
é    N)ÚPathz/var/www/screener/tradeg      Y@é   )ÚstopÚfirst_buy_mg      ð?é   )ÚnostopÚstop1Únostop_skip)é–   é
   r   gš™™™™™¹?c                 C   sÌ   |   |¡ g }tddƒD ]W}|  |d ||t¡\}}|t d }d }	}
|D ]4}| | j| d¡D ](\}}||  kr?|krEn n|	d7 }	||k rY||  krS|krYn q1|
d7 }
q1q&| ||	|
f¡ q|S )Nr   é�  ÚFé   r   © )ÚstartÚrangeÚmatchÚKÚWINÚgetÚkeysÚappend)ÚlibÚmarksÚdayÚaÚoutÚmÚidxÚ_Úw0ÚbuysÚsellsÚiÚbmÚsmr   r   ú4/var/www/screener/trade/reports/playbook/sf_batch.pyÚsignals   s    
 €ür'   c              	   C   sz  d g }}| D ]{\}}}|d u r:|t kr9||  krdkr9n qt|d |d  ƒ}	|d |	|	d|d   |	dœ}qt|d t|d | ƒƒ|d< |d | |d kre| i |¥||d dd	œ¥¡ d }q|t kr‚| i |¥|d t|d |d  ƒd
d	œ¥¡ d }q|r˜| i |¥dt|d d ƒdd	œ¥¡ |D ] }
|
d |
d  d d t |
d< |
d |
d  d d |
d< qš|S )NiY  ÚOr   éd   )Úbuy_mÚbuyr   Úlowr,   ÚLr   )Úsell_mÚsellÚwhyÚexitr   ÚCú15:55r/   r+   ÚplÚdd)ÚTRIGÚfloatÚminr   ÚCOST)Úsigr   r   r   ÚposÚtradesr   r!   r"   ÚeÚtr   r   r&   Úplay.   s$   
 2€$2€& r?   c                    s^  |   d¡\‰‰t ¡ }t ¡ }t‡‡fdd„|jD ƒƒ}dd„ tD ƒ}|D ]y}t 	t
 tjd|› d� d¡¡}|d	 D ]N}tj 	||¡}|sGq;t |d
 | d |¡}	|	d u rXq;t||||	ƒ}
t ¡ D ]%\}}t|
|	|d |d ƒD ]}||  ||dœdd„ | ¡ D ƒ¥¡ qrqcq;tjj ¡  t|dd„ | ¡ D ƒdd� q%tj|ttdˆ› dˆ› d� dƒtd� |t|ƒd  ‰tdt|ƒ› d|d › d|d › d�ƒ tdd›d d!d"›d d#d$›d d%d$›d d&d'›d d(d)›d d*d+›d d,d"›d d-d.›d d/d0›�ƒ | ¡ D ]®\}‰ ˆ �st|d›d1�ƒ qþt d2d3„ ˆ D ƒ¡}t ‡fd4d3„ˆ D ƒ¡}i }ˆ D ]}| |d5 d¡|d6  ||d5 < �q(‡ fd7d„d8D ƒ}t|d›d t|ƒd9›d |dk ¡ d:›d |dk ¡ d;›d | ¡ d<›d=| ¡ d>›d=||  ¡ d>›d?||   ¡ d@›d=tdAdB„ | ¡ D ƒƒdC›dDt|ƒ› d t dEdB„ ˆ D ƒƒdF›d=|dG d"›dD|d › dD|dH › �ƒ qþd S )INz..c                    s<   h | ]}ˆ |  d ¡d   krˆkrn n|  d ¡d ’qS )Ú|r   )Úsplit)Ú.0Úk)Úa_Úb_r   r&   Ú	<setcomp>F   s   < zmain.<locals>.<setcomp>c                 S   s   i | ]}|g “qS r   r   )rB   Úvr   r   r&   Ú
<dictcomp>G   s    zmain.<locals>.<dictcomp>Úbars_z.json.gzÚrtÚtop30_currentÚsymbolsÚbarsr   r   )r   Úsymc                 S   s.   i | ]\}}|t |tjtfƒrt|ƒn|“qS r   )Ú
isinstanceÚnpÚfloatingr7   )rB   rC   Úxr   r   r&   rH   T   s    "ÿc                 S   s   i | ]	\}}|t |ƒ“qS r   )Úlen)rB   rG   Úrr   r   r&   rH   W   s    T)ÚflushÚ	sf_batch_r   z.jsonÚw)Údefaulté   Ú
z days (r   éÿÿÿÿú)Úvariantz>12Ú r<   z>6Úwinsz>5zwin%Úavgz>7Úsumz>8z1st/2nd halfz>16zdays+z	worst dipz>9zexits/stops/15:55z>18z      0c                 S   s   g | ]}|d  ‘qS )r4   r   ©rB   r>   r   r   r&   Ú
<listcomp>_   s    zmain.<locals>.<listcomp>c                    s   g | ]}|d  ˆ k ‘qS )r   r   rb   )Úhalfr   r&   rc   _   s    r   r4   c                    s$   i | ]‰ ˆ t ‡ fd d„ˆD ƒƒ“qS )c                 3   s   � | ]	}|d  ˆ kV  qdS )r0   Nr   rb   ©rW   r   r&   Ú	<genexpr>c   s   € z"main.<locals>.<dictcomp>.<genexpr>)ra   )rB   )ÚTre   r&   rH   c   s   $ )r1   r   r3   Ú6Ú5z5.0%z+6.2fz% z+7.1fz%/z+.1fc                 s   s   � | ]}|d kV  qdS )r   Nr   )rB   rR   r   r   r&   rf   e   ó   € zmain.<locals>.<genexpr>Ú3ú/c                 s   s   � | ]}|d  V  qdS )r5   Nr   rb   r   r   r&   rf   f   rj   z+8.1fr1   r3   )!rA   ÚRTÚLibÚSFÚ
load_marksÚsortedr   ÚVARIANTSÚjsonÚloadÚgzipÚopenÚBARSÚREFÚ
day_arraysr'   Úitemsr?   r   Ú_CACHEÚclearÚprintÚdumpÚHEREÚstrrS   rP   Úarrayr   ra   ÚmeanÚvaluesr8   )Úrngr   r   ÚdaysÚresr   ÚdÚsÚrefr   r:   rG   Úcr>   ÚpÚhÚbydr0   r   )rg   rD   rE   rd   r&   ÚmainB   sl    ÿÿÿ((V,$Nÿÿÿÿþþþ
þørŽ   Ú__main__r   )Ú__doc__ru   rs   ÚsysÚpathlibr   ÚnumpyrP   Ú__file__ÚresolveÚparentr   ÚpathÚinsertr€   Úreference_traderrm   Ústar_followro   rr   r   r6   r   r9   r'   r?   rŽ   Ú__name__Úargvr   r   r   r&   Ú<module>   s*    
 þ'ÿ