+
    gjK%              
         R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RIt	]! ]
4      P                  4       P                  P                  t]P                  P                  ^ ]! ]4      4       ^ RIHt ^ RIHtHtHt RsRRRR	R
RRRRR/tR R lt]! \0        4      s]! R4      tRtR"R R lltR R ltR#R R llt R R lt!R R lt"R R lt#]t$]t%R R  lt&]'R!8X  d
   ]&! 4        R# R# )$a  
MLP Backtest Results Table
==========================
Runs the MLP strategy backtest for every timeframe that has both a data file
and a winner CSV, then prints a comparison table matching TradingView's
Strategy Tester columns:

    TF | PnL % | Max DD % | Win Rate

Usage
-----
    python3 tools/mlp_results_table.py              # all TFs
    python3 tools/mlp_results_table.py --tf 4H 8H  # specific TFs
)annotationsN)Path)	OOS_STARTSCORE_START	TRAIN_ENDCOINBASE_BTCUSD4H2406H3608H48012H7201Dc                    V ^8  d   QhRRRR/# )   assetstrreturnzdict[str, str] )formats   "B/Users/jameslopez/projects/TradingBot25/tools/mlp_results_table.py__annotate__r   $   s     O O3 O> O    c           
     n    \         P                  4        UUu/ uF  w  rVR V  RV R2bK  	  upp# u uppi )z	data/mlp/z, .csv)_TF_PERIODSitems)r   tfps   &  r   _tf_mapr!   $   s;    :E:K:K:MN:MB)E7"QCt,,:MNNNs   1zresults/winnersg{Gzt?c               $    V ^8  d   QhRRRRRR/# )r   r   r   r   
str | Noner   r   r   )r   s   "r   r   r   ,   s&     P PC P
 Pd Pr   c                B    Ve   TM\         p\        RV RV  R2,          # )N(optimization_winner_strategy_mlp_scores__r   )ASSET
WINNER_DIR)r   r   as   && r   winner_pathr*   ,   s)    "AB1#Qrd$OOOr   c                    V ^8  d   QhRRRR/# )r   df_sigzpd.DataFramer   dictr   )r   s   "r   r   r   1   s     + + +$ +r   c           
        RpRpRpRpRp^ p^ pV P                  4        F  w  rV	R,          '       d   V'       g   RpV	R,          pV^,          pK2  V'       g   K<  V	R,          V,
          V,          p
V^V
,           ,          pW+,
          V,          pW8  d   TpV	R,          '       g   K  RpV^\        ,           ,          pV	R,          ^\        ,
          ,          pW,
          V,          pV^ 8  d
   V^,          pV^V,           ,          pW8  g   K  TpK  	  VR,
          R,          R,          pV^ 8  d   Wv,          R,          MRpR	VR
V) R,          RVRVRV/# )z5Trade simulation matching validate_strategy.py logic.g      Y@g        Fexecute_entryTcloselowexecute_exitpnlmax_ddwin_pctwinstotal)iterrows
COMMISSION)r,   equitypeakmax_dd_fracin_posentry_pricer7   r6   r&   rowlow_retfloatingdd	eff_entryeff_exitr3   	total_pnlr5   s   &                 r   run_backtestrF   1   sT   FDKFKED//#Fg,KQJE65zK/;>GW-H/T)B >""'1z>:	w<1z>:+y87AID1s7#=!D/ $2 %5(50I(-	t|e#sGy;,&7 r   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r   r   r   startr#   endr   r   zdict | Noner   )r   s   "r   r   r   _   s1     8 8C 8
 8
 8"8.98r   c                   Ve   TM\         p\        V4      P                  V 4      p\        W4      pV'       d&   \        P
                  P                  V4      '       g"   \        RV  R2\        P                  R7       R # VP                  4       '       g"   \        RV  R2\        P                  R7       R # \        P                  ! V4      P                  ^ ,          P                  4       p\        P                  ! V4      pVP                  P                  P!                  4       Vn        \        P"                  ! VR,          RR7      P$                  P'                  R 4      VR&   \)        V4      p	WR&   W)R	&   \*        P,                  ! VP/                  4       3/ V	B p
