Nicolas

Tushar Chande's DMI (with RSX)

Category: Indicators By: Nicolas Created: January 31, 2018, 10:10 AM
January 31, 2018, 10:10 AM
Indicators
12 Comments
Tushar Chande's DMI (with RSX)

An indicator used in technical analysis that determines the overbought and oversold conditions of a particular asset. This indicator is very similar to the Relative Strength Index (RSI). The main difference between the two is that the RSI uses a fixed number of time periods (usually 14), while the Dynamic Momentum Index uses different time periods as volatility changes.

This indicator is interpreted in the same manner as the RSI where the readings below 30 are deemed to be oversold and more than 70 levels are deemed to be overbought. The number of time periods used in the dynamic momentum index decreases as the volatility of the underlying asset increases, making this indicator more sensitive to price changes than the RSI. This version has an additional smoothing in an RSX usage form for calculating the original RSI pitch. It has been added to make it a little more readable. The DMI Chande is less smooth than this original version and can raise more false signals. Using the RSX instead of RSI not add any lag at all, so we can say that using an RSX instead of RSI could be classified as “1% improvement” rule – which is sure it not be worse than the original Chande’s DMI.

(description found on internet). Indicator translated from Metatrader5 version by a request in forum.

Settings explanation:

_ MAStdDevMode : moving average type for smoothing the ATR value used to get the volatility of the current instrument

_ DmiLowerLimit & DmiUpperLimit : bounds for DMI periods (DMI calculated period can’t be less or more than these 2 limits)

//PRC_DMI of RSX | indicator
//31.01.18
//Nicolas @ www.prorealcode.com
//Sharing ProRealTime knowledge
//translated from MT5 code
//https://www.prorealcode.com/topic/tushar-chandes-dmi-conversion-code-mq5-to-prorealtime/

// --- settings
StdDevPeriod    =  5        // Period of Standard Deviation
MAStdDevPeriod  =  8        // Period of smoothing
MAStdDevMode    =  0        // Mode of smoothing MA
DMIPeriod       = 15        // Dynamic Momentum Index Period
DmiLowerLimit   = 10        // Dynamic Periods Lower Bound
DmiUpperLimit   = 50        // Dynamic Periods Upper Bound
LevelUp         = 60        // Lower level
LevelDown       = 40        // Upper level
// --- end of settings

if barindex>DMIperiod then
SD = STD[StdDevPeriod](customclose)
ASD = Average[MAStdDevPeriod,MAStdDevMode](SD)

RSIterm = max(1,ROUND(DMIPeriod / (SD/ASD)))
RSIterm = Max(Min(RSIterm,DmiUpperLimit),DmiLowerLimit)

//RSI calculation
plus = summation[max(1,round(RSIterm))](customclose-customclose[1]>0)
minus = summation[max(1,round(RSIterm))](customclose-customclose[1]<0)

//plus
pow = 1
per = RSIterm

if barindex>per then
beta = 0.45*(per-1)/(0.45*(per-1)+2)
if pow=1 then
alpha = beta
elsif pow=2 then
alpha = beta*beta
elsif pow=3 then
alpha = beta*beta*beta
elsif pow=4 then
alpha = beta*beta*beta*beta
elsif pow=5 then
alpha = beta*beta*beta*beta*beta
else
alpha = beta
endif

tmp0 = (1-alpha)*plus + alpha*tmp0[1]
tmp1 = (plus - tmp0[0])*(1-beta) + beta*tmp1[1]
tmp2 = tmp0[0] + tmp1[0]
tmp3 = (tmp2[0] - tmp4[1])*((1-alpha)*(1-alpha)) + (alpha*alpha)*tmp3[1]
tmp4 = tmp4[1] + tmp3[0]
avgplus = tmp4

ftmp0 = (1-alpha)*minus + alpha*ftmp0[1]
ftmp1 = (minus - ftmp0[0])*(1-beta) + beta*ftmp1[1]
ftmp2 = ftmp0[0] + ftmp1[0]
ftmp3 = (ftmp2[0] - ftmp4[1])*((1-alpha)*(1-alpha)) + (alpha*alpha)*ftmp3[1]
ftmp4 = ftmp4[1] + ftmp3[0]
avgminus = ftmp4

endif

RS = avgplus/avgminus
DMIRSX = 100 - 100 / ( 1 + RS )

r=100
g=100
b=100
if DMIRSX>LevelUp then
r=0
g=255
b=0
elsif DMIRSX<LevelDown then
r=255
g=185
b=15
endif
endif

return DMIRSX coloured(r,g,b) style(line,3) as "Dynamic Momentum Index", levelup coloured(100,100,100) style(dottedline) as "level up", leveldown coloured(100,100,100) style(dottedline) as "level down"

 

Download
Filename: PRC_DMI-of-RSX-v2.itf
Downloads: 58
Download
Filename: PRC_DMI-of-RSX.itf
Downloads: 225
Download
Filename: Dynamic-Momentum-Index-of-RSX.png
Downloads: 75
Nicolas
Nicolas Legend
I created ProRealCode because I believe in the power of shared knowledge. I spend my time coding new tools and helping members solve complex problems. If you are stuck on a code or need a fresh perspective on a strategy, I am always willing to help. Welcome to the community!
Author’s Profile

