
    "j/                         S r SSKJr  SSKJr  SSKJrJrJrJ	r	J
r
JrJrJrJrJrJr  \ " S S5      5       r " S S	5      rg
)u  
V12 — Strategy: Momentum Taker con Confirmación.

V11 entraba en el primer tick que cruzaba threshold → vulnerable a "chop"
(spike transitorio que revierte dentro de la ventana).

V12 requiere N ticks consecutivos (CONFIRM_TICKS) con |move| > threshold
en la MISMA dirección. Si el precio revierte o cae bajo threshold, el
contador se resetea a 0. Esto filtra el ruido y solo entra en movimientos
sostenidos.
    )	dataclass)Optional   )ConfigMOMENTUM_THRESHOLDCONFIRM_TICKSMAX_ENTRY_PRICEMIN_ENTRY_PRICEENTRY_SIZE_USD
MIN_SHARESTAKER_FEE_RATEPAPER_SLIPPAGE	TICK_SIZE
snap_pricec                   r    \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   \\S'   \\S'   S	r\	\S
'   Sr
\\S'   Srg)Signal   u   Señal de momentum detectada.sidetoken_idpricesizesize_usdmove_pctr   confirm_count reason N)__name__
__module____qualname____firstlineno____doc__str__annotations__floatr   intr   __static_attributes__r       "/var/www/html/Poly/v12/strategy.pyr   r      s7    '
IML
KOOM3FCr(   r   c                       \ rS rSrS\4S jrS r\S\4S j5       r	\S\
4S j5       rS\S	\S
\S\
S\
S\S\S\S\\   4S jrSrg)MomentumStrategy&   cfgc                 ,    Xl         SU l        SU l        g )Nr   r   )r-   _confirm_count_confirm_side)selfr-   s     r)   __init__MomentumStrategy.__init__'   s    r(   c                      SU l         SU l        g)z<Reset confirmation state (llamar al inicio de cada ventana).r   r   N)r/   r0   r1   s    r)   resetMomentumStrategy.reset-   s    r(   returnc                     U R                   $ )u3   Ticks de confirmación acumulados (para dashboard).)r/   r5   s    r)   r   MomentumStrategy.confirm_count2   s     """r(   c                     U R                   $ )u4   Dirección actual de confirmación (para dashboard).)r0   r5   s    r)   confirm_sideMomentumStrategy.confirm_side7   s     !!!r(   r   striket_left	token_yestoken_nobest_ask_yesbest_ask_noalready_enteredc	                 "   U(       a  gUS::  d  US::  a  gX0R                   R                  :  a  gX0R                   R                  :  a  gX-
  U-  n	[        U	5      n
XR                   R                  :  a  SU l        SU l        gU	S:  a  SOSnXR                  :w  a  SU l        Xl        OU =R
                  S-  sl        U R
                  U R                   R                  :  a  gUS:X  a  SnUnUnOSnUnUnUS::  a  SU l        SU l        g[        U5      nXR                   R                  :  a  SU l        SU l        gU[        :  a  SU l        SU l        gXR                   R                  :  a  SU l        SU l        g[        [        U R                   R                  U-  S5      [        5      n[        X-  S5      n[!        UUUUU[        U	S-  S	5      U R
                  S
U	S SU R                   R                  S SU R
                   S3S9$ )u   Evalúa si hay señal de momentum CON CONFIRMACIÓN.

Returns Signal si hay que entrar, None si no.
La señal solo se genera tras confirm_ticks ticks consecutivos
con |move| > threshold en la misma dirección.
Nr   r   YESNOr      d      z	momentum z+.4%z > threshold z.4%z (confirmed z ticks))r   r   r   r   r   r   r   r   )r-   signal_start_tleftsignal_stop_tleftabsmomentum_thresholdr/   r0   confirm_ticksr   max_entry_pricer
   min_ask_confirmmaxroundentry_size_usdr   r   )r1   r   r>   r?   r@   rA   rB   rC   rD   moveabs_movecandidate_sider   r   entry_pricen_sharescost_usds                    r)   check_signalMomentumStrategy.check_signal<   s&    Q;%1* HH///HH... &(t9 hh111"#D!#D #'( ///"#D!/1$ !7!77 U"D H&KDH%K !"#D!#D - 111"#D!#D("#D!#D
 111"#D!#D uTXX44{BAF
S/34#:q)--T{-xx2237 8""&"5"5!6g?
 	
r(   )r/   r0   r-   N)r   r   r    r!   r   r2   r6   propertyr&   r   r#   r<   r%   boolr   r   r[   r'   r   r(   r)   r+   r+   &   s     F   
 #s # # "c " "c
% c
 c
 c
 #c
/2c
#(c
7<c
 '+c
 08/?c
r(   r+   N)r"   dataclassesr   typingr   configr   r   r   r	   r
   r   r   r   r   r   r   r   r+   r   r(   r)   <module>rb      sK   
 "     	 	 	y
 y
r(   