
    x=j}6                         d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ  ee      Ze G d d	             Z G d
 dee      Z G d d      Z e       Zy)z7Trading strategy engine with 5 configurable strategies.    )	dataclassfield)Decimal)Enum)Any)	RiskLevelSignalAction)
get_loggerc                       e Zd ZU eed<   eed<   eed<   dZedz  ed<   dZ	edz  ed<    e
e      Zeed<    e
e      Zeed	<   d
Zeed<   dZeed<   y)StrategySignalaction
confidence
risk_levelN	stop_losstake_profit)default_factory
supportingcontradicting reasonr   score)__name__
__module____qualname__r	   __annotations__intr   r   floatr   r   dictr   r   r   strr        FC:\xampp\htdocs\tradingbinance\backend\app\services\strategy_engine.pyr   r      s`    O"Iut|" $K$T2J25M45FCE3Nr!   r   c                        e Zd ZdZdZdZdZdZy)StrategyTypetrendmean_reversionbreakoutscalpingensembleN)r   r   r   TRENDMEAN_REVERSIONBREAKOUTSCALPINGENSEMBLEr    r!   r"   r$   r$      s    E%NHHHr!   r$   c            	           e Zd ZdZddedededz  defdZdededefd	Zdededefd
Z	dededefdZ
dededefdZdededefdZy)StrategyEnginezIConfigurable strategy engine. Operates on probabilities, not certainties.Nstrategy_type
indicatorsparamsreturnc           
         |xs i }t         j                  j                  | j                  t         j                  j                  | j
                  t         j                  j                  | j                  t         j                  j                  | j                  t         j                  j                  | j                  i}|j                  |      }|s.t        t        j                  dt         j"                  d|       S  |||      S )Nr   zUnknown strategy: )r   r   r   r   )r$   r*   value_trend_followingr+   _mean_reversionr,   	_breakoutr-   	_scalpingr.   	_ensemblegetr   r	   HOLDr   HIGH)selfr1   r2   r3   
evaluators	evaluators         r"   evaluatezStrategyEngine.evaluate&   s    2$$d&;&;''--t/C/C!!''!!''!!''

 NN=1	!#(($>>+M?;	  V,,r!   indc                     i i }}d}|j                  dd      }|j                  d      }|j                  d      }|j                  dd      }	|dk(  rd|d<   |d	z  }n|d
k(  r
d
|d<   |d	z  }|rd|cxk  rdk  rn n||d<   |dz  }n|r|dkD  s|dk  r
||d<   |dz  }|r|dkD  r||d<   |dz  }n|r|d	k  r
d|d<   |dz  }|	dkD  r|	|d<   |dz  }n|	dk  r
|	|d<   |dz  }t        dt        d|            }|j                  dd      }
|j                  d|
dz        }|dk\  rb|dk(  r]t        t        j
                  ||r|dkD  rt        j                  nt        j                  |
d|z  z
  |
d|z  z   ||d| d| d|	d| 	      S |dk  s|d
k(  rBt        t        j                  d|z
  t        j                  |
d|z  z   |
d|z  z
  ||d!| | 	      S t        t        j                  |t        j                  ||d"| |#      S )$N2   ema_crossovernonersiadxrelative_volumer   bullish   bearish(   A   
   F         
weak_trend         ?      ?d   priceatr{Gz?K         z%EMA bullish crossover confirmed. RSI=z, ADX=z, Vol ratio=.2f	r   r   r   r   r   r   r   r   r   z+EMA bearish crossover or weak trend. Score=zNo clear trend signal. Score=r   r   r   r   r   r   r   )r<   maxminr   r	   BUYr   LOWMEDIUMSELLr=   )r?   rC   r3   r   r   r   	crossoverrH   rI   rel_volrY   rZ   s               r"   r7   zStrategyEngine._trend_following9   su   $&M
GGOV4	ggenggen''+Q/	!*3J'RKE)#-6M/*RKE2?? #JuRKEcBh#(#&M% RKE38 #JuRKES2X#/M% QJES=,3J()RKEs]/6M+,RKEAs3'#ggeUT\*B;9	1!#'' ,/C"H9==)BRBR!c'/!AGO%+>se6#l[bcfZgh
 
 B;)y0!#((;$++!c'/!AGO((DUGL
 
 $$ ''!'25':
 	
r!   c                 \   i i }}d}|j                  dd      }|j                  d      }|j                  dd      }|j                  d      }	|j                  d|d	z        }
|d
k(  rd|d<   |dz  }n|dk(  r
d|d<   |dz  }|r|dk  rd| d|d<   |dz  }n|r|dkD  rd| d|d<   |dz  }t        dt        d|            }|dk\  r^|d
k(  rY|rW|dk  rR|	xs |j                  d|dz        }t        t        j
                  |t        j                  |d|
z  z
  |||d| |	      S |dk(  rS|rQ|dkD  rLt        t        j                  |t        j                  |d|
z  z   |j                  d|dz        ||d | |	      S t        t        j                  |t        j                  ||d!| |"      S )#NrE   rY   r   rH   price_vs_bbunknownsma_longrZ   r[   below_lowerbelow_lower_band	bollingerrS   above_upperabove_upper_bandrR   z
oversold ()rL   rQ   zoverbought (rX   r\   #   	bb_middlegRQ?      ?z+Mean reversion buy: price at lower BB, RSI=r`   rO   g\(\?z,Mean reversion sell: price at upper BB, RSI=z%No mean reversion opportunity. Score=ra   )
r<   rb   rc   r   r	   rd   r   rf   rg   r=   )r?   rC   r3   r   r   r   rY   rH   bb_posrm   rZ   tps               r"   r8   zStrategyEngine._mean_reversion   s    $&M
#ggen	277:&ggeUT\*]"&8J{#RKE}$);M+&RKE38",SE 3JuRKES2X%1#a#8M% RKEAs3'B;6]2ssRx?SWW[%$,?B!#'' $++#)+%+DSEJ
 
 ]"ssRx!#(( $++#)+GGK>((EcUK
 
 $$ ''!':5'B
 	
