
    k-iV                        d Z ddlmZmZ ddlmZ ddlmZmZm	Z	 ddl
mZ ddlZ G d de      Ze G d	 d
             Zej                   eej                  dddddddd	      ej                    eej                   dddddddd	      ej"                   eej"                  dddddddd	      ej$                   eej$                  dddddddd	      iZe G d  d!             Z G d" d#      Zed$k(  rddlZ ed%        ed&        ed'(      ZddlZ ej6                  d)       d*Z e       Zg d+ZdZ eD ]  \  Z!Z"Z#Z$ ed,e! d-e" d.e# d/        e%e"      D ]  Z&e$e#z  d0z   ejN                  de#      z   Z(eZ)ee(z   Z* e+e)e*       ejX                  de#d1z        z   Z- e.e)e*       ejX                  de#d1z        z
  Z/e*Z ee)e-e/e*2      Z0ejc                  e0      Z2e d3z  Z e2sejg                  e2jh                          ed4e  d5e2           ed6d&         eejk                                 ed7eD  cg c]  } | jl                   c}          ed8 e7ejp                                 ed9       ejp                  D ]2  Z- ed4e-d:    d5e-d;    d<e-d=    d>e-d?   d@dAe-dB   dCdDe-dE   dCdF       4 yyc c} w )Gu  
Market Regime Detector for Auto Hedge-Mart V4

Classifies market conditions into 4 regimes and provides parameter adjustments:
  🔴 HIGH_VOL   — Volatile/crisis: widen grid, pause new threads
  🟢 LOW_VOL    — Quiet/grinding: tighten grid, maximize sub-pair repeats
  🔵 TRENDING   — Strong directional: favor trend entries, wider TPs
  🟡 RANGING    — Sideways: full send on sub-pair grinding

Uses three indicators:
  - ATR ratio  (current ATR / reference ATR) → volatility level
  - ADX        (Average Directional Index)   → trend strength
  - BB Width   (Bollinger Bandwidth)         → squeeze/expansion detection

Each regime returns parameter multipliers that the engine can apply to:
  - Grid spacing scale
  - Entry TP scale  
  - Recovery TP scale
  - Thread profit target scale
  - Max new threads (0 = pause)
  - Sub-pair repeat aggressiveness

Author: TheCryptoClaw 🦾
    )	dataclassfield)Enum)ListOptionalTuple)dequeNc                       e Zd ZdZdZdZdZy)MarketRegimeHIGH_VOLLOW_VOLTRENDINGRANGINGN)__name__
__module____qualname__r   r   r   r        1/var/www/html/crpytotradingbot/regime_detector.pyr   r   "   s    HGHGr   r   c                   r    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   e	ed
<   d Z
y)RegimeParamsz)Parameter adjustments for current regime.regime
confidence
grid_scaleentry_tp_scalerecovery_tp_scalethread_target_scalemax_new_threadssub_pair_aggressivedescriptionc                    ddddd}|j                  | j                  j                  d      }| d| j                  j                   d| j                  d	d
| j                  dd| j
                  dd| j                   d| j                   S )N   🔴   🟢   🔵   🟡r   r   r   r      ⚪  (conf=.0%z	) | grid=z.2fzx tp=z
x threads=z	 sub_agg=)getr   valuer   r   r   r   r   )selfemojies      r   __repr__zRegimeParams.__repr__6   s    #FW]^IIdkk''/#Qt{{(()0E F,E$2E2Ec1J K//0	$:R:R9SU 	Vr   N)r   r   r   __doc__r   __annotations__floatintboolstrr0   r   r   r   r   r   )   sA    3Vr   r           ?      ?g?       @   FuF   High volatility — widened grid, reduced thread count, larger targets)	r   r   r   r   r   r   r   r   r    333333?gffffff?皙?
   TuD   Low volatility — tightened grid, full threads, aggressive grinding333333?      ?   u=   Trending market — wider TPs to ride momentum, moderate gridg?uG   Ranging market — tighter targets, full threads, max sub-pair grindingc                   :    e Zd ZU dZeed<   eed<   eed<   eed<   y)OHLCz9Simple candle for regime detection (doesn't need volume).openhighlowcloseN)r   r   r   r1   r3   r2   r   r   r   rC   rC   r   s    C
K
K	JLr   rC   c                       e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededededed	ed
ededededefdZdee   fdZ	de
fdZde
dee   fdZdefdZdee   fdZdefdZdefdZy)RegimeDetectora5  
    Classifies market regime using ATR, ADX, and Bollinger Bandwidth.
    
    Usage:
        detector = RegimeDetector(reference_atr=132.1)
        for candle in candles:
            detector.update(candle)
            regime = detector.get_regime()
            if regime:
                print(regime)
    reference_atr
