
    j5                       d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZmZ d dlmZ d d	lmZ  ed
           G d d                      Z ed
           G d d                      Zd4dZd5dZd6dZd7d!Zd7d"Zd#d$d8d(Zd#d$d9d*Zd:d.Zd;d/Zd<d=d2Ze d3k    r e! e                      dS )>    )annotationsN)	dataclass)Path)mean)AnySequence)	BotConfigRuntimePaths)_pair_closed_trades)load_strategy_presetsT)frozenc                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )	ExperimentPathsstrstrategy_idr   rootpaper_statetrade_journalmetricsN__name__
__module____qualname____annotations__     strategy_tournament.pyr   r      sF         JJJMMMMMr   r   c                  t    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   dS )TournamentScorer   r   intclosed_tradesfloatwin_rateavg_pnl_usdtotal_pnl_usdmax_drawdown_usdprofit_factoravg_time_in_trade_minutesscoreboolsample_warningNr   r   r   r   r   r      s         OOO$$$$LLLr   r   runtime_dir
str | Pathr   r   returnc                    t          |                                           dz  |z  }t          |||dz  |dz  dz  |dz            S )Nexperimentszpaper_state.jsonTradeanalyseztrade_journal.jsonlzmetrics.json)r   r   r   r   r   )r   
expanduserr   )r,   r   r   s      r   build_experiment_pathsr3   &   sa    ''))M9KGD--^+.CC~%   r   strategy_idsSequence[str]list[ExperimentPaths]c                      fd|D             }|D ]?}|j                             dd           |j        j                            dd           @|S )Nc                0    g | ]}t          |          S r   )r3   ).0r   r,   s     r   
<listcomp>z*ensure_experiment_dirs.<locals>.<listcomp>2   s$    ^^^+#K==^^^r   Tparentsexist_ok)r   mkdirr   parent)r,   r4   pathsitems   `   r   ensure_experiment_dirsrB   1   sm    ^^^^Q]^^^E E E	t444!''t'DDDDLr   pathr   list[dict[str, Any]]c                   |                                  sg S g }|                     d                                          D ]?}|                                }|r'|                    t          j        |                     @|S )Nutf-8encoding)exists	read_text
splitlinesstripappendjsonloads)rC   rowslines      r   _read_jsonlrR   9   s|    ;;== 	D00;;== * *zz|| 	*KK
4(()))Kr   pnlslist[float]r"   c                    d}d}d}| D ]*}||z  }t          ||          }t          |||z
            }+t          |d          S )N           )maxminround)rS   equitypeakmax_ddpnls        r   _max_drawdownr_   D   s]    FDF , ,#4  VVd]++r   c                    t          d | D                       }t          t          d | D                                 }|dk    r|rt          |d          ndS t          ||z  d          S )Nc              3  &   K   | ]}|d k    |V  dS r   Nr   r9   ps     r   	<genexpr>z!_profit_factor.<locals>.<genexpr>P   s&      ))a1q555555))r   c              3  &   K   | ]}|d k     |V  dS rb   r   rc   s     r   re   z!_profit_factor.<locals>.<genexpr>Q   s&      ..1AQ..r   r   rW   rV   )sumabsrZ   )rS   gainslossess      r   _profit_factorrk   O   sv    ))4)))))E.......//F{{"'0uUAS0###r      min_samplesjournal_pathrn   r    c                  t          t          |                    }t          |          \  }}d |D             }g }|D ]t\  }}		 ddlm}
 |                    t           |
|	d                    |
|d                   z
                                  dz                       e# t          $ r Y qw xY wt          |          }|rt          t          |          d          nd}t          t          |          d          }|r*t          t          d |D                       |z  d	          nd}t          |          }t          |          }|rt          t          |          d	          nd}||k     }|rd
nd}t          |          dz  }|dk    r|dk    rdnd}t          ||dz  z   t!          |d          dz  z   |z
  |z
  |z
  d          }t#          | |||||||||
  
        S )Nc                Z    g | ](\  }}t          |                    d d                    )S )realized_pnl_usdrV   )r"   get)r9   _
