Ë
    I±j2#  ã            
      óp  — d Z ddlmZ ddlZddlZddlmZ ddlZddlZddl	Z
ddlZ ee«      j                  «       j                  j                  Zej"                  j%                  d ee«      «       ddlmZmZmZ ddlmZmZmZmZmZmZmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z& dd	l'm(Z(m)Z) dd
l*m+Z+ ddddddddddœ	Z,d„ Z-d„ Z.e/dk(  rq ej`                  e ¬«      Z1e1je                  ddg d¢g d¢¬«       e1je                  deedz  ¬«       e1jg                  «       Z4 e.e4jj                  e4jl                  «       yy) zMFit purged position-conditioned value heads; never promote or change winners.é    )ÚannotationsN)ÚPath)ÚSCORE_STARTÚ	OOS_STARTÚ	WFO_FOLDS)ÚHORIZONÚMAX_EXTENSIONÚMIN_TRAIN_TRADESÚfit_headÚtraining_recordsÚreplayÚcontinuation_target)Úgenerate_signalsÚ_score_to_signals)Ú
_data_pathÚ_load_winnerÚ_winner_path)Úwindow_metricsÚdigest)Úvalidate_file)NÚbaseline)NÚdelay)ÚmarketÚveto)Ústater   )Úcombinedr   )r   Úmanage)Útree_marketr   )Útree_combinedr   )r   r   )	r   Údelay_12Úmarket_vetoÚ
state_vetoÚcombined_vetoÚcombined_manageÚtree_market_vetoÚtree_combined_vetoÚtree_combined_managec                ó*  — t        d| «      }t        t        |«      «      \  }}}|rt        |› d|› �«      ‚t	        j
                  |«      }|j                  j                  j                  «       j                  j                  «       |_        t        j                  j                  j                  |j                  «      rdnd }t	        j                  |j                  |d¬«      j                  j                  d «      |_        t!        t	        j"                  |j$                  j&                  d   «      «      }|r|j&                  d d j)                  «       }g d¢}t+        j,                  ||   j/                  t0        ¬«      «      j3                  d	¬
«      }	|	j5                  «       st        d«      ‚t!        t+        j6                  |	«      d   «      }
|j&                  |
d  j9                  d¬«      }t+        j,                  ||   j/                  t0        ¬«      «      j3                  «       st        d«      ‚|j                  j&                  d   t	        j:                  t<        «      kD  rt        d«      ‚t?        d| «      }t<        |d<   tA        |fi |¤Ž}tC        |j)                  «       ||jD                  j/                  «       |jF                  j/                  «       |jH                  j/                  «       d¬«      }| t        |jK                  tL        «      «      tO        |«      tO        tQ        d| «      «      tO        |d   «      |t        |j                  j&                  d   «      t        |j                  j&                  d   «      |
||dœ}|||fS )NÚCOINBASE_BTCUSDz: ÚsT)ÚunitÚutcéÿÿÿÿ)Ú	rvol_normÚfed_net_liq_signÚmvrv_regime)Údtypeé   )ÚaxiszNo complete market-input rowsr   )ÚdropzInterior missing market inputsz/Warmup exclusion removes required score historyÚ_pine_time_start)Úreturn_opportunitiesÚmlp_weights_file)ÚtfÚdataÚdata_sha256Úwinner_sha256Úweights_sha256ÚparamsÚfirstÚlastÚexcluded_leading_warmup_rowsÚexcluded_tail_rowsÚwarnings))r   r   ÚstrÚ
ValueErrorÚpdÚread_csvÚcolumnsÚlowerÚstripÚapiÚtypesÚis_numeric_dtypeÚtimeÚto_datetimeÚdtÚtz_localizeÚintÚisnar0   ÚilocÚcopyÚnpÚisfiniteÚto_numpyÚfloatÚallÚanyÚflatnonzeroÚreset_indexÚ	Timestampr   r   r   r   Ústoch_peak_normÚcloseÚhighÚrelative_toÚREPOr   r   )r8   ÚpathÚerrorsrB   Ú_r9   r+   Údropped_tailÚrequiredÚcompleteÚleadingr=   ÚbaseÚopportunitiesÚmetadatas                  úP/Users/jameslopez/projects/TradingBot25/tools/run_mlp_learned_exit_experiment.pyÚ
load_inputrn       sË  € ÜÐ'¨Ó,€DÜ'¬¨D«	Ó2Ñ€FˆH�aÙÜ˜D˜6  F 8Ð,Ó-Ð-Ü�;‰;�tÓ€DØ—<‘<×#Ñ#×)Ñ)Ó+×/Ñ/×5Ñ5Ó7€D„LÜ—&‘&—,‘,×/Ñ/°·	±	Ô:‰3À€DÜ—‘˜tŸy™y¨t¸Ô>×AÑA×MÑMÈdÓS€D„IÜ”r—w‘w˜t×/Ñ/×4Ñ4°RÑ8Ó9Ó:€LÙØ�y‰y˜˜"ˆ~×"Ñ"Ó$ˆÚ?€HÜ�{‰{˜4 ™>×2Ñ2¼Ð2Ó?Ó@×DÑDÈ!ÐDÓL€HØ�<‰<Œ>ÜÐ8Ó9Ð9Ü”"—.‘. Ó*¨1Ñ-Ó.€GØ�9‰9�W�XÐ×*Ñ*°Ð*Ó5€DÜ�;‰;�t˜H‘~×.Ñ.´UÐ.Ó;Ó<×@Ñ@ÔBÜÐ9Ó:Ð:Ø‡y�y‡~�~�aÑœ2Ÿ<™<¬Ó4Ò4ÜÐJÓKÐKÜÐ+¨RÓ0€FÜ!,€FÐÑÜ˜DÑ+ FÑ+€DÜ% d§i¡i£k°6¸4×;OÑ;O×;XÑ;XÓ;ZØ&*§j¡j×&9Ñ&9Ó&;¸T¿Y¹Y×=OÑ=OÓ=QÐhlôn€Mà¤# d×&6Ñ&6´tÓ&<Ó"=ÌfÐUYËlÜ!'¬Ð5FÈÓ(KÓ!LÜ"(¨Ð0BÑ)CÓ"DÐPVÜ˜TŸY™YŸ^™^¨AÑ.Ó/¼¸T¿Y¹Y¿^¹^ÈBÑ=OÓ9PØ07È|Ðiqñ	s€Hð
 � Ð(Ð(ó    c                ó¦  — dD ]A  }t        j                  t        j                  t	        t
        dz  |z  «      gt
        d¬«       ŒC |j                  dd¬«       g g g g g f\  }}}}}| D �]  }t        |«      \  }	}
}|j                  |«       t        |	|
«      }t        D ���cg c]
  \  }}}||f‘Œ }}}}|j                  t        t	        |	j                  j                  d   j                  «       «      f«       |D �]�  \  }}|t        k(  rdnd|d d	 › �}i }d
D ]t  }|j                  d«      rdnd}t!        ||	j                  ||j#                  d«      |«      \  }}|||<   |j                  |||dœ|¥d|€d n|j%                  «       i¥«       Œv t&        j)                  «       D �]°  \  }\  }}t+        |	|
|||j-                  |«      |¬«      \  }}|dk(  rèi |d   ¥|t	        t/        j0                  |«      t/        j2                  d¬«      z   t/        j2                  d¬«      z
  «      dœ¥}t5        |	j7                  «       ||	j8                  j;                  «       |	j<                  j;                  «       |	j>                  j;                  «       «      }dD ](  }t@        jB                  jE                  ||   ||   «       Œ* tG        |||«      }|j                  ||||||d uxr ||   d udœ|¥tI        d„ |D «       «      tI        d„ |D «       «      tI        d„ |D «       «      tI        d„ |D «       «      dœ¥«       |D �]  }|d   €|d   d k(  s|d!   r|j                  |||d"œ|¥«       |dk(  sŒ3|d#   d!k(  sŒ<tK        |	j<                  j;                  «       |	j>                  j;                  «       |d$   |d%   |d&   |
d'   «      } | €Œ‹|	j                  j                  | d      t/        j0                  |«      t/        j2                  d¬«      z   k  sŒÕ|j                  |||d$   |d(   | d)   t	        |	j                  j                  | d      «      d*œ«       �Œ �Œ³ tM        |› d+|› d,|d   d-   › d.|d   d/   › d0�d¬1«       �Œ„ �Œ t/        jN                  |«      jQ                  |d2z  d3¬4«       t/        jN                  |«      jQ                  |d5z  d3¬4«       t/        jN                  |«      jQ                  |d6z  d3¬4«       |d7z  jS                  tU        jV                  |d8d3¬9«      «       g d:¢}!dtX        tZ        t\        t&        ||!D �"ci c]  }"|"t_        t
        |"z  «      “Œ c}"d;D �"ci c]  }"|"t_        ||"z  «      “Œ c}"d<œ}#|d=z  jS                  tU        jV                  |#d8d3¬9«      «       t/        jN                  |«      S c c}}}w c c}"w c c}"w )>N)zsync_params.pyzcheck_pine.pyÚtoolsT)ÚcwdÚcheck)ÚparentsÚexist_okr-   Ú
later_2026Úhistorical_é   )r   r   r   r   r   Útree_ÚtreeÚridge)r8   ÚfoldÚkindÚmodel)ÚstartÚendÚheadÚmoder   r=   r2   )Údays)Únanoseconds)r5   Ú_pine_time_end)ÚpositionÚexecute_entryÚexecute_exit)r8   r|   r   r€   ÚvariantÚfittedc              3  ó,   K  — | ]  }|d    dk(  –— Œ y­w)ÚreasonÚlearned_exitN© ©Ú.0Úds     rm   Ú	<genexpr>zrun.<locals>.<genexpr>e   s   è ø€ Ð<lÑbkÐ]^¸Q¸x¹[È.Õ=XÑbkùó   ‚c              3  ó,   K  — | ]  }|d    dk(  –— Œ y­w)rŒ   Úextension_capNrŽ   r�   s     rm   r’   zrun.<locals>.<genexpr>f   s   è ø€ Ð-^ÑT]Èq¨a°©k¸?Õ.JÑT]ùr“   c              3  ó,   K  — | ]  }|d    dk(  –— Œ y­w)rŒ   Útrailing_stopNrŽ   r�   s     rm   r’   zrun.<locals>.<genexpr>g   s   è ø€ Ð2cÑYbÐTU°1°X±;ÀÕ3OÑYbùr“   c              3  ó>   K  — | ]  }|d    duxr |d   dk(  –— Œ y­w)Úpredicted_advantageNÚactionÚholdrŽ   r�   s     rm   r’   zrun.<locals>.<genexpr>h   s@   è ø€ ð  3Dñ  zCÐtu°1Ð5JÑ3KÐSWÐ3WÒ3oÐ\]Ð^fÑ\gÐioÑ\oÓ3oñ  zCùs   ‚)Úlearned_exitsÚ	cap_exitsÚtrailing_exitsÚhold_decisionsr™   rš   ÚexitÚ
score_exit)r8   r|   r‰   rŒ   ÚbarÚ	entry_barÚ
trade_highÚtrailrM   r   )r8   r|   r¢   rM   Úhold_4_advantageÚ	label_endÚ z: fit from Útradesz
 trades / Úsamplesz rows)Úflushúmetrics.csvF)Úindexúdecisions.csvúexit_opportunities.csvúmodels.jsoné   )ÚindentÚ	allow_nan)zstrategies/mlp_learned_exit.pyz!strategies/strategy_mlp_scores.pyz(strategies/strategy_activation_scores.pyz'strategies/library_activation_scores.pyz#strategies/mlp_temporal_features.pyz(tools/run_mlp_learned_exit_experiment.pyz(tools/run_mlp_state_policy_experiment.pyz+tools/run_mlp_score_structure_experiment.pyztools/validate_chart_data.pyztools/check_pine.pyz	config.pyz,docs/mlp_learned_exit_protocol_2026_09_21.md)r¬   r®   r¯   r°   )Únon_promotingÚhorizonÚmax_extensionÚmin_train_tradesÚvariantsÚinputsÚcode_sha256Úoutputs_sha256zmanifest.json)0Ú
subprocessÚrunÚsysÚ
executablerC   rb   Úmkdirrn   Úappendr   r   r   rM   rS   ÚdateÚ
startswithr   ÚremoveprefixÚartifactÚVARIANTSÚitemsr   ÚgetrE   r]   Ú	Timedeltar   rT   r^   rW   r_   r`   rU   ÚtestingÚassert_array_equalr   Úsumr   ÚprintÚ	DataFrameÚto_csvÚ
write_textÚjsonÚdumpsr   r	   r
   r   )$ÚtfsÚoutputÚtoolÚrowsÚauditsr¹   ÚpredictionsÚeventsr8   rj   rk   Ú