atr_period
adx_period	bb_periodbb_stdlookbackhigh_vol_atr_ratiolow_vol_atr_ratiotrending_adxranging_adxbb_squeeze_pctbb_expansion_pctregime_confirm_barsc                 Z   || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        || _        || _        t        t        ||dz   |dz              | _        t        |dz         | _        t        |dz         | _        t        |dz         | _        t        |dz         | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d| _        t        d      | _        d| _        y )Nr>   r;   )maxlen   r   d   ) rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   r	   maxcandlestrue_rangesplus_dmminus_dm	dx_values_smoothed_tr_smoothed_plus_dm_smoothed_minus_dm_smoothed_adxcurrent_atrcurrent_adxcurrent_bb_widthcurrent_regimecandidate_regimecandidate_countregime_historybars_processed)r-   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   s                 r   __init__zRegimeDetector.__init__   s5   " +$$"  #5!2(&, 0#6  $3xRVW+XY"'zA~">#:>:$JN; %Z!^ < .22637.2 -1,015 7;8<$%%*#%6#$r   returnc                 
   t        t        |j                        t        |j                        t        |j                        t        |j
                              }| j                  j                  |       | xj                  dz  c_        t        | j                        dk  ry| j                  d   }t        |j                  |j                  z
  t        |j                  |j
                  z
        t        |j                  |j
                  z
              }| j                  j                  |       |j                  |j                  z
  |j                  |j                  z
  kD  r#t        |j                  |j                  z
  d      nd}|j                  |j                  z
  |j                  |j                  z
  kD  r#t        |j                  |j                  z
  d      nd}| j                  j                  |       | j                  j                  |       | j                  }| j                   t        | j                        |k\  rt#        t%        | j                        | d       |z  | _        t#        t%        | j                        | d       |z  | _        t#        t%        | j                        | d       |z  | _        nW| j                   |dz
  z  |z   |z  | _        | j&                  |dz
  z  |z   |z  | _        | j(                  |dz
  z  |z   |z  | _        | j                   y| j                   | _        | j                   dkD  r9| j&                  | j                   z  dz  }| j(                  | j                   z  dz  }	nd}d}	||	z   dkD  rt        ||	z
        ||	z   z  dz  }
nd}
| j,                  j                  |
       | j.                  }| j0                  Ct        | j,                        |k\  rHt#        t%        | j,                        | d       |z  | _        n| j0                  |dz
  z  |
z   |z  | _        | j0                  | _        t        | j                        | j4                  k\  rt%        | j                        | j4                   d D cg c]  }|j
                   }}t#        |      | j4                  z  t#        fd|D              | j4                  z  }t7        j8                  |      }| j:                  |z  z   }| j:                  |z  z
  }dkD  r||z
  z  | _        nd| _        nd| _        | j*                  -| j2                  !| j?                         }| jA                  |      S yc c}w )	a  
        Process a new candle and update regime classification.
        
        Args:
            candle: Object with .open, .high, .low, .close attributes
            
        Returns:
            RegimeParams if regime changed, None if unchanged
        rD   rE   rF   rG         Nr   rZ   c              3   .   K   | ]  }|z
  d z    yw)rr   Nr   ).0csmas     r   	<genexpr>z(RegimeDetector.update.<locals>.<genexpr>  s     :aAG>:s   )!rC   r3   rD   rE   rF   rG   r\   appendrl   lenr[   absr]   r^   r_   rK   ra   sumlistrb   rc   re   r`   rL   rd   rf   rM   mathsqrtrN   rg   	_classify_apply_regime)r-   candleohlcprevtrr^   r_   nplus_diminus_didxn_adxrv   closesvariancestdupperlower
new_regimerw   s                      @r   updatezRegimeDetector.update   s    v{{#v{{#fjj!%	
 	D!q  t||q ||B II 		DJJ&'4::%&

 	# 59II		4IdhhY]YaYaNa3b#dii$))+Q/hi3788dhh3F499W[W`W`K`2a3txx$((*A.ghG$X& OO$4##$)$'T-=-=(>rs(C$Dq$H!),T$,,-?-D)E)I&*-d4==.A1"#.F*G!*K'!%!2!2a!e!<r!AQ FD&*&<&<A&F&PTU%UD"'+'>'>!a%'H8'SWX&XD#$  ,, q --0A0AASHG//$2C2CCsJHGH h!#Wx'(Gh,>?#EBBb!%4>>"e+%(dnn)=ufg)F%G%%O""&"4"4	"BR"G5!PD-- t||.'+DLL'94>>/:J'KL!aggLFLf+.C:6::T^^KH))H%C$++++E$++++EQw).#(=%()%$(D! 'D,<,<,H)J%%j11% Ms   U:c                 V   | j                   dkD  r| j                  | j                   z  nd}| j                  xs d}| j                  xs d}|| j                  k\  rt
        j                  S || j                  k  r|| j                  k  rt
        j                  S || j                  k\  r2|| j                  dz  k\  rt
        j                  S t
        j                  S || j                  k  r/|| j                  k  rt
        j                  S t
        j                  S || j                  k\  r%|dkD  rt
        j                  S t
        j                  S || j                  k  rt
        j                  S | j                  | j                  z   dz  }||k\  rt
        j                  S t
        j                  S )u  
        Classify market regime based on indicator values.
        
        Decision tree:
        1. ATR ratio > high_vol_threshold → HIGH_VOL (regardless of trend)
        2. ATR ratio < low_vol_threshold AND BB squeeze → LOW_VOL
        3. ADX > trending_threshold → TRENDING
        4. ADX < ranging_threshold → RANGING
        5. Default → use BB width as tiebreaker
        r   r@   {Gz?r=   r?   rr   )rJ   re   rf   rg   rP   r   r   rQ   rT   r   rR   r   rS   r   rU   )r-   	atr_ratioadxbb_widthmidpoints        r   r   zRegimeDetector._classify)  s    >B=O=ORS=SD$$t'9'99Y\	#!((0D ///((( ...8t?R?R3R''' $###D33c99#,,,((( $"""D222#+++''' t,,,,5O<((VAVAVV,,,''' ))D,<,<<AHh#,,,'''r   r   c           
      X   || j                   k(  rd| _        d| _        y|| j                  k(  r| xj                  dz  c_        n|| _        d| _        | j                  | j                  k\  r| j                   }|| _         d| _        d| _        t	        di t        t        |         }| j                         |_        | j                  j                  | j                  |r|j                  nd|j                  |j                  | j                  | j                  | j                  d       |S y)z
        Apply regime change with confirmation (debouncing).
        
        Requires regime_confirm_bars consecutive bars of the same classification
        before switching. This prevents whipsawing between regimes.
        Nr   rq   NONE)barfromtor   atrr   r   r   )rh   ri   rj   rV   r   varsREGIME_PRESETS_calc_confidencer   rk   ry   rl   r,   re   rf   rg   )r-   r   
