
    Ljc                       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mZmZ  ed	
           G d d                      Z ed	
           G d d                      Zd\dZd]dZd^d_dZd`d!Zdad"Zdbd'Zdcd)Zddd.Zded/Zdfd2Zdgd4Z dgd5Z!dgd6Z"dhd;Z#did?Z$djdCZ%dDddEdkdKZ&dldMZ'dldNZ(dldOZ)dmdWZ*dndodZZ+e,d[k    r e- e+                      dS )p    )annotationsN)	dataclass)Path)mean)MappingSequence)	BotConfigRuntimePaths)CandleReplayResultReplayTradeT)frozenc                  .    e Zd ZU ded<   ded<   ded<   dS )LabStrategystrstrategy_idfamilyz#dict[str, float | int | str | bool]
parametersN__name__
__module____qualname____annotations__     B/home/agent/projects/CryptoTradingBot/Crypto_Agent/strategy_lab.pyr   r      s3         KKK333333r   r   c                  L    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
S )OpenLabPositionr   coinfloatentry_tsentry_pricesizeintentry_indexr   Nr   r   r   r   r   r      sL         IIIOOOKKKKKKKKr   r   strategykeyr   defaultfloat | int | str | boolreturnc                8    | j                             ||          S N)r   get)r&   r'   r(   s      r   _paramr.      s    ""3000r   currentr    	referencec                (    |dk    rdS | |z
  |z  dz  S )Nr                 Y@r   )r/   r0   s     r   _pct_changer4   #   s%    A~~si9,u44r      closesSequence[float]periodr$   c                   t          |           |dz   k     rdS g }g }t          | | dz
  d         | | d                    D ]r\  }}||z
  }|dk    r+|                    |           |                    d           ;|                    d           |                    t          |                     s|rt	          |          nd}|rt	          |          nd}|dk    r
|dk    rdndS ||z  }	ddd|	z   z  z
  S )N         I@r   r2   r3         ?)lenzipappendabsr   )
r6   r8   gainslossesprevcurdeltaavg_gainavg_lossrss
             r   _rsirJ   )   s%   
6{{VaZtEF!b 0166'((3CDD & &	cd
A::LLMM#LLMM#e**%%%%#,tE{{{H%.tF|||3H1}} 1uu$.	H	BES2X&''r   valuesc                Z    | sdS | t          d|           d          }t          |          S )Nr2   r:   )maxr   )rK   r8   windows      r   _smarO   >   s5     sSF^^O%%&F<<r   c                    t          |           dk     rdS t          |           t          fd| D                       t          |           z  dz  S )N   r2   c              3  (   K   | ]}|z
  d z  V  dS )rQ   Nr   ).0itemavgs     r   	<genexpr>z_std.<locals>.<genexpr>I   s,      55d!555555r         ?)r>   r   sum)rK   rU   s    @r   _stdrY   E   sU    
6{{Qs
v,,C5555f55555FCKKr   candlesSequence[Candle]idxfloat | Nonec                   |dk    s||k     rd S g }||z
  dz   }t          ||dz             D ]u}| |         }| |dz
           j        }|                    t          |j        |j        z
  t          |j        |z
            t          |j        |z
                                 v| |         j        }|dk    rd S t          |          |z  dz  S )Nr   r:   r3   )rangecloser@   rM   highlowrA   r   )	rZ   r\   r8   true_rangesstartcur_idxcandleprevious_closer`   s	            r   _atr_pctrh   L   s    
axx3<<t!K&L1Ea((  ! 1-33v{VZ7V[>=Y9Z9Z\_`f`jm{`{\|\|}}~~~~CLEzztu$u,,r   lookbackc                h    ||k     rd S | ||z
           j         }t          | |         j         |          S r,   )r`   r4   )rZ   r\   ri   r0   s       r   _relative_strength_pctrk   [   s8    
X~~th'-Iws|)9555r   r   candles_by_coinMapping[str, Sequence[Candle]]boolc           
        t          t          | dd                    }t          dt          t          | dd                              }t          t          | dd                    t          dt          t          | dd                              }g }|                                D ]U\  }}	|t          |	          k    rt          |	||          }
