PINE LIBRARY

SimTradeIndicators

454
Library "SimTradeIndicators"
SimTrade indicator library — exact parity with Python pipeline (TA-Lib + pandas_ta).
Each function replicates the formula used in base.py / signals.py so that
TradingView charts match the GPU hunt / validator / live engine outputs.

Formula sources:
TA-Lib → RSI, ATR, EMA, MACD, CCI, Stoch, WILLR, MFI, ADX, PSAR, OBV, BBANDS, AROON, PPO, AD
pandas_ta → SuperTrend, Vortex, Ichimoku, Donchian, HMA, TSI, CMF, EFI, CHOP, Heikin-Ashi
Manual → Keltner (EMA+ATR Wilder), TTM Squeeze, Chandelier Exit, VWAP reset, Pivot Points

Known intentional deviations (documented):
- Stoch trigger 11 uses Full %D (double-smoothed), not single %K
- OBV filter 206 uses windowed 800-bar OBV (GPU-aligned, not cumulative)
- Pivot Points use rolling window, not session-based (see pivot_pp notes)
- EMA has longer warmup in TA-Lib (~50 bars unstable period) vs TW (from bar 1); steady-state identical

smma(src, length)
  SMMA / Wilder RMA. alpha = 1/length. Matches talib "RMA" used for ATR/RSI internally.
  Parameters:
    src (float): Source series
    length (simple int): Period
  Returns: RMA value

hma(src, length)
  HMA (Hull Moving Average). HMA = WMA(2·WMA(N/2) − WMA(N), √N). Matches pandas_ta.hma.
  Parameters:
    src (float): Source series
    length (simple int): Period
  Returns: HMA value

dema(src, length)
  DEMA (Double EMA) = 2·EMA − EMA(EMA). Matches talib.DEMA.
  Parameters:
    src (float): Source series
    length (simple int): Period
  Returns: DEMA value

tema(src, length)
  TEMA (Triple EMA) = 3·EMA − 3·EMA² + EMA³. Matches talib.TEMA.
  Parameters:
    src (float): Source series
    length (simple int): Period
  Returns: TEMA value

atr_wilder(length)
  ATR using Wilder RMA. Identical to talib.ATR and TW ta.atr.
  Parameters:
    length (simple int): Period (default 14)
  Returns: ATR value

atr_percentile_pct(length, lookback)
  ATR percentile rank over a rolling window. Matches Python vol_filter 201.
Logic: for each bar count how many ATR values in [i-lookback+1 .. i] are <= current ATR,
return that fraction as 0..100. Warmup bars (< lookback + length) return 50.0.
  Parameters:
    length (simple int): ATR period / Wilder RMA (default 14). Matches params[0].
    lookback (simple int): Rolling window for percentile rank (default 30). Matches params[1].
  Returns: Percentile rank 0..100 (pass filter when >= pct_min / params[2])

bbands(src, length, mult)
  Bollinger Bands. Returns [upper, mid, lower].
mid = SMA. Matches talib.BBANDS (matype=0 = SMA).
  Parameters:
    src (float): Source series (typically close)
    length (simple int): Period (default 20)
    mult (float): Standard deviation multiplier (default 2.0)
  Returns: [upper, mid, lower]

bb_pctb(src, length, mult)
  Bollinger Bands %B = (close − lower) / (upper − lower).
Returns 0.5 during warmup (matches Python _nan50 fallback in base.bb_pctb).
  Parameters:
    src (float): Source series
    length (simple int): Period (default 20)
    mult (float): Multiplier (default 2.0)
  Returns: %B value

bb_width_x1000(src, length, mult)
  BB bandwidth × 1000 / mid. Used by vol filter 202 (bb_width).
  Parameters:
    src (float): Source series
    length (simple int): Period (default 20)
    mult (float): Multiplier (default 2.0)
  Returns: (upper − lower) / |mid| × 1000

