o
    "j/                     @   st   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZ eG dd dZG dd	 d	Zd
S )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                   @   sZ   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< dZeed	< d
Z	eed< dS )Signalu   Señal de momentum detectada.sidetoken_idpricesizesize_usdmove_pctr   confirm_count reasonN)
__name__
__module____qualname____doc__str__annotations__floatr   intr    r"   r"   0/var/www/html/MetaHedge/POLYBOT1/v12/strategy.pyr      s   
 r   c                   @   sx   e Zd ZdefddZdd ZedefddZede	fd	d
Z
dededede	de	dedededee fddZdS )MomentumStrategycfgc                 C   s   || _ d| _d| _d S )Nr   r   )r%   _confirm_count_confirm_side)selfr%   r"   r"   r#   __init__'   s   
zMomentumStrategy.__init__c                 C   s   d| _ d| _dS )z<Reset confirmation state (llamar al inicio de cada ventana).r   r   N)r&   r'   r(   r"   r"   r#   reset-   s   
zMomentumStrategy.resetreturnc                 C      | j S )u3   Ticks de confirmación acumulados (para dashboard).)r&   r*   r"   r"   r#   r   2      zMomentumStrategy.confirm_countc                 C   r-   )u4   Dirección actual de confirmación (para dashboard).)r'   r*   r"   r"   r#   confirm_side7   r.   zMomentumStrategy.confirm_sider   striket_left	token_yestoken_nobest_ask_yesbest_ask_noalready_enteredc	                 C   s  |rdS |dks|dkrdS || j jkrdS || j jk rdS || | }	t|	}
|
| j jk r6d| _d| _dS |	dkr<dnd}|| jkrJd| _|| _n|  jd7  _| j| j jk rZdS |dkred}|}|}nd}|}|}|dkrwd| _d| _dS t|}|| j j	krd| _d| _dS |t
k rd| _d| _dS || j jk rd| _d| _dS tt| j j| dt}t|| d}t|||||t|	d d	| jd
|	dd| j jdd| j ddS )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&   r'   confirm_ticksr   max_entry_pricer	   min_ask_confirmmaxroundentry_size_usdr   r   )r(   r   r0   r1   r2   r3   r4   r5   r6   moveabs_movecandidate_sider   r   entry_pricen_sharescost_usdr"   r"   r#   check_signal<   sz   


zMomentumStrategy.check_signalN)r   r   r   r   r)   r+   propertyr!   r   r   r/   r    boolr   r   rL   r"   r"   r"   r#   r$   &   s(    r$   N)r   dataclassesr   typingr   configr   r   r   r   r	   r
   r   r   r   r   r   r   r$   r"   r"   r"   r#   <module>   s    4
