ta-lib-python icon indicating copy to clipboard operation
ta-lib-python copied to clipboard

PLUS_DI gives different results

Open konstantin-doncov opened this issue 5 years ago • 4 comments

Hello! I use ta-lib in the freqtrade bot. When I plot indicators, It seems that PLUS_DI indicator in the ta-lib and DMI with ADX smoothing = 14 and DI length = 14 on the tradingview.com give different results. E.g.: ETHBTC 14 May 19, 01:00(UTC) PLUS_DI in tradingview.com: 5.549 ETHBTC 14 May 19, 01:00(UTC) PLUS_DI in ta-lib: 3.070

So, how can I get the ta-lib DMI indicator in the freqtrade strategy with the same settings as on the tradingview.com?

konstantin-doncov avatar May 30 '19 02:05 konstantin-doncov

What are the values of the indicator in the nearest candles on tradingview? Isn't they are just shifted by 1 (or -1) candle?

hroff-1902 avatar May 30 '19 19:05 hroff-1902

@hroff-1902 I don't think so. Please look at the plots below: PLUS_DI in ta-lib: PLUS_DI PLUS_DI in tradingview.com: DMI

Also, plots very clearly shows that PLUS_DI in ta-lib does not cross the 10 mark before May 14 01:00, but DMI in tradingview.com crosses this mark at May 13 19:00.

konstantin-doncov avatar May 30 '19 20:05 konstantin-doncov

if you use ta-lib with freqtrade, make sure to apply the decimal patch (to the underlying C library) as otherwise it has some trouble with the small numbers BTC uses.

Also make sure you have enough history - iirc plus_di uses smoothening of TR, so with 14, 14 as parameters, you'll need 28 candles to get "good" results (but i'm not 100% sure on the formula). this would explain why it "seems" correct(er) a bit later

xmatthias avatar May 31 '19 04:05 xmatthias

this is a working python code values are different from tradingview or investing, but timing of +di and -di crossovers are correct

adx, +di, -di embedded, reference from: https://medium.com/codex/does-combining-adx-and-rsi-create-a-better-profitable-trading-strategy-125a90c36ac

`import pandas as pd

def get_adx(high, low, close, lookback):

plus_dm = high.diff()
minus_dm = low.diff()
plus_dm[plus_dm < 0] = 0
minus_dm[minus_dm > 0] = 0
tr1 = pd.DataFrame(high - low)
tr2 = pd.DataFrame(abs(high - close.shift(1)))
tr3 = pd.DataFrame(abs(low - close.shift(1)))
frames = [tr1, tr2, tr3]
tr = pd.concat(frames, axis = 1, join = 'inner').max(axis = 1)
atr = tr.rolling(lookback).mean()
plus_di = 100 * (plus_dm.ewm(alpha = 1/lookback).mean() / atr)
minus_di = abs(100 * (minus_dm.ewm(alpha = 1/lookback).mean() / atr))
dx = (abs(plus_di - minus_di) / abs(plus_di + minus_di)) * 100
adx = ((dx.shift(1) * (lookback - 1)) + dx) / lookback
adx_smooth = adx.ewm(alpha = 1/lookback).mean()
return plus_di, minus_di, adx_smooth

`

df = pd.read_csv('1D/XU100-1D.csv') tempor = get_adx (df["High"], df["Low"], df["Close"], 14) df["PLUS_DI_14"] = tempor [0] df["MINUS_DI_14"] = tempor [1] df["ADX_14"] = tempor [2] pd.set_option('display.max_rows', df.shape[0]+1) print(df)

zakcali avatar Mar 27 '23 08:03 zakcali