
    Q-jE.                        d dl mZ d dlmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZmZmZ d dlmZmZmZmZ  ed      d        Z ed      d	        Z ed      d
        Z ed      d        Z	 	 	 dde	de	de	dededededefdZy)    )njit)floornanzeros
zeros_likeroll)Series	DataFrame)DictLikeIntIntFloat)v_boolv_offsetv_pos_defaultv_seriesT)cachec                    t        |       }t        |       }t        |       }d}t        t        |dz              }|dz   }| j                  }	t	        ||	|z
        D ]q  }
||
   }| |
   }||
|z
  |
|z    }| |
|z
  |
|z    }||k  j                         r|
||<   d||<   |||<   |dz  }||k\  j                         s^|
||<   d||<   |||<   |dz  }s |d | |d | |d | fS )Nr         )r   intr   sizerangeall)np_highnp_lowwindow_sizeidxswingvalueextremesleftrightmi
low_centerhigh_center
low_windowhigh_windows                  d/Users/jameslopez/projects/TradingBot25/.venv/lib/python3.12/site-packages/pandas_ta/trend/zigzag.pynb_rolling_hlr+      s(   
W
CwEwEHu[1_%&D1HE 	A4U#AY
ajAHa%i0
a$hE	2*$))+CM E(O(E(OMH;&++-CME(O)E(OMH! $$ y>5(+U9H-===    c                 x   t        |       }t        |      }t        |      }t        |       }d}d}	| d   ||<   |d   ||<   |d   ||<   d||<   | j                  }
t        d|
      D ];  }||   }||   |z
  |z  }|||	z
     dk(  r||   dk(  rF||   ||   k  s3|||	z
     | |   k(  rB|dz  }|	dz  }	| |   ||<   ||   ||<   ||   ||<   d|z  ||<   m|d|z  kD  sv|||	z
     | |   k(  r|dz  }| |   ||<   ||   ||<   ||   ||<   d|z  ||<   d}	||   dk(  rF||   ||   kD  s|||	z
     | |   k(  r|dz  }|	dz  }	| |   ||<   ||   ||<   ||   ||<   d|z  ||<   |d|z  k  s|||	z
     | |   k(  r|dz  }| |   ||<   ||   ||<   ||   ||<   d|z  ||<   d}	> |dz   }|d | |d | |d | |d | fS )Nr   r   r   d   {Gz?g{Gzr   r   r   )r   r   r    	deviationzz_idxzz_swingzz_valuezz_devzigzagschangesr$   r%   last_zz_valuecurrent_dev_ns                  r*   nb_zz_backtestr;   1   s   _F% H% H_FGG!fF7OaHWaHWF7O 	A1a[ )Qx-/=@ GGO$*Qx2~ 8hw//g/0CF: qLGqLG&)!fF7O(-aHW%(-aHW%&)K&7F7O 	!11g/0CF: qLG&)!fF7O(-aHW%(-aHW%&)K&7F7OG Qx1} 8hw//g/0CF: qLGqLG&)!fF7O(-aHW%(-aHW%&)K&7F7O !22g/0CF: qLG&)!fF7O(-aHW%(-aHW%&)K&7F7OG B 
1B#2;"x}fSbkAAr,   c                    t        |       }t        |      }t        |      }t        |       }d}| d   ||<   |d   ||<   |d   ||<   d||<   | j                  }	t        |	dz
  dd      D ]N  }
||   dk(  r||
   dk(  rJ||
   ||   k  s |dkD  s&||dz
     ||
   z
  ||
   z  }| |
   ||<   ||
   ||<   ||
   ||<   d|z  ||dz
  <   ^||
   ||   z
  ||
   z  }|d|z  kD  sx||   | |
   k(  r|dz  }| |
   ||<   ||
   ||<   ||
   ||<   d|z  ||dz
  <   ||
   dk(  rJ||
   ||   kD  s|dkD  s||
   ||dz
     z
  ||
   z  }| |
   ||<   ||
   ||<   ||
   ||<   d|z  ||dz
  <   ||   ||
   z
  ||
   z  }|d|z  kD  s||   | |
   k(  r'|dz  }| |
   ||<   ||
   ||<   ||
   ||<   d|z  ||dz
  <   Q |dz   }|d | |d | |d | |d | fS )Nr   r   r   r   r.   r/   r0   )r   r   r    r1   r2   r3   r4   r5   r6   r$   r%   r9   r:   s                r*   
