Ë
    �V.j¢ì  ã                   óº  — d Z ddlZddlZddlmZmZmZm	Z	  G d„ de«      Z
 G d„ de«      Z G d„ d	e«      Z G d
„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d „ d!e«      Zd?d"„Zd?d#„Zd@d$„ZdAd%„ZdBd&„ZdBd'„ZdCd(„ZdCd)„Z dCd*„Z!dCd+„Z"dCd,„Z#dDd-„Z$dEd.„Z%dFd/„Z&dGd0„Z'	 	 	 	 	 	 	 	 	 dHd1„Z(	 dId2„Z)	 	 	 	 	 	 	 	 	 	 dJd3„Z*	 dKd4ejV                  fd5„Z,	 dKd4ejV                  fd6„Z-dKd7„Z.dLd8„Z/dMd9„Z0dMd:„Z1dNd;„Z2dNd<„Z3dNd=„Z4dNd>„Z5y)Ozg
.. module:: trend
   :synopsis: Trend Indicators.

.. moduleauthor:: Dario Lopez Padial (Bukosabino)

é    N)ÚIndicatorMixinÚ_emaÚ_get_min_maxÚ_smac            	       óº   — e Zd ZdZ	 ddej
                  dej
                  dedefd„Zd„ Z	dej
                  fd	„Z
dej
                  fd
„Zdej
                  fd„Zy)ÚAroonIndicatoraÞ  Aroon Indicator

    Identify when trends are likely to change direction.

    Aroon Up = ((N - Days Since N-day High) / N) x 100
    Aroon Down = ((N - Days Since N-day Low) / N) x 100
    Aroon Indicator = Aroon Up - Aroon Down

    https://www.investopedia.com/terms/a/aroon.asp

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.
    ÚhighÚlowÚwindowÚfillnac                 ó\   — || _         || _        || _        || _        | j	                  «        y ©N)Ú_highÚ_lowÚ_windowÚ_fillnaÚ_run)Úselfr	   r
   r   r   s        úJC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\ta/trend.pyÚ__init__zAroonIndicator.__init__    s)   € ð ˆŒ
ØˆŒ	ØˆŒØˆŒØ�	‰	�ó    c                 óT  ‡ — ‰ j                   rdn‰ j                  dz   }‰ j                  j                  ‰ j                  dz   |¬«      }|j	                  ˆ fd„d¬«      ‰ _        ‰ j                  j                  ‰ j                  dz   |¬«      }|j	                  ˆ fd„d¬«      ‰ _        y )Né   ©Úmin_periodsc                 ó`   •— t        t        j                  | «      «      ‰j                  z  dz  S ©Néd   )ÚfloatÚnpÚargmaxr   ©Úxr   s    €r   Ú<lambda>z%AroonIndicator._run.<locals>.<lambda>/   ó    ø€ ”eœBŸI™I a›LÓ)¨D¯L©LÑ8¸3Ò>r   T©Úrawc                 ó`   •— t        t        j                  | «      «      ‰j                  z  dz  S r   )r   r    Úargminr   r"   s    €r   r$   z%AroonIndicator._run.<locals>.<lambda>4   r%   r   )r   r   r   ÚrollingÚapplyÚ	_aroon_upr   Ú_aroon_down)r   r   Úrolling_highÚrolling_lows   `   r   r   zAroonIndicator._run)   s˜   ø€ àŸ<š<‘a¨T¯\©\¸AÑ-=ˆà—z‘z×)Ñ)¨$¯,©,¸Ñ*:ÈÐ)ÓTˆØ%×+Ñ+Û>ÀDð ,ó 
ˆŒð —i‘i×'Ñ'¨¯©°qÑ(8ÀkÐ'ÓRˆØ&×,Ñ,Û>ÀDð -ó 
ˆÕr   Úreturnc                 ó„   — | j                  | j                  d¬«      }t        j                  |d| j                  › �¬«      S )z]Aroon Up Channel

        Returns:
            pandas.Series: New feature generated.
        r   ©ÚvalueÚ	aroon_up_©Úname)Ú_check_fillnar,   ÚpdÚSeriesr   )r   Úaroon_up_seriess     r   Úaroon_upzAroonIndicator.aroon_up7   s9   € ð ×,Ñ,¨T¯^©^À1Ð,ÓEˆÜ�y‰y˜°¸4¿<¹<¸.Ð/IÔJÐJr   c                 ó„   — | j                  | j                  d¬«      }t        j                  |d| j                  › �¬«      S )z_Aroon Down Channel

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úaroon_down_r5   )r7   r-   r8   r9   r   )r   Úaroon_down_seriess     r   Ú
aroon_downzAroonIndicator.aroon_down@   s=   € ð !×.Ñ.¨t×/?Ñ/?ÀqÐ.ÓIÐÜ�y‰yÐ*°;¸t¿|¹|¸nÐ1MÔNÐNr   c                 ó¢   — | j                   | j                  z
  }| j                  |d¬«      }t        j                  |d| j
                  › �¬«      S )z\Aroon Indicator

        Returns:
            pandas.Series: New feature generated.
        r   r2   Ú
aroon_ind_r5   )r,   r-   r7   r8   r9   r   )r   Ú
aroon_diffs     r   Úaroon_indicatorzAroonIndicator.aroon_indicatorI   sI   € ð —^‘^ d×&6Ñ&6Ñ6ˆ
Ø×'Ñ'¨
¸!Ð'Ó<ˆ
Ü�y‰y˜¨J°t·|±|°nÐ*EÔFÐFr   N©é   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   r9   ÚintÚboolr   r   r;   r?   rC   © r   r   r   r      sv   „ ñð$ QVñØ—I‘IðØ$&§I¡IðØ7:ðØIMóò
ðK˜"Ÿ)™)ó KðO˜BŸI™Ió OðG §¡ô Gr   r   c                   ó°   — e Zd ZdZ	 	 	 	 ddej
                  dedededef
d„Zd„ Z	d	ej
                  fd
„Z
d	ej
                  fd„Zd	ej
                  fd„Zy)ÚMACDa  Moving Average Convergence Divergence (MACD)

    Is a trend-following momentum indicator that shows the relationship between
    two moving averages of prices.

    https://school.stockcharts.com/doku.php?id=technical_indicators:moving_average_convergence_divergence_macd

    Args:
        close(pandas.Series): dataset 'Close' column.
        window_fast(int): n period short-term.
        window_slow(int): n period long-term.
        window_sign(int): n period to signal.
        fillna(bool): if True, fill nan values.
    ÚcloseÚwindow_slowÚwindow_fastÚwindow_signr   c                 ój   — || _         || _        || _        || _        || _        | j                  «        y r   )Ú_closeÚ_window_slowÚ_window_fastÚ_window_signr   r   )r   rO   rP   rQ   rR   r   s         r   r   zMACD.__init__d   s3   € ð ˆŒØ'ˆÔØ'ˆÔØ'ˆÔØˆŒØ�	‰	�r   c                 óœ  — t        | j                  | j                  | j                  «      | _        t        | j                  | j
                  | j                  «      | _        | j                  | j                  z
  | _        t        | j                  | j                  | j                  «      | _	        | j                  | j                  z
  | _
        y r   )r   rT   rV   r   Ú_emafastrU   Ú_emaslowÚ_macdrW   Ú_macd_signalÚ
_macd_diff)r   s    r   r   z	MACD._runs   s‡   € Ü˜TŸ[™[¨$×*;Ñ*;¸T¿\¹\ÓJˆŒÜ˜TŸ[™[¨$×*;Ñ*;¸T¿\¹\ÓJˆŒØ—]‘] T§]¡]Ñ2ˆŒ
Ü  §¡¨T×->Ñ->ÀÇÁÓMˆÔØŸ*™* t×'8Ñ'8Ñ8ˆ�r   r0   c                 óž   — | j                  | j                  d¬«      }t        j                  |d| j                  › d| j
                  › �¬«      S )zVMACD Line

        Returns:
            pandas.Series: New feature generated.
        r   r2   ÚMACD_Ú_r5   )r7   r[   r8   r9   rV   rU   )r   Úmacd_seriess     r   Úmacdz	MACD.macdz   sN   € ð ×(Ñ(¨¯©¸1Ð(Ó=ˆÜ�y‰yØ  d×&7Ñ&7Ð%8¸¸$×:KÑ:KÐ9LÐMô
ð 	
r   c                 óž   — | j                  | j                  d¬«      }t        j                  |d| j                  › d| j
                  › �¬«      S )zXSignal Line

        Returns:
            pandas.Series: New feature generated.
        r   r2   Ú
MACD_sign_r`   r5   )r7   r\   r8   r9   rV   rU   )r   Úmacd_signal_seriess     r   Úmacd_signalzMACD.macd_signal…   sR   € ð "×/Ñ/°×0AÑ0AÈÐ/ÓKÐÜ�y‰yØØ˜d×/Ñ/Ð0°°$×2CÑ2CÐ1DÐEô
ð 	
r   c                 óž   — | j                  | j                  d¬«      }t        j                  |d| j                  › d| j
                  › �¬«      S )z[MACD Histogram

        Returns:
            pandas.Series: New feature generated.
        r   r2   Ú
MACD_diff_r`   r5   )r7   r]   r8   r9   rV   rU   )r   Úmacd_diff_seriess     r   Ú	macd_diffzMACD.macd_diff’   sO   € ð  ×-Ñ-¨d¯o©oÀQÐ-ÓGÐÜ�y‰yØ Z°×0AÑ0AÐ/BÀ!ÀD×DUÑDUÐCVÐ#Wô
ð 	
r   N©é   é   é	   F)rF   rG   rH   rI   r8   r9   rJ   rK   r   r   rb   rf   rj   rL   r   r   rN   rN   T   sƒ   „ ñð$ ØØØñà�y‰yðð ðð ð	ð
 ðð óò9ð	
�b—i‘ió 	
ð
˜RŸY™Yó 
ð	
˜2Ÿ9™9ô 	
r   rN   c                   óZ   — e Zd ZdZd	dej
                  dedefd„Zdej
                  fd„Z	y)
