
    iKR                     <    d Z ddlZddlmZmZmZmZ  G d d      Zy)u   
Stratégies de Trading Avancées
Inspiré de: https://github.com/conor19w/Binance-Futures-Trading-Bot
11 stratégies techniques implémentées
    N)ListDictOptionalTuplec                      e Zd ZdZedee   dedee   fd       Z	eddee   dedee   fd       Z
eddee   deeeef      fd       Ze	 ddee   d	ee   d
ee   dedeeeef      f
d       Ze	 	 ddee   dededeeeef      fd       Zedee   deeeef   fd       Zedee   dee   d	ee   deeeef   fd       Zedee   deeeef   fd       Zedee   dee   d	ee   deeeef   fd       Zeddee   deee      deeeef   fd       Zedee   dee   d	ee   d
ee   deeeef   f
d       Ze	 	 	 	 	 ddee   deee      d	eee      deee      d
eee      deee      defd       Zy)AdvancedStrategiesu;   
    Collection de 11 stratégies de trading avancées
    pricesperiodreturnc                     t        |       |k  ryt        j                  | | d       }d|dz   z  }|d   }|dd D ]  }||z  |d|z
  z  z   } |S )z*Calcule l'EMA (Exponential Moving Average)N      r   )lennparray)r	   r
   prices_array
multiplieremaprices         ./advanced_strategies.pycalculate_emaz AdvancedStrategies.calculate_ema   sx     v;xxwx 01&1*%
1o!!"% 	BE:%#Z*@AC	B 
    c                 L   t        |       |dz   k  ryt        j                  | | dz
  d       }t        j                  |dkD  |d      }t        j                  |dk  | d      }t        j                  |      }t        j                  |      }|dk(  ry||z  }ddd|z   z  z
  }|S )z(Calcule le RSI (Relative Strength Index)r   Nr   d   )r   r   diffwheremean)	r	   r
   deltasgainslossesavg_gainavg_lossrsrsis	            r   calculate_rsiz AdvancedStrategies.calculate_rsi   s     v;!#	
+,!VQ/&1*vgq1775>776?q= SAF^$
r   c                 8   t        |       ||z   k  ryt        j                  | |      }t        j                  | |      }||y||z
  }t        |       ||z   k\  rg }t        |dd      D ]\  }| dt        |       |z
  dz    }	t        j                  |	|      }
t        j                  |	|      }|
F|I|j	                  |
|z
         ^ |j	                  |       t        |      |k\  r%d|dz   z  }|d   }|dd D ]  }||z
  |z  |z   } |}n|}n|}||z
  }|||dS )z7Calcule le MACD (Moving Average Convergence Divergence)Nr   r   r   )macdsignal	histogram)r   r   r   rangeappend)r	   fastslowr)   ema_fastema_slow	macd_linemacd_historyipefessignal_multiplier
signal_valmhsignal_liner*   s                    r   calculate_macdz!AdvancedStrategies.calculate_macd2   si    v;&%33FDA%33FDAx/x'	 v;$-'L61b) 1+CKM!O,'55a>'55a>>bn ''R01 	*< F*$%!$4!)!_
&qr* TB"$z/5F!F!SJT('#K+	 !"
 	
r   highslowsclosesc                    t        |      |k  ryt        | | d       }t        || d       }|d   }||k(  ryd||z
  z  ||z
  z  }t        |      |dz   k\  rg }t        d      D ]x  }	t        |      dz
  |	z   }
t        | |
|z
  dz   |
dz          }t        ||
|z
  dz   |
dz          }||k7  r!|j	                  d||
   |z
  z  ||z
  z         h|j	                  d       z t        |      t        |      z  }n|}||dS )z"Calcule l'oscillateur StochastiqueNr'   r      r   g      I@)kd)r   maxminr+   r,   sum)r<   r=   r>   r
   high_maxlow_mincurrent_closerA   k_valuesr3   idxhlrB   s                 r   calculate_stochasticz'AdvancedStrategies.calculate_stochasticc   s3    v;ufWX'dF78n%r
w=7*+x'/AB
 v;&1*$H1X *&kAo)c&jl3q512SZ\#a%016OOC6#;?$;q1u$EFOOD)* HH-AAQr   std_devc                     t        |       |k  ry| | d }t        j                  |      }t        j                  |      }|||z  z   }|||z  z
  }| d   }||k(  rd}	n||z
  ||z
  z  }	||||	dS )zCalcule les Bandes de BollingerNr'         ?)uppermiddlelower	percent_b)r   r   r   std)
r	   r
   rN   recent_pricessmarU   rQ   rS   current_pricerT   s
             r   calculate_bollinger_bandsz,AdvancedStrategies.calculate_bollinger_bands   s     v;wx(ggm$ff]#sW}%sW}% r
E>I&.55=AI "	
 	
