
    !jS                       d dl mZ d dlZd dlZd dl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  ed	           G d
 d                      Z ed	           G d d                      Z ed	           G d d                      ZdAdZdBdZdCdZdDdZdEdFd"ZdGd#ZdEdHd%ZdId'ZdJd(ZdKd.ZdLd0ZdMd2Z dNd7Z!dd8dOd:Z"dPd<Z#dQdRd?Z$e%d@k    r e& e$                      dS )S    )annotationsN)	dataclass)Path)Mapping)	BotConfigRuntimePaths)load_strategy_presetsT)frozenc                      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ed<   ded<   ded<   dS )StrategyScorecardstrstatusintscoresample_sizefloatwin_rate_pctprofit_factormax_drawdown_usdmax_consecutive_lossescoin_leakage_pctavg_risk_usdtotal_pnl_usdrealized_pnl_usdunrealized_pnl_usdtuple[str, ...]reasonsN__name__
__module____qualname____annotations__     ?/home/agent/projects/CryptoTradingBot/Crypto_Agent/dashboard.pyr   r      s         KKKJJJr$   r   c                      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ed<   ded<   ded<   ded<   ded<   dS )PaperBotStatusr   strategy_id
int | Nonepidboolrunningr   journal_eventsentriesclosed_tradesr   r   near_miss_eventstuple[dict, ...]near_missesopen_position_countopen_unrealized_pnl_usdopen_positionsr   	scorecardresearch_noter   last_log_linesNr   r#   r$   r%   r'   r'   !   s         OOOMMMLLL!!!!""""$$$$    ######r$   r'   c                  B    e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
S )DashboardSnapshotr   runtime_dirr+   live_orders_enabledztuple[PaperBotStatus, ...]
paper_botszMapping[str, str]reportskill_switch_presentNr   r#   r$   r%   r:   r:   4   sN         ****r$   r:   r*   r)   returnr+   c                ^    | dS 	 t          j        | d           n# t          $ r Y dS w xY wdS )NFr   T)oskillOSError)r*   s    r%   _pid_runningrE   =   sI    
{u
Q   uu4s    
**dict[str, str]c                R   | i S 	 t          d|  d                                          }n# t          $ r i cY S w xY wi }|                    d          D ]Q}|rd|vr	|                    dd          \  }}|                    dd          ||                    dd          <   R|S )	Nz/proc/z/environ       =   utf-8replace)errors)r   
read_bytesrD   splitdecode)r*   rawenvitemkeyvalues         r%   _read_process_envrV   G   s    
{	)C)))**5577   			C		%   ] ] 	t4''ZZa((
U5:\\'R[\5\5\CJJwyJ1122Js   %, ;;r(   r   r;   r   c               $   t          |           sdS t          |           }|                    d          |k    oW|                    d          t          |          k    o1|                    d          dk    o|                    d          dk    S )zReturn true only for the exact paper AutoTrader strategy process.

    A stale bot.pid can be reused by an unrelated process. The dashboard/scorecard
    must therefore verify the process env, not only os.kill(pid, 0).
    FCTB_STRATEGY_IDCTB_RUNTIME_DIRCTB_PAPER_TRADINGtrueCTB_DRY_RUNfalse)rE   rV   getr   )r*   r(   r;   rR   s       r%   _pid_matches_paper_strategyr_   W   s      u
C
 
 C!""k1 	.GG%&&#k*:*::	.GG'((F2	. GGM""g-	r$   pathc                    	 t          |                     d                                                    S # t          t          f$ r Y d S w xY w)NrK   encoding)r   	read_textstripFileNotFoundError
ValueErrorr`   s    r%   	_read_pidri   h   sV    4>>7>3399;;<<<z*   tts   47 AA   limitr   r   c                    	 |                      dd                                          }n# t          $ r Y dS w xY wt          || d                    S )NrK   rL   rc   rM   r#   )rd   
splitlinesrf   tuple)r`   rk   liness      r%   _tailrq   o   sd    	BBMMOO   rrvww   s   ), 
::c                    	 t          d |                     dd                                          D                       S # t          $ r Y dS w xY w)Nc              3  B   K   | ]}|                                 d V  dS )rJ   N)re   .0lines     r%   	<genexpr>z_count_lines.<locals>.<genexpr>y   s4      qqdhdndndpdpq1qqqqqqr$   rK   rL   rm   r   )sumrd   rn   rf   rh   s    r%   _count_linesry   w   sb    qq!S!S!^!^!`!`qqqqqq   qqs   ?A 
AAr1   c                   g }	 |                      dd                                          }n# t          $ r Y dS w xY w|D ]l}|                                s	 t	          j        |          }n# t          j        $ r Y >w xY wt          |t                    r|	                    |           m|
                    d            t          |d |                   S )NrK   rL   rm   r#   c           	         t          |                     dd                    t          t          |                     dd                               fS )Ndistance_pctg     8@drop_pct        )r   r^   abs)rows    r%   <lambda>z#_read_near_misses.<locals>.<lambda>   sG    uSWW^U%C%CDDs5QTQXQXYcehQiQiKjKjGkGkFkl r$   )rT   )rd   rn   rf   re   jsonloadsJSONDecodeError