r!   c                 0   i i }}d}|j                  dd      }|j                  dg       }|j                  dd      }|j                  d|dz        }	|D 
cg c]
  }
|
|k\  s	|
 }}
|rt        |      }n|rt        |      }nd }|r%||dz  kD  r||kD  rd	| |d
<   |dz  }n
||d<   |dz  }|dkD  rd|dd|d<   |dz  }n|dk  rd|dd|d<   |dz  }|j                  dd      }|dkD  rd|dd|d<   |dz  }t        dt        d|            }|dk\  rL|rJ||kD  rE|dkD  r@t        t        j
                  |t        j                  |d|	z  z
  |d|	z  z   ||d | d!|"	      S t        t        j                  |t        j                  ||d#| |$      S c c}
w )%NrE   rY   r   resistancesrJ   rZ   r[   gV-?zabove r'   rS   approaching_resistancerP   rv   zhigh (r_   zx)volume   皙?zlow (zx) - possible false breakouthistorical_volatilityrV   rs   
volatilityrX   r\   g333333?r]      zBreakout above z with volume confirmationr`   zNo confirmed breakout. Score=ra   )	r<   rc   rb   r   r	   rd   r   rf   r=   )r?   rC   r3   r   r   r   rY   rz   ri   rZ   rresistances_abovenearest_resistancehist_vols                 r"   r9   zStrategyEngine._breakout   s   $&M
#ggmR0''+Q/ggeUT\*(3B1qEzQB!$%6!7!$[!1!%%*<u*D"D))+12D1E)F
:&7I
34S=%+GC=#;Jx RKEs](-gc]:V&WM(#RKE772A6c>,28C.*BM,'RKEAs3'B;-%:L2LQX[^Q^!#'' $++!c'/!AGO%+();(<<UV
 
 $$ ''!'25':
 	
U Cs   
F!Fc                 <   i i }}d}|j                  dd      }|j                  dd      }|j                  dd      }|j                  d      }	|j                  d|dz        }
|d	kD  r<d
|dd|d<   t        t        j                  dt        j
                  |d|ddd      S |dkD  rd|dd|d<   |dz  }|	rd|	cxk  rdk  rn nd|	 d|d<   |dz  }|j                  dd      }|dk(  r
d|d<   |d z  }t        dt        d!|            }|d"k\  rF|dk(  rA|d#k  r<t        t        j                  |t        j                  |d#|
z  z
  |d|
z  z   ||d$|%	      S t        t        j                  ||d#k  rt        j                  nt        j                  ||d&| |'      S )(NrE   rY   r   
spread_pctr   rH   rZ   g{Gzt?g?z
too high (z.4fz%)spreadzSpread too high for scalping: %)r   r   r   r   r   r   r~   z	extreme (r_   rs   r   rR   -   7   zneutral zone (rP   rF   rG   rK   zbullish micro-trendemarL   rX   r\   rW   z8Conservative scalp: low vol, tight spread, micro bullishr`   z#Scalping conditions not met. Score=ra   )r<   r   r	   r=   r   r>   rb   rc   rd   re   rf   )r?   rC   r3   r   r   r   rY   r   r   rH   rZ   	ema_crosss               r"   r:   zStrategyEngine._scalping   s   $&M
#ZZa0
772A6ggenggeUU]+(2:c2B"&EM(#!#(($>>+7
37GqI  c>,5hs^1*EM,'RKE2??"0Q 7JuRKEGGOV4		! 5JuRKEAs3'B;9	1hn!#'' $==#)+!C#I-%+Q
 
 $$(03y}}I<L<L!'8@
 	
