
    DiU                       d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ e
j                  j                  d e ee      j#                         j$                  j$                               ddlZddlmZ ddlmZmZ ddlmZmZmZmZmZ ddZ d	d
	 	 	 	 	 ddZ!d Z"d Z#d Z$d Z%d Z&d Z'ddZ(ddZ)e*dk(  r e
jV                   e)              yy)aC  
Smoke tests for analysis/tech_snapshot.py end-to-end.

Uses FakeMarketDataProvider with synthetic OHLCV bars across M5/H1/H4.
Asserts TechSnapshot has all fields populated with sensible values
and that V15 bug parity is preserved (insufficient bars -> None).

Run:
    cd ~/apex_v16
    python -m tests.test_tech_snapshot
    )annotationsN)PathFakeMarketDataProvider)TechSnapshotbuild_tech_snapshot)	downtrendhh_hl_h1sidewaysuptrendwith_pivot_lowc                     t        d|         y )Nz  ok  )print)labels    //home/work/apex_v16/tests/test_tech_snapshot.py_okr   "   s    	F5'
    MES)symbolc                0    t        |df| |df||df|i      S )N5min1hour4hourr   )m5h1h4r   s       r   make_providerr   &   s4     "	2	2	2#  r   c                   K   t        t        d      t        d      t        d            } t        d| dd       d {   }d }||u }|st	        j
                  d	|fd
||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}}t        d       y 7 w)N
         r   r   r   r         ?      ?r   provider	tick_size
tick_valueisz%(py0)s is %(py3)ssnappy0py3assert %(py5)spy5zinsufficient M5 bars -> None)r   r   r
   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   pr,   @py_assert2@py_assert1@py_format4@py_format6s         r   &test_returns_none_on_insufficient_barsr@   4   s     2;8B<HRL	A %qDT D 44<44444&'	s   <C6C4B6C6c                   K   t        dt        d      i      } t        d| dd       d {   }d }||u }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}}t        d       y 7 w)N)r   r   2   r   r#   r$   r%   r)   r+   r,   r-   r0   r1   zmissing timeframe -> None)r   r   r   r2   r3   r4   r5   r6   r7   r8   r9   r   r:   s         r   &test_returns_none_on_missing_timeframerC   @   s       	A %qDT D 44<44444#$	s   )C#C!B6C#c                 `!  K   t        t        ddd      t        d      t        d            } t        d| d	d
d       d {   }t	        |t
              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      dz  }t        t        j                  |            d }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d}|j                   }	||	k  }
