
    -"jN                       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
 d dlmZmZ  ed           G d	 d
                      Ze G d d                      Z ed           G d d                      ZdFdZdGdZdHdZdIdHdZdJdKd!ZdLd-ZdMd/ZdNd0ZdNd1ZdNd2ZdNd3ZdMd4ZdNd5ZdOd8Zd9d:dPd=Zd>d9d?dQd@Z dRdEZ!d9S )S    )annotations)	dataclass)mean)IterableMapping)	BotConfig)effective_required_drop_pctleverage_for_coinT)frozenc                  \    e Zd ZU ded<   ded<   dZded<   dZded<   dZded	<   dZded
<   dS )EntryDecisionboolenterstrreason        floatdrop_pctleverageroe_drop_pctrequired_drop_pctN)__name__
__module____qualname____annotations__r   r   r   r        >/home/agent/projects/CryptoTradingBot/Crypto_Agent/strategy.pyr   r      si         KKKKKKHHL"""""""r   r   c                  J    e Zd ZU ded<   ded<   ded<   dZded<   dZded<   d	S )
PositionStater   entry_tshigh_px	atr_sl_pxFr   trailing_active	be_activeN)r   r   r   r   r$   r%   r   r   r   r    r       sR         OOONNN!O!!!!Ir   r    c                  D    e Zd ZU ded<   dZded<   dZded<   dZded	<   d
S )ExitDecisionr   close r   r   r   r   
profit_pctroe_pctN)r   r   r   r   r   r*   r+   r   r   r   r'   r'      sN         KKKFJGr   r'   valueslist[float]returnr   c                    t          |           dk     rdS t          |           t          fd| D                       t          |           z  dz  S )N   r   c              3  (   K   | ]}|z
  d z  V  dS )r0   Nr   ).0valueavgs     r   	<genexpr>z_std.<locals>.<genexpr>*   s,      77u"777777r   g      ?)lenr   sum)r,   r4   s    @r   _stdr8   &   sU    
6{{Qs
v,,C777777777#f++E#MMr   historyIterable[tuple[float, float]]current_pricec                N    d | D             }|r|d         |k    r
|d d         }|S )Nc                    g | ]\  }}|S r   r   r2   _prices      r   
<listcomp>z+_prices_without_current.<locals>.<listcomp>.       ,,,5e,,,r   r   )r9   r;   pricess      r   _prices_without_currentrE   -   s=    ,,G,,,F &*--Mr   nintc           	     p    | sdS t          | t          |t          |                      d                    S Nr   )r   minr6   )r,   rF   s     r   _smarK   4   s;     sAs6{{+++,,-...r      c                    t                     dk     rdS  fdt          dt                               D             }|t          |t          |                     d          }d |D             }d |D             }|rt          |          nd}|rt          |          nd}|dk    r
|dk    rd	ndS ||z  }d	d	d
|z   z  z
  S )Nr0   g      I@c                8    g | ]}|         |d z
           z
  S )   r   )r2   ir,   s     r   rA   z_rsi.<locals>.<listcomp>=   s*    GGGAfQi&Q-'GGGr   rO   c                .    g | ]}t          |d           S r   )maxr2   deltas     r   rA   z_rsi.<locals>.<listcomp>?   s     111S__111r   c                H    g | ]}t          t          |d                      S rR   )absrJ   rT   s     r   rA   z_rsi.<locals>.<listcomp>@   s(    777uc#eS//""777r   r   r         Y@g      ?)r6   rangerJ   r   )	r,   rF   deltaswindowgainslossesavg_gainavg_lossrss	   `        r   _rsira   :   s    
6{{QtGGGGq#f++1F1FGGGFSCKK((())*F11&111E77777F#,tE{{{H%.tF|||3H1}} 1uu$.	H	BES2X&''r             @widthtuple[float, float, float]c                    | t          |t          |                      d          pdg}t          |          }t          |          }|||z  z
  ||||z  z   fS rI   )rJ   r6   r   r8   )r,   rF   rd   r[   midstds         r   
_bollingerri   I   sa    SCKK((())*3seF
v,,C
v,,Cc3#444r   coinr   
volume_24hopen_positionsset[str]	cooldownsMapping[str, float]now_tscfgr   EntryDecision | Nonec                n   |                                  } ||j        k     rt          dd          S | |v rt          dd          S | |j        v rt          dd          S |j        r| |j        vrt          dd          S | |v r4|t          ||                    z
  |j        dz  k     rt          dd          S d S )NF
