
    ZLj              
         U d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
mZ d dlZd dlmZ d dlmZ ed	         Zed
         Zed         ZdZ ed           G d d                      Z ededddd           ededddd           ededddd           fZd!ed"<   d:d%Zd;d)Zd<d=d-Zd>d2Zd3d4d?d7Zd@d9ZdS )A    )annotations)	dataclass)DecimalROUND_HALF_UP)Path)AnyLiteralN)	STRICT_ID)PORTFOLIO_HOLDING_ID)intradayswing	portfolio)
paper_onlyresearch_onlyadvisor_only)	CandidateResearchAdvisorBlocked%candidate_swing_trend_retest_researchT)frozenc                  ~    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
Zded<   dZded<   dZded<   ddZdS )StrategySleevestr	sleeve_idstrategy_idnameSleeveHorizonhorizon
SleeveModemodepurposenonemax_live_authorityFboollive_order_allowedmainnet_signed_actionreturndict[str, str | bool]c           
     t    | j         | j        | j        | j        | j        | j        | j        | j        | j        d	S )N	r   r   r   r   r!   r"   r$   r&   r'   r+   )selfs    "src/strategies/strategy_sleeves.pyto_rowzStrategySleeve.to_row   sB    +I|I|"&"9"&"9%)%?

 

 
	
    N)r(   r)   )__name__
