
    gjK%                       d Z ddlm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                         j                  j                  Zej                  j                  d ee             ddlmZ ddlmZmZmZ daddd	d
ddZddZ et0              a ed      ZdZdddZddZ	 	 d	 	 	 ddZ ddZ!ddZ"d dZ#eZ$eZ%d!dZ&e'dk(  r e&        yy)"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2403604807201D)4H6H8H12Hr   c           
     l    t         j                         D ci c]  \  }}|d|  d| d c}}S c c}}w )Nz	data/mlp/z, .csv)_TF_PERIODSitems)assettfps      B/Users/jameslopez/projects/TradingBot25/tools/mlp_results_table.py_tf_mapr   $   s=    :E:K:K:MN:MQB)E7"QCt,,:MNNNs   0zresults/winnersg{Gzt?c                6    ||nt         }t        d| d|  dz  S )N(optimization_winner_strategy_mlp_scores__r   )ASSET
WINNER_DIR)r   r   as      r   winner_pathr!   ,   s)    "AB1#Qrd$OOO    c                   d}d}d}d}d}d}d}| j                         D ]  \  }}	|	d   r|sd}|	d   }|dz  }|s|	d	   |z
  |z  }
|d|
z   z  }||z
  |z  }||kD  r|}|	d
   sEd}|dt        z   z  }|	d   dt        z
  z  }||z
  |z  }|dkD  r|dz  }|d|z   z  }||kD  s|} |dz
  dz  dz  }|dkD  r||z  dz  nd}|| dz  |||dS )z5Trade simulation matching validate_strategy.py logic.g      Y@g        Fr   execute_entryTclose   lowexecute_exit)pnlmax_ddwin_pctwinstotal)iterrows
COMMISSION)df_sigequitypeakmax_dd_fracin_posentry_pricer-   r,   r   rowlow_retfloatingdd	eff_entryeff_exitr)   	total_pnlr+   s                     r   run_backtestr=   1   sN   FDKFKED//#3Fg,KQJE5zK/;>GW-H/T)BK >"'1z>:	w<1z>:)+y87AID1s7#D=!D/ $2 %5(50I(-	te|e#sG,& r"   c                   ||nt         }t        |      j                  |       }t        | |      }|rt        j
                  j                  |      s t        d|  dt        j                         y |j                         s t        d|  dt        j                         y t        j                  |      j                  d   j                         }t        j                  |      }|j                  j                  j!                         |_        t        j"                  |d   d      j$                  j'                  d       |d<   t)        |      }	||	d	<   ||	d
<   t+        j,                  |j/                         fi |	}
|r|
|
d   t        j0                  |      k\     }
|r|
|
d   t        j0                  |      k     }
|
j3                  d      }
t5        |
      }t)        |      }||d	<   t+        j,                  |j/                         fi |}|r||d   t        j0                  |      k\     }|j3                  d      }|j6                  s"|d   j9                         j;                  d      nd}t5        |      }||d   t        j0                  t<              k\     j3                  d      }t5        |      }| |d<   |d   |d<   |d   |d<   |d   |d<   ||d<   |S )N  u   : data file missing — skipfileu   : no winner CSV — skipr   timeT)utc_pine_time_start_pine_time_end)dropz%Y-%m-%d?r   r)   pnl_fullpnl_oosr-   	total_ooslatest_date)r   r   getr!   ospathexistsprintsysstderrpdread_csvilocto_dictcolumnsstrlowerto_datetimedttz_localizedictstratgenerate_signalscopy	Timestampreset_indexr=   emptymaxstrftimer   )r   startendr   r    	data_filewpparamsdf	is_params	df_sig_isresultfull_paramsdf_sig_fullrK   result_full