isinstancedictappendsortro   )r`   rk   rowsrp   rv   r   s         r%   _read_near_missesr   ~   s    D	BBMMOO   rr  zz|| 		*T""CC# 	 	 	H	c4   	KKIIllImmmfufs   ). 
<<A..B ?B tuple[int, int, int, float]c                `   d}d}d}d}|                                  s||||fS |                     dd                                          D ]}|                                s|dz  }	 t	          j        |          }n# t          j        $ r Y Cw xY wt          |                    d          p|                    d          pd	          	                                }|d
k    r|dz  }|dk    r,|dz  }|t          |                    d          pd          z  }|||t          |d          fS )Nr   r~   rK   rL   rm   rJ   event
event_type entryexitr      )existsrd   rn   re   r   r   r   r   r^   lowerr   round)r`   eventsr.   closedpnlrv   r   r   s           r%   _journal_statsr      sR   FGF
C;;== ,w++	BBMMOO = =zz|| 	!	*T""CC# 	 	 	H	CGGG$$C(=(=CDDJJLLGqLGF??aKF5!344;<<<C7FE#qMM11s   )A>>BBc                |   g }|                                  sdS |                     dd                                          D ]l}|                                s	 t	          j        |          }n# t          j        $ r Y >w xY wt          |t                    r|	                    |           mt          |          S )Nr#   rK   rL   rm   )r   rd   rn   re   r   r   r   r   r   r   ro   )r`   r   rv   r   s       r%   _read_journal_rowsr      s    D;;== r	BBMMOO  zz|| 		*T""CC# 	 	 	H	c4   	KK;;s   A//B Bjournal_rowsr4   r   r3   r7   c                	   d | D             }d | D             }d |D             }d |D             }d |D             }t          t          |          d          }	t          |	|z   d          }
t          |          }t          t          |                    }|dk    r||z  }n|dk    rd}nd	}d	}d	}d	}d}d}|D ]H}||z  }t          ||          }t	          |||z
            }|dk     r|d