keltner(ema_period, atr_period, mult)
  Keltner Channel. mid = EMA(close, ema_period), band = ATR(atr_period) Wilder RMA.
IMPORTANT: this is the TW-standard formula. NOT pandas_ta kc(mamode="ema") which uses EMA(TR).
That version produces ~40% narrower bands than TW. This library uses the correct RMA(ATR) band.
  Parameters:
    ema_period (simple int): EMA period for midline (default 20)
    atr_period (simple int): ATR period for band width (default 10)
    mult (float): ATR multiplier (default 1.5)
  Returns: [upper, mid, lower]

keltner_width_x1000(period, mult)
  Keltner Channel bandwidth × 1000 / mid. Used by vol filter 204 (keltner_width).
  Parameters:
    period (simple int): Period for both EMA and ATR (default 20)
    mult (float): ATR multiplier (default 1.5)
  Returns: (upper − lower) / |mid| × 1000

choppiness(length)
  Choppiness Index. CHOP = 100·log10(Σ ATR1 / (HH − LL)) / log10(N).
Matches pandas_ta.chop and TW built-in CHOP. Returns 50.0 during warmup.
  Parameters:
    length (simple int): Period (default 14)
  Returns: CHOP value

rsi_val(src, length)
  RSI using Wilder RMA. Identical to talib.RSI and TW ta.rsi.
Returns 50.0 during warmup (matches Python _nan50 fallback).
  Parameters:
    src (float): Source series (typically close)
    length (simple int): Period (default 14)
  Returns: RSI value

cci_val(length)
  CCI = (typical − SMA(typical)) / (0.015 · mean_deviation). Matches talib.CCI.
Returns 0.0 during warmup (matches Python _nan0 fallback).
  Parameters:
    length (simple int): Period (default 20)
  Returns: CCI value

stoch_raw_k(k_period)
  Stochastic raw %K (no smoothing). Matches base.stoch_k (talib slowk_period=1).
NOTE: TW ta.stoch default smooths %K with SMA(3). This is the unsmoothed fast %K.
Used by filter 103 (stoch_k_below).
  Parameters:
    k_period (simple int): Lookback period (default 14)
  Returns: Raw %K (50.0 during warmup)

stoch_full_d(k_period, d_period)
  Full Stochastic %D = SMA(SMA(raw%K, d_period), d_period). Matches talib.STOCH output.
Used by trigger 11 (stoch_cross). NOT single-smoothed %K — lag is +2-3 bars vs TW default.
  Parameters:
    k_period (simple int): Raw %K lookback (default 14)
    d_period (simple int): Smoothing applied twice (default 3)
  Returns: Full Stochastic %D (50.0 during warmup)

williams_r(length)
  Williams %R = −100 · (HH − close) / (HH − LL). Matches talib.WILLR.
Range: −100 to 0. Returns −50.0 during warmup.
  Parameters:
    length (simple int): Period (default 14)
  Returns: Williams %R value

mfi_val(length)
  MFI (Money Flow Index). Matches talib.MFI.
Returns 50.0 during warmup.
  Parameters:
    length (simple int): Period (default 14)
  Returns: MFI value

macd_val(src, fast, slow, signal_period)
  MACD. Returns [macd_line, signal_line, histogram]. Identical to talib.MACD.
All NaN values replaced with 0.0 (matches Python _nan0).
  Parameters:
    src (float): Source series
    fast (simple int): Fast EMA period (default 12)
    slow (simple int): Slow EMA period (default 26)
    signal_period (simple int): Signal EMA period (default 9)
  Returns: [macd_line, signal_line, histogram]

ppo_val(src, fast, slow)
  PPO = (EMA(fast) − EMA(slow)) / EMA(slow) × 100. Matches talib.PPO.
Returns 0.0 during warmup.
  Parameters:
    src (float): Source series
    fast (simple int): Fast period (default 12)
    slow (simple int): Slow period (default 26)
  Returns: PPO value