|
)|                    |
|                                f           Vfd	|D             }t          |          |k     rd
S |	                    d d           d |d |         D             }|                                |v S )Nri      r:   top_n   min_momentum_pct       @min_positive_candidatesc                *    g | ]\  }}|k    ||fS r   r   )rS   score	candidatemin_momentums      r   
<listcomp>z-_is_top_relative_strength.<locals>.<listcomp>s   s-    [[['7uiUlEZEZ	"EZEZEZr   Fc                "    | d         | d         fS )Nr   r:   r   rT   s    r   <lambda>z+_is_top_relative_strength.<locals>.<lambda>v   s    DGT!W#5 r   Tr'   reversec                    h | ]\  }}|S r   r   )rS   _scorerx   s      r   	<setcomp>z,_is_top_relative_strength.<locals>.<setcomp>w   s    
?
?
?*9
?
?
?r   )
r$   r.   rM   r    itemsr>   rk   r@   uppersort)r&   r   rl   r\   ri   rq   ru   scoresrx   rowsrw   eligibletopry   s                @r   _is_top_relative_strengthr   b   sk    6(J3344H3vh334455E*<cBBCCL!!S:SUV)W)W%X%XYY&(F*0022 6 6	4#d))&tS(;;MM5)//"3"34555[[[[6[[[H
8}}...uMM55tMDDD
?
?hvv.>
?
?
?C::<<3r   c                   |dk    rdS | j         }||         j        }d |d |dz            D             }|d |         }|dk    rt          t          | dd                    }t	          |          |k     rdS t          t          | dd	                    }t          d
 || d          D                       }	t          t          | dt          d|dz                                }
t          t          | d|                    }t          |d d         |
          t          |d d         |          k    }|ot          ||	          |k    S |dk    rPt          t          | dd                    }t          t          | dd                    }t          ||          |k    S |dk    rt          t          | dd                    }
t          t          | dd                    }t          t          | d|                    }t          t          | dd                    }t	          |          t          |
||          k     rdS t          d || d          D                       }	|||dz
           j        k    }t          |d d         |
          t          |d d         |          k    ot          ||	          | k    o|S |dk    rt          t          | dd                    }t	          |          |k     rdS d || d          D             }t          |          }|rt          |          dz  |z  dz  nd}t          t          | dd                    }t          t          | dd                     }||k    o3t          |t          d! || d          D                                 |k    S |d"k    r t          t          | dd#                    }t	          |          |k     rdS t          d$ || d          D                       }	t          t          t          | d%d&                              }t          ||	          | k    rdS d' || d          D             }|r||         j        dk    rdS t          t          | d(d                    }||         j        t          |          |z  k    S |d)k    rLt          t          | dd#                    }
t          t          | dd*                    }t          t          | d+|dz                      }t	          |          t          |
||          k     rdS t          |d d         |
          t          |d d         |          k    }t          ||| dz
                     }t          t          | d,d&                    }t          t          | d-d                    }t          t          | d.d                    }t          |||          }|d u p||k    }|o||k    o|S |d/k    rt          t          | dd                    }t	          |          |k     rdS t          d0 || d          D                       }	t          t          | dd1                    }t          ||	          |k     rdS d2 || d          D             }|r||         j        dk    rdS t          t          | d(d3                    }||         j        t          |          |z  k    S dS )4Nr   Fc                    g | ]	}|j         