Comments

AG1
AG1
6 years ago
#

Thanks Nicolas Still a problem in line 29 Please take a look. thanks again Alex

AG1
AG1
6 years ago
#

Still a problem in line 29 Please take a look. thanks again Alex

Nicolas
6 years ago
#

code is modified in the above post, use that one.

AG1
AG1
6 years ago
#

Hello Nicholas Is it possible to attach a revised code? I tried to change according to your instructions but the indicator is not working yet. Thanks in advance for your help Alex

Nicolas
6 years ago
#

PFA below a revised version: //PRC_DMI of RSX | indicator //31.01.18 //Nicolas @ www.prorealcode.com //Sharing ProRealTime knowledge //translated from MT5 code //https://www.prorealcode.com/topic/tushar-chandes-dmi-conversion-code-mq5-to-prorealtime/ // --- settings StdDevPeriod = 5 // Period of Standard Deviation MAStdDevPeriod = 8 // Period of smoothing MAStdDevMode = 0 // Mode of smoothing MA DMIPeriod = 15 // Dynamic Momentum Index Period DmiLowerLimit = 10 // Dynamic Periods Lower Bound DmiUpperLimit = 50 // Dynamic Periods Upper Bound LevelUp = 60 // Lower level LevelDown = 40 // Upper level // --- end of settings if barindex>DMIperiod then SD = STD[StdDevPeriod](customclose) ASD = Average[MAStdDevPeriod,MAStdDevMode](SD) RSIterm = max(1,ROUND(DMIPeriod / (SD/ASD))) RSIterm = Max(Min(RSIterm,DmiUpperLimit),DmiLowerLimit) //RSI calculation plus = summation[max(1,round(RSIterm))](customclose-customclose[1]>0) minus = summation[max(1,round(RSIterm))](customclose-customclose[1]per then beta = 0.45*(per-1)/(0.45*(per-1)+2) if pow=1 then alpha = beta elsif pow=2 then alpha = beta*beta elsif pow=3 then alpha = beta*beta*beta elsif pow=4 then alpha = beta*beta*beta*beta elsif pow=5 then alpha = beta*beta*beta*beta*beta else alpha = beta endif tmp0 = (1-alpha)*plus + alpha*tmp0[1] tmp1 = (plus - tmp0[0])*(1-beta) + beta*tmp1[1] tmp2 = tmp0[0] + tmp1[0] tmp3 = (tmp2[0] - tmp4[1])*((1-alpha)*(1-alpha)) + (alpha*alpha)*tmp3[1] tmp4 = tmp4[1] + tmp3[0] avgplus = tmp4 ftmp0 = (1-alpha)*minus + alpha*ftmp0[1] ftmp1 = (minus - ftmp0[0])*(1-beta) + beta*ftmp1[1] ftmp2 = ftmp0[0] + ftmp1[0] ftmp3 = (ftmp2[0] - ftmp4[1])*((1-alpha)*(1-alpha)) + (alpha*alpha)*ftmp3[1] ftmp4 = ftmp4[1] + ftmp3[0] avgminus = ftmp4 endif RS = avgplus/avgminus DMIRSX = 100 - 100 / ( 1 + RS ) r=100 g=100 b=100 if DMIRSX>LevelUp then r=0 g=255 b=0 elsif DMIRSX<LevelDown then r=255 g=185 b=15 endif endif return DMIRSX coloured(r,g,b) style(line,3) as "Dynamic Momentum Index", levelup coloured(100,100,100) style(dottedline) as "level up", leveldown coloured(100,100,100) style(dottedline) as "level down"

falco44
7 years ago
#

Bonjour Nicolas, je suis desolé mais cela ne fonctionne toujours pas ... Merci de ton retour

falco44
7 years ago
#

Bonjour Nicolas, Lorsque j'importe l'indicateur via l'itf et que je l'attache au graphique, il apparait ce message "Erreur dans l'indicateur : PRC_DMI of RSX (5 8 0 15 10 50 60 40) --- Un parametre de type entier positif est attendu avec SUMMATION". Pourrais-tu m'eclairer à ce sujet stp ? Je suis sur la v11 de prt. Merci à toi, Cordialement, Romain

Nicolas
7 years ago
#

Dans ce cas, il faut changer les lignes qui comportent l'instruction SUMMATION comme ceci: summation[max(1,RSIterm)]

macbartin
8 years ago
#

Bonjour, merci pour l'indicateur, j'utilise un RSI de 7 période, sur du 1 min, est'il possible de changer sa base de période ? si oui comment faire ? merci encore j'avais pas pensé que le RSI pouvait avoir du retard !

Nicolas
8 years ago
#

Cet indicateur est dynamique, il n'utilise pas de période fixe

macbartin
8 years ago
#

merci, je voulais savoir quel paramètre il faut modifier sur votre indicateur pour le modifier sur la période 7 de votre indicateur

Nicolas
8 years ago
#

Changer la base de périodes du RSI original ? Le RSI a du "retard" puisqu'il est toujours nécessaire d'évaluer le terrain (et donc de regarder le passé) pour donner l'information sur la bougie courante.

ProRealCode ProRealCode
Loading...