V'       d'   WR,          \        P0                  ! V4      8  ,          p
V'       d'   WR,          \        P0                  ! V4      8*  ,          p
V
P3                  RR
7      p
\5        V
4      p\)        V4      pWR&   \*        P,                  ! VP/                  4       3/ VB pV'       d'   WR,          \        P0                  ! V4      8  ,          pVP3                  RR
7      pVP6                  '       g'   VR,          P9                  4       P;                  R4      MRp\5        V4      pWR,          \        P0                  ! \<        4      8  ,          P3                  RR
7      p\5        V4      pWR&   VR,          VR&   VR,          VR&   VR,          VR&   WR&   V# )N  u   : data file missing — skipfileu   : no winner CSV — skiptimeT)utc_pine_time_start_pine_time_end)dropz%Y-%m-%d?r   r3   pnl_fullpnl_oosr7   	total_ooslatest_date)r'   r!   getr*   ospathexistsprintsysstderrpdread_csvilocto_dictcolumnsr   lowerto_datetimedttz_localizer-   stratgenerate_signalscopy	Timestampreset_indexrF   emptymaxstrftimer   )r   rH   rI   r   r)   	data_filewpparamsdf	is_params	df_sig_isresultfull_paramsdf_sig_fullrW   result_full
df_sig_oos
result_ooss   &&&&              r   evaluate_tfr|   _   s    "A
r"I	R	BBGGNN9552$23#**E99;;2$./cjjA[[_!!!$,,.F	Y	B%%'BJ6
588DDTJBvJ VI$) !"%&&rwwy>I>I/2<<3FFG	
/2<<3DDE	%%4%0I)$F v,K&+"#((BkBK!f"5e9L"LM))t)4KHSHYHYHY+f%))+44Z@_bK{+K 0BLL4KKLXX^bXcJj)J4L$U+F:#E*F9$W-F;'=Mr   c                    V ^8  d   QhRRRR/# )r   valzfloat | Noner   r   r   )r   s   "r   r   r      s     ; ;, ;3 ;r   c                6    V f   R# V ^ 8  d   RV R R2# V R R2# )Nu   —+z,.1f%r   )r~   s   &r   _fmt_pnlr      s-    
{!QhQs4j?:s4jN:r   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )r   rows
list[dict]r   r   rH   rI   r   r   )r   s   "r   r   r      s/      * S  3 3 r   c                z   ^ RI H pHp VP                  VP                  4      P	                  R4      pV '       d   V ^ ,          P                  RR4      MRpRV 2RRV RV R	V R
\         R2	RRV R2R.pV  F  p	VP                  RV	R,           R\        V	R,          4       RV	R,          R RV	R,          R RV	R,           RV	R,           R\        V	P                  R4      4       R\        V	P                  R4      4       RV	P                  R^ 4       R 24       K  	  VRR!.,          pR"P                  V4      # )#zDReturn a GitHub-renderable markdown table for the given result rows.)datetimetimezonez%Y-%m-%d %H:%M UTCrW   rS   u   # MLP Performance —  z
*Updated: u    · IS:     → u	    · OOS: z+*z-| TF | IS PnL % | Max DD % | Win Rate | Thru z | OOS PnL % | OOS Trades |z#|---|---:|---:|---:|---:|---:|---:|z| r   z | r3   r4   .1fz% | r5   .0f% (r6   /r7   z) | rT   rU   rV   z |z6*Refresh: `python3 tools/mlp_results_table.py --save`*
)
r   r   nowrO   ro   rX   r   appendr   join)
r   r   rH   rI   r   r   r   latestlinesrs
   &&&&      r   format_markdownr      s]   +\\(,,'001EFC04T!W[[,#F
 (

SE%cU)I;bI

7x?Z[-E 4	 !E(#$ %8S! "9c"#ai[!G* >!%%
+,- .!%%	*+, -{A&'r+	
  
bJKKE99Ur   c                    V ^8  d   QhRRRR/# )r   r   r   r   Noner   )r   s   "r   r   r      s      j T r   c                   V '       g   \        R 4       R# V '       d   V ^ ,          P                  RR4      MRpRV R2pR\         R2pRR	 R
RR R
RR R
RR RRR RVR RRR RVR 2pR& R
R' R
R( R
R) RRR RR* RRR RR+ 2p\        4        \        V4       \        V4       V  F  p\        VR,          4      pVR,          R R2pVR,          R RVR,           RVR,           R2p	\        VP                  R 4      4      p
VP                  R!^ 4      p\        VP                  R"4      4       R#V R$2p\        VR%,          R	 R
VR R
VR R
V	R RRR RV
R RRR RVR 24       K  	  \        4        R# ),zNo results.NrW   rS   zPnL % (thru )zOOS PnL % (z+)TFz<5 zPnL %z>12zMax DD %z>10zWin Ratez>18rK   r   z>4z>22z>26r3   r4   r   r   r5   r   r   r6   r   r7   rT   rV   rU   z (z trades)r   z-----z------------z
----------z------------------z----------------------z--------------------------)r\   rX   r   r   )r   r   full_hdroos_hdrheadersepr   pnl_strdd_strwin_strfull_pnl_str
oos_tradesoos_strs   &            r   print_tabler      s   m48a]C0cFxq)Hyk,Gb	73-qC(8*S9I2b'HS>2b'GC=*F q&6(2b'F82b'F8%C 
G	&M	#J%)H+c*!,I,s+3qyk1W:,aHj 12uu[!,
"155#345R
|8L4Agc]!F3<q2b'L-2b'GC=* 	+  
Gr   c                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r   r   r      s     %H %Hd %Hr   c            	     2   \         P                  ! R R7      p V P                  R\        R\         R2R7       V P                  RR\	        \
        P                  4       4      \	        \
        P                  4       4      RR	7       V P                  R
\        R\         R2R7       V P                  R\        R\         R2R7       V P                  RR\        \        R,          R,          4      \        \        R,          R,          4      RRR7       V P                  RRRRRR7       V P                  4       pVP                  s\        \        4      s\        R\         RVP                    RVP"                   R2\$        P&                  R7       . pVP(                   F?  p\+        W1P                   VP"                  R 7      pV'       g   K.  VP-                  V4       KA  	  \/        V4       VP0                  '       d   \3        VP0                  4      pVP4                  P7                  R!R!R"7       VP9                  \;        V\        VP                   VP"                  4      4       \        R#VP=                  \        4       2\$        P&                  R7       R# R# )$zMLP backtest results table)descriptionz--assetzAsset to evaluate (default: r   )defaulthelpz--tf*z$Timeframes to include (default: all))nargsr   choicesr   z--startzStart date inclusive (default: z--endzEnd date inclusive (default: z--saverS   resultszmlp_performance.mdPATHzZWrite markdown table to PATH (default: results/mlp_performance.md; pass --no-save to skip))r   constr   metavarr   z	--no-savesavestore_constNz"Skip writing the markdown artifact)destactionr   r   zRunning MLP backtest for z [r   z]...rL   )rH   rI   T)parentsexist_okzSaved: )argparseArgumentParseradd_argumentr'   listr   keysDEFAULT_STARTDEFAULT_ENDr   REPO
parse_argsr   r!   TF_MAPr\   rH   rI   r]   r^   r   r|   r   r   r   r   parentmkdir
write_textr   relative_to)parserargsr   r   rv   	save_paths         r   mainr      s)   $$1MNF
	5;E7!D  F
c48H8H8J3K $[%5%5%7 8C  E 	=>}oQO  Q
<[MK  M
!$"25I"IJ #D9$47K$K L &y	  {
 &dA  CDZZEU^F	%eWBtzzl%z
NUXU_U_`DggRzztxx@6KK 
 yyyO	td;_T5$**dhhOP	--d345CJJG	 r   __main__)N)NNN)(__doc__
__future__r   r   rY   r]   pathlibr   pandasr_   __file__resolver   r   rZ   insertr   strategies.strategy_mlp_scoresstrategy_mlp_scoresrh   configr   r   r   r'   r   r!   r   r(   r9   r*   rF   r|   r   r   r   r   r   r   __name__r   r   r   <module>r      s    #  	 
  H~&&-- 3t9  . 4 4UD%ueUD$OO 
#$

P
+\8v;6> %HP zF r   