ÚEMAIndicatorzµEMA - Exponential Moving Average

    Args:
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.
    rO   r   r   c                 ó.   — || _         || _        || _        y r   ©rT   r   r   ©r   rO   r   r   s       r   r   zEMAIndicator.__init__§   ó   € ØˆŒØˆŒØˆ�r   r0   c                 ó    — t        | j                  | j                  | j                  «      }t	        j
                  |d| j                  › �¬«      S )zmExponential Moving Average (EMA)

        Returns:
            pandas.Series: New feature generated.
        Úema_r5   )r   rT   r   r   r8   r9   )r   rv   s     r   Úema_indicatorzEMAIndicator.ema_indicator¬   ó:   € ô �D—K‘K §¡¨t¯|©|Ó<ˆÜ�y‰y˜ d¨4¯<©<¨.Ð$9Ô:Ð:r   N©é   F)
rF   rG   rH   rI   r8   r9   rJ   rK   r   rw   rL   r   r   rp   rp   ž   s5   „ ññ˜bŸi™ið °ð À4ó ð
;˜rŸy™yô ;r   rp   c                   óZ   — e Zd ZdZd	dej
                  dedefd„Zdej
                  fd„Z	y)
ÚSMAIndicatorz°SMA - Simple Moving Average

    Args:
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.
    rO   r   r   c                 ó.   — || _         || _        || _        y r   rr   rs   s       r   r   zSMAIndicator.__init__¿   rt   r   r0   c                 ó    — t        | j                  | j                  | j                  «      }t	        j
                  |d| j                  › �¬«      S )zhSimple Moving Average (SMA)

        Returns:
            pandas.Series: New feature generated.
        Úsma_r5   )r   rT   r   r   r8   r9   )r   r   s     r   Úsma_indicatorzSMAIndicator.sma_indicatorÄ   rx   r   N)F)
rF   rG   rH   rI   r8   r9   rJ   rK   r   r€   rL   r   r   r|   r|   ¶   s5   „ ññ˜bŸi™ið °ð ¸dó ð
;˜rŸy™yô ;r   r|   c                   ó`   — e Zd ZdZd
dej
                  dedefd„Zd„ Z	dej
                  fd„Z
y	)ÚWMAIndicatorz²WMA - Weighted Moving Average

    Args:
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.
    rO   r   r   c                 óN   — || _         || _        || _        | j                  «        y r   ©rT   r   r   r   rs   s       r   r   zWMAIndicator.__init__×   ó    € ØˆŒØˆŒØˆŒØ�	‰	�r   c           	      óJ  — t        j                  t        d| j                  dz   «      D �cg c]$  }|dz  | j                  | j                  dz   z  z  ‘Œ& c}«      }d„ }| j                  j                  | j                  «      j                   ||«      d¬«      | _        y c c}w )Nr   é   c                 ó   ‡ — ˆ fd„}|S )Nc                 ó*   •— ‰| z  j                  «       S r   )Úsum)r#   Úweights    €r   Ú_weighted_averagezFWMAIndicator._run.<locals>.weighted_average.<locals>._weighted_averageæ   s   ø€ Ø ™
×'Ñ'Ó)Ð)r   rL   )r‹   rŒ   s   ` r   Úweighted_averagez+WMAIndicator._run.<locals>.weighted_averageå   s   ø€ ô*ð %Ð$r   Tr&   )r8   r9   Úranger   rT   r*   r+   Ú_wma)r   ÚiÚ_weightr�   s       r   r   zWMAIndicator._runÝ   s˜   € Ü—)‘)ô ˜q $§,¡,°Ñ"2Ô3óá3�Að �A‘˜Ÿ™¨¯©¸Ñ)9Ñ:Ó;Ø3ñó
ˆò	%ð —K‘K×'Ñ'¨¯©Ó5×;Ñ;Ù˜WÓ%¨4ð <ó 
ˆ�	ùòs   «)B r0   c                 ó„   — | j                  | j                  d¬«      }t        j                  |d| j                  › �¬«      S )zjWeighted Moving Average (WMA)

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úwma_r5   )r7   r�   r8   r9   r   )r   Úwmas     r   r”   zWMAIndicator.wmaï   s9   € ð × Ñ  §¡°!Ð Ó4ˆÜ�y‰y˜ T¨$¯,©,¨Ð#8Ô9Ð9r   N©rn   F)rF   rG   rH   rI   r8   r9   rJ   rK   r   r   r”   rL   r   r   r‚   r‚   Î   s:   „ ññ˜bŸi™ið °ð À$ó ò
ð$:�R—Y‘Yô :r   r‚   c                   ó`   — e Zd ZdZd
dej
                  dedefd„Zd„ Z	dej
                  fd„Z
y	)ÚTRIXIndicatoraS  Trix (TRIX)

    Shows the percent rate of change of a triple exponentially smoothed moving
    average.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:trix

    Args:
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.
    rO   r   r   c                 óN   — || _         || _        || _        | j                  «        y r   r„   rs   s       r   r   zTRIXIndicator.__init__  r…   r   c                 óž  — t        | j                  | j                  | j                  «      }t        || j                  | j                  «      }t        || j                  | j                  «      }||j	                  d|j                  «       ¬«      z
  |j	                  d|j                  «       ¬«      z  | _        | xj                  dz  c_        y )Nr   ©Ú
fill_valuer   )r   rT   r   r   ÚshiftÚmeanÚ_trix)r   Úema1Úema2Úema3s       r   r   zTRIXIndicator._run  sš   € Ü�D—K‘K §¡¨t¯|©|Ó<ˆÜ�D˜$Ÿ,™,¨¯©Ó5ˆÜ�D˜$Ÿ,™,¨¯©Ó5ˆØ˜TŸZ™Z¨°d·i±i³k˜ZÓBÑBÀdÇjÁjØ˜$Ÿ)™)›+ð GQó G
ñ 
ˆŒ
ð 	�
Š
�cÑŽ
r   r0   c                 ó„   — | j                  | j                  d¬«      }t        j                  |d| j                  › �¬«      S )zXTrix (TRIX)

        Returns:
            pandas.Series: New feature generated.
        r   r2   Útrix_r5   )r7   rž   r8   r9   r   )r   Útrix_seriess     r   ÚtrixzTRIXIndicator.trix  s9   € ð ×(Ñ(¨¯©¸1Ð(Ó=ˆÜ�y‰y˜¨U°4·<±<°.Ð+AÔBÐBr   N©é   F)rF   rG   rH   rI   r8   r9   rJ   rK   r   r   r¥   rL   r   r   r—   r—   ù   s<   „ ññ˜bŸi™ið °ð À4ó òðC�b—i‘iô Cr   r—   c                   ó‚   — e Zd ZdZ	 	 	 ddej
                  dej
                  dededef
d„Zd„ Z	d	ej
                  fd
„Z
y)Ú	MassIndexa  Mass Index (MI)

    It uses the high-low range to identify trend reversals based on range
    expansions. It identifies range bulges that can foreshadow a reversal of
    the current trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:mass_index

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window_fast(int): fast period value.
        window_slow(int): slow period value.
        fillna(bool): if True, fill nan values.
    r	   r
   rQ   rP   r   c                 ój   — || _         || _        || _        || _        || _        | j                  «        y r   )r   r   rV   rU   r   r   )r   r	   r
   rQ   rP   r   s         r   r   zMassIndex.__init__1  s2   € ð ˆŒ
ØˆŒ	Ø'ˆÔØ'ˆÔØˆŒØ�	‰	�r   c                 óX  — | j                   rdn| j                  }| j                  | j                  z
  }t	        || j
                  | j                   «      }t	        || j
                  | j                   «      }||z  }|j                  | j                  |¬«      j                  «       | _        y )Nr   r   )	r   rU   r   r   r   rV   r*   rŠ   Ú_mass)r   r   Ú	amplituderŸ   r    Úmasss         r   r   zMassIndex._run@  sƒ   € ØŸ<š<‘a¨T×->Ñ->ˆØ—J‘J §¡Ñ*ˆ	Ü�I˜t×0Ñ0°$·,±,Ó?ˆÜ�D˜$×+Ñ+¨T¯\©\Ó:ˆØ�d‰{ˆØ—\‘\ $×"3Ñ"3À�\ÓM×QÑQÓSˆ�
r   r0   c                 óž   — | j                  | j                  d¬«      }t        j                  |d| j                  › d| j
                  › �¬«      S )z\Mass Index (MI)

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úmass_index_r`   r5   )r7   r¬   r8   r9   rV   rU   )r   r®   s     r   Ú
mass_indexzMassIndex.mass_indexH  sN   € ð ×!Ñ! $§*¡*°AÐ!Ó6ˆÜ�y‰yØ˜ T×%6Ñ%6Ð$7°q¸×9JÑ9JÐ8KÐLô
ð 	
r   N©rn   rE   F)rF   rG   rH   rI   r8   r9   rJ   rK   r   r   r±   rL   r   r   r©   r©      se   „ ñð( ØØñà�i‰iðð �Y‰Yðð ð	ð
 ðð óòTð	
˜BŸI™Iô 	
r   r©   c                   óî   — e Zd ZdZ	 	 	 	 	 ddej
                  dej
                  dededededefd	„Zd
„ Z	dej
                  fd„Z
dej
                  fd„Zdej
                  fd„Zdej
                  fd„Zy)ÚIchimokuIndicatoruÈ  Ichimoku KinkÅ� HyÅ� (Ichimoku)

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ichimoku_cloud

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window1(int): n1 low period.
        window2(int): n2 medium period.
        window3(int): n3 high period.
        visual(bool): if True, shift n2 values.
        fillna(bool): if True, fill nan values.
    r	   r
   Úwindow1Úwindow2Úwindow3Úvisualr   c                 ó†   — || _         || _        || _        || _        || _        || _        || _        | j                  «        y r   )r   r   Ú_window1Ú_window2Ú_window3Ú_visualr   r   )r   r	   r
   rµ   r¶   r·   r¸   r   s           r   r   zIchimokuIndicator.__init__c  s>   € ð ˆŒ