S r   r`   rS   cs     r   rz   z!_should_enter.<locals>.<listcomp>   s    222!ag222r   r:   momentum_breakoutri      breakout_pctr=   c              3  $   K   | ]}|j         V  d S r,   ra   r   s     r   rV   z _should_enter.<locals>.<genexpr>   $      ??Q!&??????r   fast_smarQ   slow_smar<   rsi_mean_reversion
rsi_periodr5   oversold_rsig      >@trend_pullback      pullback_pctrt   c              3  $   K   | ]}|j         V  d S r,   r   r   s     r   rV   z _should_enter.<locals>.<genexpr>   r   r   volatility_squeeze_breakoutc                    g | ]	}|j         
S r   r   r   s     r   rz   z!_should_enter.<locals>.<listcomp>   s    >>>A>>>r         @r3   g     8@max_band_width_pctg      ?c              3  $   K   | ]}|j         V  d S r,   r   r   s     r   rV   z _should_enter.<locals>.<genexpr>   s$      @f@fA@f@f@f@f@f@fr   liquidation_reversal   c              3  $   K   | ]}|j         V  d S r,   r   r   s     r   rV   z _should_enter.<locals>.<genexpr>   r   r   drop_pct      @c                2    g | ]}|j         d k    |j         S r   volumer   s     r   rz   z!_should_enter.<locals>.<listcomp>   !    PPPa18a<<<<<r   volume_spike_multrisk_managed_trend_following$   long_lookbackmin_long_trend_pct
atr_periodmax_atr_pctdonchian_volume_breakoutc              3  $   K   | ]}|j         V  d S r,   r   r   s     r   rV   z _should_enter.<locals>.<genexpr>   r   r   rW   c                2    g | ]}|j         d k    |j         S r   r   r   s     r   rz   z!_should_enter.<locals>.<listcomp>   r   r         ?)r   r`   r$   r.   r>   r    rM   rO   r4   rJ   r   rY   rA   r   rh   ) r&   rZ   r\   r   r`   r6   previousri   r   recent_highfastslowtrend_okr8   oversoldr   bouncedbasis_valuesbasis	width_pct	max_widthr   prior_volumesr   r   fast_ok
long_trendmin_long_trendr   r   atr_pctvolatility_oks                                    r   _should_enterr   {   sI   
axxu_FCLE22wyqy1222Ftt}H$$$vh
B7788x==8##5VHncBBCC??(H9::*>?????6(JAx1}0E0EFFGG6(J99::ssT**d6#2#;.E.EEKK{;;|KK%%%VHlB7788.$??@@FF##x//!!!6(J22336(J3344vh
D99::VHncBBCCx==3tT844445??(H9::*>?????'#'*00F3B3K&&fSbSk4)@)@@  B[QVXcEdEdiuhuEu  B  {B  	B...vh
B7788x==8##5>>8)**)=>>>\""BGRT,''#-5==U	&+?EEFF	VHndCCDDI%w+eS@f@fQY[cZcZdZdQe@f@f@f=f=f*g*gkw*ww'''vh
B7788x==8##5??(H9::*>?????uVHj#>>??@@uk**hY665PP8XIJJ+?PPP 	 3q 8 85!&3F"L"LMMs|"d=&9&9<M&MMM///6(J33446(J3344F8_dQhGGHHx==3tT=99995vcrc{D))Dd,C,CC ~/A(BCC
vh0DcJJKK,;;<<
F8]EBBCC7C444A7k+AI:7IMI+++vh
B7788x==8##5??(H9::*>?????VHncBBCCuk**\995PP8XIJJ+?PPP 	 3q 8 85!&3F"L"LMMs|"d=&9&9<M&MMM5r   position
str | Nonec                d   ||         j         }t          ||j                  }t          t	          | dd                    }t          t	          | dd                    }t          t	          | dd                    }|t          |           k    rdS |t          |          k    rdS | j        d	k    rmt          t	          | d
d                    }	t          t	          | dd                    }
t          d |d |dz            D             |	          |
k    r|dk    rdS ||j	        z
  |k    rdS d S )Nstop_loss_pctr   take_profit_pctrt   max_hold_barsrp   	stop_losstake_profitr   r   r5   exit_rsi     K@c                    g | ]	}|j         
S r   r   r   s     r   rz   z _exit_reason.<locals>.<listcomp>   s    555Q555r   r:   r   rsi_recovered	time_stop)
r`   r4   r"   r    r.   r$   rA   r   rJ   r%   )r&   r   rZ   r\   r`   pnl_pctr   r   max_holdr8   r   s              r   _exit_reasonr      s8   CLE%!566GfX<<==Ix):C@@AAK6(OR8899H3y>>/!!{#k""""}...VHlB7788*d;;<<55')C!G)"4555v>>(JJwYZ{{"?
X!!X--{4r   pnlsc                    d}d}d}| D ]*}||z  }t          ||          }t          |||z
            }+t          |d          S )Nr2   r   )rM   minround)r   equitypeakmax_ddpnls        r   _max_drawdownr      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   rS   ps     r   rV   z!_profit_factor.<locals>.<genexpr>   s&      ))a1q555555))r   c              3  &   K   | ]}|d k     |V  dS r   r   r   s     r   rV   z!_profit_factor.<locals>.<genexpr>   s&      ..1AQ..r   r   r   r2   )rX   rA   r   )r   rB   rC   s      r   _profit_factorr      sv    ))4)))))E.......//F{{"'0uUAS0###r   c                N   t          |           }| sdS t          |           }t          d | D                       |z  }t          t	          |           d          }t          t          |                     dz  }|dk     rdnd}t          ||dz  z   |d	z  z   |z
  |z
  d
          S )Ng       c              3  &   K   | ]}|d k    dV  dS r   r:   Nr   r   s     r   rV   z_score.<locals>.<genexpr>  s&      ,,a!ee1eeee,,r   g      @gffffff?   r=   r2   rW   g?r   )r>   r   rX   r   r   rA   r   r   )r   closedavg_pnlwin_ratepf
dd_penaltysample_penaltys          r   r   r      s    YYF t4jjG,,d,,,,,v5H	^D!!3	'	'B]4(())D0J"QJJSSCN8c>)BH4zANRTUVVVr   rf   r   reasonr   c                2   |j         |j        z
  |j        z  }t          | j        |j        |j        t          |j                  |j        |j         |j        t          |d          |t          t          |j                  |j        z
  dz            
  
        S )Nr   <   )
r   r   r!   exit_tsr"   
exit_pricer#   pnl_usdexit_reasonminutes_in_trade)r`   r"   r#   r   r   r   r!   r    tsr   r$   )r&   r   rf   r   r   s        r   _close_trader   
  s    <(..(-
?C(]"fi  (<]c1eFI..1BBrIJJ   r   volumesMapping[str, float]r   c               p   t          t          | dd                    }t          t          | dd                    }t          t          | dd                    }i }g }g }|                                D ]g\  }	}
t	          |
          }t          |          D ]C\  }}|                    t          |j                  |	                                |||f           Dh|	                    d            |D ]\  }}	}}}|
                    |	d	          |k     r#|	|v rSt          | ||	         ||          }|r8|                    t          | |                    |	          ||                     zt          |          |k    r| j        d
k    rt!          | |	||          }nt#          | ||          }|r<t%          |	t          |j                  |j        ||j        z  || j                  ||	<   d |                                D             }t	          |                                          D ]A\  }	}|
                    |	          }|%|                    t          | ||d                     Bd |D             }t          |          }t)          | j        ||r*t-          t/          d |D                       |z  d          nd	|rt-          t1          |          d          nd	t-          t/          |          d          t3          |          t5          |          t7          |          |	  	        S )Nmin_volume_24hr=   trade_size_usdr;   max_total_tradesrr   c                    | d         S )Nr   r   r|   s    r   r}   z"run_lab_strategy.<locals>.<lambda>&  s
    47 r   )r'   r2   relative_strength_rotation)r   r!   r"   r#   r%   r   c                h    i | ]/\  }}||                                 t          |          d          0S )r<   )r   list)rS   r   rZ   s      r   
<dictcomp>z$run_lab_strategy.<locals>.<dictcomp>@  s7    lllgdklDJJLL$w--"3lllr   end_of_replayc                    g | ]	}|j         
S r   )r   rS   trades     r   rz   z$run_lab_strategy.<locals>.<listcomp>F  s    ...eEM...r   c              3  &   K   | ]}|d k    dV  dS r   r   )rS   r   s     r   rV   z#run_lab_strategy.<locals>.<genexpr>K  s&      88a188r      r   )	r   closed_tradesr   avg_pnl_usdtotal_pnl_usdmax_drawdown_usdprofit_factorrw   trades)r    r.   r$   r   r	  	enumerater@   r   r   r   r-   r   r   popr>   r   r   r   r   r`   r   r   r   rX   r   r   r   r   )r&   rl   r   
min_volume
trade_sizemax_positionsopen_positionsr  timeliner   rZ   r   r\   rf   _tscoin_candlesr   enterlast_by_coinr   lastr   r   s                          r   run_lab_strategyr#    sg   vh(8#>>??Jvh(8$??@@Jx);Q??@@M13N "FGIH(..00 Q QgG}}$T?? 	Q 	QKCOOU69--tzz||VT3OPPPP	QMM**M+++08  ,T6<;;tS!!J..>!!!(N4,@,PSTTF `l8^5G5G5M5MvW]^^___~-//?:::-hosSSEE!(L#>>E 	#2vy))"L&,.$ $ $N4  mlI^I^I`I`lllL~335566 S Sh%%MM,x4QQRRR..v...DYYF(IOXs88888886A1EEEUX,09E$t**a(((cCIIq))&t,,$T**Tll
 
 
 
r   
strategiesSequence[LabStrategy]list[ReplayResult]c               J    fd| D             }t          |d d          S )Nc                4    g | ]}t          |           S )r   )r#  )rS   r&   rl   r   s     r   rz   z$run_strategy_lab.<locals>.<listcomp>V  s*    gggPX/7KKKgggr   c                *    | j         | j        | j        fS r,   )rw   r  r  )results    r   r}   z"run_strategy_lab.<locals>.<lambda>W  s    v|V=QSYSg.h r   Tr~   )sorted)r$  rl   r   resultss    `` r   run_strategy_labr.  U  s;    ggggg\fgggG'hhrvwwwwr   r   min_samplessampler_strategiesr-  Sequence[ReplayResult]r0  r1  Sequence[LabStrategy] | Nonec                  ddg}|rh|                     d           |D ]P}t          |j                            d|j                            }|                     d|j         d| d           Qt          | d	          D ]\  }}|j        |k     rd
nd}t          d |j        D                       }	|                     | d|j         d|j	        dd|j         d|j
        dd|j        dd|j        dd|j        dd|j        ddd                    |	d d                   pd |            d                    |          S )NzStrategy Lab Tournamentz'Mode: side-effect-free archetype replayu-   Research sampler — not a champion candidatelabelz- z: z-; paper-only research-sampler data-collectionr:   )rd   z observation-only c                    h | ]	}|j         
S r   )r   r  s     r   r   z-render_strategy_lab_report.<locals>.<setcomp>c  s    >>>u
>>>r   z. z: score=z+.4fz, n=z, win=z.2fz, avg=z, total=z	, max_dd=z, pf=z, coins=,r   -
)r@   r   r   r-   r   r  r  r,  r  rw   r   r  r  r  r  join)
r-  r0  r1  linessamplerr5  r\   r+  warningcoinss
             r   render_strategy_lab_reportr@  Z  s   &(QRE kDEEE) 	k 	kG*..w8KLLMMELLig1iiUiiijjjj 222 
 
V)/)=)K)K%%QS>>>>>?? A Af( A A&,a A AI] A A?lA A.4.@lA AOUOclA A-  AA A9?9M  AA A[^[c[cdijlkljldm[n[n[uruAw~A A	
 	
 	
 	

 99Ur   list[LabStrategy]c                     t          ddddddddd	d
          t          ddddddddd	d
          t          dddddddddd	d          t          dddddddddd	d          t          dd d!d"ddd#dd$dd	d%	          t          d&d'dd(d)dd*ddd	d+          t          d,d-ddddd.ddd	d/          t          d0d1dd2dd2ddd3dd	d4	          t          d5d6ddd3d7ddd7dd8dd	d9          t          d:d;dd<ddd=ddd	d>          g
S )?Nlab_momentum_breakout_fastr   r   g??333333?   r;   逖 ri   r   r   r   r   r  r  lab_momentum_breakout_slowr   g?r   0   lab_rsi_reversion_fastr      g      8@r   g333333@rt   rp   r   r   r   r   r   r   r  r  lab_rsi_reversion_deepr5   g      6@g      J@      @      @lab_trend_pullbackr   r   r   g@   	r   r   ri   r   r   r   r   r  r  lab_squeeze_breakoutr   g	@gffffff?g?ri   r   r   r   r   r   r  r  lab_liquidation_reversalr   ffffff?ri   r   r   r   r   r   r  r  lab_relative_strength_rotationr  rr   H   	ri   rq   rs   ru   r   r   r   r  r   lab_risk_managed_trend_followingr   r   `   r   r   r   r   r   r   r   r   r   r  r  lab_donchian_volume_breakoutr   皙?r   ri   r   r   r   r   r   r  r  r   r   r   r   default_lab_strategiesrc  l  sL   02ETVhk  AD  WZ  mo  CG  [e  Hf  Hf  	g  	g02ETVhk  AD  WZ  mo  CG  [e  Hf  Hf  	g  	g,.BSTfjx|  RU  hk  ~@  TX  lv  Ew  Ew  	x  	x,.BSUgky}  SV  il  A  UY  mw  Ex  Ex  	y  	y(*:XZhj|  UX  kn  AC  W[  oy  =z  =z  	{  	{*,IXZru  HK  `c  vy  LN  bf  zD  LE  LE  	F  	F.0FUWeh  @C  X[  nq  DF  Z^  r|  I}  I}  	~  	~46Racno  FI  fg  |  RU  hj  ~B  V`  Ua  Ua  	b  	b68Veguw  KM  eh  xz  KN  cf  y|  OQ  ei  }G  YH  YH  	I  	I24N]_qt  LO  dg  z}  PR  fj  ~H  QI  QI  	J  	J r   c                     t          dddddddddddd	dd
ddd          t          ddddddddddddddd
ddd          gS )a  Paper-only research samplers promoted from recent Strategy-Lab replay.

    These are explicitly not champion/live candidates; they exist to collect
    comparable signal/outcome data for promising families without loosening the
    running v76 candidates.
    !sampler_squeeze_breakout_researchr   z5Squeeze breakout sampler from strongest replay familyTrp   rP  333333?rt   rE  g      $@rQ   rG  )r5  research_samplernot_champion
paper_onlydata_collectionri   r   r   r   r   r   r  r  r  "sampler_relative_strength_researchr  z5Relative strength rotation sampler with breadth guardr   rr   rD  rZ  )r5  rg  rh  ri  rj  ri   rq   rs   ru   r   r   r   r  r  r  rb  r   r   r   #default_research_sampler_strategiesrl  {  s     	/)P$( $"#'&) ##&!$!#"&$%", 	
 	
( 	0(P$( $"#'$'+,#&!$!#"&$%", 	
 	
+* *r   c                 ,   g } dD ]\}dD ]W}t          |                              dd          }|                     t          d| d| d||dd	d
ddd                     X]dD ]G}dD ]B}|                     t          d| d| d|t	          |          dddd
ddd                     CHdD ]V}t          |                              dd          }|                     t          d| dddd|dd	d
ddd	                     WdD ]}dD ]{}t          |                              dd          }t          |                              dd          }	|                     t          d | d|	 d!d||dd	d
ddd"                     |d#D ]}
d$D ]{}t          |
                              dd          }t          |                              dd          }|                     t          d%| d&| d'd(|
|d)d*d(ddd+                     |d,D ]C}d-D ]>}d.D ]9}|                     t          d/| d0| d1| d2||d3|d3d)d4ddd5	                     :?Dd6D ]`}dD ][}t          |                              dd          }|                     t          d7| d8| d9d(d:|d;d<|d;dd=ddd>                     \ad,D ]]}d?D ]X}t          |                              dd          }|                     t          d@| d&| dA|dB|ddd:dddC                     Y^| S )DN)r          )rf  rE  rt   .r   grid_momo_l_br   rt   rE  rn  r;   rG  rH  )rr   rL  r5   )r      r   
grid_rsi_p_or   r   rP  r   rM  )r=   rP  r   grid_pullback_r   r   r   rp   rS  )rP  r   )rf  rE  grid_squeeze_wr   rU  )rP  rO  g      @)rD  rP  grid_liqrev_d_vr   r   rD  rW  rX  )rp   rJ  )rQ   r  )r:   rr   	grid_rs_l_t_mr  r   rZ  r[  )rJ  r]  grid_trend_l_atrr   r   r   r5   r]  r^  )r   rt   grid_donchian_lr   r`  ra  )r   replacer@   r   r    )r$  ri   breakoutsafer8   r   pullbackwidth
safe_widthsafe_breakoutdropspike	safe_drop
safe_spikerq   min_positiver   max_atrsafe_atrs                      r   generate_lab_grid_strategiesr    s   $&J M M' 	M 	MHx==((c22Dk*J*J*JD*J*JL_nv  IQ  fi  |  RT  hl  @J  bK  bK  L  L  M  M  M  M	M  h h$ 	h 	hHk*Kv*K*K*K*KMarx  KP  QY  KZ  KZ  hl  AD  WZ  mo  CG  [e  df  df  g  g  h  h  h  h	h# V V8}}$$S#..+&=t&=&=?O^_mo}  RZ  or  EH  []  qu  IS  RT  RT  U  U  	V  	V  	V  	V | |" 	| 	|HU++C55JMM11#s;;Mk*X:*X*X*X*XZw  GI  af  x@  UX  kn  AC  W[  oy  zz  zz  {  {  |  |  |  |	|   g g 	g 	gED		))#s33IU++C55Jk*S)*S*Sz*S*SUkz|  KO  fk  @C  VY  ln  BF  Zd  ne  ne  f  f  g  g  g  g	g  a a 	a 	aE & a a!!+.](.].]e.].]|.].]_{  KS  ^c  y|  Ye  z}  PS  fh  |@  T^  ~_  ~_  #`  #`  a  a  a  aa	a " y y! 	y 	yG7||++C55Hk*V*V*VH*V*VXv  FH  VX  kx  PS  ce  v}  RU  hk  ~@  TX  lv  yw  yw  x  x  y  y  y  y	y  u u 	u 	uEU++C55Jk*TH*T*T
*T*TVp  @H  Z]  ty  NQ  dg  z|  PT  hr  ss  ss  t  t  u  u  u  u	u r   	cache_dirr   r?  Sequence[str]interval
hours_backdict[str, list[Candle]]c                   i }|D ]}| |                                  d| d| dz  }|                                s7t          j        |                    d                    }d |D             ||                                 <   |S )N_zh.jsonutf-8encodingc                ^   g | ]}t          t          |                    d d                    dz  t          |d                   t          |d                   t          |d                   t          |d                   t          |                    dd          pd          	          S )
tr   g     @@ohlr   vr2   )r   openra   rb   r`   r   )r   r    r-   )rS   rows     r   rz   z&_load_candle_cache.<locals>.<listcomp>  s(     !\  !\  !\  QT5a+A+AF+JQVWZ[^W_Q`Q`glmpqtmugvgv  }B  CF  GJ  CK  }L  }L  TY  Z]  ^a  Zb  Tc  Tc  lq  ru  ry  ry  z}  B  rC  rC  rJ  GJ  lK  lK  "L  "L  "L  !\  !\  !\r   )r   existsjsonloads	read_text)r  r?  r  r  rZ   r   pathraws           r   _load_candle_cacher    s    ')G \ \djjllJJXJJ
JJJJ{{}} 	j99:: !\  !\  X[  !\  !\  !\

Nr   argvlist[str] | Nonec           	       	
 t          j                    
t          j        
          }t	          j        d          }|                    ddt          
j        d d                              |                    dd	           |                    d
t          d           |                    dt          d           |                    dd	           |                    ddd           |                    dt          dd           |                    ddd           |
                    |           	t          |j        dz  	j        	j        	j                  }	j        dk    r 	fd|                                D             }
fd|                                D             }	j        rt'                      n"	j        rt+                      nt-                      }t/          |||          }t1          |	j        	j        r|nd           }|j                            d d !           |j        	j        z  }|                    |d"#           t=          |           t=          d$|            d%S )&NzCRun side-effect-free strategy archetype lab against cached candles.)descriptionz--coins*rn  )nargsr(   z
--interval5m)r(   z--hours-backi  )typer(   z--min-samplesr   z--report-namezstrategy_lab_report.txtz--grid
store_truezJRun the broader archetype parameter grid instead of the small default set.)actionhelpz--strider:   z5Use every Nth candle for faster coarse research runs.)r  r(   r  z
--samplerszIRun/label paper-only research samplers instead of the full archetype set.candle_cachec                8    i | ]\  }}||d d j                  S r,   )stride)rS   r   r   argss      r   r
  zmain.<locals>.<dictcomp>  s,    PPP*$4nnn-PPPr   c           	     p    i | ]2\  }}|t          t          d  |D                       j                  3S )c              3  $   K   | ]}|j         V  d S r,   r   r   s     r   rV   z"main.<locals>.<dictcomp>.<genexpr>  s$      44!QX444444r   )rM   rX   r  )rS   r   r   cfgs      r   r
  zmain.<locals>.<dictcomp>  sD    llljdTXtS44t44444c6HIIlllr   r)  r/  T)parentsexist_okr  r  zReport: r   )r	   	from_filer
   from_configargparseArgumentParseradd_argumentr	  allowed_coinsr$   
parse_argsr  runtime_dirr?  r  r  r  r   samplersrl  gridr  rc  r.  r@  r0  reports_dirmkdirreport_name
write_textprint)r  pathsparserrZ   r   r$  r-  reportreport_pathr  r  s            @@r   mainr    s   



C$S))E$1vwwwF
	d3;LSbS;Q6R6RSSS
d333
S$???
c2>>>
1JKKK
  =I  J  J  J

a>uvvv
\  AL  M  M  MT""D !2^!CTZQUQ^`d`oppG{QPPPPPPPllll\c\i\i\k\klllG:>-  W4666osox  NWMiMkMkMk  U  W  WJz7GDDDG'T=Mptp}  cHblbl  DH  I  I  IF	D4888#d&66K6G444	&MMM	
"[
"
"###1r   __main__)r&   r   r'   r   r(   r)   r*   r)   )r/   r    r0   r    r*   r    )r5   )r6   r7   r8   r$   r*   r    )rK   r7   r8   r$   r*   r    )rK   r7   r*   r    )rZ   r[   r\   r$   r8   r$   r*   r]   )rZ   r[   r\   r$   ri   r$   r*   r]   )
r&   r   r   r   rl   rm   r\   r$   r*   rn   )r&   r   rZ   r[   r\   r$   r*   rn   )
r&   r   r   r   rZ   r[   r\   r$   r*   r   )r   r7   r*   r    )
r&   r   r   r   rf   r   r   r   r*   r   )r&   r   rl   rm   r   r  r*   r   )r$  r%  rl   rm   r   r  r*   r&  )r-  r2  r0  r$   r1  r3  r*   r   )r*   rA  )
r  r   r?  r  r  r   r  r$   r*   r  r,   )r  r  r*   r$   ).
__future__r   r  r  dataclassesr   pathlibr   
statisticsr   typingr   r   configr	   r
   historical_replayr   r   r   r   r   r.   r4   rJ   rO   rY   rh   rk   r   r   r   r   r   r   r   r#  r.  r@  rc  rl  r  r  r  r   
SystemExitr   r   r   <module>r     sJ   " " " " " "   ! ! ! ! ! !             $ $ $ $ $ $ $ $ * * * * * * * * ? ? ? ? ? ? ? ? ? ? $4 4 4 4 4 4 4 4 $       1 1 1 15 5 5 5( ( ( ( (*   L L L L- - - -6 6 6 6   2Y Y Y Yx   (   $ $ $ $	W 	W 	W 	W    8 8 8 8vx x x x
 WY  NR      $   1 1 1 1h" " " "J       : z
*TTVV

 r   