old_regimeparamss       r   r   zRegimeDetector._apply_regimeZ  s    ,,,$(D!#$D ...  A% $.D!#$D 4#;#;;,,J",D$(D!#$D  "ED
)C$DEF $ 5 5 7F&&**,6
((F &&$//'''' 11(  Mr   c           
         | j                   | j                  y| j                   | j                  z  }| j                  xs d}| j                  xs d}| j                  }g }|t
        j                  k(  rX|j                  t        d|dz
  | j                  dz
  z               |j                  t        d|| j                  z               n{|t
        j                  k(  ru|j                  t        dd|z
  d| j                  z
  z               |j                  || j                  k  r&t        d| j                  |z
  | j                  z        nd       n|t
        j                  k(  ra|j                  t        d|| j                  z
  | j                   | j                  z
  z               |j                  t        d|dz               n|t
        j"                  k(  rl|j                  t        d| j                   |z
  | j                   | j                  z
  z               |j                  dt        dt%        |dz
              z
         |r+t'        dt        dt)        |      t+        |      z              S dS )z
        Calculate confidence score (0-1) based on how strongly indicators
        agree on the current classification.
        r7   r   r   r@   r9   )re   rf   rJ   rg   rh   r   r   ry   minrP   rU   r   rQ   rT   r   rS   rR   r   r{   r[   r|   rz   )r-   r   r   r   r   scoress         r   r   zRegimeDetector._calc_confidence  s   
 #t'7'7'?$$t'9'99	#!((0D$$\***MM#cIO8O8ORU8U#VWXMM#c8d.C.C#CDE|+++MM#cC)Od>T>T8T#UVWMM^fimi|i|^|#cD$7$7($BdFYFY#YZ  CF  G|,,,MM#cC$*:*:$:t?P?PSWScSc?c#defMM#c9s?34|+++MM#cD$5$5$;@Q@QTXTdTd@d#efgMM#CY_)= >>?@Fs3CVs6{!:;<OCOr   c                     | j                   yt        di t        t        | j                            }| j	                         |_        |S )z<Get current regime parameters (None if not enough data yet).Nr   )rh   r   r   r   r   r   )r-   r   s     r   
get_regimezRegimeDetector.get_regime  sD    &J^D4G4G%H IJ 113r   c           	         | j                   r| j                   | j                  z  nd}| j                   rt        | j                   d      nd|rt        |d      nd| j                  rt        | j                  d      nd| j                  rt        | j                  d      nd| j
                  r| j
                  j                  nd| j                  t        | j                        dS )z3Get current indicator values for debugging/display.Nrr   r;      )r   r   r   r   r   barsregime_changes)