ØˆŒ	ØˆŒØˆŒØˆŒØˆŒØˆŒØ�	‰	�r   c                 ó8  — | j                   rdn| j                  }| j                   rdn| j                  }d| j                  j	                  | j                  |¬«      j                  «       | j                  j	                  | j                  |¬«      j                  «       z   z  | _        d| j                  j	                  | j                  |¬«      j                  «       | j                  j	                  | j                  |¬«      j                  «       z   z  | _	        y )Nr   ç      à?r   )
r   rº   r»   r   r*   Úmaxr   ÚminÚ_convÚ_base)r   Úmin_periods_n1Úmin_periods_n2s      r   r   zIchimokuIndicator._runv  sÚ   € Ø"Ÿlšl™°·±ˆØ"Ÿlšl™°·±ˆØØ�J‰J×Ñ˜tŸ}™}¸.ÐÓI×MÑMÓOØ�i‰i×Ñ §¡¸>ÐÓJ×NÑNÓPñQñ
ˆŒ
ð Ø�J‰J×Ñ˜tŸ}™}¸.ÐÓI×MÑMÓOØ�i‰i×Ñ §¡¸>ÐÓJ×NÑNÓPñQñ
ˆ�
r   r0   c                 óž   — | j                  | j                  d¬«      }t        j                  |d| j                  › d| j
                  › �¬«      S )ziTenkan-sen (Conversion Line)

        Returns:
            pandas.Series: New feature generated.
        éÿÿÿÿr2   Úichimoku_conv_r`   r5   )r7   rÂ   r8   r9   rº   r»   )r   Ú
conversions     r   Úichimoku_conversion_linez*IchimokuIndicator.ichimoku_conversion_line‚  sH   € ð ×'Ñ'¨¯
©
¸"Ð'Ó=ˆ
Ü�y‰yØ˜~¨d¯m©m¨_¸A¸d¿m¹m¸_ÐMô
ð 	
r   c                 óž   — | j                  | j                  d¬«      }t        j                  |d| j                  › d| j
                  › �¬«      S )zbKijun-sen (Base Line)

        Returns:
            pandas.Series: New feature generated.
        rÇ   r2   Úichimoku_base_r`   r5   )r7   rÃ   r8   r9   rº   r»   )r   Úbases     r   Úichimoku_base_linez$IchimokuIndicator.ichimoku_base_line�  sC   € ð ×!Ñ! $§*¡*°BÐ!Ó7ˆÜ�y‰y˜ n°T·]±]°OÀ1ÀTÇ]Á]ÀOÐ$TÔUÐUr   c                 ó4  — d| j                   | j                  z   z  }| j                  r+|j                  | j                  |j                  «       ¬«      n|}| j                  |d¬«      }t        j                  |d| j                  › d| j                  › �¬«      S )zkSenkou Span A (Leading Span A)

        Returns:
            pandas.Series: New feature generated.
        r¿   rš   rÇ   r2   Úichimoku_a_r`   r5   )
rÂ   rÃ   r½   rœ   r»   r�   r7   r8   r9   rº   )r   Úspanas     r   Ú
ichimoku_azIchimokuIndicator.ichimoku_a–  s…   € ð �t—z‘z D§J¡JÑ.Ñ/ˆð �|Š|ð �K‰K˜Ÿ™°%·*±*³,ˆKÔ?àð 	ð
 ×"Ñ" 5°Ð"Ó3ˆÜ�y‰y˜ {°4·=±=°/ÀÀ4Ç=Á=À/Ð%RÔSÐSr   c                 óØ  — d| j                   j                  | j                  d¬«      j                  «       | j                  j                  | j                  d¬«      j                  «       z   z  }| j                  r+|j                  | j                  |j                  «       ¬«      n|}| j                  |d¬«      }t        j                  |d| j                  › d| j                  › �¬	«      S )
zkSenkou Span B (Leading Span B)

        Returns:
            pandas.Series: New feature generated.
        r¿   r   r   rš   rÇ   r2   Úichimoku_b_r`   r5   )r   r*   r¼   rÀ   r   rÁ   r½   rœ   r»   r�   r7   r8   r9   rº   )r   Úspanbs     r   Ú
ichimoku_bzIchimokuIndicator.ichimoku_b¥  sÆ   € ð Ø�J‰J×Ñ˜tŸ}™}¸!ÐÓ<×@Ñ@ÓBØ�i‰i×Ñ §¡¸1ÐÓ=×AÑAÓCñDñ
ˆð �|Š|ð �K‰K˜Ÿ™°%·*±*³,ˆKÔ?àð 	ð
 ×"Ñ" 5°Ð"Ó3ˆÜ�y‰y˜ {°4·=±=°/ÀÀ4Ç=Á=À/Ð%RÔSÐSr   N)rn   rl   é4   FF)rF   rG   rH   rI   r8   r9   rJ   rK   r   r   rÊ   rÎ   rÒ   rÖ   rL   r   r   r´   r´   T  s´   „ ñð$ ØØØØñà�i‰iðð �Y‰Yðð ð	ð
 ðð ðð ðð óò&

ð	
¨"¯)©)ó 	
ðV B§I¡Ió VðT˜BŸI™Ió TðT˜BŸI™Iô Tr   r´   c                   óÔ   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddej
                  dedededededed	ed
ededefd„Zd„ Z	dej
                  fd„Z
dej
                  fd„Zdej
                  fd„Zy)ÚKSTIndicatora@  KST Oscillator (KST Signal)

    It is useful to identify major stock market cycle junctures because its
    formula is weighed to be more greatly influenced by the longer and more
    dominant time spans, in order to better reflect the primary swings of stock
    market cycle.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:know_sure_thing_kst

    Args:
        close(pandas.Series): dataset 'Close' column.
        roc1(int): roc1 period.
        roc2(int): roc2 period.
        roc3(int): roc3 period.
        roc4(int): roc4 period.
        window1(int): n1 smoothed period.
        window2(int): n2 smoothed period.
        window3(int): n3 smoothed period.
        window4(int): n4 smoothed period.
        nsig(int): n period to signal.
        fillna(bool): if True, fill nan values.
    rO   Úroc1Úroc2Úroc3Úroc4rµ   r¶   r·   Úwindow4Únsigr   c                 ó¾   — || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        | j                  «        y r   )rT   Ú_r1Ú_r2Ú_r3Ú_r4rº   r»   r¼   Ú_window4Ú_nsigr   r   )r   rO   rÚ   rÛ   rÜ   rÝ   rµ   r¶   r·   rÞ   rß   r   s               r   r   zKSTIndicator.__init__Ð  sZ   € ð ˆŒØˆŒØˆŒØˆŒØˆŒØˆŒØˆŒØˆŒØˆŒØˆŒ
ØˆŒØ�	‰	�r   c                 ó(  — | j                   rdn| j                  }| j                   rdn| j                  }| j                   rdn| j                  }| j                   rdn| j                  }| j
                  | j
                  j                  | j                  | j
                  j                  «       ¬«      z
  | j
                  j                  | j                  | j
                  j                  «       ¬«      z  j                  | j                  |¬«      j                  «       }| j
                  | j
                  j                  | j                  | j
                  j                  «       ¬«      z
  | j
                  j                  | j                  | j
                  j                  «       ¬«      z  j                  | j                  |¬«      j                  «       }| j
                  | j
                  j                  | j                  | j
                  j                  «       ¬«      z
  | j
                  j                  | j                  | j
                  j                  «       ¬«      z  j                  | j                  |¬«      j                  «       }| j
                  | j
                  j                  | j                  | j
                  j                  «       ¬«      z
  | j
                  j                  | j                  | j
                  j                  «       ¬«      z  j                  | j                  |¬«      j                  «       }d|d|z  z   d|z  z   d|z  z   z  | _        | j                  j                  | j                  d¬«      j                  «       | _        y )Nr   rš   r   r   r‡   é   é   )r   rº   r»   r¼   rå   rT   rœ   rá   r�   r*   râ   rã   rä   Ú_kstræ   Ú_kst_sig)	r   rÄ   rÅ   Úmin_periods_n3Úmin_periods_n4Úrocma1Úrocma2Úrocma3Úrocma4s	            r   r   zKSTIndicator._runë  s³  € Ø"Ÿlšl™°·±ˆØ"Ÿlšl™°·±ˆØ"Ÿlšl™°·±ˆØ"Ÿlšl™°·±ˆð —K‘KØ—k‘k×'Ñ'¨¯©¸T¿[¹[×=MÑ=MÓ=OÐ'ÓPñQð —+‘+×#Ñ# D§H¡H¸¿¹×9IÑ9IÓ9KÐ#ÓLñ	M÷ ‰W�T—]‘]°ˆWÓ?ß‰T‹Vð 	ð —K‘KØ—k‘k×'Ñ'¨¯©¸T¿[¹[×=MÑ=MÓ=OÐ'ÓPñQð —+‘+×#Ñ# D§H¡H¸¿¹×9IÑ9IÓ9KÐ#ÓLñ	M÷ ‰W�T—]‘]°ˆWÓ?ß‰T‹Vð 	ð —K‘KØ—k‘k×'Ñ'¨¯©¸T¿[¹[×=MÑ=MÓ=OÐ'ÓPñQð —+‘+×#Ñ# D§H¡H¸¿¹×9IÑ9IÓ9KÐ#ÓLñ	M÷ ‰W�T—]‘]°ˆWÓ?ß‰T‹Vð 	ð —K‘KØ—k‘k×'Ñ'¨¯©¸T¿[¹[×=MÑ=MÓ=OÐ'ÓPñQð —+‘+×#Ñ# D§H¡H¸¿¹×9IÑ9IÓ9KÐ#ÓLñ	M÷ ‰W�T—]‘]°ˆWÓ?ß‰T‹Vð 	ð ˜6 A¨¡JÑ.°°V±Ñ;¸aÀ&¹jÑHÑIˆŒ	ØŸ	™	×)Ñ)¨$¯*©*À!Ð)ÓD×IÑIÓKˆ�r   r0   c                 ój   — | j                  | j                  d¬«      }t        j                  |d¬«      S )zbKnow Sure Thing (KST)

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úkstr5   )r7   rê   r8   r9   )r   Ú
kst_seriess     r   ró   zKSTIndicator.kst  ó.   € ð ×'Ñ'¨¯	©	¸Ð'Ó;ˆ
Ü�y‰y˜¨%Ô0Ð0r   c                 ój   — | j                  | j                  d¬«      }t        j                  |d¬«      S )zŽSignal Line Know Sure Thing (KST)

        nsig-period SMA of KST

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úkst_sigr5   )r7   rë   r8   r9   )r   Úkst_sig_seriess     r   r÷   zKSTIndicator.kst_sig(  s.   € ð ×+Ñ+¨D¯M©MÀÐ+ÓCˆÜ�y‰y˜¨iÔ8Ð8r   c                 óˆ   — | j                   | j                  z
  }| j                  |d¬«      }t        j                  |d¬«      S )z�Diff Know Sure Thing (KST)

        KST - Signal_KST

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úkst_diffr5   )rê   rë   r7   r8   r9   )r   rú   s     r   rú   zKSTIndicator.kst_diff3  s<   € ð —9‘9˜tŸ}™}Ñ,ˆØ×%Ñ% h°aÐ%Ó8ˆÜ�y‰y˜¨
Ô3Ð3r   N©
é
   r§   é   é   rü   rü   rü   r§   rn   F)rF   rG   rH   rI   r8   r9   rJ   rK   r   r   ró   r÷   rú   rL   r   r   rÙ   rÙ   ¸  sÓ   „ ñð4 ØØØØØØØØØñà�y‰yðð ðð ð	ð
 ðð ðð ðð ðð ðð ðð ðð óò62Lðh1�R—Y‘Yó 1ð	9˜Ÿ™ó 	9ð
