
    .i                         d dl Zd dlZd dlZd dlmZ d dlmZm	Z	  ej
        e          ZddddgdZ G d	 d
e          ZdS )    N)Dict)BaseStrategyStrategyResult	      15m1h)fast_periodslow_period
timeframesc                        e Zd ZdZddef fdZdej        dee	e	e	e	f         fdZ
de	d	e	d
e	de	deee	f         f
dZdeeej        f         defdZ xZS )EMACrossoverStrategya	  
    EMA Crossover strategy with multi-timeframe confirmation.

    - BUY  (Golden Cross): fast EMA crosses above slow EMA.
    - SELL (Death Cross):  fast EMA crosses below slow EMA.
    - Confidence scales with the percentage divergence between the two EMAs.
    Nparamsc                 h    i t           |pi }t                                          d|           d S )NEMA_Crossover)namer   )DEFAULT_PARAMSsuper__init__)selfr   merged	__class__s      @/var/www/html/crypto-bot/backend/app/strategies/ema_crossover.pyr   zEMACrossoverStrategy.__init__   s9    5N5v|5of=====    dfreturnc                    | j         d         }| j         d         }t          j                            |d         |                                          }t          j                            |d         |                                          }||dS |                                }|                                }t          |          dk     st          |          dk     rdS t          |j        d                   t          |j        d	                   t          |j        d                   t          |j        d	                   fS )
zQ
        Return (fast_prev, fast_curr, slow_prev, slow_curr) EMA values.
        r
   r   close)windowN)        r    r    r       )	r   ta_libtrendEMAIndicatorema_indicatordropnalenfloatiloc)r   r   fastslowfast_emaslow_ema	fast_vals	slow_valss           r   _compute_emasz"EMACrossoverStrategy._compute_emas   s    {=){=)<,,R[,FFTTVV<,,R[,FFTTVVx/%%OO%%	OO%%	y>>AY!!3!3%% ).$%%).$%%).$%%).$%%	
 	
r   	fast_prev	fast_curr	slow_prev	slow_currc                    |dk    s|dk    rdS ||k    r5||k    r/t          ||z
            |z  dz  }t          d|dz            }d|fS ||k    r5||k     r/t          ||z
            |z  dz  }t          d|dz            }d|fS ||k    r"||z
  |z  dz  }t          d|d	z            }d|fS ||k     r"||z
  |z  dz  }t          d|d	z            }d|fS dS )
zBDetect crossover direction and compute confidence from divergence.r   )HOLDr    d         Y@   BUYSELLg      N@
   )absmin)r   r3   r4   r5   r6   
divergence
confidences          r   _crossover_signalz&EMACrossoverStrategy._crossover_signal6   s=    >>Y!^^; 	!!i)&;&;Y233i?#EJUJO44J*$$ 	!!i)&;&;Y233i?#EJUJO44J:%% y  #i/9<sBJT:?33J*$$""#i/9<sBJT:?33J:%%{r   datac           	         | j         d         }|d         }t          |          dk    r|d         nd }||vr/t                              d| d           t	          dd          S |                     ||                   \  }}}}|                     ||||          \  }	}
d}i }|ra||v r]|                     ||                   \  }}}}|                     ||||          \  }}t          |d	          t          |d	          |d
}|r||	dfvrd}d}n|	}||	k    rdnd}t          d|
|z             }t	          ||t          |d	          t          |d	          |d|          S )Nr   r      z EMACrossover: primary timeframe z not in datar8   r    )signalrB      )confirm_fast_emaconfirm_slow_emaconfirm_timeframeg      .@r:   )primary_fast_emaprimary_slow_emaprimary_timeframe)rG   rB   metadata)	r   r)   loggerwarningr   r2   rC   roundr@   )r   rD   r   
primary_tf
confirm_tffpfcspscprimary_signalprimary_confconfirm_signalconfirm_metacfpcfccspcsc_final_signalfinal_confidenceboosts                        r   analyzezEMACrossoverStrategy.analyzeU   s   [.
]
&)*oo&9&9Z]]t
T!!NNVjVVVWWW!C@@@@++D,<==BB'+'='=b"b"'M'M$ 	*,,!%!3!3D4D!E!ECc3 $ 6 6sCc J JNA$)#qMM$)#qMM%/ L  	@.0HHH!L")L*n<<DD#E"5,*>??'$)"aLL$)"aLL%/  		
 	
 	
 		
r   )N)__name__
__module____qualname____doc__dictr   pd	DataFrametupler*   r2   strrC   r   r   re   __classcell__)r   s   @r   r   r      s         > >t > > > > > >
 
ueUE7Q1R 
 
 
 
2+0=BOT	sEz	   >)
Dbl!23 )
 )
 )
 )
 )
 )
 )
 )
 )
r   r   )pandasrk   tar$   loggingtypingr   app.strategies.base_strategyr   r   	getLoggerrf   rP   r   r    r   r   <module>rw      s                   E E E E E E E E		8	$	$ $- n
 n
 n
 n
 n
< n
 n
 n
 n
 n
r   