tsi_val(src, long_period, short_period)
  TSI (True Strength Index). Matches pandas_ta.tsi parameter order.
TSI = 100 · EMA(EMA(Δclose, slow), fast) / EMA(EMA(|Δclose|, slow), fast)
slow is the OUTER (first) smoothing, fast is the INNER (second). Same as TW.
  Parameters:
    src (float): Source series
    long_period (simple int): Outer (slow) EMA period (default 25)
    short_period (simple int): Inner (fast) EMA period (default 13)
  Returns: TSI value (0.0 during warmup)

adx_di(length)
  ADX + DI lines. Returns [adx, plus_di, minus_di]. Matches talib.ADX/PLUS_DI/MINUS_DI.
Uses Wilder RMA (identical to TW ta.dmi / ta.adx).
  Parameters:
    length (simple int): Period (default 14)
  Returns: [adx, plus_di, minus_di] — 0.0 during warmup

supertrend_val(length, mult)
  SuperTrend direction and value. Matches pandas_ta.supertrend (RMA ATR).
Returns [direction, supertrend_value]: direction = 1 (bull) or −1 (bear).
  Parameters:
    length (simple int): ATR period (default 10)
    mult (float): ATR multiplier (default 3.0)
  Returns: [direction, supertrend_value]

psar_val(start, inc, max_af)
  Parabolic SAR. Returns [direction, sar_value]. Matches talib.SAR.
direction = 1 if close > SAR (bull), −1 bear.
  Parameters:
    start (simple float): Initial AF / step (default 0.02)
    inc (simple float): AF increment per bar (default 0.02)
    max_af (simple float): Maximum AF cap (default 0.2)
  Returns: [direction, sar_value]

aroon_val(length)
  Aroon Up and Down. Returns [up, down]. Matches talib.AROON.
ta.aroon does not exist in Pine v6 — computed manually:
Aroon Up = (length − bars since highest high over length+1 bars) / length × 100
Aroon Down = (length − bars since lowest low over length+1 bars) / length × 100
This is identical to talib.AROON and TradingView's built-in Aroon indicator.
Returns 50.0 during warmup (matches Python _nan50).
  Parameters:
    length (simple int): Period (default 25)
  Returns: [aroon_up, aroon_down]

vortex_diff(length)
  Vortex Indicator difference (VI+ − VI−). Matches base.vortex.
Positive = bullish regime, negative = bearish. Returns 0.0 during warmup.
  Parameters:
    length (simple int): Period (default 14)
  Returns: VI+ minus VI−

linreg_slope(src, length)
  Linear Regression Slope. Matches talib.LINEARREG_SLOPE exactly.
Computes OLS slope for x = 0..N-1 (oldest=0, newest=N-1).
Positive = uptrend, negative = downtrend. Returns 0.0 during warmup.
  Parameters:
    src (float): Source series
    length (simple int): Period (default 20)
  Returns: Slope value

obv_val()
  OBV (On-Balance Volume). Cumulative. Matches talib.OBV.
  Returns: Cumulative OBV

vwap_reset(reset_bars)
  VWAP with periodic session reset. Matches base.vwap(reset_bars).
reset_bars=24 on H1 ≈ daily VWAP (crypto 24/7). reset_bars=6 on H4 ≈ daily.
reset_bars=0 uses TW built-in ta.vwap (session anchor).
  Parameters:
    reset_bars (simple int): Bars per session (0 = TW session anchor, 24 = H1 daily, 6 = H4 daily)
  Returns: VWAP value

cmf_val(length)
  CMF (Chaikin Money Flow) = Σ(CLV·vol) / Σvol. Matches pandas_ta.cmf.
CLV = ((close − low) − (high − close)) / (high − low). Returns 0.0 during warmup.
  Parameters:
    length (simple int): Period (default 20)
  Returns: CMF value (−1 to 1)

