
    Uj*                     ,   S r SSKrSSKrSSKJr  SSKJr  SSK	J
r
  / SQrSS\R                  S\S	\R                  4S
 jjrSS\R                  S\S	\R                  4S jjrS\S\R                  S	\R                  4S jrS\R                  S	\4S jrg)u  
Multi-Timeframe Context Features.

Заменяет отдельные D1/W1 эксперты: вместо них вычисляет контекстные фичи
из старших таймфреймов и добавляет их как дополнительные признаки к H1.

Фичи:
  d1_trend_slope       — наклон D1 Close за 20 дней (нормализованный)
  d1_trend_strength    — D1 ADX (0-100)
  d1_rsi               — D1 RSI (0-100)
  d1_vol_regime        — D1 ATR процентиль: 0=low, 1=normal, 2=high
  w1_trend_slope       — наклон W1 Close за 10 недель
  w1_trend_strength    — W1 ADX
  w1_rsi               — W1 RSI
  d1_h1_alignment      — sign(D1 slope) × sign(H1 slope)  ∈ {-1,0,+1}
  w1_h1_alignment      — sign(W1 slope) × sign(H1 slope)
  w1_d1_alignment      — sign(W1 slope) × sign(D1 slope)
  mtf_confluence       — среднее всех alignment ∈ [0,1]
  mtf_regime           — 0=range / 1=uptrend / 2=downtrend (по D1+W1)
    N)load_dataframe)engineer_features)add_directional_signals)d1_trend_sloped1_trend_strengthd1_rsid1_vol_regimew1_trend_slopew1_trend_strengthw1_rsid1_h1_alignmentw1_h1_alignmentw1_d1_alignmentmtf_confluence