provenanceÚrecordsre   r   r€   ÚfoldsÚlabelÚheadsr}   Ú
model_typerŠ   Úauditr‰   r‚   ÚsignalsÚ	decisionsr=   Ú	canonicalÚcolÚmetricsÚdecisionÚtargetÚsourcesÚnameÚmanifests$                                       rm   r½   r½   C   sÓ  € ã3ˆÜ�‰œŸ™¬¬D°©L¸Ñ,=Ó(>Ð?ÄTÐQUÖVð 4à
‡L�L˜¨€LÔ-Ø02°B¸¸BÀÐ0BÑ-€Dˆ&�&˜+ vÜˆÜ*4°R«.Ñ'ˆˆm˜ZØ�‰�jÔ!Ü" 4¨Ó7ˆÝ3<Õ=±9¡- ! U¨C�%˜’°9ˆÒ=Ø�‰”i¤ T§Y¡Y§^¡^°BÑ%7×%<Ñ%<Ó%>Ó!?Ð@ÔAÜ‰JˆE�3Ø$)¬YÒ$6‘L¸kÈ%ÐPRÐQRÈ)ÈÐ<UˆEØˆEÛW�Ø'+§¡°wÔ'?™VÀW�
Ü (¨°$·)±)¸UÀD×DUÑDUÐV]ÓD^Ð`jÓ k‘�˜Ø$��d‘Ø—‘ R°Àñ WÈð WØ&°°©ÀFÇOÁOÓDUñWõ Xð	 Xô *2¯©×)9Ñ%�™˜$ Ü%+¨D°-ÀuÐRUØ27·)±)¸D³/Èô&NÑ"�˜à˜jÒ(ðy 
¨8Ñ 4ð yÈ%Ü03´B·L±LÀÓ4EÄbÇlÁlÐXYÔFZÑ4ZÔ[]×[gÑ[gÐtuÔ[vÑ4vÓ0wòy�Fä 1°$·)±)³+¸vÀt×G[ÑG[×GdÑGdÓGfØ26·*±*×2EÑ2EÓ2GÈÏÉ×I[ÑI[ÓI]ó!_�IãL˜ÜŸ
™
×5Ñ5°g¸c±lÀIÈcÁNÕSð  Mä(¨°%¸Ó=�Ø—‘ 2¨u¸uÈSÐ]dØ'+°4Ð'7Ò'S¸EÀ$¹KÈtÐ<SñEà&ðEä9<Ñ<lÑbkÓ<lÓ9lÜ*-Ñ-^ÑT]Ó-^Ó*^Ü/2Ñ2cÑYbÓ2cÓ/cÜ/2ñ  3Dñ  zCó  3Dó  0DòEô Fô !*�Hð  Ð 5Ñ6ÐBÀhÈxÑFXÐZ`ÒF`ÐdlÐmyÒdzØ#×*Ñ*°"¸eÐPWÑ+dÐ[cÐ+dÔeØ *Ó,°¸(Ñ1CÀ\Ó1QÜ!4°T·Z±Z×5HÑ5HÓ5JÈDÏIÉI×L^ÑL^ÓL`ÐbjÐkpÑbqØ$ [Ñ1°8¸LÑ3IÈ=ÐY`ÑKaó"c˜à!Ñ-°$·)±)·.±.ÀÈÁÑ2KÌbÏlÉlÐ[^ÓN_Ô`b×`lÑ`lÐrsÔ`tÑNtÓ2tØ"ŸM™M°¸UÈ8ÐTYÉ?Ø3;¸FÑ3CÐY_Ð`aÑYbÜ8;¸D¿I¹I¿N¹NÈ6ÐRSÉ9Ñ<UÓ8Vñ+Xö Yò !*ð# *:ô: �R�D˜˜%˜ ¨F°2©J°xÑ,@Ð+AÀÈFÐSUÉJÐW`ÑLaÐKbÐbgÐhÐpt×uòM  ð ôZ ‡L�L�Ó×Ñ˜f ]Ñ2¸%ÐÔ@Ü‡L�L�Ó×$Ñ$ V¨OÑ%;À5Ð$ÔIÜ‡L�L�Ó×Ñ Ð'?Ñ ?ÀuÐÔMØˆMÑ×%Ñ%¤d§j¡j°ÀÈUÔ&SÔTò?€Gð "&´'ÌMÜ$4Ä(ÐV\ÙDKÓLÁG¸D ¤f¬T°$©YÓ&7Ñ 7ÀGÑLá#ló#nÙ#lð BF 4¬°°t±Ó)<Ñ#<Ø#lñ#nño€Hð
 ˆOÑ×'Ñ'¬¯
©
°8ÀAÐQVÔ(WÔXÜ�<‰<˜ÓÐùôs >ùòj  Mùò#ns   Â#W
ÕW	Õ(WÚ__main__)Údescriptionz--tfsÚ+)Ú4HÚ6HÚ8HÚ12HÚ1D)ÚnargsÚchoicesÚdefaultz--outputz$results/mlp_experiments/learned_exit)Útyperõ   )7Ú__doc__Ú
__future__r   ÚargparserÑ   Úpathlibr   r¼   r¾   ÚnumpyrU   ÚpandasrE   Ú__file__ÚresolveÚparentrb   rc   ÚinsertrC   Úconfigr   r   r   Ústrategies.mlp_learned_exitr   r	   r
   r   r   r   r   Ústrategies.strategy_mlp_scoresr   r   Ú(tools.run_mlp_score_structure_experimentr   r   r   Ú%tools.run_mlp_state_policy_experimentr   r   Útools.validate_chart_datar   rÆ   rn   r½   Ú__name__ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsrÓ   rÔ   rŽ   ro   rm   Ú<module>r     s  ðÙ SÝ "ã Û Ý Û Û 
ã Û áˆHƒ~×ÑÓ×&Ñ&×-Ñ-€Ø ‡�‡��‘3�t“9Ô ç 4Ñ 4÷=÷ =ñ =ç Nß [Ñ [ß HÝ 3à*¸Ø-Ð=NØ1ÐF\Ø 7Ø";Ø$?ñA€ò )òFCðL ˆzÒØ$ˆX×$Ñ$°Ô9€FØ
×Ñ˜ sÒ4SÒ]|ÐÔ}Ø
×Ñ˜
¨°tÐ<bÑ7bÐÔcØ×ÑÓ€DÙˆ�‰�$—+‘+Õð ro   