df_sig_oos
result_ooss                     r   evaluate_tfrt   _   s    "A
r"I	R	BBGGNN952$23#**E99;2$./cjjA[[_!!!$,,.F	Y	B%%'BJ6
588DDTJBvJ VI$)I !"%I&&rwwy>I>Ii/2<<3FFG	
i/2<<3DDE	%%4%0I)$F v,K&+K"#((BkBK!+f"5e9L"LM))t)4KHSHYHY+f%))+44Z@_bK{+K [0BLL4KKLXX^bXcJj)JF4L$U+F:#E*F9$W-F;'F=Mr"   c                ,    | y| dk\  rd| ddS | ddS )Nu   —r   +z,.1f% )vals    r   _fmt_pnlrz      s-    
{!QhQs4j?:s4jN:r"   c                *   ddl m }m} |j                  |j                        j	                  d      }| r| d   j                  dd      nd}d| dd| d	| d
| dt         d	dd| ddg}| D ]  }	|j                  d|	d    dt        |	d          d|	d   dd|	d   dd|	d    d|	d    dt        |	j                  d             dt        |	j                  d             d|	j                  d d       d!        |dd"gz  }d#j                  |      S )$zDReturn a GitHub-renderable markdown table for the given result rows.r   )datetimetimezonez%Y-%m-%d %H:%M UTCrK   rG   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 | r)   r*   .1fz% | r+   .0f% (r,   /r-   z) | rH   rI   rJ   z |z6*Refresh: `python3 tools/mlp_results_table.py --save`*
)
r|   r}   nowrC   re   rL   r   appendrz   join)
rowsr   rf   rg   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                   | st        d       y | r| d   j                  dd      n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d ddddd ddddd }t                t        |       t        |       | D ]  }t        |d         }|d   dd }|d!   d"d#|d$    d%|d&    d}	t        |j                  d'            }
|j                  d(d      }t        |j                  d)             d*| d+}t        |d,   d
d|dd|dd|	ddddd|
ddddd|d        t                y )-NzNo results.r   rK   rG   zPnL % (thru )zOOS PnL % (z+)TFz<5 zPnL %z>12zMax DD %z>10zWin Ratez>18r?   r~   z>4z>22z>26z-----z------------z
----------z------------------z----------------------z--------------------------r)   r*   r   rw   r+   r   r   r,   r   r-   rH   rJ   rI   z (z trades)r   )rP   rL   r   rz   )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            	        t        j                  d      } | j                  dt        dt         d       | j                  ddt	        t
        j                               t	        t
        j                               d	
       | j                  dt        dt         d       | j                  dt        dt         d       | j                  ddt        t        dz  dz        t        t        dz  dz        dd       | j                  dddd d       | j                         }|j                  at        t              at        dt         d|j                    d|j"                   dt$        j&                         g }|j(                  D ]8  }t+        ||j                   |j"                         }|s(|j-                  |       : t/        |       |j0                  rt3        |j0                        }|j4                  j7                  d!d!"       |j9                  t;        |t        |j                   |j"                               t        d#|j=                  t               t$        j&                         y y )$Nz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--saverG   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_constz"Skip writing the markdown artifact)destactionr   r   zRunning MLP backtest for z [r   z]...r@   )rf   rg   T)parentsexist_okzSaved: )argparseArgumentParseradd_argumentr   listr   keysDEFAULT_STARTDEFAULT_ENDrX   REPO
parse_argsr   r   TF_MAPrP   rf   rg   rQ   rR   r   rt   r   r   r   r   parentmkdir
write_textr   relative_to)parserargsr   r   rn   	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Rtzztxx@KK 
 yyO	td;_T5$**dhhOP	--d345CJJG	 r"   __main__)r   rX   returnzdict[str, str])N)r   rX   r   
str | Noner   r   )r0   zpd.DataFramer   r]   )NNN)
r   rX   rf   r   rg   r   r   r   r   zdict | None)ry   zfloat | Noner   rX   )
r   
list[dict]r   rX   rf   rX   rg   rX   r   rX   )r   r   r   None)r   r   )(__doc__
__future__r   r   rM   rQ   pathlibr   pandasrS   __file__resolver   r   rN   insertrX   strategies.strategy_mlp_scoresstrategy_mlp_scoresr^   configr   r   r   r   r   r   r   r   r/   r!   r=   rt   rz   r   r   r   r   r   __name__rx   r"   r   <module>r      s    #  	 
  H~&&-- 3t9  . 4 4%uU$OO 
#$

P
+\ FJ%)8"8.98v;6> %HP zF r"   