__module____qualname____annotations__r$   r&   r'   r.    r/   r-   r   r      s         NNNIIILLL$$$$$$$$$$"'''''
 
 
 
 
 
r/   r   intraday_v76_strictzIntraday v76 strictr   r   zGMain intraday candidate; confluence-gated lifecycle paper trading only.)r   r   r   r   r!   r"   swing_trend_retestzSwing trend/retestr   r   zWMulti-session trend/retest sleeve placeholder; collect evidence before paper execution.portfolio_holding_advisorz#Portfolio holding/rebalance advisorr   r   zLAllocation/rebalance recommendation sleeve; no exchange execution authority.ztuple[StrategySleeve, ...]SLEEVESr(   list[dict[str, str | bool]]c                 $    d t           D             S )Nc                6    g | ]}|                                 S r4   )r.   ).0sleeves     r-   
<listcomp>z)list_strategy_sleeves.<locals>.<listcomp>J   s     222FMMOO222r/   )r8   r4   r/   r-   list_strategy_sleevesr?   I   s    22'2222r/   valuer   r   c                z    	 t          t          |                     S # t          $ r t          d          cY S w xY w)N0)r   r   	Exception)r@   s    r-   _safe_decimalrD   M   sH    s5zz"""   s||s    ::0.01placesr   c                n    t          |                     t          |          t                              S )N)rounding)r   quantizer   r   )r@   rF   s     r-   _fmt_decimalrJ   T   s&    u~~gfoo~FFGGGr/   runtime_dir
str | Pathr   dict[str, Any]c                   t          |           dz  |z  dz  }d}d}t          d          }|                                sddt          d          dS |                    dd                                          D ]}|                                s	 t          j        |          }n# t          $ r Y 9w xY w|	                    d	          d
k    r|dz  }|	                    d	          dk    rT|	                    d          r?|dz  }|t          |	                    d          p|	                    d                    z  }|||dS )Nexperimentsztrade_journal.jsonlr   rB   )entriesexitsnet_pnl_usdzutf-8replace)encodingerrorsevententry   exitexit_reasonrR   realized_pnl_usd)r   r   exists	read_text
splitlinesstripjsonloadsrC   getrD   )rK   r   pathrP   rQ   pnllinerows           r-   _journal_metricsrg   X   sc   },{:=RRDGE
#,,C;;== GqFFF	BBMMOO X Xzz|| 		*T""CC 	 	 	H	777w&&qLG777v%%#''-*@*@%QJE=!7!7!V377CU;V;VWWWCsCCCs   B))
B65B6runtime)rK   lifecycle_summarylifecycle_scorecardc                   g }t           D ]^}g }d}t          d          }t          d          }t          d          }	d}
|j        dk    rt          |                    d          pd          }t          |                    d                    }t          |                    d                    }t          |                    d                    }	d	 |                    d
          pg D             }t          |                    d          pd          }
|dk    r|sdnd}n|j        dk    rt          ||j                  }t          |d                   }t          |d                   }|d         rdnd}
d}dg}|d         s|	                    d           n|dk     r|	                    d           |dk    r|	                    d           nd}ddg}|	                    i |
                                ||
|t          |          t          |	          t          |          |j        dk    r$t          |                     d          pd          nd|dd	           `dt          |          |ddd S )!a:  Build a read-only Phase-6 sleeve scorecard.

    The scorecard separates the three target sleeves without granting live
    authority. Only the intraday sleeve may currently have lifecycle evidence;
    swing/portfolio sleeves are explicitly research/advisor-only until their own
    journals and gates exist.
    r   rB   not_startedr5   closed_tradesrR   winrate_pctprofit_factorc                ,    g | ]}t          |          S r4   r   r<   items     r-   r>   z*build_sleeve_scorecard.<locals>.<listcomp>   s    XXXdD		XXXr/   blockersevidence_sourcetrue_lifecycle_exits_only   r   r   r6   rQ   rP    swing_lifecycle_research_journalr   research_only_no_live_authorityno_swing_retest_entries_yetswing_sample_too_smallswing_net_pnl_not_positive_yetr   advisor_only_no_executionportfolio_context_not_connectedopen_positionsF)	statusru   rm   rn   ro   rR   r   rt   live_allowedzstrategy_sleeves.v1)versionrK   sleevesr   r'   )r8   r   r   intrb   rD   r   rg   r   appendr.   rJ   )ri   rj   rK   cardsr=   rt   rm   net_pnlwinratero   ru   r   metricss                r-   build_sleeve_scorecardr   n   s    #%E - - #,,#,,'444 3 7 7 H H MANNM#$7$;$;M$J$JKKG#$7$;$;M$J$JKKG)*=*A*A/*R*RSSMXX.A.E.Ej.Q.Q.WUWXXXH!"5"9"9:K"L"L"kPkllO$1R$7$7$7[[iFF!555&{F4FGGG 011M#GM$:;;GDKIDVi@@\iOF9:H9% : =>>>>## 8999!|| @AAAF35VWH 
mmoo
.*'00)-88'00SYScg|S|S|c"3"7"78H"I"I"NQOOO  CD !
 
 
 	 	 	 	 );''!&  r/   	scorecardc                   t          |                     d          t                    r|                     d          ng }g }|D ]}t          |t                    r|                    d          ng }t          |t                    r|ng }|r'd                    d |d d         D                       nd}|                    |                    d           d|                    d	           d
|                    d           d|                    d           d|                    d           d|                    d           d|            d|rd                    |          nd dS )Nr   rt   ,c              3  4   K   | ]}t          |          V  d S )Nrq   rr   s     r-   	<genexpr>z*format_sleeve_scorecard.<locals>.<genexpr>   s(      CCdD		CCCCCCr/      keiner   =r   z mode=r!   z closed=rm   z pf=ro   z pnl=rR   z	 blocker=zStrategy Sleeves v1: z | z, live=nein)
isinstancerb   listdictjoinr   )r   r   partsrf   raw_blockersrt   blocker_texts          r-   format_sleeve_scorecardr      s   *4Y]]95M5Mt*T*T\immI&&&Z\GE 
 
.8d.C.CKswwz***#-lD#A#AI<<rGO\sxxCChrrlCCCCCCU\ww{## a acggh&7&7 a aGGFOOa a-0WW_-E-Ea a''/**a a141G1Ga aR^a a	
 	
 	
 	

 X#J5::e#4#4#47WWWWr/   )r(   r9   )r@   r   r(   r   )rE   )r@   r   rF   r   r(   r   )rK   rL   r   r   r(   rM   )ri   rM   rj   rM   rK   rL   r(   rM   )r   rM   r(   r   )
__future__r   dataclassesr   decimalr   r   pathlibr   typingr   r	   r`   src.tools.v76_paper_runtimer
   (src.strategies.portfolio_holding_advisorr   r   r    SleeveStatusSWING_RETEST_IDr   r8   r3   r?   rD   rJ   rg   r   r   r4   r/   r-   <module>r      s>   " " " " " " " ! ! ! ! ! ! * * * * * * * *                1 1 1 1 1 1 I I I I I I89BC
DE9 $
 
 
 
 
 
 
 
4 N'"Y   N&#!i   N-(2^  #'    83 3 3 3   H H H H HD D D D, AJ > > > > > >BX X X X X Xr/   