4˜"Ÿ)™)ô 
4r   rÙ   c                   ó`   — e Zd ZdZd
dej
                  dedefd„Zd„ Z	dej
                  fd„Z
y	)ÚDPOIndicatora  Detrended Price Oscillator (DPO)

    Is an indicator designed to remove trend from price and make it easier to
    identify cycles.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:detrended_price_osci

    Args:
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.
    rO   r   r   c                 óN   — || _         || _        || _        | j                  «        y r   r„   rs   s       r   r   zDPOIndicator.__init__N  r…   r   c                 óJ  — | j                   rdn| j                  }| j                  j                  t	        d| j                  z  dz   «      | j                  j                  «       ¬«      | j                  j                  | j                  |¬«      j                  «       z
  | _        y )Nr   r¿   r   rš   r   )r   r   rT   rœ   rJ   r�   r*   Ú_dpo)r   r   s     r   r   zDPOIndicator._runT  s‚   € ØŸ<š<‘a¨T¯\©\ˆà�K‰K×ÑÜ�S˜4Ÿ<™<Ñ'¨1Ñ,Ó-¸$¿+¹+×:JÑ:JÓ:Lð ó ð �k‰k×!Ñ! $§,¡,¸KÐ!ÓH×MÑMÓOñPð 	�	r   r0   c                 ó–   — | j                  | j                  d¬«      }t        j                  |dt	        | j
                  «      z   ¬«      S )zmDetrended Price Oscillator (DPO)

        Returns:
            pandas.Series: New feature generated.
        r   r2   Údpo_r5   )r7   r  r8   r9   Ústrr   )r   Ú
dpo_seriess     r   ÚdpozDPOIndicator.dpo]  s<   € ð ×'Ñ'¨¯	©	¸Ð'Ó;ˆ
Ü�y‰y˜¨&´3°t·|±|Ó3DÑ*DÔEÐEr   N©rý   F)rF   rG   rH   rI   r8   r9   rJ   rK   r   r   r  rL   r   r   r   r   @  s<   „ ññ˜bŸi™ið °ð À4ó ò
ðF�R—Y‘Yô Fr   r   c                   óš   — e Zd ZdZ	 	 	 ddej
                  dej
                  dej
                  dededefd„Z	d	„ Z
d
ej
                  fd„Zy)ÚCCIIndicatoraä  Commodity Channel Index (CCI)

    CCI measures the difference between a security's price change and its
    average price change. High positive readings indicate that prices are well
    above their average, which is a show of strength. Low negative readings
    indicate that prices are well below their average, which is a show of
    weakness.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:commodity_channel_index_cci

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        constant(int): constant.
        fillna(bool): if True, fill nan values.
    r	   r
   rO   r   Úconstantr   c                 óx   — || _         || _        || _        || _        || _        || _        | j                  «        y r   )r   r   rT   r   Ú	_constantr   r   )r   r	   r
   rO   r   r  r   s          r   r   zCCIIndicator.__init__{  s7   € ð ˆŒ
ØˆŒ	ØˆŒØˆŒØ!ˆŒØˆŒØ�	‰	�r   c                 ól  — d„ }| j                   rdn| j                  }| j                  | j                  z   | j                  z   dz  }||j                  | j                  |¬«      j                  «       z
  | j                  |j                  | j                  |¬«      j                  |d«      z  z  | _	        y )Nc                 ó~   — t        j                  t        j                  | t        j                  | «      z
  «      «      S r   )r    r�   Úabs)r#   s    r   Ú_madzCCIIndicator._run.<locals>._mad�  s&   € Ü—7‘7œ2Ÿ6™6 !¤b§g¡g¨a£j¡.Ó1Ó2Ð2r   r   g      @r   T)
r   r   r   r   rT   r*   r�   r  r+   Ú_cci)r   r  r   Útypical_prices       r   r   zCCIIndicator._runŒ  s¡   € ò	3ð  Ÿ<š<‘a¨T¯\©\ˆØŸ™ d§i¡iÑ/°$·+±+Ñ=ÀÑDˆàØ×#Ñ# D§L¡L¸kÐ#ÓJ×OÑOÓQñRð �N‰NØ×#Ñ# D§L¡L¸kÐ#ÓJ×PÑPØ�dóññ	
ˆ�	r   r0   c                 ój   — | j                  | j                  d¬«      }t        j                  |d¬«      S )zjCommodity Channel Index (CCI)

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úccir5   )r7   r  r8   r9   )r   Ú
cci_seriess     r   r  zCCIIndicator.cciœ  rõ   r   N©rý   g¸…ëQ¸Ž?F)rF   rG   rH   rI   r8   r9   rJ   r   rK   r   r   r  rL   r   r   r  r  g  sr   „ ñð0 ØØñà�i‰iðð �Y‰Yðð �y‰yð	ð
 ðð ðð óò"
ð 1�R—Y‘Yô 1r   r  c                   óÔ   — e Zd ZdZ	 	 ddej
                  dej
                  dej
                  dedef
d„Zd„ Z	d	ej
                  fd
„Z
d	ej
                  fd„Zd	ej
                  fd„Zy)ÚADXIndicatoraû  Average Directional Movement Index (ADX)

    The Plus Directional Indicator (+DI) and Minus Directional Indicator (-DI)
    are derived from smoothed averages of these differences, and measure trend
    direction over time. These two indicators are often referred to
    collectively as the Directional Movement Indicator (DMI).

    The Average Directional Index (ADX) is in turn derived from the smoothed
    averages of the difference between +DI and -DI, and measures the strength
    of the trend (regardless of direction) over time.

    Using these three indicators together, chartists can determine both the
    direction and strength of the trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_directional_index_adx

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.
    r	   r
   rO   r   r   c                 ój   — || _         || _        || _        || _        || _        | j                  «        y r   ©r   r   rT   r   r   r   ©r   r	   r
   rO   r   r   s         r   r   zADXIndicator.__init__¿  ó0   € ð ˆŒ
ØˆŒ	ØˆŒØˆŒØˆŒØ�	‰	�r   c                 ó�  — | j                   dk(  rt        d«      ‚| j                  j                  d«      }t	        | j
                  |d«      }t	        | j                  |d«      }||z
  }t        j                  | j                   dz
  «      | _	        t        j                  t        | j                  «      | j                   dz
  z
  «      | _        |j                  «       j                  d| j                    j                  «       | j                  d<   |j                  d¬«      }t!        dt        | j                  «      dz
  «      D ]]  }| j                  |dz
     | j                  |dz
     t#        | j                   «      z  z
  || j                   |z      z   | j                  |<   Œ_ | j
                  | j
                  j                  d«      z
  }| j                  j                  d«      | j                  z
  }t%        ||kD  |dkD  z  |z  «      }t%        ||kD  |dkD  z  |z  «      }	t        j                  t        | j                  «      | j                   dz
  z
  «      | _        |j                  «       j                  d| j                    j                  «       | j&                  d<   |j                  d¬«      }t!        dt        | j&                  «      dz
  «      D ]]  }| j&                  |dz
     | j&                  |dz
     t#        | j                   «      z  z
  || j                   |z      z   | j&                  |<   Œ_ t        j                  t        | j                  «      | j                   dz
  z
  «      | _        |	j                  «       j                  d| j                    j                  «       | j(                  d<   |	j                  d¬«      }	t!        dt        | j(                  «      dz
  «      D ]]  }| j(                  |dz
     | j(                  |dz
     t#        | j                   «      z  z
  |	| j                   |z      z   | j(                  |<   Œ_ y )Nr   zwindow may not be 0r   rÀ   rÁ   T)Údrop)r   Ú
ValueErrorrT   rœ   r   r   r   r    ÚzerosÚ_trs_initialÚlenÚ_trsÚdropnaÚilocrŠ   Úreset_indexrŽ   r   r  Ú_dipÚ_din)
r   Úclose_shiftÚpdmÚpdnÚdiff_directional_movementr�   Údiff_upÚ	diff_downÚposÚnegs
             r   r   zADXIndicator._runÎ  s{  € Ø�<‰<˜1ÒÜÐ2Ó3Ð3à—k‘k×'Ñ'¨Ó*ˆä˜4Ÿ:™: {°EÓ:ˆÜ˜4Ÿ9™9 k°5Ó9ˆà$'¨#¡IÐ!äŸH™H T§\¡\°AÑ%5Ó6ˆÔÜ—H‘HœS §¡Ó-°·±ÀÑ1AÑBÓCˆŒ	Ø0×7Ñ7Ó9×>Ñ>¸qÀ4Ç<Á<ÐP×TÑTÓVˆ�	‰	�!‰Ø$=×$IÑ$IÈtÐ$IÓ$TÐ!ä�qœ#˜dŸi™i›.¨1Ñ,Ö-ˆAà—	‘	˜!˜a™%Ñ Ø—9‘9˜Q ™UÑ#¤e¨D¯L©LÓ&9Ñ9ñ;à+¨D¯L©L¸1Ñ,<Ñ=ñ>ð �I‰I�aŠLð .ð —*‘*˜tŸz™z×/Ñ/°Ó2Ñ2ˆØ—I‘I—O‘O AÓ&¨¯©Ñ2ˆ	ä�G˜iÑ'¨G°a©KÑ8¸GÑCÓDˆÜ�I Ñ'¨I¸©MÑ:¸iÑGÓHˆä—H‘HœS §¡Ó-°·±ÀÑ1AÑBÓCˆŒ	Ø—z‘z“|×(Ñ(¨¨T¯\©\Ð:×>Ñ>Ó@ˆ�	‰	�!‰à�o‰o 4ˆoÓ(ˆä�qœ#˜dŸi™i›.¨1Ñ,Ö-ˆAà—	‘	˜!˜a™%Ñ Ø—9‘9˜Q ™UÑ#¤e¨D¯L©LÓ&9Ñ9ñ;à�d—l‘l QÑ&Ñ'ñ(ð �I‰I�aŠLð .ô —H‘HœS §¡Ó-°·±ÀÑ1AÑBÓCˆŒ	Ø—z‘z“|×(Ñ(¨¨T¯\©\Ð:×>Ñ>Ó@ˆ�	‰	�!‰à�o‰o 4ˆoÓ(ˆä�qœ#˜dŸi™i›.¨1Ñ,Ö-ˆAà—	‘	˜!˜a™%Ñ Ø—9‘9˜Q ™UÑ#¤e¨D¯L©LÓ&9Ñ9ñ;à�d—l‘l QÑ&Ñ'ñ(ð �I‰I�aŠLñ .r   r0   c                 ó  — t        j                  t        | j                  «      «      }t	        | j                  «      D ](  \  }}|dk7  rd| j
                  |   |z  z  ||<   Œ$d||<   Œ* t        j                  t        | j                  «      «      }t	        | j                  «      D ](  \  }}|dk7  rd| j                  |   |z  z  ||<   Œ$d||<   Œ* t        j                  t        | j                  «      «      }t        t        | j                  «      «      D ]F  }||   ||   z   dk7  r1dt        j                  ||   ||   z
  ||   ||   z   z  «      z  ||<   ŒBd||<   ŒH t        j                  t        | j                  «      «      }|d| j                   j                  «       || j                  <   t        | j                  dz   t        |«      «      D ]<  }||dz
     | j                  dz
  z  ||dz
     z   t        | j                  «      z  ||<   Œ> t        j                  | j                  |fd¬«      }t        j                  || j                   j"                  ¬«      }| j%                  |d¬«      }t        j                  |d¬	«      S )
znAverage Directional Index (ADX)

        Returns:
            pandas.Series: New feature generated.tr
        r   r   r   )Úaxis)ÚdataÚindexrý   r2   Úadxr5   )r    r"  r$  r%  Ú	enumerater)  r*  rŽ   r  r   r�   r   Úconcatenater#  r8   r9   rT   r6  r7   )r   ÚdipÚidxr3   ÚdinÚdirectional_indexÚ
adx_seriesr�   s           r   r7  zADXIndicator.adx  s?  € ô �h‰h”s˜4Ÿ9™9“~Ó&ˆä# D§I¡IÖ.‰JˆC�Ø˜ŠzØ $§)¡)¨C¡.°5Ñ"8Ñ9��C’ð ��C’ð /ô �h‰h”s˜4Ÿ9™9“~Ó&ˆä# D§I¡IÖ.‰JˆC�Ø˜ŠzØ $§)¡)¨C¡.°5Ñ"8Ñ9��C’ð ��C’ð /ô ŸH™H¤S¨¯©£^Ó4Ðäœ˜TŸY™Y›Ö(ˆCØ�3‰x˜#˜c™(Ñ" aÒ'Ø),¬r¯v©vØ˜‘X  C¡Ñ(¨S°©X¸¸C¹Ñ-@ÑAó0ñ *Ð! #Ò&ð
 *+Ð! #Ò&ð )ô —X‘Xœc $§)¡)›nÓ-ˆ
Ø#4°Q¸¿¹Ð#F×#KÑ#KÓ#Mˆ
�4—<‘<Ñ ä�t—|‘| aÑ'¬¨Z«Ö9ˆAà˜A ™EÑ" d§l¡l°QÑ&6Ñ7Ð;LÈQÐQRÉUÑ;SÑSÜ�d—l‘lÓ#ñ$ˆJ�qŠMð :ô
 —^‘^ T×%6Ñ%6¸
Ð$CÈ!ÔLˆ
Ü—Y‘Y J°d·k±k×6GÑ6GÔHˆ
Ø×'Ñ'¨
¸"Ð'Ó=ˆ
ä�y‰y˜¨%Ô0Ð0r   c                 óô  — t        j                  t        | j                  «      «      }t	        dt        | j
                  «      dz
  «      D ]Y  }| j
                  |   dk7  r3d| j                  |   | j
                  |   z  z  ||| j                  z   <   ŒHd||| j                  z   <   Œ[ | j                  t        j                  || j                  j                  ¬«      d¬«      }t        j                  |d¬«      S )	zmPlus Directional Indicator (+DI)

        Returns:
            pandas.Series: New feature generated.
        r   r   r   ©r6  rý   r2   Úadx_posr5   )r    r"  r$  rT   rŽ   r%  r)  r   r7   r8   r9   r6  )r   r:  r�   Úadx_pos_seriess       r   rA  zADXIndicator.adx_pos4  óÏ   € ô �h‰h”s˜4Ÿ;™;Ó'Ó(ˆä�qœ#˜dŸi™i›.¨1Ñ,Ö-ˆAØ�y‰y˜‰|˜qÒ Ø(+¨t¯y©y¸©|¸d¿i¹iÈ¹lÑ/JÑ(K��A˜Ÿ™Ñ$Ò%ð )*��A˜Ÿ™Ñ$Ò%ð .ð ×+Ñ+Ü�I‰I�c §¡×!2Ñ!2Ô3¸2ð ,ó 
ˆô �y‰y˜¨iÔ8Ð8r   c                 óô  — t        j                  t        | j                  «      «      }t	        dt        | j
                  «      dz
  «      D ]Y  }| j
                  |   dk7  r3d| j                  |   | j
                  |   z  z  ||| j                  z   <   ŒHd||| j                  z   <   Œ[ | j                  t        j                  || j                  j                  ¬«      d¬«      }t        j                  |d¬«      S )	znMinus Directional Indicator (-DI)

        Returns:
            pandas.Series: New feature generated.
        r   r   r   r@  rý   r2   Úadx_negr5   )r    r"  r$  rT   rŽ   r%  r*  r   r7   r8   r9   r6  )r   r<  r�   Úadx_neg_seriess       r   rE  zADXIndicator.adx_negI  rC  r   Nry   )rF   rG   rH   rI   r8   r9   rJ   rK   r   r   r7  rA  rE  rL   r   r   r  r  ¦  s‡   „ ñð: Øñà�i‰iðð �Y‰Yðð �y‰yð	ð
 ðð óò3ðj/1�R—Y‘Yó /1ðb9˜Ÿ™ó 9ð*9˜Ÿ™ô 9r   r  c                   ó†   — e Zd ZdZ	 	 ddej
                  dej
                  dej
                  dedef
d„Zd„ Z	d	„ Z
d
„ Zd„ Zy)ÚVortexIndicatoraH  Vortex Indicator (VI)

    It consists of two oscillators that capture positive and negative trend
    movement. A bullish signal triggers when the positive trend indicator
    crosses above the negative trend indicator or a key level.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:vortex_indicator

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.
    r	   r
   rO   r   r   c                 ój   — || _         || _        || _        || _        || _        | j                  «        y r   r  r  s         r   r   zVortexIndicator.__init__p  r  r   c                 óþ  — | j                   j                  d| j                   j                  «       ¬«      }| j                  | j                  | j
                  |«      }| j                  rdn| j                  }|j                  | j                  |¬«      j                  «       }t        j                  | j                  | j
                  j                  d«      z
  «      }t        j                  | j
                  | j                  j                  d«      z
  «      }|j                  | j                  |¬«      j                  «       |z  | _        |j                  | j                  |¬«      j                  «       |z  | _        y )Nr   rš   r   r   )rT   rœ   r�   Ú_true_ranger   r   r   r   r*   rŠ   r    r  Ú_vipÚ_vin)r   r+  Ú
true_ranger   ÚtrnÚvmpÚvmms          r   r   zVortexIndicator._run  s  € Ø—k‘k×'Ñ'¨°d·k±k×6FÑ6FÓ6HÐ'ÓIˆØ×%Ñ% d§j¡j°$·)±)¸[ÓIˆ
ØŸ<š<‘a¨T¯\©\ˆØ× Ñ  §¡¸;Ð ÓG×KÑKÓMˆÜ�f‰f�T—Z‘Z $§)¡)§/¡/°!Ó"4Ñ4Ó5ˆÜ�f‰f�T—Y‘Y §¡×!1Ñ!1°!Ó!4Ñ4Ó5ˆØ—K‘K §¡¸+�KÓF×JÑJÓLÈsÑRˆŒ	Ø—K‘K §¡¸+�KÓF×JÑJÓLÈsÑRˆ�	r   c                 ój   — | j                  | j                  d¬«      }t        j                  |d¬«      S )zP+VI

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úvipr5   )r7   rL  r8   r9   )r   rS  s     r   Úvortex_indicator_posz$VortexIndicator.vortex_indicator_pos‰  ó.   € ð × Ñ  §¡°!Ð Ó4ˆÜ�y‰y˜ 5Ô)Ð)r   c                 ój   — | j                  | j                  d¬«      }t        j                  |d¬«      S )zP-VI

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úvinr5   )r7   rM  r8   r9   )r   rW  s     r   Úvortex_indicator_negz$VortexIndicator.vortex_indicator_neg’  rU  r   c                 óˆ   — | j                   | j                  z
  }| j                  |d¬«      }t        j                  |d¬«      S )zTDiff VI

        Returns:
            pandas.Series: New feature generated.
        r   r2   Úvidr5   )rL  rM  r7   r8   r9   )r   rZ  s     r   Úvortex_indicator_diffz%VortexIndicator.vortex_indicator_diff›  s<   € ð �i‰i˜$Ÿ)™)Ñ#ˆØ× Ñ  ¨AÐ Ó.ˆÜ�y‰y˜ 5Ô)Ð)r   Nry   )rF   rG   rH   rI   r8   r9   rJ   rK   r   r   rT  rX  r[  rL   r   r   rH  rH  _  se   „ ñð* Øñà�i‰iðð �Y‰Yðð �y‰yð	ð
 ðð óòSò*ò*ó*r   rH  c                   ó  — e Zd ZdZ	 	 	 ddej
                  dej
                  dej
                  dededefd„Zd	„ Z	d
ej
                  fd„Z
d
ej
                  fd„Zd
ej
                  fd„Zd
ej
                  fd„Zd
ej
                  fd„Zy)ÚPSARIndicatora!  Parabolic Stop and Reverse (Parabolic SAR)

    The Parabolic Stop and Reverse, more commonly known as the
    Parabolic SAR,is a trend-following indicator developed by
    J. Welles Wilder. The Parabolic SAR is displayed as a single
    parabolic line (or dots) underneath the price bars in an uptrend,
    and above the price bars in a downtrend.

    https://school.stockcharts.com/doku.php?id=technical_indicators:parabolic_sar

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        step(float): the Acceleration Factor used to compute the SAR.
        max_step(float): the maximum value allowed for the Acceleration Factor.
        fillna(bool): if True, fill nan values.
    r	   r
   rO   ÚstepÚmax_stepr   c                 óx   — || _         || _        || _        || _        || _        || _        | j                  «        y r   )r   r   rT   Ú_stepÚ	_max_stepr   r   )r   r	   r
   rO   r^  r_  r   s          r   r   zPSARIndicator.__init__º  s7   € ð ˆŒ
ØˆŒ	ØˆŒØˆŒ
Ø!ˆŒØˆŒØ�	‰	�r   c                 ó¨  — d}| j                   }| j                  j                  d   }| j                  j                  d   }| j                  j                  «       | _        t        j                  | j                  j                  d¬«      | _
        t        j                  | j                  j                  d¬«      | _        t        dt        | j                  «      «      D �]p  }d}| j                  j                  |   }| j                  j                  |   }|�rn| j                  j                  |dz
     ||| j                  j                  |dz
     z
  z  z   | j                  j                  |<   || j                  j                  |   k  r+d}|| j                  j                  |<   |}| j                   }�n0||kD  r%|}t        || j                   z   | j                  «      }| j                  j                  |dz
     }	| j                  j                  |dz
     }
|
| j                  j                  |   k  r|
| j                  j                  |<   �n—|	| j                  j                  |   k  �rz|	| j                  j                  |<   �n_| j                  j                  |dz
     || j                  j                  |dz
     |z
  z  z
  | j                  j                  |<   || j                  j                  |   kD  r*d}|| j                  j                  |<   |}| j                   }nÃ||k  r%|}t        || j                   z   | j                  «      }| j                  j                  |dz
     }| j                  j                  |dz
     }|| j                  j                  |   kD  r|| j                  |<   n5|| j                  j                  |   kD  r|| j                  j                  |<   ||k7  }|r2| j                  j                  |   | j                  j                  |<   �ŒA| j                  j                  |   | j                  j                  |<   �Œs y )NTr   Úfloat64)r6  Údtyper‡   Fr   )ra  r   r'  r   rT   ÚcopyÚ_psarr8   r9   r6  Ú_psar_upÚ
_psar_downrŽ   r$  rÁ   rb  )r   Úup_trendÚacceleration_factorÚup_trend_highÚdown_trend_lowr�   ÚreversalÚmax_highÚmin_lowÚlow1Úlow2Úhigh1Úhigh2s                r   r   zPSARIndicator._runË  sd  € ØˆØ"Ÿj™jÐØŸ
™
Ÿ™¨Ñ*ˆØŸ™Ÿ™¨Ñ*ˆà—[‘[×%Ñ%Ó'ˆŒ
ÜŸ	™	¨¯
©
×(8Ñ(8À	ÔJˆŒÜŸ)™)¨$¯*©*×*:Ñ*:À)ÔLˆŒä�qœ#˜dŸk™kÓ*×+ˆAØˆHà—z‘z—‘ qÑ)ˆHØ—i‘i—n‘n QÑ'ˆGâØ%)§Z¡Z§_¡_°Q¸±UÑ%;Ø'¨=¸4¿:¹:¿?¹?È1ÈqÉ5Ñ;QÑ+QÑRñ&�—
‘
—‘ Ñ"ð ˜TŸZ™ZŸ_™_¨QÑ/Ò/Ø#�HØ)6�D—J‘J—O‘O AÑ&Ø%,�NØ*.¯*©*Ò'à -Ò/Ø(0˜Ü.1Ø/°$·*±*Ñ<¸d¿n¹nó/Ð+ð  Ÿ9™9Ÿ>™>¨!¨a©%Ñ0�DØŸ9™9Ÿ>™>¨!¨a©%Ñ0�DØ˜dŸj™jŸo™o¨aÑ0Ò0Ø-1˜Ÿ
™
Ÿ™¨Ó*Ø §
¡
§¡°Ñ 2Ó2Ø-1˜Ÿ
™
Ÿ™¨Ó*à%)§Z¡Z§_¡_°Q¸±UÑ%;Ø'¨4¯:©:¯?©?¸1¸q¹5Ñ+AÀNÑ+RÑSñ&�—
‘
—‘ Ñ"ð ˜dŸj™jŸo™o¨aÑ0Ò0Ø#�HØ)7�D—J‘J—O‘O AÑ&Ø$,�MØ*.¯*©*Ñ'à Ò/Ø)0˜Ü.1Ø/°$·*±*Ñ<¸d¿n¹nó/Ð+ð !ŸJ™JŸO™O¨A°©EÑ2�EØ ŸJ™JŸO™O¨A°©EÑ2�EØ˜tŸz™zŸ™¨qÑ1Ò1Ø(-˜Ÿ
™
 1šØ §¡§¡°Ñ!3Ò3Ø-2˜Ÿ
™
Ÿ™¨Ñ*à 8Ñ+ˆHáØ(,¯
©
¯©¸Ñ(:�—‘×"Ñ" 1Ó%à*.¯*©*¯/©/¸!Ñ*<�—‘×$Ñ$ QÓ'ñu ,r   r0   c                 ój   — | j                  | j                  d¬«      }t        j                  |d¬«      S )zWPSAR value

        Returns:
            pandas.Series: New feature generated.
        rÇ   r2   Úpsarr5   )r7   rg  r8   r9   )r   Úpsar_seriess     r   rv  zPSARIndicator.psar  s.   € ð ×(Ñ(¨¯©¸2Ð(Ó>ˆÜ�y‰y˜¨6Ô2Ð2r   c                 ój   — | j                  | j                  d¬«      }t        j                  |d¬«      S )z`PSAR up trend value

        Returns:
            pandas.Series: New feature generated.
        rÇ   r2   Úpsarupr5   )r7   rh  r8   r9   )r   Úpsar_up_seriess     r   Úpsar_upzPSARIndicator.psar_up  s.   € ð ×+Ñ+¨D¯M©MÀÐ+ÓDˆÜ�y‰y˜¨hÔ7Ð7r   c                 ój   — | j                  | j                  d¬«      }t        j                  |d¬«      S )zbPSAR down trend value

        Returns:
            pandas.Series: New feature generated.
        rÇ   r2   Úpsardownr5   )r7   ri  r8   r9   )r   Úpsar_down_seriess     r   Ú	psar_downzPSARIndicator.psar_down#  s0   € ð  ×-Ñ-¨d¯o©oÀRÐ-ÓHÐÜ�y‰yÐ)°