nb_find_zzr=      s   _F% H% H_FG"gF7Ob	HWb	HWF7OA1q5"b!G"Qx2~ 8hw//GaK#+GaK#858#CuQx"OK&)!fF7O(-aHW%(-aHW%*-*;F7Q;'  %Qx(7*;;uQxG	!11g#a&0 qLG&)!fF7O(-aHW%(-aHW%*-*;F7Q;' Qx1} 8hw//GaK#(8hw{.C#CuQx"OK&)!fF7O(-aHW%(-aHW%*-*;F7Q;'  (058;uQxG	!11g#a&0 qLG&)!fF7O(-aHW%(-aHW%*-*;F7Q;'c "f 
1B#2;"x}fSbkAAr,   c                 "   t        |      }t        |      }t        |      }t        |       D ](  \  }}	t        |	      }	||   ||	<   ||   ||	<   ||   ||	<   * t        |      D ]&  }	||	   dk(  st        ||	<   t        ||	<   t        ||	<   ( |||fS )Nr   )r   	enumerater   r   r   )
r   r   r    r1   n	swing_map	value_mapdev_mapjr%   s
             r*   	nb_map_zzrE      s    aIaIAhG#1FQx	!Qx	!q\
	  1XQ<1IaLIaLGAJ	  i((r,   Nhighlowcloselegsr1   backtestoffsetkwargsc                    t        |d      }|dz   }t        | |      } t        ||      }| |y|t        ||      }|j                  }	|yt        |d      }t        |      }t	        |d      }|r|t        t        |dz              z  }| j                         |j                         }}
t        |
||      \  }}}|rt        ||||      \  }}}}nt        ||||      \  }}}}t        |||||
j                        \  }}}|dk7  r?t        ||      }t        ||      }t        ||      }t        |d| t        |d| t        |d| d|v rB|j                  |d   d	
       |j                  |d   d	
       |j                  |d   d	
       d| d| }d| |d| |d| |i}t!        || j"                        }d| |_        d|_        |S )a`  Zigzag

    This indicator attempts to filter out smaller movements while identifying
    trend direction. It does not predict future trends, but it does identify
    swing highs and lows.

    Sources:
        * [stockcharts](https://school.stockcharts.com/doku.php?id=technical_indicators:zigzag)
        * [tradingview](https://www.tradingview.com/support/solutions/43000591664-zig-zag/#:~:text=Definition,trader%20visual%20the%20price%20action.)

    Parameters:
        high (Series): ```high``` Series
        low (Series): ```low``` Series
        close (Series): ```close``` Series. Default: ```None```
        legs (int): Number of legs (> 2). Default: ```10```
        deviation (float): Reversal deviation percentage. Default: ```5```
        backtest (bool): Default: ```False```
        offset (int): Post shift. Default: ```0```

    Other Parameters:
        fillna (value): ```pd.DataFrame.fillna(value)```

    Returns:
        (DataFrame): 2 columns

    Note: Deviation
        When ```deviation=10```, it shows movements greater than ```10%```.

    Note: Backtest Mode
        Ensures the DataFrame is safe for backtesting. By default, swing
        points are returned on the pivot index. Intermediate swings are
        not returned at all. This mode swing detection is placed on the bar
        that would have been detected. Furthermore, changes in swing levels
        are also included instead of only the final value.

        * Use the following formula to get the true index of a pivot:
          ```p_i = i - int(floor(legs / 2))```

    Warning:
        A Series reversal will create a new line.
    
   r   Ng      @Fr   r   fillnaT)inplace_z%_ZIGZAGsZIGZAGvZIGZAGd)indexZIGZAGtrend)r   r   valuesr   r   r   r   to_numpyr+   r;   r=   rE   r   r   r   rO   r
   rU   namecategory)rF   rG   rH   rI   r1   rJ   rK   rL   _lengthnp_closer   r   hlihlshlvzzizzszzvzzdr   r    dev_propsdatadfs                            r*   zigzagri      s   ^ r"DQhGD'"D
3
 C|s{w'<<=i-IfFh&HE$q&M"" mmos||~VG!'648MCc+Cc9ES#s'S#yAS#s!#sCgllCE5# {UF#UF#3gvgvGV 6VH%t4VH%t4

6(#T
2 2dV$F
&E
&E
&CD
 
4tzz	*BvhBGBKIr,   )NNNNN)numbar   numpyr   r   r   r   r   pandasr	   r
   pandas_ta._typingr   r   r   pandas_ta.utilsr   r   r   r   r+   r;   r=   rE   r   boolri    r,   r*   <module>rq      s     5 5 $ 5 5  D> >B DRB RBl DAB ABL D) ), 04CGj
jj&,j
j!)j<@j j #+jr,   