z  }t          ||          }Fd}Ii }g }|D ]}t          |                    d          pd                                          }|                    |d          d
z   ||<   t          |                    d          t                    r|                    d          ni }	 t          |                    d          pd	          }n# t          t          f$ r d	}Y nw xY w|dk    r|                    |           |r4t          |                                          t          |          z  dz  nd	}|rt          |          t          |          z  nd	}t          |          }|rt          |          |z  dz  nd	}d}g }|dk    r|dz  }n9|dk    r|dz  }n-|dk    r|dz  }n!|dk    r|dz  }n|                    d           |dk    r|dz  }n-|dk    r|dz  }n!|dk    r|dz  }n|                    d           |
dk    r|dz  }n|                    d           |dk    r|r|dz  }n|d k    r|                    d!           |d"k    r|dz  }n|d#k     r|                    d$           |d%k    r|dz  }n|                    d&           |d%k    r|dz  }n|                    d'           |r|                    d(           |s|dk     rd)} n2|dk     s|
dk    rd*} n#|dk    r|dk    r|
dk    r|d+k    r	|d#k    rd,} nd-} |s|                    d.           t!          | t          dt	          d/t#          t          |                                        |t          |d%          t          t	          |d          d%          t          |d          |t          |d%          t          |d          |
|	t          |d          t%          |          0          S )1Nc                    g | ]S}t          |                    d           p|                    d          pd                                          dk    Q|TS )r   r   r   r   r   r^   r   ru   r   s     r%   
<listcomp>z#_score_strategy.<locals>.<listcomp>   sZ    vvvsc#'''2B2B2acgglF[F[2a_a.b.b.h.h.j.jnu.u.us.u.u.ur$   c                    g | ]S}t          |                    d           p|                    d          pd                                          dk    Q|TS )r   r   r   r   r   r   s     r%   r   z#_score_strategy.<locals>.<listcomp>   sZ    sssSC0@0@0_CGGLDYDY0_]_,`,`,f,f,h,hlr,r,rS,r,r,rr$   c                V    g | ]&}t          |                    d           pd          'S )r   r~   )r   r^   r   s     r%   r   z#_score_strategy.<locals>.<listcomp>   s2    GGG#E#'',--455GGGr$   c                    g | ]
}|d k    |S r   r#   ru   r   s     r%   r   z#_score_strategy.<locals>.<listcomp>   s    +++C377C777r$   c                    g | ]
}|d k     |S r   r#   r   s     r%   r   z#_score_strategy.<locals>.<listcomp>   s    ---cS1WWcWWWr$   r   r   g     X@r~   rJ   coinUNKNOWNextrarisk_usdg      Y@2         
      rj   zsample < 5 closed tradesg       @   g      ?   g?zprofit factor below 1.1   ztotal PnL not positiveg      I@g     Q@zcoin leakage above 70%g       g      zdrawdown above 5 USDC   zmore than 2 consecutive lossesztoo many open positionszresearch sampler / not championResearchBlockedg      N@zLive-preview-ready	Candidatez$metrics acceptable for current staged   )r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rx   r   maxminr   r^   upperr   r   r   	TypeErrorrg   r   valueslenr   r   ro   )!r   r4   r3   r7   r.   exitspnlswinslossesrealized	total_pnlgross_profit
gross_lossr   equitypeakmax_ddr   current_lossesr   coin_countsrisk_valuesr   r   r   riskcoin_leakageavg_riskr   win_rater   r   r   s!                                    r%   _score_strategyr      s    wvlvvvGssLsssEGGGGGD++4+++D--T---FSYY""Hh!88!<<It99LS[[!!JA~~$z1			FDFN  #4  VVd]++77aN%()?%P%P""NN"$K!K 	% 	%3776??/i006688'OOD!44q8D$.swww/?/?$F$FN   B	:..5#66DD:& 	 	 	DDD	!88t$$$IPYC**,,--G<uDDVYL6AJs;#k"2"222sHe**K4?HD		K'%//SHEGb									
1222	#			#		
01111}}/000t			/000~~	$.///""
7888a
0111 :8999 a				Q			}33	A,Z^J^J^cimqcqcq% ?=>>>!Sc%,,//00118Q''Ct44a88vq))5|Q//8Q''! !8!<<g   s   $GGGreports_dirc                    i }t          |                     d                    D ])}|                    dd          d d         ||j        <   *|S )Nz*.txtrK   rL   rm   i.  )sortedglobrd   stem)r   r>   r`   s      r%   _read_reportsr   A  s^    G{''0011 Y Y!^^WY^OOPWQWPWX	Nr$   dict[str, float]c                     	 t          j        dddid          } |                                  |                                 }d |                                D             S # t
          $ r i cY S w xY w)Nz https://api.hyperliquid.xyz/infotypeallMidsrj   )r   timeoutc                r    i | ]4\  }}t          |                                          t          |          5S r#   )r   r   r   )ru   r   prices      r%   
<dictcomp>z&_fetch_live_prices.<locals>.<dictcomp>M  s4    PPPKD%D		!!5<<PPPr$   )requestspostraise_for_statusr   items	Exception)responsedatas     r%   _fetch_live_pricesr   H  s    =!C6S\J]ghiii!!###}}PP4::<<PPPP   			s   AA! !A0/A0paper_state_pathlive_pricesMapping[str, float]tuple[tuple[dict, ...], float]c                   	 t          j        |                     d                    }n# t          t           j        f$ r Y dS w xY wt          |t                    r|                    di           ni }t          |t                    r|                    di           ni }g }d}t          |	                                          D ]\  }}	 t          |                    dd                    }	t          |                    dd                    }
n# t          t          t          f$ r Y gw xY w|	d	k    s|
d	k    rxt          |                                          }t          |                    d
          p| d          }t          |                    dd                    }t          |                    ||
                    }|dk    rdnd}||