Ô;Ð;r   c                 ó@  — | j                   j                  | j                   j                  «       | j                   j                  d«      j	                  «       z  d«      }|j                  |dk(  d«      }t        j                  || j                  j                  d¬«      S )zjPSAR up trend value indicator

        Returns:
            pandas.Series: New feature generated.
        r   r   Úpsariup©r6  r6   )	rh  ÚwhereÚnotnullrœ   Úisnullr8   r9   rT   r6  ©r   Ú	indicators     r   Úpsar_up_indicatorzPSARIndicator.psar_up_indicator,  sz   € ð —M‘M×'Ñ'Ø�M‰M×!Ñ!Ó# d§m¡m×&9Ñ&9¸!Ó&<×&CÑ&CÓ&EÑEÀqó
ˆ	ð —O‘O I°¡N°AÓ6ˆ	Ü�y‰y˜¨$¯+©+×*;Ñ*;À)ÔLÐLr   c                 ó@  — | j                   j                  | j                  j                  «       | j                  j	                  d«      j                  «       z  d«      }|j                  |dk(  d«      }t        j                  || j                  j                  d¬«      S )zlPSAR down trend value indicator

        Returns:
            pandas.Series: New feature generated.
        r   r   Ú	psaridownr‚  )
rh  rƒ  ri  r„  rœ   r…  r8   r9   rT   r6  r†  s     r   Úpsar_down_indicatorz!PSARIndicator.psar_down_indicator8  sz   € ð —M‘M×'Ñ'Ø�O‰O×#Ñ#Ó%¨¯©×(=Ñ(=¸aÓ(@×(GÑ(GÓ(IÑIÈ1ó
ˆ	ð —O‘O I°¡N°AÓ6ˆ	Ü�y‰y˜¨$¯+©+×*;Ñ*;À+ÔNÐNr   N©g{®Gáz”?gš™™™™™É?F)rF   rG   rH   rI   r8   r9   r   rK   r   r   rv  r{  r  rˆ  r‹  rL   r   r   r]  r]  ¦  s¸   „ ñð0 ØØñà�i‰iðð �Y‰Yðð �y‰yð	ð
 ðð ðð óò"D=ðL3�b—i‘ió 3ð8˜Ÿ™ó 8ð<˜2Ÿ9™9ó <ð