low_volumealready_open	blacklistnot_allowed_coin<   cooldown)uppermin_volume_24hr   rv   allowed_coinsr   cooldown_minutesrj   rk   rl   rn   rp   rq   s         r   _basic_entry_guardsr   P   s     ::<<DC&&&UL111~UN333s}UK000
 8T):::U$6777yfuYt_'='==#BVY[B[\\UJ///4r   baseline_pricec        	           |                                  } t          | |||||          }	|	|	S d |D             }
|
st          dd          S t          |
          }|dk    s|dk    rt          dd          S ||z
  |z  dz  }t	          ||           }||z  }t          ||           }|| k    rt          dd||||          S |dk    r||k    rt          dd	||||          S t          d
d||||          S )Nr~   c                    g | ]\  }}|S r   r   r>   s      r   rA   z,should_enter_flash_crash.<locals>.<listcomp>   rB   r   Finsufficient_historyr   	bad_priced   no_flash_crashabove_baselineTflash_crash)rz   r   r   rS   r
   r	   )rj   r9   r;   rk   r   rl   rn   rp   rq   guardrD   
high_pricer   r   r   r   s                   r   should_enter_flash_crashr   g   sL    ::<<D%  E ,,G,,,F <U$:;;;VJQ-1,,UK000+z9S@H d++Hh&L3C>>$$$$U$4h,Xijjjmn<<U$4h,Xijjj}h,Pabbbr   c           	        |                                  } t          | |||||          }||S d |D             }	|	r|	d         |k    r
|	d d         }	t          dt          |j                            }
t          |	          |
k     s|dk    rt          dd          S |	|
 d          }t          |          }|dk    rt          dd          S t          |          d	z  |z  d
z  }||j	        k    r't          dd|t          ||           d|j	                  S t          |          }|dk    r||z
  |z  d
z  nd}t          ||           }||z  }||j        k     rt          dd||||j                  S t          dd||||j                  S )Nr~   c                    g | ]\  }}|S r   r   r>   s      r   rA   z<should_enter_volatility_squeeze_breakout.<locals>.<listcomp>   rB   r   rC   r0   r   Fr   r   g      @rX   not_compressedr   no_breakoutTsqueeze_breakout)rz   r   rS   rG   squeeze_lookback_ticksr6   r   r   r8   squeeze_max_band_width_pctr
   squeeze_breakout_pct)rj   r9   r;   rk   rl   rn   rp   rq   r   rD   lookbacksqueeze_windowbasisband_width_pctrecent_highbreakout_pctr   roe_breakout_pcts                     r   (should_enter_volatility_squeeze_breakoutr      s    ::<<D%  E ,,G,,,F &*--1c#45566H
6{{X!!3!3U$:;;;XIJJ'N  EzzUK000>**S058EAN666U$4nFWX[]aFbFbdgil  jH  I  I  	In%%KLWZ[OO][0K?5HHadL d++H#h.c...UM<K[]`]uvvv1<K[]`]uvvvr   c                   t          | |||||          }||S t          ||          |gz   }	t          |	          dk     s|dk    rt          dd          S t	          |	d          }
t	          |	t          dt          |	                              }t	          |	t          dt          |	                              }t          |	t          dt          d	t          |	          d
z
                                }|
|k    rt          dd          S |j        |cxk    r|j	        k    s)n t          dd|t          ||           d|j	                  S |dk    rt          ||z
  |z            dz  nd}||j        k    r't          dd|t          ||           d|j                  S t          dd|t          ||           ||j                  S )Nr~      r   Fr         rL   r0   rO   trend_not_uprsi_out_of_pullback_ranger   rX   too_far_from_vwapTtrend_pullback_sma_vwap)r   rE   r6   r   rK   rJ   ra   rS   trend_pullback_min_rsitrend_pullback_max_rsir
   rW   trend_pullback_max_distance_pct)rj   r9   r;   rk   rl   rn   rp   rq   r   rD   sma_fastsma_slow
