pandas-ta icon indicating copy to clipboard operation
pandas-ta copied to clipboard

Supertrend Value Mismatch - proposal to add both implementations

Open MLpranav opened this issue 2 years ago • 7 comments
trafficstars

Which version are you running? 0.3.14b0

Is your feature request related to a problem? Please describe. Supertrend calculation in pandas-ta is different from most stock/crypto trading websites (like Binance and Zerodha) and platforms, even though many of them are using TradingView's charting library. On investigating further into this mismatch and checking the source code of various Python and Pinescript implementations of supertrend, it seems like TradingView js charting library's supertrend uses SMA(true_range, length) instead of ATR.

Describe the solution you'd like I have added a custom indicator named supertrend_classic. After changing matr = multiplier * atr(high, low, close, length) to matr = multiplier * sma(true_range(high, low, close), length), the results are matching perfectly with the aforementioned platforms' charts.

I'm making this issue to help others with similar problems and also propose that supertrend_classic be included in the main library.

https://www.tradingview.com/script/r6dAP7yi/ Lines 10-11 here illustrate both the approaches.

MLpranav avatar Oct 06 '23 10:10 MLpranav

Alternatively, we can add a simple flag to the existing supertrend indicator so that the user can choose between ATR and SMA(TR) based implementations. Adding a separate indicator for only one minor change will be redundant.

MLpranav avatar Oct 06 '23 13:10 MLpranav

Hello @MLpranav,

Certainly supertrend v0.3.14b has historical issues. Some of which has been taken care of in the development version.

On investigating further into this mismatch and checking the source code of various Python and Pinescript implementations of supertrend, it seems like TradingView js charting library's supertrend uses SMA(true_range, length) instead of ATR.

According to TV (version 5), it's default is ATR and not SMA(TR). However to include SMA(TR) as an optionable calculation would be trivial include on the development version. Additionally while focus is on updating supertrend it would be great to rewrite it to in numpy/numba to further boost it's calculation speed.

//@version=5
indicator("Pine Script® Supertrend")

[supertrend, direction] = ta.supertrend(3, 10)
plot(direction < 0 ? supertrend : na, "Up direction", color = color.green, style=plot.style_linebr)
plot(direction > 0 ? supertrend : na, "Down direction", color = color.red, style=plot.style_linebr)

// The same on Pine Script®
pine_supertrend(factor, atrPeriod) =>
    src = hl2
    atr = ta.atr(atrPeriod)
    upperBand = src + factor * atr
    lowerBand = src - factor * atr
    prevLowerBand = nz(lowerBand[1])
    prevUpperBand = nz(upperBand[1])

    lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
    upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
    int direction = na
    float superTrend = na
    prevSuperTrend = superTrend[1]
    if na(atr[1])
        direction := 1
    else if prevSuperTrend == prevUpperBand
        direction := close > upperBand ? -1 : 1
    else
        direction := close < lowerBand ? 1 : -1
    superTrend := direction == -1 ? lowerBand : upperBand
    [superTrend, direction]

[Pine_Supertrend, pineDirection] = pine_supertrend(3, 10)
plot(pineDirection < 0 ? Pine_Supertrend : na, "Up direction", color = color.green, style=plot.style_linebr)
plot(pineDirection > 0 ? Pine_Supertrend : na, "Down direction", color = color.red, style=plot.style_linebr)

Lastly, this library primarily covers TA Lib (first) and TV (second). Indicators not covered by TA Lib or TV from other platforms will only be accepted if others are willing to submit PR and provide support for it as needed.

Kind Regards KJ

twopirllc avatar Oct 11 '23 20:10 twopirllc

On digging further, I found that this issue is because different platforms use different moving average types to calculate ATR. Have opened a PR to allow passing the ATR's mamode argument while calling supertrend. Kindly merge @twopirllc.

To illustrate,

Here's one major charting library that uses SMA instead of RMA for ATR calculation: https://documentation.chartiq.com/tutorial-Using%20and%20Customizing%20Studies%20-%20Definitions.html#atr

And here's a comparison of both the supertrends, yellow one uses RMA for ATR and grey one uses SMA: image

Additionally while focus is on updating supertrend it would be great to rewrite it to in numpy/numba to further boost it's calculation speed.

Unfortunately I do not have much experience with numba, but I will try to take out some time and address this rewrite in a separate PR.

MLpranav avatar Oct 12 '23 18:10 MLpranav

@MLpranav

On digging further, I found that this issue is because different platforms use different moving average types to calculate ATR.

Yes and not just ATR. Quite a few indicators have differences in calculations... like TA Lib's EMA comment.

   /* The first EMA is calculated differently. It
    * then become the seed for subsequent EMA.
    *
    * The algorithm for this seed vary widely.
    * Only 3 are implemented here:
    *
    * TA_MA_CLASSIC:
    *    Use a simple MA of the first 'period'.
    *    This is the approach most widely documented.
    *
    * TA_MA_METASTOCK:
    *    Use first price bar value as a seed
    *    from the begining of all the available
    *    data.
    *
    * TA_MA_TRADESTATION:
    *    Use 4th price bar as a seed, except when
    *    period is 1 who use 2th price bar or something
    *    like that... (not an obvious one...).
    */

Unfortunately I do not have much experience with numba, but I will try to take out some time and address this rewrite in a separate PR.

Converting supertrend's for loop into a numpy/numba for alphatrend would be similar if you need an example. There is no urgency.

KJ

twopirllc avatar Oct 12 '23 20:10 twopirllc

@twopirllc - I will try to create a numba version and post here. But I don't have experience in bench marking testing it with this lib; if you can take over from there, appreciate it.

krazykoder avatar Oct 12 '23 21:10 krazykoder

@krazykoder

Cool! 😎

No worries about testing. But if you are curious, there is a Speed Test notebook you can run to check the performances when you are satisfied with your code.

KJ

twopirllc avatar Oct 13 '23 00:10 twopirllc