M 2§9¡9ó 
Mð
O R§Y¡Yô 
Or   r]  c                   ób   — e Zd ZdZ	 	 	 	 	 	 ddej
                  dedededededefd	„Zd
„ Z	d„ Z
y)ÚSTCIndicatora:  Schaff Trend Cycle (STC)

    The Schaff Trend Cycle (STC) is a charting indicator that
    is commonly used to identify market trends and provide buy
    and sell signals to traders. Developed in 1999 by noted currency
    trader Doug Schaff, STC is a type of oscillator and is based on
    the assumption that, regardless of time frame, currency trends
    accelerate and decelerate in cyclical patterns.

    https://www.investopedia.com/articles/forex/10/schaff-trend-cycle-indicator.asp

    Args:
        close(pandas.Series): dataset 'Close' column.
        window_fast(int): n period short-term.
        window_slow(int): n period long-term.
        cycle(int): cycle size
        smooth1(int): ema period over stoch_k
        smooth2(int): ema period over stoch_kd
        fillna(bool): if True, fill nan values.
    rO   rP   rQ   ÚcycleÚsmooth1Úsmooth2r   c                 ó†   — || _         || _        || _        || _        || _        || _        || _        | j                  «        y r   )rT   rU   rV   Ú_cycleÚ_smooth1Ú_smooth2r   r   )r   rO   rP   rQ   r�  r�  r‘  r   s           r   r   zSTCIndicator.__init__[  s@   € ð ˆŒØ'ˆÔØ'ˆÔØˆŒØˆŒØˆŒØˆŒØ�	‰	�r   c                 óÐ  — t        | j                  | j                  | j                  «      }t        | j                  | j                  | j                  «      }||z
  }|j                  | j                  ¬«      j                  «       }|j                  | j                  ¬«      j                  «       }d||z
  z  ||z
  z  }t        || j                  | j                  «      }|j                  | j                  ¬«      j                  «       }|j                  | j                  ¬«      j                  «       }	d||z
  z  |	|z
  z  }