r   c                    t        |       dk  ryt        j                  | d      }t        j                  | d      }t        j                  | d      }t        j                  | d      }d||||fv ryd}||cxkD  r|kD  r	n n|d	z  }n||cxk  r|k  rn n|d	z  }|d
k  r|dz  }n
|dkD  r|dz  }|d	k\  rd|d|dd|ddfS |dk  rdt	        |      d|dd|ddfS y)z?
        Croisement d'or: EMA20 > EMA50 > EMA100 = BUY
        r   HOLDr   u   Pas assez de données   2      Nr\   r   zIndicateurs incompletsr   r@      r   F   BUYzGolden Cross (EMA20>.2fz, RSI=.0f)SELLzDeath Cross (EMA20<)r\   r   zPas de signal clair)r   r   r   r%   abs)r	   kwargsema20ema50ema100r$   signalss          r   golden_crosszAdvancedStrategies.golden_cross   s   
 v;5"00<"00<#11&#> ..vr:E5&#..6 5!6!qLGU#V#qLG 8qLG2XqLGa<'%9%F3s)ST#UUU]3w<+>uSkPSTWyXY)ZZZ/r   c                    t        |       dk  ryt        j                  | d      }t        j                  ||| d      }t        j	                  | ddd      }d|||fv ryd	}|d
k  r|dz  }n
|dkD  r|dz  }|d   dk  r|dz  }n|d   dkD  r|dz  }|d   d	kD  r|dz  }n|d   d	k  r|dz  }|dk\  rd|d|dd|d   ddfS |dk  rdt        |      dfS y)zI
        Combine Stochastique, RSI et MACD pour signaux robustes
        r^   r[   r_         	   Nr`   r   ra   r   rb   rA   r]   P   r*   r      rc   zStoch/RSI/MACD convergent (RSI=re   z, Stoch=rf   rh   zSignaux baissiers multiples)r\   r   zSignaux mixtes)r   r   r%   rM   r;   ri   )r	   r<   r=   rj   r$   stochr(   rn   s           r   stoch_rsi_macdz!AdvancedStrategies.stoch_rsi_macd   s0    v;5 ..vr:"77tVRP!00RCC%%6 8qLG2XqLG :?qLG3Z"_qLG q qLG+"qLGa<'%DSIXV[\_V`adUeef#ggg]3w<+FGG*r   c                    t        |       dk  ryt        j                  | d      }t        j                  | d      }t        j                  | d      }d|||fv ryd}||cxkD  r|kD  r	n n|d	z  }n||cxk  r|k  rn n|d	z  }t        |       d
k\  rUt        j                  | dd d      }t        j                  | dd d      }|r!|r||k  r||kD  r|d
z  }n||k\  r
||k  r|d
z  }|d	k\  rd|d|dd|ddfS |dk  rdt        |      dfS y)uB   
        Triple EMA rapide pour scalping: 3/6/9 périodes
           r[   r@      rs   N)r\   r   zEMAs incompletsr   ru   r   r'   rc   zTriple EMA haussier (3>z.4fz > 6>rf   rv   rh   zTriple EMA baissier)r\   r   zPas de tendance claire)r   r   r   ri   )r	   rj   ema3ema6ema9rn   	prev_ema3	prev_ema6s           r   