ad_val()
  Accumulation/Distribution Line. Matches talib.AD.
  Returns: Cumulative A/D value

efi_val(length)
  EFI (Elder Force Index). EFI = EMA((close − close[1]) · volume, length).
Matches pandas_ta.efi. Returns 0.0 during warmup.
  Parameters:
    length (simple int): EMA period (default 13)
  Returns: EFI value

ichimoku_val(tenkan_period, kijun_period, senkou_b_period)
  Ichimoku lines. Returns [tenkan, kijun, senkou_a, senkou_b, chikou].
Matches pandas_ta.ichimoku with CORRECTED column mapping (ISA, ISB, ITS, IKS, ICS).
senkou_a/b are plotted 26 bars AHEAD in TW — values here are for current bar alignment.
  Parameters:
    tenkan_period (simple int): Tenkan-sen period (default 9)
    kijun_period (simple int): Kijun-sen period (default 26)
    senkou_b_period (simple int): Senkou B period (default 52)
  Returns: [tenkan, kijun, senkou_a, senkou_b, chikou]

donchian_val(length)
  Donchian Channel. Returns [upper, mid, lower].
upper = highest(high, N), lower = lowest(low, N). Matches pandas_ta.donchian.
NOTE: lookback may differ ±1 bar from TA-Lib; consistent across all pipeline stages.
Trigger 37 (donchian_break) compares close > upper[i-1] — use upper[1] in Pine.
  Parameters:
    length (simple int): Period (default 20)
  Returns: [upper, mid, lower]

ttm_squeeze_val(bb_period, bb_mult, kc_period, kc_mult)
  TTM Squeeze. Returns [squeeze_on, momentum].
squeeze_on: BB inside KC (volatility compression).
momentum: ta.linreg(close − (donchian_mid + SMA) / 2, bb_period)
EXACT match with John Carter formula and base.ttm_squeeze after fix.
  Parameters:
    bb_period (simple int): BB period (default 20)
    bb_mult (float): BB multiplier (default 2.0)
    kc_period (simple int): KC period — same for EMA midline and ATR band (default 20)
    kc_mult (float): KC ATR multiplier (default 1.5)
  Returns: [squeeze_on (bool), momentum (float)]

chandelier_val(period, mult)
  Chandelier Exit. Returns [long_exit, short_exit].
long_exit = highest(high, period) − mult · ATR(period)
short_exit = lowest(low, period) + mult · ATR(period)
Exact match with base.chandelier_exit. Both include current bar in rolling max/min.
Trigger 45 fires when close crosses long_exit or short_exit (up = bull, down = bear).
  Parameters:
    period (simple int): Lookback and ATR period (default 22)
    mult (float): ATR multiplier (default 3.0)
  Returns: [long_exit, short_exit]

ha_close()
  Heikin Ashi close. HA_close = (open + high + low + close) / 4. Matches pandas_ta.ha.
  Returns: HA close value

ha_open()
  Heikin Ashi open. HA_open = (HA_open[i-1] + HA_close[i-1]) / 2.
Trigger 48 fires on HA candle color flip: HA_close vs HA_open.
  Returns: HA open value

pivot_pp(period)
  Rolling Pivot Point (floor method). Matches base.pivot_points.
pp = (max(high, period bars ago) + min(low, period bars ago) + close[1]) / 3
NOTE: Rolling window, NOT session-based. H1 default period=24 ≈ 1 day (crypto 24/7).
For H4 set period=6 (6 × 4h = 1 day). TW Pivot Points use session H/L/C — differs.
  Parameters:
    period (simple int): Rolling lookback (default 24)
  Returns: Pivot point value

pivot_r1_s1(period)
  Rolling R1 and S1 levels. Matches base.pivot_points r1/s1.
r1 = 2·pp − lowest_low, s1 = 2·pp − highest_high
  Parameters:
    period (simple int): Rolling lookback (default 24)
  Returns: [r1, s1]

Disclaimer

The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.