d}|	|k  }|
r|st        j                  d|
|fd||	|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}
x}x}	}d}|j"                  }	||	k  }
d}|	|k  }|
r|st        j                  d|
|fd ||	|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}
x}x}	}d}|j$                  }	||	k  }
d}|	|k  }|
r|st        j                  d|
|fd!||	|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}
x}x}	}|j&                  }d}||kD  }|st        j                  d|fd"||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j(                  }d}||kD  }|st        j                  d|fd#||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j*                  }d$}||v }|st        j                  d%|fd&||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j,                  }d'}||v }|st        j                  d%|fd(||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j.                  }d)}||v }|st        j                  d%|fd*||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j0                  }
t	        |
t2              }	|	sd+dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      d,t        j                         v st        j                  t2              rt        j                  t2              nd,t        j                  |	      d-z  }t        t        j                  |            d x}
}	|j4                  }d.}||v }|st        j                  d%|fd/||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j6                  }d0}||v }|st        j                  d%|fd1||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d}|j8                  }	||	k  }
d2}|	|k  }|
r|st        j                  d|
|fd3||	|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}
x}x}	}|j:                  }d	}||k(  }|st        j                  d|fd4||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j<                  }d
}||k(  }|st        j                  d|fd5||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j>                  }d}||k(  }|st        j                  d|fd6||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j@                  }i }||k(  }|st        j                  d|fd7||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}tC        d8|j4                   d9|j.                   d:|j,                          y 7 iw);NP   333333?皙?bodystepr    r!   r"   r   r#   r$      )r   r&   r'   r(   consecutive_sl_countz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer,   r   )r.   py1py2py4)==)z.%(py2)s
{%(py2)s = %(py0)s.symbol
} == %(py5)sr.   rO   r1   assert %(py7)spy7r   )>)z,%(py2)s
{%(py2)s = %(py0)s.price
} > %(py5)sd   )<=rW   )z+%(py1)s <= %(py6)s
{%(py6)s = %(py4)s.rsi
}z+%(py6)s
{%(py6)s = %(py4)s.rsi
} <= %(py8)s)rN   rP   py6py8zassert %(py10)spy10)z.%(py1)s <= %(py6)s
{%(py6)s = %(py4)s.rsi_h1
}z.%(py6)s
{%(py6)s = %(py4)s.rsi_h1
} <= %(py8)s)z.%(py1)s <= %(py6)s
{%(py6)s = %(py4)s.rsi_h4
}z.%(py6)s
{%(py6)s = %(py4)s.rsi_h4
} <= %(py8)s)z4%(py2)s
{%(py2)s = %(py0)s.atr_m5_points
} > %(py5)s)z0%(py2)s
{%(py2)s = %(py0)s.atr_ratio
} > %(py5)s)HIGHNORMALin)z2%(py2)s
{%(py2)s = %(py0)s.vol_regime
} in %(py5)s)BULLISH_EXPANSIONBEARISH_EXPANSIONRANGING)z8%(py2)s
{%(py2)s = %(py0)s.market_structure
} in %(py5)s)TRENDINGTRENDING_SOFTBREAKOUTra   )z.%(py2)s
{%(py2)s = %(py0)s.regime
} in %(py5)sz_assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.regime_near_trending
}, %(py4)s)
}list)r.   rN   r/   rP   rX   )	RIALZISTA
RIBASSISTANEUTROz,%(py2)s
{%(py2)s = %(py0)s.bias
} in %(py5)s)BUYSELLBOTHNONE)z9%(py2)s
{%(py2)s = %(py0)s.allowed_direction
} in %(py5)s      ?)z8%(py1)s <= %(py6)s
{%(py6)s = %(py4)s.h1_compatibility
}z8%(py6)s
{%(py6)s = %(py4)s.h1_compatibility
} <= %(py8)s)z1%(py2)s
{%(py2)s = %(py0)s.tick_size
} == %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.tick_value
} == %(py5)s)z<%(py2)s
{%(py2)s = %(py0)s.consecutive_sl_count
} == %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.swing_data
} == %(py5)szhappy: snap built bias=z regime=z struct=)"r   r   r
   r   rM   r   r4   r5   r2   r6   r7   r8   r9   r   r3   pricersirsi_h1rsi_h4atr_m5_points	atr_ratio
vol_regimemarket_structureregimeregime_near_trendingre   biasallowed_directionh1_compatibilityr'   r(   rL   
swing_datar   )r;   r,   @py_assert3@py_format5r=   @py_assert4r?   @py_format8@py_assert0@py_assert5r<   @py_assert7@py_format9@py_format11@py_format7s                  r   test_happy_path_full_snapshotr   P   s	    2Cc*B<B<	A
 %q4 D
 dL)))))))):))):))))))d)))d))))))L)))L))))))))));;%;%;%44;%:::>:44:1CC1C1C""1""s"s"""""1s"""1"""""""""""""""s"""""""""1""s"s"""""1s"""1"""""""""""""""s"""""""!!!!!!!!!!!!4!!!4!!!!!!!!!!!!!>>A>A>A44>A??000?00000?000000040004000?00000000000    %   %     %              !   %       ;;NNN;NNNNN;NNNNNNN4NNN4NNN;NNNNNNNNNNN//6:/66666666:666:666666d666d666/666666666666666666699===9=====9=======4===4===9===========!!D%DD!%DDDDD!%DDDDDDD4DDD4DDD!DDD%DDDDDDDD.$''.3'..3.'3.....3'3...3......$...$...'...3.......>>!T!>T!!!!>T!!!!!!4!!!4!!!>!!!T!!!!!!!??"d"?d""""?d""""""4"""4"""?"""d"""""""$$))$))))$))))))4)))4)))$))))))))))?? b ?b    ?b      4   4   ?   b       
!$))HT[[M B''(	* +Cs   A AB.AB+AA)AB.c            
       K   t        t        ddd      t        d      t        d            } t        d| d	d
       d {   }	 d|_        t!        d      7 # t
        $ r}g }d}t        |      }|j                  } |       }||v }|}	|s&d}
t        |      }|j                  } |       }|
|v }|}	|	sct        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       |st        j                  dfd
f      t        j                  |
      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                        t        j                        t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t!        t        j"                  |            d x}	x}x}x}x}x}x}x}