r!   c                 L   |j                  dddddd      | j                  ||      | j                  ||      | j                  ||      | j	                  ||      dt        fdD              }t        |      }i }i }j                         D ]]  \  }}|j                  j                         D ]  \  }}	|	|| d| <    |j                  j                         D ]  \  }}	|	|| d| <    _ |j                  dd	      }
|j                  d
|
dz        }t        |j                  dd            }t        |j                  dd            }||k\  rUt        t        j                  ||dk\  rt        j                  nt        j                  |
d|z  z
  |
d|z  z   ||d| d|	      S ||k  rCt        t        j                   d|z
  t        j                  |
d|z  z   |
d|z  z
  ||d| d|	      S t        t        j"                  |t        j                  ||d| d|      S )Nweightsg333333?g?      ?)r%   r&   r'   r(   c              3   b   K   | ]&  }|   j                   j                  |d       z   ( yw)r   N)r   r<   ).0ksignalsr   s     r"   	<genexpr>z+StrategyEngine._ensemble.<locals>.<genexpr>D  s,     VgWQZ--At0DDgs   ,/_rY   r   rZ   r[   min_confidence_buyr\   ensemble_sell_thresholdrN   U   r]   r^   zEnsemble BUY: weighted score=z/100r`   rX   zEnsemble SELL: weighted score=zEnsemble HOLD: weighted score=ra   )r<   r7   r8   r9   r:   sumr   itemsr   r   r   r	   rd   r   re   rf   rg   r=   )r?   rC   r3   weighted_scoreall_supportingall_contradictingnamesigr   vrY   rZ   buy_thresholdsell_thresholdr   r   s                 @@r"   r;   zStrategyEngine._ensemble5  sQ   **Y"	)
  **37"223?sF3sF3	
 VgVV^, ID#,,.101$q}- /))//1134!TF!A3-0 2 ) #ggeUT\*FJJ';R@AVZZ(A2FG]*!#''),:b,@9==iFVFV!c'/!AGO)/6~6FdK$
 
 ^+!#((/$++!c'/!AGO,,77GtL$
 
 $$% ''%+3N3C4H 
 	
r!   )N)r   r   r   __doc__r   r   r   rB   r7   r8   r9   r:   r;   r    r!   r"   r0   r0   #   s    S-c -t -TD[ -\j -&I
D I
$ I
> I
V:
4 :
 :
. :
x:
T :
4 :
N :
x7
T 7
4 7
N 7
r@
T @
4 @
N @
r!   r0   N)r   dataclassesr   r   decimalr   enumr   typingr   
app.modelsr   r	   app.core.loggingr
   r   loggerr   r   r$   r0   strategy_enginer    r!   r"   <module>r      sb    = (    . '	H	 	 	 	3 R
 R
j
 !"r!   