z
  |	z  |z  }||	z  }t          |                    ||                    dd                    pd          }|r||z  nd}||t!          |	d          t!          |
d          t!          |d          t!          |d          t!          |d          t!          |d          t!          |d          d	}|                    |           ||z  }t%          |          t!          |d          fS )NrK   rb   )r#   r~   	positionsleverager~   	contracts
entryPricer   symbolz
/USDC:USDCsidelongg      ?g      r   )	r   r   r   entry_pricecurrent_pricer   notional_usd
margin_usdr   )r   r   rd   rf   r   r   r   r^   r   r   r   r   rg   AttributeErrorr   r   r   r   ro   )r   r   stater   leverage_mapr   total_unrealizedr   posr   r   r   r   r   	direction
unrealizednotionalr   marginr   s                       r%   _read_open_positionsr  R  s   
+55w5GGHHt34   ww.8.E.EM		+r***2I0:5$0G0GO599Z,,,RLDIOO--.. ' '	c	cggk37788Ic : :;;KK:~6 	 	 	H	>>[A--4yy  SWWX&&=T*=*=*=>>37766**++koodK@@AA6>>CCt	#k1Y>J
 9,))&#''*c2J2JKKRsSS(09H$$cy!,, a00"=!44"'
A"6"6!(A..**h**

 

 	CJ&;;.2222s"   (+ AAADD/.D/)r;   str | Path | Nonec                   t          j                    }t          j        |          }| 3t	          |                                                                           n|j        }|dz  }t                      }t                      }g }|
                                r"t          |                    d                    ng D ]>}|                                st          |dz            }	|dz  dz  }
t          |
          \  }}}}t!          |
          }|dz  dz  }t#          |dz  |          \  }}|                    |j                  }|rd|j        v rd	nd
}t+          ||t-          |          |          }|                    t1          |j        |	t3          |	|j        |          ||||t5          |          t7          |          t-          |          ||||t9          |dz                                 @t;          |dt=          |          t?          |dz            |dz  
                                          S )Nexperiments*zbot.pidTradeanalyseztrade_journal.jsonlznear_miss.jsonlzpaper_state.jsonzresearch-sampleru-   Research sampler — not a champion candidater   )r   r4   r3   r7   )r(   r;   zbot.log)r(   r*   r,   r-   r.   r/   r   r0   r2   r3   r4   r5   r6   r7   r8   Fr>   KILL_SWITCH)r;   r<   r=   r>   r?   ) r   	from_filer   from_configr   
expanduserresolver;   r	   r   r   r   r   is_dirri   r   r   r  r^   nametagsr   r   r   r'   r_   ry   r   rq   r:   ro   r   )r;   cfgpathsrootr  presetsr   botsexp_dirr*   journal_pathr   r.   r   r   r   near_miss_pathr5   open_unrealizedpresetr7   r6   s                         r%   build_dashboard_snapshotr  |  ss   



C$S))E7B7N4''))11333TYTeD&K#%%G$&&K!#D4?4F4F4H4HP6+**3//000b ! !~~ 	)+,,/2GG'5l'C'C$),77 >14EE*>wI[?[]h*i*i'W\**KQVhlrlwVwVwGG}#%$3 #N 3 3'	
 
 
	 	N/[bccc!  ).99).99 #N 3 3$3)' 9!455
 
 
 	 	 	 	" !;;dY.//!M199;;   r$   snapshotc           #     Z   g }g }g }g }| j         D ]}d                    d |j        D                       }t          j        |j                  }|j        r |dt          j        |j                   dz  }|                    d| d|j        rdnd d|j	        pd	 d|j
         d|j         d|j         d|j        d