vwap_proxyrsidistance_pcts                  r   $should_enter_trend_pullback_sma_vwapr      s     TjQ_kt  ~D  JM  N  N  NE$Wm<<NF
6{{Q-1,,U$:;;;FAHFCCKK0011Hfc!S[[1122J
vs2s1c&kkAo6677
8
8C8UN333&#KKKK1KKKKKU$?FWX[]aFbFbdgil  jD  E  E  	EMWZ[^^3
2j@AAEIIadLc999U$7GXY\^bGcGcehjm  kN  O  O  	O8,HYZ]_cHdHdfikn  lO  P  P  Pr   c                6   t          | |||||          }||S t          ||          }	|	|gz   }
t          |	          dk     s|dk    rt          dd          S t	          |	t          dt          |	                              \  }}}t          |
t          dt          dt          |
          d	z
                                }||j        d
z  z  }|||z   k    r8t          dd|dk    r||z
  |z  d
z  ndt          ||           ||j                  S ||j
        k    r't          dd|t          ||           d|j
                  S |dk    r||dz  k     rt          dd          S t          dd|dk    r||z
  |z  d
z  ndt          ||           ||j
                  S )Nr~      r   Fr   rb   rL   r0   rO   rX   not_near_lower_bandr   rsi_not_oversoldg?falling_knifeTbollinger_rsi_mean_reversion)r   rE   r6   r   ri   rJ   ra   rS   !mean_reversion_band_tolerance_pctr
   mean_reversion_max_rsi)rj   r9   r;   rk   rl   rn   rp   rq   r   priorrD   lowerrg   _upperr   	tolerances                   r   )should_enter_bollinger_rsi_mean_reversionr      sF     TjQ_kt  ~D  JM  N  N  NE#G];;Em_$F