triple_emazAdvancedStrategies.triple_ema   sE   
 v;5!//:!//:!//:D$%%/ $qLGD4qLG v;!*88aHI*88aHIY	)dTkqLG)+tqLGa<'%<T#JeDQT:UV#WWW]3w<)>>>2r   c                 r   t        |       dk  ryt        j                  | dd      }t        j                  ||| d      }d||fv ryd}| d	   }|d
   dk  r|d   dk  r|dz  }n|d
   dkD  r|d   dkD  r|dz  }|d   |d   z
  |d   z  }|dk  r|dz  }|dk\  rd|d|d
   ddfS |dk  rdt	        |      dfS y)z?
        Combine Bandes de Bollinger avec Stochastique
           r[   r]          @r_   Nr`   r   r'   rT   g?rA   ru   g?rt   rQ   rS   rR   g?r   rc   zBB+Stoch oversold (%B=rd   rf   rv   rh   zBB+Stoch overbought)r\   r   zEn milieu de bande)r   r   rY   rM   ri   )	r	   r<   r=   rj   bbrw   rn   rX   bb_widths	            r   stoch_bbzAdvancedStrategies.stoch_bb/  s    v;599&"cJ"77tVRPB;6r
 k?S U3Z"_qLG _s"uSzBqLG wK"W+-H=d?qLGa<'%;B{OC;PPQ#RRR]3w<)>>>.r   Nvolumesc                    t        |       dk  ry| d   }t        | dd       }t        | dd       }t        | dd       }t        | dd       }d}||dz  k\  r|d	z  }||dz  k\  r |d
z  }n||dz  k  r|d	z  }||dz  k  r|d
z  }|rHt        |      dk\  r:t        j                  |dd       }	|d   }
|
|	dz  kD  r|dkD  r|d
z  }n
|dk  r|d
z  }|dk\  r
d|d|ddfS |dk  rdt        |      dfS y)uH   
        Détecte les cassures de prix avec confirmation volume
        r^   r[   r'   iNir   gV-?r@   r   gx&1?r]         ?ru   rc   zBreakout haussier (prix=z.6frf   rv   rh   zBreakdown baissier)r\   r   zPas de breakout)r   rC   rD   r   r   ri   )r	   r   rj   rX   high_20low_20high_50low_50rn   
avg_volumecurrent_volumes              r   breakoutzAdvancedStrategies.breakoutY  sW    v;5r
 fSTl#VCD\" fSTl#VCD\" GeO+qLG %/1 fun,qLG.1 s7|r)R1J$R[N
S 00Q;qLGq[qLGa<'%=mC=PPQ#RRR]3w<)===+r   opensc                 
   t        |      dk  ryd}| d   }|d   }|d   }|d   }	t        |	|z
        }
|t        ||	      z
  }t        ||	      |z
  }||z
  }|dk(  ry||
dz  kD  r||
dz  k  r|	|kD  r|dz  }n||
dz  kD  r||
dz  k  r
|	|k  r|dz  }t        |      dk\  rG| d	   }|d	   }t        ||z
        }||k  r|	|kD  r|
|d
z  kD  r|dz  }n||kD  r|	|k  r|
|d
z  kD  r|dz  }|dk\  rd|dfS |dk  rdt        |      dfS y)uJ   
        Détecte les patterns de chandelier avec grandes mèches
           )r\   r   zPas assez de bougiesr   r'   )r\   r   zBougie dojir   rP   ru   r   r@   rc   z#Pattern haussier (Hammer/Engulfing)rv   rh   z Pattern baissier (Shooting Star))r\   r   zPas de pattern clair)r   ri   rC   rD   )r   r<   r=   r>   rj   rn   	last_open	last_highlast_low
last_closebody
upper_wick
lower_wicktotal_range	prev_open
prev_close	prev_bodys                    r   candle_wickzAdvancedStrategies.candle_wick  s    v;?4 "I	"I	8BZ
:	)*Y
!;;
J/(:
(*!+ q Z$*%<iAWqLG $("zD3J'>:PYCYqLG v;!b	IJJ23I Y&Y&y3&1 y(y(S(1a<'#HHH]3w<)KKK0r   c                 T   || }|| }|| }|| }i }d}d}d}	dt         j                  d| ifdt         j                  | ||dfdt         j                  d| ifdt         j                  | ||dfd	t         j
                  | |d
fdt         j                  ||||dfg}
|
D ];  \  }}}	  |di |\  }}}|||d||<   |dk(  r||z  }|	|z  }	n|dk(  r
||z  }|	|z  }	= ||dz  kD  rd}|}n||dz  kD  rd}|}nd}d}|||||	|dS # t        $ r}ddt        |      d||<   Y d}~d}~ww xY w)uI   
        Évalue toutes les stratégies et retourne un consensus
        Nr   zGolden Crossr	   zStoch/RSI/MACD)r	   r<   r=   z
Triple EMAzBB + StochasticBreakout)r	   r   zCandle Wick)r   r<   r=   r>   )r)   
confidencereasonrc   rh   ERRORr   r\   )	consensusconsensus_strengthbuy_signalssell_signalstotal_confidence
strategies )	r   ro   rx   r   r   r   r   	Exceptionstr)r	   r<   r=   r   r>   r   resultsr   r   r   r   namestrategy_funcparamsr)   r   r   er   r   s                       r   evaluate_all_strategiesz*AdvancedStrategies.evaluate_all_strategies  s    >F=E<D=E /<<x>PQ1@@=?-888V:LM 2 ; ;=?+44735.::udfMO

 ,6 	'D--:-DV-D*
F$",$! U?:-K$
2$v% J.L$
2$	0 ++I!,K#--I!-I!" #"4&( 0!
 	
%  %"#!!f!s   %4D	D'D""D')r_   )rq   rr   rs   )r]   r   )N)NNNNN)__name__
__module____qualname____doc__staticmethodr   floatintr   r   r%   r   r   r;   rM   rY   r   ro   rx   r   r   r   r   r   r   r   r   r   r   	   sp    d5k 3 8E?   d5k 3   ( .
tE{ .
8TXY\^cYcTdKe .
 .
` )+  DK   tE{   DQVK   #&  08c5j9I0J     D EG25
$u+ 
s 
*/
:B4U
CS:T
 
> #0T%[ #0uS#s]7K #0 #0R (+tE{ (+4; (+d5k (+#(c3#7(+ (+\ )34; )3U3S=5I )3 )3^ #/e #/T%[ #/U #/"3S=1#/ #/R 3,e 3,xU/D 3,"3S=13, 3,r 714; 71tE{ 71$u+ 71;715:3S=5I71 71z >B=A>B?C@DO
U O
&.tE{&;O
%-d5k%:O
 '/tE{&;O
 (0U'<	O

 )1e(=O

 JNO
 O
r   r   )	r   numpyr   typingr   r   r   r   r   r   r   r   <module>r      s!   
  . .X
 X
r   