
    ~i                        d Z ddlmZmZmZmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ  G d dee      Z G d d	e      Z G d
 de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zy)zH
Data Models with Validation
Using Pydantic for robust input validation
    )ListDictOptionalAny)	BaseModelField	validatorconstr)datetime)Enumc                        e Zd ZdZdZdZdZdZy)OptimizationModez Modes d'optimisation disponiblesquickgridgeneticfullN)__name__
__module____qualname____doc__QUICKGRIDGENETICFULL     -/home/ubuntu/crypto_trading_bot/api/models.pyr   r      s    *EDGDr   r   c                      e Zd ZU dZ eddd      Zeed<    eddd      Zeed	<    ed
ddd      Z	e
e   ed<    eddd      Zeed<    eddd      Zeed<    eddd      Zeed<    eddd      Zeed<    edd d!      Zeed"<    eddd#      Zeed$<    ed%d&d'      Zeed(<    eddd)      Zeed*<    ed+d,-      Ze
e   ed.<    ed"      d/        Zy
)0TradingConfigz(Configuration de trading avec validationg        g      4@zStop loss en %)geledescriptionSTOP_LOSS_PERCENTg      I@zTake profit en %TAKE_PROFIT_PERCENTN   i'  zTaille max de l'ordre)defaultr    r!   r"   MAX_ORDER_SIZE   2   u   Période RSI
RSI_PERIOD      $@g      D@zNiveau survente RSIRSI_OVERSOLDg      N@g     V@zNiveau surachat RSIRSI_OVERBOUGHT   u   Période EMA courte	EMA_SHORT
      u   Période EMA longueEMA_LONGu   Période Bollinger Bands	BB_PERIOD      ?g      @u   Écart-type BollingerBB_STDzSignaux requisREQUIRED_SIGNALSFu   Redémarrer le bot)r&   r"   restart_botc                 4    d|v r||d   k  rt        d      |S )u"   Vérifier que EMA_LONG > EMA_SHORTr/   u   EMA_LONG doit être > EMA_SHORT)
ValueError)clsvvaluess      r   ema_long_must_be_greaterz&TradingConfig.ema_long_must_be_greater#   s)     & Q&*=%=>??r   )r   r   r   r   r   r#   float__annotations__r$   r'   r   intr*   r,   r-   r/   r2   r3   r5   r6   r7   boolr	   r=   r   r   r   r   r      s   2$BRSuS!&#$DV!WW$)$1Tk$lNHSMlqR^DJD4D>STL%T!Td@UVNEVaB4IJIsJRC5JKHcKaB4NOIsOSS6MNFEN!Q1:JKcK"'CW"XK$Xz r   r   c                       e Zd ZU dZ eej                        Zeed<    eg ddd      Z	e
 edd	
         ed<    ed      Zeeeef      ed<    ed      d        Zy)OptimizationRequestu   Requête d'optimisation)r&   mode)BTCUSDTETHUSDTBNBUSDTr%   d   )r&   	min_items	max_itemsr.      
min_length
max_lengthsymbolsNcurrentConfigc                 x    |D ]4  }|j                  d      r|j                  d      r't        d| d       |S zValider les symbolesUSDTUSDCzSymbol z must end with USDT or USDC)endswithr9   r:   r;   symbols      r   validate_symbolsz$OptimizationRequest.validate_symbols5   sH      	PF??6*6??63J 76(2M!NOO	P r   )r   r   r   r   r   r   r   rD   r?   rO   r   r
   rP   r   r   strr   r	   rX   r   r   r   rC   rC   +   sw    !"+;+A+ABD
B9>1:GT&A"56 
 /4D.AM8DcN+Ay r   rC   c                       e Zd ZU dZdZee   ed<    eddd      Z	ee
   ed<    eddd	      Zee   ed
<    eddd      Zee   ed<   y)SettingsUpdateu#   Mise à jour des paramètres du botN
auto_trader%   r)   )r    r!   max_positionsr4   g     @position_sizeg?r+   risk_per_trade)r   r   r   r   r\   r   rA   r?   r   r]   r@   r^   r>   r_   r   r   r   r[   r[   >   sX    -!%J%#(!#;M8C=;%*4CG%DM8E?D&+DST&BNHUOBr   r[   c                   ,    e Zd ZU dZ edd      ed<   y)ForceCloseRequestu   Requête de fermeture forcéer.   rK   rL   rW   N)r   r   r   r   r
   r?   r   r   r   ra   ra   F   s    'aB//r   ra   c                   b    e Zd ZU dZ edd      Ze edd         ed<    e	d      d	        Z
y
)WatchlistRequestu#   Requête de sauvegarde de watchlistr%   r1   )rI   rJ   r.   rK   rL   rO   c                     |D ]4  }|j                  d      r|j                  d      r't        d| d       t        t        |            S rR   )rU   r9   listsetrV   s      r   rX   z!WatchlistRequest.validate_symbolsR   sQ      	PF??6*6??63J 76(2M!NOO	P CF|r   N)r   r   r   r   r   rO   r   r
   r?   r	   rX   r   r   r   rc   rc   K   sA    -9>:GT&A"56 
 y r   rc   c                   b    e Zd ZU dZeed<   dZee   ed<   dZ	ee
eef      ed<   dZee   ed<   y)APIResponseu   Réponse API standardsuccessNmessagedataerror)r   r   r   r   rA   r?   rj   r   rY   rk   r   r   rl   r   r   r   rh   rh   [   s=    M!GXc]!%)D(4S>
")E8C=r   rh   c                   b    e Zd ZU dZeed<   eed<   eed<   eed<   dZee   ed<   dZ	ee   ed<   y)	Positionu   Modèle d'une positionrW   entry_pricequantity	timestampN	stop_losstake_profit)
r   r   r   r   rY   r?   r>   rr   r   rs   r   r   r   rn   rn   c   s6     KON!%Ix%#'K%'r   rn   c                   v    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   eed<   y)Tradeu   Modèle d'un traderW   sidero   
exit_pricerp   pnlpnl_pctreason
entry_time	exit_timeN)r   r   r   r   rY   r?   r>   r   r   r   ru   ru   m   s9    K
IO	JNKONr   ru   N)r   typingr   r   r   r   pydanticr   r   r	   r
   r   enumr   rY   r   r   rC   r[   ra   rc   rh   rn   ru   r   r   r   <module>r      s   
 - , 8 8  sD I .) &CY C0	 0
y   )  (y (I r   