
    ri
#                       d Z ddlmZ ddlmZmZmZ ddlZddlZ	ddddZ
	 	 d	 	 	 dd	Zddd
Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 d dZ	 	 	 d!	 	 	 	 	 d"dZ	 	 	 d#	 	 	 	 	 	 	 	 	 d$dZ	 	 	 	 	 	 d%	 	 	 	 	 	 	 	 	 	 	 d&dZ	 	 d'	 	 	 d(dZ	 	 d'	 	 	 d(dZ	 	 	 d)	 	 	 	 	 d*dZ	 	 	 d+	 	 	 	 	 d,dZ	 	 	 d+	 	 	 	 	 d-dZd.d/dZd.d/dZ	 	 d0	 	 	 d1dZy)2a2  
Synthetic OHLCV bar fixtures for indicator tests.

Each helper returns a deterministic pd.DataFrame with columns
[open, high, low, close, volume] and a 'time' column (UTC, 5-min spacing).
Reused across all analysis/indicators/* unit tests so each test
focuses on the assertion, not the data construction.
    )annotations)datetime	timedeltatimezoneN   <      )5min1hour4hourc                    |t        dddddt        j                        }t        t        |         }t        |       D cg c]
  }|||z  z    c}S c c}w )Ni           r   )tzinfo)minutes)r   r   utcr   _TF_MINUTESrange)n	timeframestartstepis        +/home/work/apex_v16/tests/_fixtures/bars.py_timesr      sO    }q"a8<<@[34D&+Ah/EAH///s   Ac           
         t        |       }t        j                  t        ||      t	        |       t	        |      t	        |      t	        |      t	        |      d      S )N)timeopenhighlowclosevolume)lenpd	DataFramer   list)openshighslowsclosesvolumesr   r   s          r   _framer-      sN    E
A<<I&u+u+t*v,w-      c                    t        |       D cg c]
  }|||z  z    }}|D 	cg c]  }	|	|z   	 }
}	|
D cg c]  }||z   	 }}|D 	cg c]  }	|	|z
  	 }}	t        ||||
|g| z  |      S c c}w c c}	w c c}w c c}	w )zl
    Monotonic uptrend: each bar closes above its open by `body`,
    next bar opens at previous close.
    r   r-   )r   start_pricer   bodywickr#   r   r   r(   or+   cr)   r*   s                 r   uptrendr6   -   s     .31X6[1t8#6E6 %&1a$h&F&%&!QX&E&#$AH$D$%f(Q,	+ +	 7&&$   A)A.A3A8c                    t        |       D cg c]
  }|||z  z
   }}|D 	cg c]  }	|	|z
  	 }
}	|D 	cg c]  }	|	|z   	 }}	|
D cg c]  }||z
  	 }}t        ||||
|g| z  |      S c c}w c c}	w c c}	w c c}w )Nr0   )r   r1   r   r2   r3   r#   r   r   r(   r4   r+   r)   r5   r*   s                 r   	downtrendr9   =   s     .31X6[1t8#6E6 %&1a$h&F&$%!QX%E%$%AH%D%%f(Q,	+ +	 7&%%r7   c                6   t         j                  j                  d      }||j                  d||       z   }||j                  d|dz  |       z   }t        j                  ||      |dz  z   }t        j
                  ||      |dz  z
  }	t        |||	||g| z  |      S )uR   
    Bars oscillate around `mid` with small amplitude — RSI ~50, ATR small.
    *   r      333333?)nprandomdefault_rngnormalmaximumminimumr-   )
r   mid	amplituder#   r   rngr+   r(   r)   r*   s
             r   sidewaysrG   I   s     ))


#C3::aA..FSZZ9q=!44EJJuf%	C7E::eV$y36D%f(Q,	+ +r.   c                   | j                         }|j                  |   }|j                  |df   }||z   |j                  |df<   ||z
  |j                  |df<   ||dz  z   |j                  |df<   ||j                  |df<   |S )z|
    Inject a large-range bar at `spike_idx` (default last). Used to
    verify ATR ratio / volatility-spike detection.
    r   r    r!   g?r"   r#   )copyindexloc)base	spike_idx
spike_sizespike_volumedfidxr4   s          r   
with_spikerR   X   s     
B
((9
C
sF{Aj.BFF3;ZBFF3:zC//BFF3<(BFF3=Ir.   c                    t        | |d      }t        |g|g|g|gdg      }t        | dz   d      dd |d<   t        j                  ||gd	
      S )z\
    Sequence ending in a hammer candle (small body near the top,
    long lower wick).
    皙?rD   rE        r
   Nr   Tignore_indexrG   r-   r   r%   concat)prefix_nprefix_closehammer_openhammer_close
hammer_lowhammer_highrL   extras           r   hammer_at_endrd   m   sc     H,$?D	}zl\NTFE 8a<05E&M99dE]66r.   c                    t        | |d      }t        |g|g|g|gdg      }t        | dz   d      dd  |d<   t        j                  ||gd	      S )
NrT   rU   rV   rW   r
   rX   r   TrY   r[   )r]   r^   	star_open
star_close	star_highstar_lowrL   rc   s           r   shooting_star_at_endrj   }   sc     H,$?D	i[8*zlTFE 8a<05E&M99dE]66r.   c                    t        | dz
  |d      }t        dgdgdgdgdg      }t        d	gd
gdgdgdg      }t        j                  |||gd      }t	        t        |      d      |d<   |S )z=Last two bars: small bearish then a larger bullish engulfing.rW   rT   rU   皙Y@      Y@33333X@gX@  gX@g     @Y@fffffX@gfffff&Y@rV   TrY   r
   r   rG   r-   r%   r\   r   r$   )r]   r^   rL   bearishbullishouts         r   bull_engulfing_at_endru      s~     HqLldCDeWugvvv>GdVeWtfugv>G
))T7G,4
@CS6*CKJr.   c                    t        | dz
  |d      }t        dgdgdgdgdg      }t        d	gd
gdgdgdg      }t        j                  |||gd      }t	        t        |      d      |d<   |S )NrW   rT   rU   rp   Y@     X@gfffffY@ro   g33333Y@rl   g     X@gX@rV   TrY   r
   r   rq   )r]   r^   rL   rs   rr   rt   s         r   bear_engulfing_at_endry      s|    HqLldCDdVeWtfugv>GeWugvvv>G
))T7G,4
@CS6*CKJr.   c                    t        | |d      }t        dg|g|gdgdg      }t        j                  ||gd      }t	        t        |      d      |d<   |S )	u,   Last bar: open ≈ close (doji), wide range.rT   rU         Y@i  TrY   r
   r   rq   )r]   r^   	doji_highdoji_lowrL   dojirt   s          r   doji_at_endr      s[     H,$?D5'I;
UGdVDD
))T4Lt
4CS6*CKJr.   c                    t        | |d      }||z
  }||j                  |j                  |   df<   |dz   |j                  |j                  |   df<   |dz   |j                  |j                  |   df<   |S )zy
    Sideways series with a clear pivot LOW at `pivot_idx`
    (5-bar pivot: lower than 2 left + 2 right neighbors).
    rT   rU   r!   r"   皙?r   rG   rK   rJ   )r   	pivot_idx
base_price
pivot_droprP   pls         r   with_pivot_lowr      s}     
!t	4B	j	 B)+BFF288I%&+-9BFF288I'(*,t)BFF288I&'Ir.   c                    t        | |d      }||z   }||j                  |j                  |   df<   |dz
  |j                  |j                  |   df<   |dz
  |j                  |j                  |   df<   |S )NrT   rU   r    r"   r   r   r   )r   r   r   
pivot_jumprP   phs         r   with_pivot_highr      s}     
!t	4B	j	 B*,BFF288I&'+-9BFF288I'(*,t)BFF288I&'Ir.   c                    d}g }t        |       D ]/  }||dz  z   }|dz   }|dz   }|dz
  }|j                  ||||df       1 t        j                  |g d      }t	        | d      |d	<   |S )
z8Bullish structure: each bar's high & low above previous.r{         ?      ?r=     r   r    r!   r"   r#   columnsr   r   r   appendr%   r&   r   	r   	base_openrowsr   r4   r5   hlrP   s	            r   hh_hl_h1r          ID1X (CGGGQ1a&'( 
d$N	OB7#BvJIr.   c                    d}g }t        |       D ]/  }||dz  z
  }|dz
  }|dz   }|dz
  }|j                  ||||df       1 t        j                  |g d      }t	        | d      |d	<   |S )
z"Bearish structure: HH/LL inverted.r{   r   r   r=   r   r   r   r   r   r   r   s	            r   lh_ll_h1r      r   r.   c                D   t         j                  j                  d      }||j                  | ||       z   }||j                  | dz  |dz  |       z   }t        j                  ||      |dz  z   }t        j
                  ||      |dz  z
  }t        ||||dg| z  d      }|S )u3   Bars confined within a band — no HH/HL nor LH/LL.   r<   皙?rV   r   )r>   r?   r@   uniformrB   rC   r-   )	r   rD   rE   rF   r+   r(   r)   r*   rP   s	            r   
ranging_h1r      s     ))


"C3;;	z9a88FS[[)aQBBEJJuf%	C7E::eV$y36D	udFTFQJ	@BIr.   )r
   N)r   intr   strr   zdatetime | Nonereturnzlist[datetime])r
   )r   pd.DataFrame)2   r{   r   g?r        @@r
   )r   r   r1   floatr   r   r2   r   r3   r   r#   r   r   r   r   r   )r   r{   r   r   r
   )r   r   rD   r   rE   r   r#   r   r   r   r   r   )rX   g      @g     @)
rL   r   rM   r   rN   r   rO   r   r   r   )   r{   rx   rn   g     X@r{   )r]   r   r^   r   r_   r   r`   r   ra   r   rb   r   r   r   )r   r{   rm   rw   g     Y@r{   )r]   r   r^   r   rf   r   rg   r   rh   r   ri   r   r   r   )r   r{   )r]   r   r^   r   r   r   )r   r{   rm   rx   )
r]   r   r^   r   r|   r   r}   r   r   r   )(      r{   r   )
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )r   )r   r   r   r   )r   r{   r   )r   r   rD   r   rE   r   r   r   )__doc__
__future__r   r   r   r   numpyr>   pandasr%   r   r   r-   r6   r9   rG   rR   rd   rj   ru   ry   r   r   r   r   r   r    r.   r   <module>r      s   # 2 2   24 %+$(0!0-;0	  /4-0/5#++%*++',+ + )5+  16/217%	+	+',	+	+).	+ 	+ +7	+ (-5;$++-2++)5+ 57#&%+ "0<* =BCGAF7$7;@7#79>7 $7  *,/4,1-2,1+07',7$)7 &+7 %*	7
 $)7
 6B7 +-05(-:F +-05(-:F ;@#("& +7 24','*$$/; 35(-(+ % %0< */"%		*6	r.   