mtf_regimedfperiodreturnc                    U S   R                   nU S   R                   nU S   R                   n[        R                  " U5      n[        R                  " U5      * nSXUS:  '   SXfS:  '   [        R                  " S/U/5      n[        R                  " S/U/5      n[        R                  " X#-
  [        R                  " [        R
                  " U[        R                  " US   /USS /5      -
  5      [        R
                  " U[        R                  " US   /USS /5      -
  5      5      5      n	[        R                  " U	5      R                  U5      R                  5       R                   n
S[        R                  " U5      R                  U5      R                  5       R                   -  U
S-   -  nS[        R                  " U5      R                  U5      R                  5       R                   -  U
S-   -  nS[        R
                  " X-
  5      -  X-   S-   -  n[        R                  " U5      R                  U5      R                  5       R                   n[        R                  " US	S
9$ )uW   Приближённый ADX: среднее направленное движение.HighLowCloser   Nd   绽|=g      4@)nan)valuesnpdiffconcatenatemaximumabspdSeriesrollingmean
nan_to_num)r   r   highlowcloseupdownplus_dmminus_dmtratrplus_diminus_didxadxs                  5/home/ai/projects/AI_Strategy/features/mtf_context.py_compute_adxr6   (   s   f:D
U)

CwKE	BGGCL=DBAvJDNnnqc2Y'G~~sDk*H	



FF4"..58*eCRj)ABBCFF3%(U3BZ(@AAB	

B ))B-


'
,
,
.
5
5CBIIg&..v6;;=DDDeTGRYYx(008==?FFF#PU+VH	rvvg()	)W-?%-G	HB
))B-


'
,
,
.
5
5C==$''    windowc                    U R                  5       nUS   R                  n[        R                  " [	        U5      S5      n[        U[	        U5      5       HF  nX5U-
  U n[        R                  " U5      n[        R                  " XvS5      S   nXU   S-   -  XE'   MH     XBS'   [        U[        SU5      S9US	'   S
UR                  ;  a  US   R                  5       n	U	R                  U	S:  S5      n
U	* R                  U	S:  S5      nU
R                  SSS9R                  5       nUR                  SSS9R                  5       nXR                  S[        R                   5      -  nSSSU-   -  -
  US
'   US
   R#                  S5      US
'   SUR                  ;   a  US   R                  nO[        R$                  " US   US   -
  [        R$                  " [        R&                  " US   US   R)                  S5      -
  5      [        R&                  " US   US   R)                  S5      -
  5      5      5      nUR                  S5      R                  5       US   -  R                  n[        R*                  " [	        U5      [,        S9n[        U[	        U5      5       HP  nXU-
  U n[        R.                  " UX   :  5      [	        U5      -  nUS:  a  SUU'   M>  US:  a  SUU'   MK  SUU'   MR     UUS'   U$ )u   
Вычисляет trend_slope, trend_strength (ADX), rsi, vol_regime для одного ТФ.
Возвращает DataFrame с теми же индексами и дополнительными колонками.
r              r   r   trend_slope   )r   trend_strengthrsi)r8   min_periodsr   2   atr_pctr   r   )dtypeg333333?gffffff?   
vol_regime)copyr   r   fulllenrangearangepolyfitr6   mincolumnsr   wherer%   r&   replacer   fillnar!   r"   shiftzerosintsum)r   r8   resultclosesslopesiyxslopedeltagainlossavg_gavg_lrsatr_valsr/   rE   window_valspcts                       r5   _compute_tf_featuresre   H   s   
 WWYF G_##FWWS[#&F63v;'v:a IIf

1#A&AY./		 (
 #=  ,F3r6?KF FNN"w$$&{{519c*~~eai-BA6;;=BA6;;=]]1bff--sa"f~.uu,,R0u FNN")$++ ZZ6NVE]*JJvf~w(=(=a(@@Ave}vg'<'<Q'??@
 JJrN'')F7O;CC #f+S1J63v;'6z!,ff[8;./#k2BB9JqM3YJqMJqM ( &F<Mr7   tickerdf_h1c                 `
   UR                  5       nUS   R                  [        5      US'   SnSn[        R                  " SUS   R
                  05      n [        U S5      nUb  [        U5      S:  a  [        USS9n[        U5      n[        USS	9nU/ S
Q   R                  5       n/ SQUl        US   R                  [        5      US'   [        R                  " UR                  S5      UR                  S5      SSS9nSn [        U S5      n	U	b  [        U	5      S:  a  [        U	SS9n	[        U	5      n	[        U	SS	9n	U	/ SQ   R                  5       n
/ SQU
l        U
S   R                  [        5      U
S'   [        R                  " UR                  S5      U
R                  S5      SSS9nSn[        R                   " X%SSS9nSUS'   SUS'   SUS'   SUS'   SUS'   US   R#                  S5      R
                  nU(       a  US   R#                  S5      R
                  nUS   R#                  S5      R
                  n[$        R&                  " U5      [$        R&                  " U5      -  US'   US :  US!:  -  nUS":  US!:  -  nS#UR(                  US4'   S$UR(                  US4'   U(       Ga  US%   R#                  S5      R
                  nUS&   R#                  S5      R
                  n[$        R&                  " U5      [$        R&                  " U5      -  US'   [$        R&                  " U5      [$        R&                  " US   R#                  S5      R
                  5      -  US'   US :  US!:  -  nUS":  US!:  -  nS#UR(                  US4'   S$UR(                  US4'   US!:  WS!:  -  nSUR(                  US4'   / nSUR                  ;   a"  UR+                  US   R-                  5       5        SUR                  ;   a"  UR+                  US   R-                  5       5        SUR                  ;   a0  U(       a)  U(       a"  UR+                  US   R-                  5       5        U(       a4  [        R.                  " US#S'9R1                  S#S'9R#                  S5      US'   [2         Vs/ s H  nUUR                  ;   d  M  UPM     nnUU   R#                  S5      UU'   U$ ! [         a  n[        SU 35         SnAGNSnAff = f! [         a  n[        SU 35         SnAGNrSnAff = fs  snf )(u   
Загружает D1 и W1 для ticker, вычисляет контекстные фичи,
и добавляет их в H1 DataFrame через asof merge.

Возвращает df_h1 с новыми колонками из MTF_CONTEXT_COLS.
	timestampFD1NrA   T)skip_temporal   )r8   )ri   r<   r>   r?   rE   )ri   r   r   r   r	   backward)on	directionz    [MTF] D1 context error: W1
   )ri   r<   r>   r?   )ri   r
   r   r   z    [MTF] W1 context error: left)rn   howr:   r   r   r   r   r   r   	return_20r   r   gMbP?   gMbPr;   rD   r
   r   )axis)rF   astyperS   r#   	DataFramer   r   rH   r   r   re   rM   
merge_asofsort_values	ExceptionprintmergerP   r   signlocappendr"   concatr&   MTF_CONTEXT_COLS)rf   rg   rU   has_d1has_w1
extra_colsdf_d1d1_featsedf_w1w1_featsh1_sloped1_sloped1_strengthcond_up	cond_downw1_slopew1_strengthweak_w1
alignmentscmtf_colss                         r5   add_mtf_contextr      s1    ZZ\F -44S9F; FF {F;,?,F,FGHJ2vt,Ub%e4@E+E2E(r:E`affhHnH$,[$9$@$@$EH[! &&{3$$[1$	J F
2vt,Ub%e4@E+E2E(r:ERSXXZH]H$,[$9$@$@$EH[! &&{3$$[1$	J F XX{F
 !$F #F #F"FF< k"))!,33H*+2215<<0188<CC %'GGH$58I$I ! e#b(89&;+;<	,-

7L()./

9l*+*+2215<<0188<CC$&GGH$58I$I !$&GGH$5#$++A.559
 %
 !
 e#b(89&;+;<	,-

7L()./

9l*+#b(89,-

7L() JFNN*&!23779:FNN*&!23779:FNN*v&&!23779:#%99Za#@#E#E1#E#M#T#TUV#W  ,C+aqFNN/B+HCh'..q1F8Ms  2,QC0112.  2,QC0112~ Ds>   B-S B-T &T+>T+
T)S==T
T(T##T(rU   c                 6   ^  [        U 4S j[         5       5      $ )u<   Проверяет, есть ли MTF фичи в DataFrame.c              3   @   >#    U  H  oTR                   ;   v   M     g 7f)N)rM   ).0r   rU   s     r5   	<genexpr>"has_mtf_context.<locals>.<genexpr>  s     =,<qFNN",<s   )anyr   )rU   s   `r5   has_mtf_contextr   
  s    =,<===r7   )r=   )rl   )__doc__numpyr   pandasr#   data.loaderr   features.technicalr   features.directionalr   r   rx   rS   ndarrayr6   re   strr   boolr    r7   r5   <module>r      s   *   & 0 8 (R\\ (3 (

 (@:R\\ :3 : :B~C ~ ~ ~B>BLL >T >r7   