x}x}x}}t%        d       Y d }~y d }~ww xY ww)NrE   rF   rG   rH   r    r!   r"   r   r#   r$   r%   g     X@frozenzcannot assignr]   )zf%(py3)s in %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}.lower
}()
}stre)r/   r1   rX   rY   rZ   py12z%(py14)spy14)zk%(py17)s in %(py26)s
{%(py26)s = %(py24)s
{%(py24)s = %(py22)s
{%(py22)s = %(py19)s(%(py20)s)
}.lower
}()
})py17py19py20py22py24py26z%(py28)spy28   zassert %(py31)spy31u/   snapshot is frozen — direct mutation rejectedzsnapshot should be frozen)r   r   r
   r   rp   	Exceptionr   lowerr2   r3   r7   r4   r5   r6   append_format_boolopr8   r9   r   )r;   r,   r   r=   r<   r   @py_assert9@py_assert11r   r   @py_assert16@py_assert21@py_assert23@py_assert25@py_assert18@py_format13@py_format15@py_format27@py_format29@py_format30@py_format32s                        r   test_snapshot_is_frozenr      s    2Cc*x|	A %qDT D 4
55
  NxN3q6N6<<N<>Nx>)N_NANNN_-NNNNNx>NNNxNNNNNN3NNN3NNNNNNqNNNqNNN6NNN<NNN>NNNNNNN_NNN_NNNNNNNNNNNNNNNANNNANNNNNNNNNNNNNNNNNNNNNNNN=>	s<   ?MAMA M
M%KM>MMMc                 R  K   t        t        dddd      t        d      t        d            } t        d	| d
dd       d {   }d }||u}|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}}|j                  }i }||k7  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}d}	|j                  }|	|v }|st	        j
                  d|fd|	|f      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}	x}}t        d|j                  j                  d              y 7 aw)NrE   (   g      Y@rn   )n	pivot_idx
base_price
pivot_dropr    r!   r"   r   r#   r$   rj   )r   r&   r'   r(   direction_for_swingis notz%(py0)s is not %(py3)sr,   r-   r0   r1   )!=)z2%(py2)s
{%(py2)s = %(py0)s.swing_data
} != %(py5)srR   rS   rT   swing_foundr]   )z2%(py1)s in %(py5)s
{%(py5)s = %(py3)s.swing_data
})rN   r/   r1   z1swing data populated when direction='BUY': found=)r   r   r
   r   r2   r3   r4   r5   r6   r7   r8   r9   r|   r   get)
r;   r,   r<   r=   r>   r?   r   r}   r   r   s
             r   (test_swing_data_when_direction_requestedr      s    B"3OB<B<	A
 %q4! D
 4t4t44t?? b ?b    ?b      4   4   ?   b       +DOO+=O++++=O+++=++++++D+++D+++O+++++++ $$]34	6 7s   AJ'J$I!J'c            	       K   t        t        ddd      t        d      t        ddd            } t        d	| d
d       d{   }d}||u}|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}|j                  }d}||v }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}t        d|j                   d|j                          y7 w)zbH4 in clean uptrend -> RSI override likely fires, but bias shouldn't be RIBASSISTA from algo path.rE   rF   rG   rH   r    r   rn   r"   r   r#   r$   r%   Nr   r   r,   r-   r0   r1   )rg   rf   r]   ri   rR   rS   rT   zbullish H4 -> bias=z	 allowed=)r   r   r
   r   r2   r3   r4   r5   r6   r7   r8   r9   ry   r   rz   )	r;   r,   r<   r=   r>   r?   r   r}   r   s	            r   'test_bullish_h4_yields_non_bearish_biasr      s=    2Cc*B<2Cc*	A
 %qDT D 4t4t44t 993339333339333333343334333933333333333
dii[	$2H2H1IJKs   AGGFGc                 (  K   t        d       t                d {    t                d {    t                d {    t	                d {    t                d {    t                d {    t        d       y7 j7 Z7 J7 :7 *7 w)Nztest_tech_snapshot.pyzALL 6 TESTS PASSEDr   )r   r@   rC   r   r   r   r    r   r   
main_asyncr      s|     	
!"
0
222
0
222
'
)))
!
###
2
444
1
333	
 32)#43sf   BBBBBB
 BBB#B$B5B6BB
BBBBc                 <    t        j                  t                     S )N)asynciorunr   r   r   r   mainr      s    ;;z|$$r   __main__)r   r   returnNone)
r   pd.DataFramer   r   r   r   r   r   r   r   )r   int),__doc__
__future__r   builtinsr4   _pytest.assertion.rewrite	assertionrewriter2   r   syspathlibr   pathinsertr   __file__resolveparentpandaspdanalysis.market_datar   analysis.tech_snapshotr   r   tests._fixtures.barsr	   r
   r   r   r   r   r   r@   rC   r   r   r   r   r   r   __name__exitr   r   r   <module>r      s   
 #    
  3tH~--/66==> ?  7 D 
 38",/-	(	% (+^6*7,L*	% zCHHTV r   