
    pjL                    t   d Z 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
  ee      j                         j                  d   Zedz  d	z  d
z  dz  Z ed       G d d             Z ed       G d d             Z ed       G d d             Z ed       G d d             ZdddddZdddZy)z3Load and validate live platform JSON configuration.    )annotationsN)	dataclass)Path)Any   RenTechliveconfigzlive_platform_default.jsonT)frozenc                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   y
)BrokerConfigstradapterhostintport	client_idfloatconnect_timeout_secmarket_data_typeN__name__
__module____qualname____annotations__     8/opt/rentech/trading_bot/RenTech/live/platform_config.pyr   r      s"    L
I
INr   r   c                  h    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<   y)
RiskConfigfloat | Nonemax_daily_loss_usdmax_daily_loss_pct_navr   min_net_liq_usdmax_margin_utilizationboolhalt_on_kill_switchrecommend_onlymax_drawdown_pct_from_peakmin_excess_liquidity_usdblock_if_pending_ordersNr   r   r   r   r    r       s8    $$((!! ,,**!!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<   y)StrategySlotr   idr&   enabledmoduler   prioritycapital_budget_moder!   capital_budget_nav_pctcapital_budget_usdmax_new_entries_per_daymax_open_positionsz
str | Noneentry_before_etenabled_for_entriesdict[str, Any]r
   Nr   r   r   r   r-   r-   &   sF    GMKM(($$  r   r-   c                  f    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dZy)PlatformConfigr   pathr   namelog_dirkill_switch_path	state_dirr   brokerr    risktuple[StrategySlot, ...]
strategiesc                :    t        d | j                  D              S )Nc              3  :   K   | ]  }|j                   s|  y wN)r/   ).0ss     r   	<genexpr>z4PlatformConfig.enabled_strategies.<locals>.<genexpr>B   s     =1199Q=s   )tuplerD   )selfs    r   enabled_strategiesz!PlatformConfig.enabled_strategiesA   s    ====r   N)returnrC   )r   r   r   r   rM   r   r   r   r;   r;   6   s3    
J
IMO
((>r   r;   lohic                   t        | |         }t        j                  |      st        | d      |||k  rt        | d|       |||kD  rt        | d|       |S )Nz must be finitez must be >= z must be <= )r   mathisfinite
ValueError)dkeyrP   rQ   vs        r   
_req_floatrY   E   st    afA==C5011	~!b&C5RD122	~!b&C5RD122Hr   c                   | 't        |       j                         j                         nt        }|j	                         st        d|       t        j                  |j                  d            }t        |t              st        d      |j                  di       }t        |t              st        d      t        |j                  dd            }t        t        |j                  d	d
            z  j                         }t        t        |j                  dd            z  j                         }t        t        |j                  dd            z  j                         }|j                  di       }t        |t              st        d      t        t        |j                  dd            j!                         t        |j                  dd            t#        |j                  dd            t#        |j                  dd            t%        |j                  dd            t#        |j                  dd                  }	|	j&                  dk7  rt        d|	j&                        |j                  di       }
t        |
t              st        d       |
j                  d!      }|
j                  d"      }|
j                  d#      }|
j                  d$      }t)        |t%        |      nd |t%        |      nd t+        |
d%d&'      t+        |
d(d&d)*      t-        |
j                  d+d,            t-        |
j                  d-d.            |t%        |      nd |t%        |      nd t-        |
j                  d/d,            0	      }|j                  d1g       }t        |t.              st        d2      g }t1               }t3        |      D ]  \  }}t        |t              st        d3| d4      t        |j                  d5d6            j5                         }|st        d3| d7      ||v rt        d8|       |j7                  |       |j                  d9i       }|t        |t              st        d3| d:      t        |j                  d;d<            j!                         }|j                  d=      }|j                  d>      }|j                  d?      }|j9                  t;        |t-        |j                  d@d,            t        |j                  dAd6            j5                         t#        |j                  dBdC            ||t%        |      nd |t%        |      nd t#        |j                  dDdE            t#        |j                  dFdE            |rt        |      j5                         nd t-        |j                  dGd,            t        |xs i       H               |D ]'  }|j<                  rt        dI|j>                  dJ       |jA                  dK L       tC        ||||||	|tE        |      M      S )NNzPlatform config not found: zutf-8)encodingz%Platform config must be a JSON objectplatformz'platform' must be an objectr=   live_platformr>   zRenTech/data/logs/live_platformr?   zRenTech/live/config/KILL_SWITCHr@   zRenTech/data/live_staterA   z'broker' must be an objectr   ibkrr   z	127.0.0.1r   iI  r   r   r      r      )r   r   r   r   r   r   z/Only broker adapter 'ibkr' is implemented; got rB   z'risk' must be an objectr"   r#   r)   r*   r$   r   )rP   r%   g      ?rO   r'   Tr(   Fr+   )	r"   r#   r$   r%   r'   r(   r)   r*   r+   rD   z'strategies' must be a listzstrategies[z] must be an objectr.    z] missing idzDuplicate strategy id: r
   z].config must be an objectr2   nav_pctr3   r4   r7   r/   r0   r1   d   r5      r6   r8   )r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r
   z	Strategy zG missing module (e.g. RenTech.live.strategies.vrp_ibkr:VrpIbkrStrategy)c                    | j                   S rG   )r1   )xs    r   <lambda>z&load_platform_config.<locals>.<lambda>   s
    QZZ r   )rW   )r<   r=   r>   r?   r@   rA   rB   rD   )#r   
expanduserresolveDEFAULT_PLATFORM_CONFIGis_fileFileNotFoundErrorjsonloads	read_text
isinstancedictrU   getr   _REPOr   lowerr   r   r   r    rY   r&   listset	enumeratestripaddappendr-   r0   r.   sortr;   rK   )r<   prawplatr=   r>   kill_switchr@   brrA   rkmdlmdlpmdd_peak
min_excessrB   	slots_rawslotsseenirowsidcfgmoderb   cap_usdentry_beforerI   s                               r   load_platform_configr   P   sq   -1-=T
'')CZA99;"=aS ABB
**Q[['[2
3Cc4 @AA77:r"DdD!788txx01Ds488I/PQRR[[]G3txx(:<]^__hhjKTXXk3LMNNWWYI	2	Bb$566BFF9f-.446,-%&bff[!,-!"&&)>"CDRVV$6:;F ~~J6>>J\]^^		Bb$344
&&%
&C66*+Dvv23H23J),5:d.2.>uT{D"2'8Q?)".F1QTU (=t!DEBFF#3U;<6>6J5?PT6@6Lz!2RV $RVV,Et%L M
D b)Ii&677 "EUDI& 
3#t${1#-@ABB#''$#$**,{1#\:;;$;6se<==ggh#?:c4#8{1#-GHII3770)<=CCE''23''./ww01SWWY563778R01779SWWZ56$(9@9LuW~RV5<5H5>d(+CGG4Mq,Q(R#&sww/CQ'G#H=IL 1 7 7 9t$(1F)M$NCI2	
!
@  zxxy0wxyyz 
JJ'J($<	 	r   )
rV   r9   rW   r   rP   r!   rQ   r!   rN   r   rG   )r<   zstr | Path | NonerN   r;   )__doc__
__future__r   rm   rS   dataclassesr   pathlibr   typingr   __file__ri   parentsrs   rj   r   r    r-   r;   rY   r   r   r   r   <module>r      s    9 "   !  X ((+)+f4x?B^^  $   $	" 	" 	" $   $> > > CG[_ dr   