5zzA~~!++U$:;;;#E3r3u::+>+>??E3
vs2s1c&kkAo6677
8
8C>FGIuy(((U$9hmpqhqhq]U=RV[<[_d;d;dwz  }N  OR  TX  }Y  }Y  [^  `c  `E  F  F  	F
S'''U$6=NsTX=Y=Y[^`c`z{{{
Qww=3:--UO444=lqtululuQVAVZ_@_ch?h?h{~  AR  SV  X\  A]  A]  _b  dg  d~      r   c           
        t          | |||||||          }|j        s|S t          ||          |gz   }	t          |	t	          dt          |	                              }
t          |	t	          dt          |	                              }|
|k     r(t          dd|j        |j        |j	        |j
                  S t          dd|j        |j        |j	        |j
                  S )Nrj   r9   r;   rk   rl   rn   rp   rq   r   r   Fsqueeze_not_trend_confirmedTconfirmed_squeeze_breakout)r   r   rE   rK   rJ   r6   r   r   r   r   r   )rj   r9   r;   rk   rl   rn   rp   rq   baserD   r   r   s               r   'should_enter_confirmed_squeeze_breakoutr      s    4w^k  yC  Tb  nw  @F  LO  P  P  PD: $Wm<<NFFC3v;;//00HFCCKK0011H(U$A4=RVR_aeartx  uK  L  L  	L;T]DM[_[lnr  oE  F  F  Fr   c        	           t          | |||||||          }	|	j        r(t          dd|	j        |	j        |	j        |	j                  S |	j        dv r|	S t          | ||||||||	  	        }
|
j        s|
S t          ||          |gz   }t          |t          dt          |                              }||k     r(t          dd|
j        |
j        |
j        |
j                  S t          dd	|
j        |
j        |
j        |
j                  S )
a6  Hybrid paper entry: v60/v59 survival base plus confirmed squeeze alpha.

    The squeeze module is preferred when present. Flash-crash/survival entries
    remain allowed only after a short moving-average reclaim, which filters the
    paper-trade pattern where hard stops dominated falling-knife entries.
    r   Thybrid_squeeze_breakout>   ry   r   rv   rt   ru   rw   	rj   r9   r;   rk   r   rl   rn   rp   rq   r   Fhybrid_flash_not_reclaiming_smahybrid_survival_rebound)r   r   r   r   r   r   r   r   r   rE   rK   rJ   r6   )rj   r9   r;   rk   r   rl   rn   rp   rq   squeezeflashrD   r   s                r   $should_enter_hybrid_survival_squeezer     so   $ 6#%	 	 	G } ST#<g>NPWP`bibvx  yR  S  S  	S~qqq$#%%
 
 
E ; $Wm<<NFFC3v;;//00HxU$Eu~W\Weglgy  |A  |S  T  T  	T8%.%.Z_Zlns  oF  G  G  Gr   c           	        t          | |||||          }||S t          ||          |gz   }	t          |	          dk     s|dk    rt          dd          S t	          |	t          dt          |	                              }
t	          |	t          dt          |	                              }|dk    rt          dd          S |
|z
  |z  dz  }||j        k     r't          dd	|t          ||           d
|j                  S |
dk    rt          ||
z
  |
z            dz  nd
}||j	        k    r't          dd|t          ||           d
|j	                  S t          dd|t          ||           ||j                  S )Nr~   
   r   Fr   r   r   rX   multi_day_trend_too_weakr   multi_day_entry_too_extendedTmulti_day_trend_investment)
r   rE   r6   r   rK   rJ   multi_day_min_trend_pctr
   rW   #multi_day_max_pullback_distance_pct)rj   r9   r;   rk   rl   rn   rp   rq   r   rD   r   r   	trend_pctr   s                 r   'should_enter_multi_day_trend_investmentr   J  s     TjQ_kt  ~D  JM  N  N  NE$Wm<<NF
6{{R=A--U$:;;;FC3v;;//00HFCCKK0011H1}}UK000X%1U:I3...U$>	K\]`bfKgKgilnq  oJ  K  K  	KIQTU30H<==EE[^Lc===U$BLRcdgimRnRnpsux  v]  ^  ^  	^;YHYZ]_cHdHdfrtw  uP  Q  Q  Qr   r   float | Nonec                    t          |           |dz   k     rd S | | dz
           }| d         }|dk    rd S ||z
  |z  dz  S )NrO   rC   r   rX   )r6   )r,   r   	referencecurrents       r   _momentum_pctr   h  sX    
6{{X\!!ty1}%IRjGA~~ty I-66r   N)market_historiesr   2Mapping[str, Iterable[tuple[float, float]]] | Nonec        	   	     D    t           |||||          }	|	|	S t          dt          |j                            }
|p                                 |i}g }|                                D ]\  }}d |D             }|                                                                 k    r|r|d         |k    r||gz   }t          ||
          }|)|                    ||                                f           t          |j	                  fd|D             }t           fd|D             d          }t          |          t          |j                  k     r"t          dd	|t          |           d          S |                    d
 d           d |d t          dt          |j                                     D             }                                 |vr"t          dd|t          |           d          S t          dd|t          |           d          S )Nr~   rO   c                    g | ]\  }}|S r   r   )r2   _tsr@   s      r   rA   z;should_enter_relative_strength_rotation.<locals>.<listcomp>  s    <<<JC%<<<r   rC   c                *    g | ]\  }}|k    ||fS r   r   )r2   score	candidatemin_momentums      r   rA   z;should_enter_relative_strength_rotation.<locals>.<listcomp>  s-    [[['7uiUlEZEZ	"EZEZEZr   c              3  R   K   | ]!\  }}|                                 k    |V  "d S )N)rz   )r2   r   r   rj   s      r   r5   z:should_enter_relative_strength_rotation.<locals>.<genexpr>  s:      XX 0yi4::<<>W>We>W>W>W>WXXr   r   Fmarket_breadth_too_thinc                "    | d         | d         fS )Nr   rO   r   )items    r   <lambda>z9should_enter_relative_strength_rotation.<locals>.<lambda>  s    DGT!W#5 r   T)keyreversec                    h | ]\  }}|S r   r   )r2   _scorer   s      r   	<setcomp>z:should_enter_relative_strength_rotation.<locals>.<setcomp>  s    
c
c
c*9
c
c
cr   not_top_relative_strengthrelative_strength_rotation)r   rS   rG    relative_strength_lookback_ticksrz   itemsr   appendr   "relative_strength_min_momentum_pctnextr6   )relative_strength_min_positive_candidatesr   r
   sortrelative_strength_top_n)rj   r9   r;   rk   rl   rn   rp   rq   r   r   r   	historiesscoresr   candidate_historyr,   r   eligible	own_scoretopr   s   `                   @r   'should_enter_relative_strength_rotationr   r  s^     TjQ_kt  ~D  JM  N  N  NE1c#>??@@H ;TZZ\\7$;I&(F(1(9(9 6 6$	$<<*;<<<??

,,f,r
m@[@[}o-Ffh//MM5)//"3"34555?@@L[[[[6[[[HXXXXFXXXZ]^^I
8}}s3HIIIIU$=yJ[\_aeJfJfhkmyzzzMM55tMDDD
c
ch7aQCD_@`@`9a9a7a.b
c
c
cCzz||3U$?L]^acgLhLhjmo{|||;YHYZ]_cHdHdfikwxxxr   r   )r   r   c        
           |j         dk    rt          | ||||||||	  	        S |j         dk    rt          | |||||||          S |j         dk    rt          | |||||||          S |j         dk    rt	          | |||||||          S |j         dk    rt          | |||||||          S |j         dk    rt          | |||||||          S |j         d	k    rt          | ||||||||	
	  	        S t          | ||||||||	  	        S )Nhybrid_survival_squeezer   volatility_squeeze_breakoutr   r   r   r   r   r   )	rj   r9   r;   rk   rl   rn   rp   rq   r   )	strategy_familyr   r   r   r   r   r   r   r   )
rj   r9   r;   rk   r   rl   rn   rp   rq   r   s
             r   should_enter_by_strategy_familyr     s    7773w^k  yC  Tb  sA  MV  _e  kn  o  o  o  	o
;;;7T7bo  }G  Xf  r{  DJ  PS  T  T  T  	T
:::6D'an  |F  We  qz  CI  OR  S  S  S  	S
7773w^k  yC  Tb  nw  @F  LO  P  P  P  	P
<<<8dGcp  ~H  Yg  s|  EK  QT  U  U  U  	U
:::6D'an  |F  We  qz  CI  OR  S  S  S  	S
:::6D'an  |F  We  qz  CI  OR  eu  v  v  v  	v#wmhr  DR  cq  }F  OU  [^  _  _  _  _r   entry_px
current_pxr   statec                   | dk    s|dk    rt          dd          S t          |j        |          |_        || z
  | z  dz  }|j        | z
  | z  dz  }||z  }||j        z
  dz  }	|j        s |j        s||j        k    r| |_        d|_        |j        s||j        k    rd|_        |j        r%|||j	        z
  k    rt          dd|dd	||          S |j        s.|	|j
        k    r#t          dd
t          |	           d||          S |j        s.||j        k    s||j         k    rt          dd|dd	||          S t          dd||          S )Nr   Fr   r   rx   TzV-Shape Trail Exit (z+.2fz% ROE)zDead Fish Time-Stop (Nach z Min ohne Rebound)zSL Hit (z.2fhold)r'   rS   r"   r!   r%   r$   break_even_activation_pctr#   v_shape_activation_pctv_shape_trail_dist_pctdead_fish_time_limit_minsrG   max_hard_stop_pct)
r   r   r   r  rp   rq   r*   max_profit_pctr+   time_in_trade_minss
             r   exit_long_positionr    s   1}}
aE;///z22EM(H4;J}x/8;sBN8#G 5>1R7? 5#8 ^sOl=l=l"  %^s7Q%Q%Q $ dA[0[!\!\D"M"M"M"M"Mz[bccc  A%7#:W%W%WD"jsCU?V?V"j"j"jlvx  A  A  	A  WjEO&C&CzVYVkUkGkGkD"@W"@"@"@"@*gVVVvz7;;;r   )r,   r-   r.   r   )r9   r:   r;   r   r.   r-   )r,   r-   rF   rG   r.   r   )rL   )rb   rc   )r,   r-   rF   rG   rd   r   r.   re   )rj   r   rk   r   rl   rm   rn   ro   rp   r   rq   r   r.   rr   )rj   r   r9   r:   r;   r   rk   r   r   r   rl   rm   rn   ro   rp   r   rq   r   r.   r   )rj   r   r9   r:   r;   r   rk   r   rl   rm   rn   ro   rp   r   rq   r   r.   r   )r,   r-   r   rG   r.   r   )rj   r   r9   r:   r;   r   rk   r   rl   rm   rn   ro   rp   r   rq   r   r   r   r.   r   )rj   r   r9   r:   r;   r   rk   r   r   r   rl   rm   rn   ro   rp   r   rq   r   r   r   r.   r   )r   r   r   r   r   r   r  r    rp   r   rq   r   r.   r'   )"
__future__r   dataclassesr   
statisticsr   typingr   r   configr   	near_missr	   r
   r   r    r'   r8   rE   rK   ra   ri   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   <module>r     s   " " " " " " ! ! ! ! ! !       $ $ $ $ $ $ $ $       D D D D D D D D $# # # # # # # #         $       N N N N   / / / /( ( ( ( (5 5 5 5 5   .'c 'c 'c 'cT-w -w -w -w`P P P P>   <F F F F,3G 3G 3G 3GlQ Q Q Q<7 7 7 7( LP"y "y "y "y "y "yV  
 LP_ _ _ _ _ _<< < < < < <r   