t        |
| j                  | j                  «      | _        y )N)r   r   )r   rT   rV   r   rU   r*   r“  rÁ   rÀ   r”  r•  Ú_stc)r   rY   rZ   r[   Ú_macdminÚ_macdmaxÚ_stoch_kÚ_stoch_dÚ_stoch_d_minÚ_stoch_d_maxÚ	_stoch_kds              r   r   zSTCIndicator._runn  s  € Ü˜Ÿ™ T×%6Ñ%6¸¿¹ÓEˆÜ˜Ÿ™ T×%6Ñ%6¸¿¹ÓEˆØ˜8Ñ#ˆà—=‘=¨¯©�=Ó4×8Ñ8Ó:ˆØ—=‘=¨¯©�=Ó4×8Ñ8Ó:ˆØ˜% (Ñ*Ñ+¨x¸(Ñ/BÑCˆÜ˜ $§-¡-°·±Ó>ˆà×'Ñ'¨t¯{©{Ð'Ó;×?Ñ?ÓAˆØ×'Ñ'¨t¯{©{Ð'Ó;×?Ñ?ÓAˆØ˜8 lÑ2Ñ3°|ÀlÑ7RÑSˆ	Ü˜ D§M¡M°4·<±<Ó@ˆ�	r   c                 óf   — | j                  | j                  «      }t        j                  |d¬«      S )z_Schaff Trend Cycle

        Returns:
            pandas.Series: New feature generated.
        Ústcr5   )r7   r—  r8   r9   )r   Ú
stc_seriess     r   r   zSTCIndicator.stc}  s)   € ð ×'Ñ'¨¯	©	Ó2ˆ
Ü�y‰y˜¨%Ô0Ð0r   N©é2   é   rü   rè   rè   F)rF   rG   rH   rI   r8   r9   rJ   rK   r   r   r   rL   r   r   rŽ  rŽ  E  ss   „ ñð0 ØØØØØñà�y‰yðð ðð ð	ð
 ðð ðð ðð óò&Aó1r   rŽ  c                 ó:   — t        | ||¬«      j                  «       S )zaExponential Moving Average (EMA)

    Returns:
        pandas.Series: New feature generated.
    ©rO   r   r   )rp   rw   r¦  s      r   rw   rw   ‡  ó   € ô ˜e¨F¸6ÔB×PÑPÓRÐRr   c                 ó:   — t        | ||¬«      j                  «       S )z\Simple Moving Average (SMA)

    Returns:
        pandas.Series: New feature generated.
    r¦  )r|   r€   r¦  s      r   r€   r€   �  r§  r   c                 ó:   — t        | ||¬«      j                  «       S )z^Weighted Moving Average (WMA)

    Returns:
        pandas.Series: New feature generated.
    r¦  )r‚   r”   r¦  s      r   Úwma_indicatorrª  ™  s   € ô ˜e¨F¸6ÔB×FÑFÓHÐHr   c                 ó>   — t        | ||d|¬«      j                  «       S )a×  Moving Average Convergence Divergence (MACD)

    Is a trend-following momentum indicator that shows the relationship between
    two moving averages of prices.

    https://en.wikipedia.org/wiki/MACD

    Args:
        close(pandas.Series): dataset 'Close' column.
        window_fast(int): n period short-term.
        window_slow(int): n period long-term.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    rn   ©rO   rP   rQ   rR   r   )rN   rb   )rO   rP   rQ   r   s       r   rb   rb   ¢  s)   € ô" ØØØØØô÷ �dƒfðr   c                 ó>   — t        | ||||¬«      j                  «       S )a°  Moving Average Convergence Divergence (MACD Signal)

    Shows EMA of MACD.

    https://en.wikipedia.org/wiki/MACD

    Args:
        close(pandas.Series): dataset 'Close' column.
        window_fast(int): n period short-term.
        window_slow(int): n period long-term.
        window_sign(int): n period to signal.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r¬  )rN   rf   r¬  s        r   rf   rf   ¼  s)   € ô" ØØØØØô÷ �kƒmðr   c                 ó>   — t        | ||||¬«      j                  «       S )aÐ  Moving Average Convergence Divergence (MACD Diff)

    Shows the relationship between MACD and MACD Signal.

    https://en.wikipedia.org/wiki/MACD

    Args:
        close(pandas.Series): dataset 'Close' column.
        window_fast(int): n period short-term.
        window_slow(int): n period long-term.
        window_sign(int): n period to signal.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r¬  )rN   rj   r¬  s        r   rj   rj   Ö  s)   € ô" ØØØØØô÷ �iƒkðr   c                 ó>   — t        | ||||¬«      j                  «       S )a7  Average Directional Movement Index (ADX)

    The Plus Directional Indicator (+DI) and Minus Directional Indicator (-DI)
    are derived from smoothed averages of these differences, and measure trend
    direction over time. These two indicators are often referred to
    collectively as the Directional Movement Indicator (DMI).

    The Average Directional Index (ADX) is in turn derived from the smoothed
    averages of the difference between +DI and -DI, and measures the strength
    of the trend (regardless of direction) over time.

    Using these three indicators together, chartists can determine both the
    direction and strength of the trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_directional_index_adx

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    ©r	   r
   rO   r   r   )r  r7  r°  s        r   r7  r7  ð  s#   € ô6 Ø�s %°¸vôç	�cƒeðr   c                 ó>   — t        | ||||¬«      j                  «       S )a@  Average Directional Movement Index Positive (ADX)

    The Plus Directional Indicator (+DI) and Minus Directional Indicator (-DI)
    are derived from smoothed averages of these differences, and measure trend
    direction over time. These two indicators are often referred to
    collectively as the Directional Movement Indicator (DMI).

    The Average Directional Index (ADX) is in turn derived from the smoothed
    averages of the difference between +DI and -DI, and measures the strength
    of the trend (regardless of direction) over time.

    Using these three indicators together, chartists can determine both the
    direction and strength of the trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_directional_index_adx

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r°  )r  rA  r°  s        r   rA  rA    ó#   € ô6 Ø�s %°¸vôç�gƒiðr   c                 ó>   — t        | ||||¬«      j                  «       S )a@  Average Directional Movement Index Negative (ADX)

    The Plus Directional Indicator (+DI) and Minus Directional Indicator (-DI)
    are derived from smoothed averages of these differences, and measure trend
    direction over time. These two indicators are often referred to
    collectively as the Directional Movement Indicator (DMI).

    The Average Directional Index (ADX) is in turn derived from the smoothed
    averages of the difference between +DI and -DI, and measures the strength
    of the trend (regardless of direction) over time.

    Using these three indicators together, chartists can determine both the
    direction and strength of the trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_directional_index_adx

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r°  )r  rE  r°  s        r   rE  rE  0  r²  r   c                 ó>   — t        | ||||¬«      j                  «       S )a„  Vortex Indicator (VI)

    It consists of two oscillators that capture positive and negative trend
    movement. A bullish signal triggers when the positive trend indicator
    crosses above the negative trend indicator or a key level.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:vortex_indicator

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r°  )rH  rT  r°  s        r   rT  rT  P  ó%   € ô& Ø�s %°¸vôçÑÓðr   c                 ó>   — t        | ||||¬«      j                  «       S )a„  Vortex Indicator (VI)

    It consists of two oscillators that capture positive and negative trend
    movement. A bearish signal triggers when the negative trend indicator
    crosses above the positive trend indicator or a key level.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:vortex_indicator

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r°  )rH  rX  r°  s        r   rX  rX  h  rµ  r   c                 ó:   — t        | ||¬«      j                  «       S )a�  Trix (TRIX)

    Shows the percent rate of change of a triple exponentially smoothed moving
    average.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:trix

    Args:
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r¦  )r—   r¥   r¦  s      r   r¥   r¥   €  s   € ô  ˜u¨V¸FÔC×HÑHÓJÐJr   c                 ó>   — t        | ||||¬«      j                  «       S )aW  Mass Index (MI)

    It uses the high-low range to identify trend reversals based on range
    expansions. It identifies range bulges that can foreshadow a reversal of
    the current trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:mass_index

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window_fast(int): fast window value.
        window_slow(int): slow window value.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.

    ©r	   r
   rQ   rP   r   )r©   r±   r¹  s        r   r±   r±   “  s)   € ô( ØØØØØô÷ �jƒlðr   c                 ó@   — t        | |||||¬«      j                  «       S )a"  Commodity Channel Index (CCI)

    CCI measures the difference between a security's price change and its
    average price change. High positive readings indicate that prices are well
    above their average, which is a show of strength. Low negative readings
    indicate that prices are well below their average, which is a show of
    weakness.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:commodity_channel_index_cci

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        window(int): n periods.
        constant(int): constant.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.

    ©r	   r
   rO   r   r  r   )r  r  r»  s         r   r  r  °  s&   € ô. Ø�s %°ÀÐRXôç	�cƒeðr   c                 ó:   — t        | ||¬«      j                  «       S )a»  Detrended Price Oscillator (DPO)

    Is an indicator designed to remove trend from price and make it easier to
    identify cycles.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:detrended_price_osci

    Args:
        close(pandas.Series): dataset 'Close' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r¦  )r   r  r¦  s      r   r  r  Ì  s   € ô  ˜e¨F¸6ÔB×FÑFÓHÐHr   c
                 óJ   — t        | ||||||||d|	¬«      j                  «       S )a  KST Oscillator (KST)

    It is useful to identify major stock market cycle junctures because its
    formula is weighed to be more greatly influenced by the longer and more
    dominant time spans, in order to better reflect the primary swings of stock
    market cycle.

    https://en.wikipedia.org/wiki/KST_oscillator

    Args:
        close(pandas.Series): dataset 'Close' column.
        roc1(int): r1 period.
        roc2(int): r2 period.
        roc3(int): r3 period.
        roc4(int): r4 period.
        window1(int): n1 smoothed period.
        window2(int): n2 smoothed period.
        window3(int): n3 smoothed period.
        window4(int): n4 smoothed period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    rn   ©rO   rÚ   rÛ   rÜ   rÝ   rµ   r¶   r·   rÞ   rß   r   )rÙ   ró   )
