
    Ki                         d Z ddlZddlmZmZmZmZ ddlmZm	Z	m
Z
mZmZ ddlmZmZmZmZmZmZmZmZ  G d d      Zy)ug   
PolyEdge — Signal Generation

Combines fair value model with filters to produce actionable signals.
    N)ListOptionalDictAny)realized_volmomentum_driftcalc_fair_value	calc_edgemean_reversion_adjustment)VOL_LOOKBACK_BARSVOL_EWMA_SPANMOMENTUM_LOOKBACKMOMENTUM_WEIGHTMIN_EDGESTRONG_EDGEMAX_MARKET_PRICEMIN_MARKET_PRICEc                       e Zd ZdZd ZdefdZdefdZdefdZ	 dded	ed
edede	e
eef      f
dZde
eef   fdZy)SignalEngineaW  
    Generates trading signals based on fair value mispricing.
    
    Flow:
    1. Calculate realized vol from recent returns
    2. Estimate momentum drift
    3. Price the binary option (fair value)
    4. Compare to simulated market price
    5. Apply filters (min edge, price bounds, regime)
    6. Output signal with edge magnitude
    c                 <    g | _         g | _        d| _        g | _        y )Nr   )pricesreturnssignals_generatedvol_historyselfs    4/var/www/html/crpytotradingbot/polymarket/signals.py__init__zSignalEngine.__init__    s     #%$&!"(*    close_pricec                    t        | j                        dkD  r@t        j                  || j                  d   z        }| j                  j                  |       | j                  j                  |       t        t        t              dz   }t        | j                        |kD  r| j                  | d | _        t        | j                        |kD  r| j                  | d | _        yy)z!Feed a new M5 candle close price.r   2   N)	lenr   mathlogr   appendmaxr   r   )r   r    log_retmax_historys       r   updatezSignalEngine.update&   s    t{{ahh{T[[_<=GLL(;' +->?"Dt{{k)++{lm4DKt||{*<<6DL +r   returnc                     t        | j                        t        k  ry| j                  t         d }t        |t              }| j
                  j                  |       |S )z"Get current realized vol estimate.g      ?N)r$   r   r   r   r   r   r'   )r   recent_returnsvols      r   get_volzSignalEngine.get_vol4   sQ    t||00'8&8&9:>=9$
r   c                 6    t        | j                  t              S )z$Get current momentum drift estimate.)r   r   r   r   s    r   	get_driftzSignalEngine.get_drift=   s    dkk+<==r   current_pricestrikemarket_yes_pricetime_remaining_minc                    t        | j                        t        k  ry| j                         }| j	                         }t        |||||t              }t        ||      \  }}	t        |      }
|dk(  r|dkD  r|	|
z  }	n|dk(  r
|dk  r|	|
z  }	|	t        k  ry|dk(  r
|t        kD  ry|dk(  r
|t        k  ry|	t        k\  rdnd}| xj                  d	z  c_        ||	||||||||d

S )a  
        Generate a trading signal if mispricing is detected.
        
        Args:
            current_price: Current BTC spot price
            strike: Binary option strike price
            market_yes_price: Current YES price on Polymarket (0-1)
            time_remaining_min: Minutes until market resolves
        
        Returns:
            Signal dict or None if no trade
        N)r3   r4   r/   time_to_expiry_mindriftmomentum_weightbuy_nog333333?buy_yesg333333?strongnormal   )
	directionedgestrength
fair_valuemarket_pricer/   r9   current_btcr4   time_remaining)r$   r   r   r0   r2   r	   r   r
   r   r   r   r   r   r   )r   r3   r4   r5   r6   r/   r9   fvr@   rA   mr_bonusrB   s               r   generate_signalzSignalEngine.generate_signalA   s#   ( t||00 lln  '1+
 $B(89	4 --=> %5%<HD)#(84(?HD (?	!&69I&I %58H%H  ${28!# # ,(0
 	
r   c                     t        | j                        | j                  r| j                  d   nd| j                  r| j                  d   nd| j                  dS )z'Get current engine state for debugging.r"   r   )bars_loadedr3   r/   r   )r$   r   r   r   r   s    r   	get_statezSignalEngine.get_state   sN     t{{+04T[[_+/+;+;4##B'!%!7!7	
 	
r   N)g      @)__name__
__module____qualname____doc__r   floatr+   r0   r2   r   r   strr   rI   rL    r   r   r   r      s    
+7% 7 >5 > %(I
I
 I
  	I

 "I
 
$sCx.	!I
V
4S> 
r   r   )rP   r%   typingr   r   r   r   rC   r   r   r	   r
   r   configr   r   r   r   r   r   r   r   r   rS   r   r   <module>rV      s:     , ,   @
 @
r   