exit_events      r   r:   z!score_journal.<locals>.<listcomp>Z   s3    VVV}q*E*..!3S99::VVVr   r   )	_parse_tsts<   rW   rV   c              3  &   K   | ]}|d k    dV  dS )r      Nr   )r9   r^   s     r   re   z score_journal.<locals>.<genexpr>f   s&      66scAgggggg66r      g       @gffffff?rz   g      ?g      ?g      @g?)
r   r!   r#   r$   r%   r&   r'   r(   r)   r+   )rR   r   r   signal_correlationrv   rM   r    total_seconds	ExceptionlenrZ   r   rg   r_   rk   rh   rY   r   )r   ro   rn   eventspairsrt   rS   	durationsentryru   rv   closedavg_pnl	total_pnlr#   r]   pfavg_timer+   sample_penaltydrawdown_penaltyoverfit_penaltyr)   s                          r   score_journalr   W   sB   l++,,F"6**HE1VVPUVVVDI"  z	444444S))Jt,<"="=		%PT+@V@V"V!e!e!g!gkm!mnnoooo 	 	 	H	YYF&*3eDJJ"""Gc$ii##IGMVuS66d66666?CCCSVH4  F			B,5>uT)__a(((3Hk)N*3SSN6{{T)$kki!mmddO'X^,s2s||c/AADTTWeehwwyz{{E"*%   s   AB$$
B10B1list[TournamentScore]c                   g }|D ]<}t          | |          }|                    t          ||j        |                     =t	          |d d          S )Nrm   c                *    | j         | j        | j        fS N)r)   r%   r!   )rA   s    r   <lambda>z/rank_strategies_from_journals.<locals>.<lambda>   s    DJ8JDL^+_ r   T)keyreverse)r3   rM   r   r   sorted)r,   r4   rn   scoresr   r@   s         r   rank_strategies_from_journalsr   }   si    F# ` `&{K@@mK1DR]^^^____&__imnnnnr   r   Sequence[TournamentScore]Nonec                    |D ]i}t          | |j                  }|j                            dd           |j                            t          j        |j        dd          d           jd S )NTr;      )indent	sort_keysrF   rG   )	r3   r   r   r>   r   
write_textrN   dumps__dict__)r,   r   r)   r@   s       r   write_metricsr      s     i i&{E4EFF
555  EN1PT!U!U!U`g hhhhi ir   c                   dg}| s*|                     d           d                    |          S t          | d          D ]y\  }}|j        rdnd}|                     | d|j         d	|j        d
d|j         d|j        dd|j        d
d|j	        d
d|j
        d
d|j        dd|j        dd|            zd                    |          S )NzStrategy Tournament ReportzNo strategies found.
rz   )startz observation-only z. z: score=z+.4fz, n=z, win=z.2fz, avg=z, total=z	, max_dd=z, pf=z, avg_time=z.1fm)rM   join	enumerater+   r   r)   r!   r#   r$   r%   r&   r'   r(   )r   linesidxr)   warnings        r   render_tournament_reportr      sv   )*E  +,,,yya000 
 

U).)=E%%2 L Le' L L^ L LuGZ L L>iL L-2->iL LMRM`iL L,  LL L8=8K  LL L\a\{  LL L CJL L	
 	
 	
 	

 99Ur   argvlist[str] | Nonec                   t          j                    }t          j        |          }t	          j        d          }|                    dt          |j                             |                    dt          d           |                    dd	d
           |                    ddd            |
                    |           }t                      }|j        p t          |                                          }|j        rt!          |j        |           t#          |j        ||j                  }t'          |j        |           t)          t+          |                     dS )Nz1Rank isolated paper-trading strategy experiments.)descriptionz--runtime-dir)defaultz--min-samplesrl   )typer   z--init
store_truez<Create experiment directories for all registered strategies.)actionhelpz--strategies*)nargsr   rm   r   )r	   	from_filer
   from_configargparseArgumentParseradd_argumentr   r,   r    
parse_argsr   
strategieslistkeysinitrB   r   rn   r   printr   )r   cfgr@   parserargspresetsr4   r   s           r   mainr      sK   



C$S))E$1deeeF
U5F1G1GHHH
c1===
<z{{{
c4@@@T""D#%%G?:d7<<>>&:&:Ly ?t/>>>*4+;\W[WghhhF$"F+++	
"6
*
*+++1r   __main__)r,   r-   r   r   r.   r   )r,   r-   r4   r5   r.   r6   )rC   r   r.   rD   )rS   rT   r.   r"   )r   r   ro   r-   rn   r    r.   r   )r,   r-   r4   r5   rn   r    r.   r   )r,   r-   r   r   r.   r   )r   r   r.   r   r   )r   r   r.   r    )"
__future__r   r   rN   dataclassesr   pathlibr   
statisticsr   typingr   r   configr	   r
   r|   r   strategy_registryr   r   r   r3   rB   rR   r_   rk   r   r   r   r   r   r   
SystemExitr   r   r   <module>r      s\   " " " " " "   ! ! ! ! ! !                             * * * * * * * * 2 2 2 2 2 2 3 3 3 3 3 3 $        $
 
 
 
 
 
 
 
            $ $ $ $ UV # # # # # #L op o o o o o oi i i i       ( z
*TTVV

 r   