rO   rÚ   rÛ   rÜ   rÝ   rµ   r¶   r·   rÞ   r   s
             r   ró   ró   ß  s<   € ôH ØØØØØØØØØØØô÷ 
�cƒeðr   c           	      óB   — t        | ||||||¬«      j                  «       S )at  Schaff Trend Cycle (STC)

    The Schaff Trend Cycle (STC) is a charting indicator that
    is commonly used to identify market trends and provide buy
    and sell signals to traders. Developed in 1999 by noted currency
    trader Doug Schaff, STC is a type of oscillator and is based on
    the assumption that, regardless of time frame, currency trends
    accelerate and decelerate in cyclical patterns.

    https://www.investopedia.com/articles/forex/10/schaff-trend-cycle-indicator.asp

    Args:
        close(pandas.Series): dataset 'Close' column.
        window_fast(int): n period short-term.
        window_slow(int): n period long-term.
        cycle(int): n period
        smooth1(int): ema period over stoch_k
        smooth2(int): ema period over stoch_kd
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    ©rO   rP   rQ   r�  r�  r‘  r   )rŽ  r   rÀ  s          r   r   r     s/   € ô4 ØØØØØØØô÷ 
�cƒeðr   c                 óJ   — t        | |||||||||	|
¬«      j                  «       S )a|  KST Oscillator (KST Signal)

    It is useful to identify major stock market cycle junctures because its
    formula is weighed to be more greatly influenced by the longer and more
    dominant time spans, in order to better reflect the primary swings of stock
    market cycle.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:know_sure_thing_kst

    Args:
        close(pandas.Series): dataset 'Close' column.
        roc1(int): roc1 period.
        roc2(int): roc2 period.
        roc3(int): roc3 period.
        roc4(int): roc4 period.
        window1(int): n1 smoothed period.
        window2(int): n2 smoothed period.
        window3(int): n3 smoothed period.
        window4(int): n4 smoothed period.
        nsig(int): n period to signal.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r¾  )rÙ   r÷   r¾  s              r   r÷   r÷   7  s<   € ôL ØØØØØØØØØØØô÷ �gƒiðr   r0   c           	      óB   — t        | |||d||¬«      j                  «       S )a*  Tenkan-sen (Conversion Line)

    It identifies the trend and look for potential signals within that trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ichimoku_cloud

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window1(int): n1 low period.
        window2(int): n2 medium period.
        visual(bool): if True, shift n2 values.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r×   ©r	   r
   rµ   r¶   r·   r¸   r   )r´   rÊ   ©r	   r
   rµ   r¶   r¸   r   s         r   rÊ   rÊ   l  s1   € ô( ØØØØØØØô÷ ÑÓ ð!r   c           	      óB   — t        | |||d||¬«      j                  «       S )a#  Kijun-sen (Base Line)

    It identifies the trend and look for potential signals within that trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ichimoku_cloud

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window1(int): n1 low period.
        window2(int): n2 medium period.
        visual(bool): if True, shift n2 values.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r×   rÃ  )r´   rÎ   rÄ  s         r   rÎ   rÎ   ‹  s1   € ô( ØØØØØØØô÷ ÑÓðr   c           	      óB   — t        | |||d||¬«      j                  «       S )u-  Ichimoku KinkÅ� HyÅ� (Ichimoku)

    It identifies the trend and look for potential signals within that trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ichimoku_cloud

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window1(int): n1 low period.
        window2(int): n2 medium period.
        visual(bool): if True, shift n2 values.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    r×   rÃ  )r´   rÒ   rÄ  s         r   rÒ   rÒ   ª  s/   € ô$ ØØØØØØØô÷ �jƒlðr   c           	      óB   — t        | |d||||¬«      j                  «       S )u.  Ichimoku KinkÅ� HyÅ� (Ichimoku)

    It identifies the trend and look for potential signals within that trend.

    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ichimoku_cloud

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window2(int): n2 medium period.
        window3(int): n3 high period.
        visual(bool): if True, shift n2 values.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    rn   rÃ  )r´   rÖ   )r	   r
   r¶   r·   r¸   r   s         r   rÖ   rÖ   Ç  s/   € ô$ ØØØØØØØô÷ �jƒlðr   c                 ó<   — t        | |||¬«      j                  «       S )aÆ  Aroon Indicator (AI)

    Identify when trends are likely to change direction (uptrend).

    Aroon Up - ((N - Days Since N-day High) / N) x 100

    https://www.investopedia.com/terms/a/aroon.asp

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.

    ©r	   r
   r   r   )r   r;   rÉ  s       r   r;   r;   ä  s   € ô& ˜t¨°VÀFÔK×TÑTÓVÐVr   c                 ó<   — t        | |||¬«      j                  «       S )aÈ  Aroon Indicator (AI)

    Identify when trends are likely to change direction (downtrend).

    Aroon Down - ((N - Days Since N-day Low) / N) x 100

    https://www.investopedia.com/terms/a/aroon.asp

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        window(int): n period.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    rÉ  )r   r?   rÉ  s       r   r?   r?   ú  s   € ô$ ˜t¨°VÀFÔK×VÑVÓXÐXr   c                 óD   — t        | |||||¬«      }|j                  «       S )an  Parabolic Stop and Reverse (Parabolic SAR)

    Returns the PSAR series with non-N/A values for upward trends

    https://school.stockcharts.com/doku.php?id=technical_indicators:parabolic_sar

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        step(float): the Acceleration Factor used to compute the SAR.
        max_step(float): the maximum value allowed for the Acceleration Factor.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    ©r	   r
   rO   r^  r_  r   )r]  r{  ©r	   r
   rO   r^  r_  r   r‡  s          r   r{  r{    s,   € ô$ Ø�s %¨d¸XÈfô€Ið ×ÑÓÐr   c                 óD   — t        | |||||¬«      }|j                  «       S )ap  Parabolic Stop and Reverse (Parabolic SAR)

    Returns the PSAR series with non-N/A values for downward trends

    https://school.stockcharts.com/doku.php?id=technical_indicators:parabolic_sar

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        step(float): the Acceleration Factor used to compute the SAR.
        max_step(float): the maximum value allowed for the Acceleration Factor.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    rÌ  )r]  r  rÍ  s          r   r  r  '  s,   € ô$ Ø�s %¨d¸XÈfô€Ið ×ÑÓ Ð r   c                 óD   — t        | |||||¬«      }|j                  «       S )a“  Parabolic Stop and Reverse (Parabolic SAR) Upward Trend Indicator

    Returns 1, if there is a reversal towards an upward trend. Else, returns 0.

    https://school.stockcharts.com/doku.php?id=technical_indicators:parabolic_sar

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        step(float): the Acceleration Factor used to compute the SAR.
        max_step(float): the maximum value allowed for the Acceleration Factor.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    rÌ  )r]  rˆ  rÍ  s          r   rˆ  rˆ  ?  s,   € ô$ Ø�s %¨d¸XÈfô€Ið ×&Ñ&Ó(Ð(r   c                 óD   — t        | |||||¬«      }|j                  «       S )a—  Parabolic Stop and Reverse (Parabolic SAR) Downward Trend Indicator

    Returns 1, if there is a reversal towards an downward trend. Else, returns 0.

    https://school.stockcharts.com/doku.php?id=technical_indicators:parabolic_sar

    Args:
        high(pandas.Series): dataset 'High' column.
        low(pandas.Series): dataset 'Low' column.
        close(pandas.Series): dataset 'Close' column.
        step(float): the Acceleration Factor used to compute the SAR.
        max_step(float): the maximum value allowed for the Acceleration Factor.
        fillna(bool): if True, fill nan values.

    Returns:
        pandas.Series: New feature generated.
    rÌ  )r]  r‹  rÍ  s          r   r‹  r‹  W  s,   € ô$ Ø�s %¨d¸XÈfô€Ið ×(Ñ(Ó*Ð*r   )rm   Fr•   )rl   rm   Frk   ry   r¦   r²   r  r	  )	rü   r§   rý   rþ   rü   rü   rü   r§   Fr¢  rû   )rn   rl   FF)rl   r×   FFrD   rŒ  )6rI   Únumpyr    Úpandasr8   Úta.utilsr   r   r   r   r   rN   rp   r|   r‚   r—   r©   r´   rÙ   r   r  r  rH  r]  rŽ  rw   r€   rª  rb   rf   rj   r7  rA  rE  rT  rX  r¥   r±   r  r  ró   r   r÷   r9   rÊ   rÎ   rÒ   rÖ   r;   r?   r{  r  rˆ  r‹  rL   r   r   Ú<module>rÔ     só  ðñó Û ç =Ó =ôCG�^ô CGôLG
ˆ>ô G
ôT;�>ô ;ô0;�>ô ;ô0(:�>ô (:ôV$C�Nô $CôN1
�ô 1
ôhaT˜ô aTôHE4�>ô E4ôP$F�>ô $FôN<1�>ô <1ô~v9�>ô v9ôrD*�nô D*ôN\O�Nô \Oô~?1�>ô ?1óDSóSóIóó4ó4ó4ó@ó@ó@ó0ó0Kó&ó:ó8Ið* 
Ø	Ø	Ø	ØØØØØó0ðh SXó"ðN 
Ø	Ø	Ø	ØØØØØ	
Øó2ðl <Añ!à‡Y�Yó!ð@ <Añà‡Y�Yóó>ó:ó:Wó,Yó*ó0!ó0)ô0+r   