re   rJ   roundrf   rg   rh   r,   rl   rz   rk   )r-   r   s     r   get_indicatorszRegimeDetector.get_indicators  s    ?C?O?OT%%(:(::UY	151A1A5))1-t09y!,t151A1A5))1-t;?;P;Pd33Q7VZ373F3Fd))//D''!$"5"56
 	
r   c                 l   | j                   y| j                         }| j                         }ddddd}|j                  | j                   j                  d      }| d| j                   j                   d	|j
                  d
d dd|d    d|d    d| j                   dd|d    d	|d   r|d   | j                  kD  rdn|d   r|d   | j                  k  rdnd dd|d    d	|d   r|d   | j                  k  rdn|d   r|d   | j                  kD  rdnd d dd|j                  dd d!|j                  dd d"|j                  dd d#|j                  dd d$|j                   d%|j                   rd&nd'  d(t#        | j$                         d)| j&                   d*g}d+j)                  |      S ),z*Human-readable regime summary for display.u8   ⏳ Warming up... (need more candles for classification)r"   r#   r$   r%   r&   r'   z Market Regime:  (r*   z confidence)zIndicators:z  ATR: r   z	 (ratio: r   z	x vs ref )z  ADX: r   trendingrangingneutralz  BB Width: r   squeeze	expansionnormalzParameter Adjustments:z  Grid spacing: .1fxz  Entry TP: z  Recovery TP: z  Thread target: z  Max new threads: z  Sub-pair aggressive: YESnozRegime changes: z over z bars
)rh   r   r   r+   r,   r   rJ   rR   rS   rT   rU   r   r   r   r   r   r   rz   rk   rl   join)r-   r   
indicatorsr.   r/   liness         r   get_regime_summaryz!RegimeDetector.get_regime_summary  s   &M"((*
#FW]^IId))//7 c!$"5"5";";!<Bv?P?PQT>UUabj'(	*[2I1J)TXTfTfSgghij'(E9JzZ_O`cgctctOt:  HR  SX  HY  ^h  in  ^o  rv  rB  rB  ^B  {D  HQ  +R  RS  T:j12"*ZBX]ghr]svz  wJ  wJ  ^JY  _i  jt  _u  zD  EO  zP  SW  Sh  Sh  zh  P[  nv  5w  wx  y$v005Q76005Q7f66s;1= : :3?qA!&"8"8!9:%v/I/Iet%TUs4#6#678t?R?R>SSXY!
$ yyr   N)33333`@   r      r:   2   r8   r<   g      >@g      4@g{Gz?gQ?r;   )r   r   r   r1   r3   r4   rm   r   r   r   r   r   r   r   r   dictr   r6   r   r   r   r   rI   rI   {   s(   
  %$'#&"! $"&#$8%8% 8% 	8%
 8% 8% 8% "8% !8% 8% 8% 8%  8% !8%te 6 eN/(< /(b* *,9O *X$P% $PLH\2 
 
 C  r   rI   __main__u/   🦾 Market Regime Detector — Standalone Testz<============================================================r   )rJ   *   g    1@))zQuiet rangingrZ   r   r   )zBreakout trendingrZ   i,  rq   )Crashr   i  )zRecovery trendrZ      rq   )Consolidation   P   r   z
--- Simulating: r   z bars, vol=z) ---g333333?g      ?rp   rq   z  Bar z: r   z
Regimes seen: zTotal regime changes: z
Regime history:r   r   u    → r   r)   r   r*   z, ATR=r   r   z, ADX=r   r   )9r1   dataclassesr   r   enumr   typingr   r   r   collectionsr	   r~   r   r   r   r   r   r   r   rC   rI   r   sysprintdetectorrandomseedpricesetregimes_seen	scenariosr   namecount	vol_range	directionrangeigaussmovementorv   r[   uniformhr   lr   r   changeaddr   r   r,   rz   rk   )rs   0r   <module>r      s  2 )  ( (  4  V V V2 <$$!\
 ,## Z
 <$$!S
 ,## ]
E-`   b  b R z	
;<	(O E2H FKKOE5LI C-6 0)eY	"4&5'YKuMNu 	0A 9,s2\V\\!Y5OOHA AAq	NFNN1i#o>>AAq	NFNN1i#o>>AEqqaq9F__V,F1HC  /se2fX./	00& 
Bxj/	(
%
%
'(	|<!agg<=
>?	"3x'>'>#?"@
AB	
$$ Wqxj1V9+U1T7) <s+6!E(3vahs^STV 	WWe ^ =s   <J>