d|j         d|j        d
d|j        j         d|j        j         d| d           |                    d| dt          j        |j        j                   d|j        j         d|j        j         d|j        j        dd|j        j        dd|j        j        d
d|j        j        d
d|j        j        d
d|j        j        d
d|j        j         d|j        j        dd|j        j        ddt          j        d                    |j        j                             d           |j        rg }|j        D ]}	|                    dt          j        t=          |	                    dd	                               dt          j        t=          |	                    dd	                               dtA          |	                    dd                    ddtA          |	                    dd                    ddtA          |	                    dd                    ddtA          |	                    dd                    ddtA          |	                    dd                    ddtA          |	                    dd                    ddtA          |	                    dd                    d
d           |                    dt          j        |j                   dd                     |          z   d!z              |j!        rFg }
|j!        D ]}|
                    dt          j        t=          |                    dd	                               dtA          |                    d"d                    d#dtA          |                    d$d                    ddtA          |                    d%d                    ddt          j        t=          |                    d&d	                               d           |                    dt          j        |j                   d'd                     |
          z   d!z              g }| j"        #                                D ]E\  }}|                    d(t          j        |           d)t          j        |           d*           Fd+$                    d,t          j        t=          | j%                                      $                    d-| j&        rdnd          $                    d.d                     |                    $                    d/d                     |                    $                    d0|rd                     |          nd1          $                    d2|rd                     |          nd3          $                    d4d                     |                    S )5Nz<br>c              3  >   K   | ]}t          j        |          V  d S N)htmlescapert   s     r%   rw   z(render_dashboard_html.<locals>.<genexpr>  s,      KK$+d++KKKKKKr$   z<br><span class='warn'>z</span>z<tr><td>z	</td><td>yesnor   z+.4fz</td><td class='log'>z
</td></tr>z.1fz
%</td><td>z.2fz.4fz; r   r   r   r~   z.8fr   r   r   r   r   z
x</td><td>r   z<h3>z</h3><table><thead><tr><th>Coin</th><th>Side</th><th>Contracts</th><th>Entry</th><th>Current</th><th>Notional</th><th>Margin</th><th>Lev</th><th>Unrealized</th></tr></thead><tbody>
z</tbody></table>r}   z+.2frequired_drop_pctr|   reasonz}</h3><table><thead><tr><th>Coin</th><th>Drop</th><th>Required</th><th>Distance</th><th>Reject reason</th></tr></thead><tbody>z<h2>z
</h2><pre>z</pre>a6  <!doctype html>
<html><head><meta charset="utf-8"><title>CryptoTradingBot Dashboard</title>
<style>
body{font-family:system-ui,Arial,sans-serif;background:#0f1115;color:#e8e8e8;margin:24px} table{border-collapse:collapse;width:100%} th,td{border:1px solid #333;padding:8px;vertical-align:top} th{background:#1e2430} pre{background:#171b22;padding:12px;overflow:auto}.ok{color:#8bd17c}.warn{color:#ffcc66}.log{font-size:12px;color:#b9c0cc}
</style></head><body>
<h1>CryptoTradingBot Dashboard</h1>
<p><strong>Read-only</strong>: no execution controls, no order buttons, no config mutation.</p>
<p>Runtime: __RUNTIME__</p>
<p>Live orders enabled: <span class="ok">no</span> | Kill switch present: __KILL__</p>
<h2>Paper Bots</h2>
<table><thead><tr><th>Strategy</th><th>Running</th><th>PID</th><th>Journal events</th><th>Closed trades</th><th>Open pos</th><th>Open PnL</th><th>Near misses</th><th>PnL USDC</th><th>Status</th><th>Score</th><th>Last log</th></tr></thead><tbody>
__ROWS__
</tbody></table>
<h2>Live-readiness Strategy Scorecard</h2>
<p>Read-only scoring. <strong>Research</strong> means data collection only; <strong>Live-preview-ready</strong> means preview discussion may start, not live autopilot.</p>
<table><thead><tr><th>Strategy</th><th>Status</th><th>Score</th><th>Closed</th><th>Winrate</th><th>PF</th><th>Total PnL</th><th>Realized</th><th>Unrealized</th><th>Max DD</th><th>Max losses</th><th>Coin leakage</th><th>Avg risk</th><th>Reasons</th></tr></thead><tbody>
__SCORECARD_ROWS__
</tbody></table>
<h2>Open Positions</h2>
<p>Read-only paper/live position view with current Hyperliquid mids when available.</p>
__OPEN_POSITIONS__
<h2>Near Miss Telemetry</h2>
<p>Closest rejected entry signals by strategy. Distance shows how many percentage points were still missing to trigger.</p>
__NEAR_MISSES__
__REPORTS__
</body></html>__RUNTIME____KILL____ROWS____SCORECARD_ROWS____OPEN_POSITIONS__z<p>No open positions.</p>__NEAR_MISSES__z#<p>No near misses recorded yet.</p>__REPORTS__)'r=   joinr8   r  r  r(   r7   r   r,   r*   r-   r/   r3   r4   r0   r   r6   r   r   r   r   r   r   r   r   r   r   r   r   r5   r   r^   r   r2   r>   r   rL   r;   r?   )r  r   scorecard_rowsopen_position_blocksnear_miss_blocksbotlogstrategy_cellposition_rowsr   detail_rowsr   report_blocksr  contents                  r%   render_dashboard_htmlr7    s	   DN" N NkkKK8JKKKKKCO44 	_^t{3CT7U7U^^^^M  K155T  7=b  %	 
 $  *  .:  '  '3  ='  =&   #  	
 	
 	
  	  ;s}344  =&  =,	 
 =-9  =.9  =.:  =1=  =3?  =1=  =7  =1=  =-8  ;tyy)>??@@  	
 	
 	
$  	M)  $$
;s37762+>+>'?'?@@
 
;s37762+>+>'?'?@@
 
 !c!:!:;;F
 
 !!<!<==H	
 

 !#!>!>??J
 
 !!=!=>>I
 
 !s!;!;<<G
 
 !S!9!9::F
 
 !)=s!C!CDDP
 
 
    !''Bt{3?33 B B B))M**+ %%   ? 	K 	 	"";s37762+>+>'?'?@@  S!9!9::G  !)<c!B!BCCO  !!=!=>>J	 
  ;s3778R+@+@'A'ABB      ##Kt{3?33 K K K))K(() %%   M!)//11 _ _g]DK$5$5]]WAUAU]]]^^^^2 '-S9M5N5N)O)OPPQXQXYcnv  oK  fUejej  QU  RV  RV  W^  W^  _i  ko  kt  kt  uy  kz  kz  W{  W{  |C  |C  DX  Z^  Zc  Zc  dr  Zs  Zs  |t  |t  u|  u|  }Q  vJ  Sk  SW  S\  S\  ]q  Sr  Sr  Sr  Pk  ul  ul  mt  mt  uF  gw  Hb  HL  HQ  HQ  Rb  Hc  Hc  Hc  }b  mc  mc  dk  dk  ly  {  {D  {D  ER  {S  {S  dT  dT3Tr$   argvlist[str] | Nonec                   t          j        d          }|                    dd            |                    |           }t	                      }|j        r8t          |j                                                                                  n|j	        dz  dz  }|j
                            dd           |                    t          |          d	
           t          |           dS )Nz1Render read-only CryptoTradingBot dashboard HTML.)descriptionz--output)defaultr>   zdashboard.htmlT)parentsexist_okrK   rb   r   )argparseArgumentParseradd_argument
parse_argsr  outputr   r
  r  r;   parentmkdir
write_textr7  print)r8  parserargsr  rC  s        r%   mainrJ  "  s    $1deeeF

D111T""D'))H9=}T$+))++33555(J^ajJjm}J}F
Mt444
+H55HHH	&MMM1r$   __main__)r*   r)   r@   r+   )r*   r)   r@   rF   )r*   r)   r(   r   r;   r   r@   r+   )r`   r   r@   r)   )rj   )r`   r   rk   r   r@   r   )r`   r   r@   r   )r`   r   rk   r   r@   r1   )r`   r   r@   r   )r`   r   r@   r1   )
r   r1   r4   r   r3   r   r7   r   r@   r   )r   r   r@   rF   )r@   r   )r   r   r   r   r@   r   )r;   r  r@   r:   )r  r:   r@   r   r  )r8  r9  r@   r   )'
__future__r   r?  r  r   rB   r   dataclassesr   pathlibr   typingr   configr   r   strategy_registryr	   r   r'   r:   rE   rV   r_   ri   rq   ry   r   r   r   r   r   r   r  r  r7  rJ  r   
SystemExitr#   r$   r%   <module>rS     s   " " " " " "    				  ! ! ! ! ! !             * * * * * * * * 3 3 3 3 3 3 $         $$ $ $ $ $ $ $ $$ $                 "   ! ! ! ! !       &2 2 2 26    B B B BJ      '3 '3 '3 '3T BF 0 0 0 0 0 0fpT pT pT pTf	 	 	 	 	 z
*TTVV

 r$   