DMI (Directional Movement Index) Format, Label, Watchlist, Scan for ThinkorSwim

BenTen

Administrative
Staff member
Staff
VIP
Lifetime
The DMI indicator (Directional Movement Index) will tell you which direction the price of a stock is moving. When the +DI line is above the -DI line, it means there is more upward movement than downward and vice versa.

The way I use the DMI is a bit different. Instead of using this indicator to tell bullish or bearish trend, I use it as a sideways detector. When the two lines are moving next to each other, it's telling me that the market is choppy at the moment.

Here is an example on the $BYND chart:

I99Lf1J.png


The DMI indicator is available right inside ThinkorSwim. You can just add it without additional code. To make things a bit easier on my part, I asked @WalkingBallista if it was possible to make a Watchlist column that displays the range between the DMI lines. The closer they are to each other the more likely that the stock isn't moving anywhere. And of course, he said yes.

Here is the DMI Range watchlist column for anyone interested.

iBDu6uI.png


thinkScript Code

Rich (BB code):
# WalkingBallista DMI Range
# https://usethinkscript.com/d/193-dmi-directional-movement-index-watchlist-for-thinkorswim

input length = 14;
input averageType = AverageType.WILDERS;

def hiDiff = high - high[1];
def loDiff = low[1] - low;

def plusDM = if hiDiff > loDiff and hiDiff > 0 then hiDiff else 0;
def minusDM =  if loDiff > hiDiff and loDiff > 0 then loDiff else 0;

def ATR = MovingAverage(averageType, TrueRange(high, close, low), length);
def "DI+" = 100 * MovingAverage(averageType, plusDM, length) / ATR;
def "DI-" = 100 * MovingAverage(averageType, minusDM, length) / ATR;

plot range = AbsValue(AbsValue("DI+")-AbsValue("DI-"));

Shareable Link

https://tos.mx/IgnhP6
 

Attachments

  • I99Lf1J.png
    I99Lf1J.png
    350.4 KB · Views: 135
  • iBDu6uI.png
    iBDu6uI.png
    22 KB · Views: 143
Last edited:
hey I had a question I was wondering if there was a way to make an adjustment on the dmi study? what im looking for is just a line that is at the 20 % mark and then a separate script that would make the dmi study have a line across it at 25%? is that even possible?
Thanks for everything
Brett
 
Last edited by a moderator:
declare lower;
plot line20 = 20;
plot line25 = 25;


instrictions:
make a new study, copy above into study, then add it to your chart, then drag it so it is inside the DMI study
 
I was wondering if there was a scan out there that will show when the dmi cross each other? Like when the di+ crosses di-
Any help would be appreciative
Thank you
 
I was wondering if there was a scan out there that will show when the dmi cross each other? Like when the di+ crosses di-
Any help would be appreciative
Thank you
Isn't there a built in DMI scan in TOS already? I am not sure if that meets your criteria as I never used it...but I did see it.
 
Hi Ben, Nice work. I added the ADX and this DMI indicator to my watchlist but don’t under how to interpret the DMI numbers. I understand ADX > and < 20-25 indicates trend strength and understand how DMI works when looking at it on a chart and it expands and contracts but don’t know what the numbers mean in a watchlist columns. As an example, after the close on 5/8/20 APA reads ADX 28.73 which means strong trend and the DMI read 16.18. What does the DMI reading mean by itself and what does it mean relative to the ADX? Thanks
 
Hey guys
Here is my version of a customizable watchlist column from a while back. Based on ideas from the book ADXellence.
ADX and DMI can have separate lengths and the box will change color depending on trending or not and if + or =- are in control. Enjoy

Code:
# Custom ADX/DMI watchlist Column
# WTF_Dude 5.26.20
# Based on settings in the book ADXellence by Charles Schaap
# If the - DMI is above positive, the box will be black (if ADX is below 25) and dark red if the ADX is above 25 (which means a negative trend is confirmed). +DMI in control with ADX over 25 is green, ADX below 25 will be gray.
# DMI of 13 and ADX at 8 are the settings recommended in ADXellence  By default in the regular ADX, they are both the same length @ 14. This gives you more control with having them separate and ADX is much more responsive.
# 25 is considered the threshold for trending. Ideally you want the DMI and ADX BOTH above 25
# Keep in mind, that a downward trending ADX can mean consolidation and not necessarily a price reversal.
# Select the time frame BOX in the small box above the area where you paste the code.
# Be sure to change your DMI length and ADX length in the code if you don't want to use the current settings (But they work really damn well)

input length = 13;
input ADXlength = 8;
input averageType = AverageType.WILDERS;


def hiDiff = high - high[1];
def loDiff = low[1] - low;

def plusDM = if hiDiff > loDiff and hiDiff > 0 then hiDiff else 0;
def minusDM =  if loDiff > hiDiff and loDiff > 0 then loDiff else 0;

def ATR = MovingAverage(averageType, TrueRange(high, close, low), length);
def "DI+" = 100 * MovingAverage(averageType, plusDM, length) / ATR;
def "DI-" = 100 * MovingAverage(averageType, minusDM, length) / ATR;

def DX = if ("DI+" + "DI-" > 0) then 100 * AbsValue("DI+" - "DI-") / ("DI+" + "DI-") else 0;
def ADX = MovingAverage(averageType, DX, ADXlength);
plot adxl = round(adx,1);

assignbackgroundcolor(if "DI+" is greater than "DI-" and ADX>=25 then color.dark_green else if "DI+" is greater than "DI-" and ADX<25 then color.dark_gray else if "DI-" is greater than "DI+" and ADX>25 then color.dark_red  else color.current);

# End Code
 
Hey guys
Here is my version of a customizable watchlist column from a while back. Based on ideas from the book ADXellence.
ADX and DMI can have separate lengths and the box will change color depending on trending or not and if + or =- are in control. Enjoy
Hey @wtf_dude I have this style I did with ADX as well... My problem with multiple times is if there was a hard reverse in between the times (like a pullback in between 30 minutes and 1 hour) I would probably be a tad bit insecure.
Code:
#INSTRUCTIONS
# Recommended timeframe chart setup:  1 minute and 30 days.
# Lables will adjust to highest timeframe and filter lower time frames
#
#INPUTS
input length = 14; #DI+- length
input adxlength = 25; #ADX sideways length
input averageType = AverageType.WILDERS;
input showlabels = yes; #show labels
input showstats = yes; #show stats
def show1MIN = yes; #show ONE MINUTE label
def show2MIN = yes; #show TWO MINUTES label
def show3MIN = yes; #show THREE MINUTES label
def show4MIN = yes; #show FOUR MINUTES label
def show5MIN = yes; #show FIVE MINUTES label
def show10MIN = yes; #show TEN MINUTES label
def show15MIN = yes; #show FIFTEEN MINUTES label
def show20MIN = yes; #show TWENTY MINUTES label
def show30MIN = yes; #show THIRTY MINUTES label
def show1HOUR = yes; #show HOUR label
#def show2HOUR = yes; #show TWO HOURS label
#def show4HOUR = yes; #show FOUR HOURS label
#def show1DAY = yes; #show ONE DAY label
#def show2DAY = yes; #show TWO DAYS label
#def show3DAY = yes; #show THREE DAYS label
#def show4DAY = yes; #show FOUR DAYS label
#def showWEEK = yes; #show ONE WEEK label
#def showMONTH = yes; #show ONE MONTH label
def NAN = Double.NaN;
#CORE
DefineGlobalColor("Bullish", Color.GREEN);
DefineGlobalColor("Bearish", Color.RED);
DefineGlobalColor("Neutral", Color.YELLOW);
#TIMEFRAME CHECK
def currentTimeFrame = GetAggregationPeriod();
# AGGREGATION 1 - ONE MINUTE
def aM1 = if currentTimeFrame <= AggregationPeriod.MIN then AggregationPeriod.MIN else currentTimeFrame;
def availableM1 = currentTimeFrame <= AggregationPeriod.MIN;
def hiDiffM1 = high(period = aM1) - high(period = aM1)[1];
def loDiffM1 = low(period = aM1)[1] - low(period = aM1);
def plusDMM1 = if hiDiffM1 > loDiffM1 and hiDiffM1 > 0 then hiDiffM1 else 0;
def minusDMM1 =  if loDiffM1 > hiDiffM1 and loDiffM1 > 0 then loDiffM1 else 0;
def ATRM1 = MovingAverage(averageType, TrueRange(high(period = aM1), close(period = aM1), low(period = aM1)), length);
def "DI+M1" = 100 * MovingAverage(averageType, plusDMM1, length) / ATRM1;
def "DI-M1" = 100 * MovingAverage(averageType, minusDMM1, length) / ATRM1;
def DXM1 = if ("DI+M1" + "DI-M1" > 0) then 100 * AbsValue("DI+M1" - "DI-M1") / ("DI+M1" + "DI-M1") else 0;
def ADXM1 = MovingAverage(averageType, DXM1, length);
def bullishM1 = ("DI+M1" > "DI-M1") and (ADXM1 > adxlength);
def bearishM1 = ("DI+M1" < "DI-M1") and (ADXM1 > adxlength);
def sidewaysM1 = (ADXM1 < adxlength);
def sStateM1 =  if !availableM1 then Double.NaN else if bullishM1 then 100 else if bearishM1 then -100 else 0;
def sPOSM1 = if IsNaN(sStateM1) then 0 else bullishM1;
def sNEGM1 = if IsNaN(sStateM1) then 0 else bearishM1;
def sSIDM1 = if IsNaN(sStateM1) then 0 else if sPOSM1 or sNEGM1 then 0 else sidewaysM1;
AddLabel(showlabels and show1MIN and availableM1, "1m", if IsNaN(sStateM1) then Color.DARK_GRAY else
 if sStateM1 == 100 then GlobalColor("Bullish") else
 if sStateM1 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 2 - TWO MINUTES
def aM2 = if currentTimeFrame <= AggregationPeriod.TWO_MIN then AggregationPeriod.TWO_MIN else currentTimeFrame;
def availableM2 = currentTimeFrame <= AggregationPeriod.TWO_MIN;
def hiDiffM2 = high(period = aM2) - high(period = aM2)[1];
def loDiffM2 = low(period = aM2)[1] - low(period = aM2);
def plusDMM2 = if hiDiffM2 > loDiffM2 and hiDiffM2 > 0 then hiDiffM2 else 0;
def minusDMM2 =  if loDiffM2 > hiDiffM2 and loDiffM2 > 0 then loDiffM2 else 0;
def ATRM2 = MovingAverage(averageType, TrueRange(high(period = aM2), close(period = aM2), low(period = aM2)), length);
def "DI+M2" = 100 * MovingAverage(averageType, plusDMM2, length) / ATRM2;
def "DI-M2" = 100 * MovingAverage(averageType, minusDMM2, length) / ATRM2;
def DXM2 = if ("DI+M2" + "DI-M2" > 0) then 100 * AbsValue("DI+M2" - "DI-M2") / ("DI+M2" + "DI-M2") else 0;
def ADXM2 = MovingAverage(averageType, DXM2, length);
def bullishM2 = ("DI+M2" > "DI-M2") and (ADXM2 > adxlength);
def bearishM2 = ("DI+M2" < "DI-M2") and (ADXM2 > adxlength);
def sidewaysM2 = (ADXM2 < adxlength);
def sStateM2 =  if !availableM2 then Double.NaN else if bullishM2 then 100 else if bearishM2 then -100 else 0;
def sPOSM2 = if IsNaN(sStateM2) then 0 else bullishM2;
def sNEGM2 = if IsNaN(sStateM2) then 0 else bearishM2;
def sSIDM2 = if IsNaN(sStateM2) then 0 else if sPOSM2 or sNEGM2 then 0 else sidewaysM2;
AddLabel(showlabels and show2MIN and availableM2, "2m", if IsNaN(sStateM2) then Color.DARK_GRAY else
 if sStateM2 == 100 then GlobalColor("Bullish") else
 if sStateM2 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 3 - THREE MINUTES
def aM3 = if currentTimeFrame <= AggregationPeriod.THREE_MIN then AggregationPeriod.THREE_MIN else currentTimeFrame;
def availableM3 = currentTimeFrame <= AggregationPeriod.THREE_MIN;
def hiDiffM3 = high(period = aM3) - high(period = aM3)[1];
def loDiffM3 = low(period = aM3)[1] - low(period = aM3);
def plusDMM3 = if hiDiffM3 > loDiffM3 and hiDiffM3 > 0 then hiDiffM3 else 0;
def minusDMM3 =  if loDiffM3 > hiDiffM3 and loDiffM3 > 0 then loDiffM3 else 0;
def ATRM3 = MovingAverage(averageType, TrueRange(high(period = aM3), close(period = aM3), low(period = aM3)), length);
def "DI+M3" = 100 * MovingAverage(averageType, plusDMM3, length) / ATRM3;
def "DI-M3" = 100 * MovingAverage(averageType, minusDMM3, length) / ATRM3;
def DXM3 = if ("DI+M3" + "DI-M3" > 0) then 100 * AbsValue("DI+M3" - "DI-M3") / ("DI+M3" + "DI-M3") else 0;
def ADXM3 = MovingAverage(averageType, DXM3, length);
def bullishM3 = ("DI+M3" > "DI-M3") and (ADXM3 > adxlength);
def bearishM3 = ("DI+M3" < "DI-M3") and (ADXM3 > adxlength);
def sidewaysM3 = (ADXM3 < adxlength);
def sStateM3 =  if !availableM3 then Double.NaN else if bullishM3 then 100 else if bearishM3 then -100 else 0;
def sPOSM3 = if IsNaN(sStateM3) then 0 else bullishM3;
def sNEGM3 = if IsNaN(sStateM3) then 0 else bearishM3;
def sSIDM3 = if IsNaN(sStateM3) then 0 else if sPOSM3 or sNEGM3 then 0 else sidewaysM3;
AddLabel(showlabels and show3MIN and availableM3, "3m", if IsNaN(sStateM3) then Color.DARK_GRAY else
 if sStateM3 == 100 then GlobalColor("Bullish") else
 if sStateM3 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 4 - FOUR MINUTES
def aM4 = if currentTimeFrame <= AggregationPeriod.FOUR_MIN then AggregationPeriod.FOUR_MIN else currentTimeFrame;
def availableM4 = currentTimeFrame <= AggregationPeriod.FOUR_MIN;
def hiDiffM4 = high(period = aM4) - high(period = aM4)[1];
def loDiffM4 = low(period = aM4)[1] - low(period = aM4);
def plusDMM4 = if hiDiffM4 > loDiffM4 and hiDiffM4 > 0 then hiDiffM4 else 0;
def minusDMM4 =  if loDiffM4 > hiDiffM4 and loDiffM4 > 0 then loDiffM4 else 0;
def ATRM4 = MovingAverage(averageType, TrueRange(high(period = aM4), close(period = aM4), low(period = aM4)), length);
def "DI+M4" = 100 * MovingAverage(averageType, plusDMM4, length) / ATRM4;
def "DI-M4" = 100 * MovingAverage(averageType, minusDMM4, length) / ATRM4;
def DXM4 = if ("DI+M4" + "DI-M4" > 0) then 100 * AbsValue("DI+M4" - "DI-M4") / ("DI+M4" + "DI-M4") else 0;
def ADXM4 = MovingAverage(averageType, DXM4, length);
def bullishM4 = ("DI+M4" > "DI-M4") and (ADXM4 > adxlength);
def bearishM4 = ("DI+M4" < "DI-M4") and (ADXM4 > adxlength);
def sidewaysM4 = (ADXM4 < adxlength);
def sStateM4 =  if !availableM4 then Double.NaN else if bullishM4 then 100 else if bearishM4 then -100 else 0;
def sPOSM4 = if IsNaN(sStateM4) then 0 else bullishM4;
def sNEGM4 = if IsNaN(sStateM4) then 0 else bearishM4;
def sSIDM4 = if IsNaN(sStateM4) then 0 else if sPOSM4 or sNEGM4 then 0 else sidewaysM4;
AddLabel(showlabels and show4MIN and availableM4, "4m", if IsNaN(sStateM4) then Color.DARK_GRAY else
 if sStateM4 == 100 then GlobalColor("Bullish") else
 if sStateM4 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 5 - FIVE MINUTES
def aM5 = if currentTimeFrame <= AggregationPeriod.FIVE_MIN then AggregationPeriod.FIVE_MIN else currentTimeFrame;
def availableM5 = currentTimeFrame <= AggregationPeriod.FIVE_MIN;
def hiDiffM5 = high(period = aM5) - high(period = aM5)[1];
def loDiffM5 = low(period = aM5)[1] - low(period = aM5);
def plusDMM5 = if hiDiffM5 > loDiffM5 and hiDiffM5 > 0 then hiDiffM5 else 0;
def minusDMM5 =  if loDiffM5 > hiDiffM5 and loDiffM5 > 0 then loDiffM5 else 0;
def ATRM5 = MovingAverage(averageType, TrueRange(high(period = aM5), close(period = aM5), low(period = aM5)), length);
def "DI+M5" = 100 * MovingAverage(averageType, plusDMM5, length) / ATRM5;
def "DI-M5" = 100 * MovingAverage(averageType, minusDMM5, length) / ATRM5;
def DXM5 = if ("DI+M5" + "DI-M5" > 0) then 100 * AbsValue("DI+M5" - "DI-M5") / ("DI+M5" + "DI-M5") else 0;
def ADXM5 = MovingAverage(averageType, DXM5, length);
def bullishM5 = ("DI+M5" > "DI-M5") and (ADXM5 > adxlength);
def bearishM5 = ("DI+M5" < "DI-M5") and (ADXM5 > adxlength);
def sidewaysM5 = (ADXM5 < adxlength);
def sStateM5 =  if !availableM5 then Double.NaN else if bullishM5 then 100 else if bearishM5 then -100 else 0;
def sPOSM5 = if IsNaN(sStateM5) then 0 else bullishM5;
def sNEGM5 = if IsNaN(sStateM5) then 0 else bearishM5;
def sSIDM5 = if IsNaN(sStateM5) then 0 else if sPOSM5 or sNEGM5 then 0 else sidewaysM5;
AddLabel(showlabels and show5MIN and availableM5, "5m", if IsNaN(sStateM5) then Color.DARK_GRAY else
 if sStateM5 == 100 then GlobalColor("Bullish") else
 if sStateM5 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 6 - TEN MINUTES
def aM10 = if currentTimeFrame <= AggregationPeriod.TEN_MIN then AggregationPeriod.TEN_MIN else currentTimeFrame;
def availableM10 = currentTimeFrame <= AggregationPeriod.TEN_MIN;
def hiDiffM10 = high(period = aM10) - high(period = aM10)[1];
def loDiffM10 = low(period = aM10)[1] - low(period = aM10);
def plusDMM10 = if hiDiffM10 > loDiffM10 and hiDiffM10 > 0 then hiDiffM10 else 0;
def minusDMM10 =  if loDiffM10 > hiDiffM10 and loDiffM10 > 0 then loDiffM10 else 0;
def ATRM10 = MovingAverage(averageType, TrueRange(high(period = aM10), close(period = aM10), low(period = aM10)), length);
def "DI+M10" = 100 * MovingAverage(averageType, plusDMM10, length) / ATRM10;
def "DI-M10" = 100 * MovingAverage(averageType, minusDMM10, length) / ATRM10;
def DXM10 = if ("DI+M10" + "DI-M10" > 0) then 100 * AbsValue("DI+M10" - "DI-M10") / ("DI+M10" + "DI-M10") else 0;
def ADXM10 = MovingAverage(averageType, DXM10, length);
def bullishM10 = ("DI+M10" > "DI-M10") and (ADXM10 > adxlength);
def bearishM10 = ("DI+M10" < "DI-M10") and (ADXM10 > adxlength);
def sidewaysM10 = (ADXM10 < adxlength);
def sStateM10 =  if !availableM10 then Double.NaN else if bullishM10 then 100 else if bearishM10 then -100 else 0;
def sPOSM10 = if IsNaN(sStateM10) then 0 else bullishM10;
def sNEGM10 = if IsNaN(sStateM10) then 0 else bearishM10;
def sSIDM10 = if IsNaN(sStateM10) then 0 else if sPOSM10 or sNEGM10 then 0 else sidewaysM10;
AddLabel(showlabels and show10MIN and availableM10, "10m", if IsNaN(sStateM10) then Color.DARK_GRAY else
 if sStateM10 == 100 then GlobalColor("Bullish") else
 if sStateM10 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 7 - FIFTEEN MINUTES
def aM15 = if currentTimeFrame <= AggregationPeriod.FIFTEEN_MIN then AggregationPeriod.FIFTEEN_MIN else currentTimeFrame;
def availableM15 = currentTimeFrame <= AggregationPeriod.FIFTEEN_MIN;
def hiDiffM15 = high(period = aM15) - high(period = aM15)[1];
def loDiffM15 = low(period = aM15)[1] - low(period = aM15);
def plusDMM15 = if hiDiffM15 > loDiffM15 and hiDiffM15 > 0 then hiDiffM15 else 0;
def minusDMM15 =  if loDiffM15 > hiDiffM15 and loDiffM15 > 0 then loDiffM15 else 0;
def ATRM15 = MovingAverage(averageType, TrueRange(high(period = aM15), close(period = aM15), low(period = aM15)), length);
def "DI+M15" = 100 * MovingAverage(averageType, plusDMM15, length) / ATRM15;
def "DI-M15" = 100 * MovingAverage(averageType, minusDMM15, length) / ATRM15;
def DXM15 = if ("DI+M15" + "DI-M15" > 0) then 100 * AbsValue("DI+M15" - "DI-M15") / ("DI+M15" + "DI-M15") else 0;
def ADXM15 = MovingAverage(averageType, DXM15, length);
def bullishM15 = ("DI+M15" > "DI-M15") and (ADXM15 > adxlength);
def bearishM15 = ("DI+M15" < "DI-M15") and (ADXM15 > adxlength);
def sidewaysM15 = (ADXM15 < adxlength);
def sStateM15 =  if !availableM15 then Double.NaN else if bullishM15 then 100 else if bearishM15 then -100 else 0;
def sPOSM15 = if IsNaN(sStateM15) then 0 else bullishM15;
def sNEGM15 = if IsNaN(sStateM15) then 0 else bearishM15;
def sSIDM15 = if IsNaN(sStateM15) then 0 else if sPOSM15 or sNEGM15 then 0 else sidewaysM15;
AddLabel(showlabels and show15MIN and availableM15, "15m", if IsNaN(sStateM15) then Color.DARK_GRAY else
 if sStateM15 == 100 then GlobalColor("Bullish") else
 if sStateM15 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 8 - TWENTY MINUTES
def aM20 = if currentTimeFrame <= AggregationPeriod.TWENTY_MIN then AggregationPeriod.TWENTY_MIN else currentTimeFrame;
def availableM20 = currentTimeFrame <= AggregationPeriod.TWENTY_MIN;
def hiDiffM20 = high(period = aM20) - high(period = aM20)[1];
def loDiffM20 = low(period = aM20)[1] - low(period = aM20);
def plusDMM20 = if hiDiffM20 > loDiffM20 and hiDiffM20 > 0 then hiDiffM20 else 0;
def minusDMM20 =  if loDiffM20 > hiDiffM20 and loDiffM20 > 0 then loDiffM20 else 0;
def ATRM20 = MovingAverage(averageType, TrueRange(high(period = aM20), close(period = aM20), low(period = aM20)), length);
def "DI+M20" = 100 * MovingAverage(averageType, plusDMM20, length) / ATRM20;
def "DI-M20" = 100 * MovingAverage(averageType, minusDMM20, length) / ATRM20;
def DXM20 = if ("DI+M20" + "DI-M20" > 0) then 100 * AbsValue("DI+M20" - "DI-M20") / ("DI+M20" + "DI-M20") else 0;
def ADXM20 = MovingAverage(averageType, DXM20, length);
def bullishM20 = ("DI+M20" > "DI-M20") and (ADXM20 > adxlength);
def bearishM20 = ("DI+M20" < "DI-M20") and (ADXM20 > adxlength);
def sidewaysM20 = (ADXM20 < adxlength);
def sStateM20 =  if !availableM20 then Double.NaN else if bullishM20 then 100 else if bearishM20 then -100 else 0;
def sPOSM20 = if IsNaN(sStateM20) then 0 else bullishM20;
def sNEGM20 = if IsNaN(sStateM20) then 0 else bearishM20;
def sSIDM20 = if IsNaN(sStateM20) then 0 else if sPOSM20 or sNEGM20 then 0 else sidewaysM20;
AddLabel(showlabels and show20MIN and availableM20, "20m", if IsNaN(sStateM20) then Color.DARK_GRAY else
 if sStateM20 == 100 then GlobalColor("Bullish") else
 if sStateM20 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 9 - THIRTY MINUTES
def aM30 = if currentTimeFrame <= AggregationPeriod.THIRTY_MIN then AggregationPeriod.THIRTY_MIN else currentTimeFrame;
def availableM30 = currentTimeFrame <= AggregationPeriod.THIRTY_MIN;
def hiDiffM30 = high(period = aM30) - high(period = aM30)[1];
def loDiffM30 = low(period = aM30)[1] - low(period = aM30);
def plusDMM30 = if hiDiffM30 > loDiffM30 and hiDiffM30 > 0 then hiDiffM30 else 0;
def minusDMM30 =  if loDiffM30 > hiDiffM30 and loDiffM30 > 0 then loDiffM30 else 0;
def ATRM30 = MovingAverage(averageType, TrueRange(high(period = aM30), close(period = aM30), low(period = aM30)), length);
def "DI+M30" = 100 * MovingAverage(averageType, plusDMM30, length) / ATRM30;
def "DI-M30" = 100 * MovingAverage(averageType, minusDMM30, length) / ATRM30;
def DXM30 = if ("DI+M30" + "DI-M30" > 0) then 100 * AbsValue("DI+M30" - "DI-M30") / ("DI+M30" + "DI-M30") else 0;
def ADXM30 = MovingAverage(averageType, DXM30, length);
def bullishM30 = ("DI+M30" > "DI-M30") and (ADXM30 > adxlength);
def bearishM30 = ("DI+M30" < "DI-M30") and (ADXM30 > adxlength);
def sidewaysM30 = (ADXM30 < adxlength);
def sStateM30 =  if !availableM30 then Double.NaN else if bullishM30 then 100 else if bearishM30 then -100 else 0;
def sPOSM30 = if IsNaN(sStateM30) then 0 else bullishM30;
def sNEGM30 = if IsNaN(sStateM30) then 0 else bearishM30;
def sSIDM30 = if IsNaN(sStateM30) then 0 else if sPOSM30 or sNEGM30 then 0 else sidewaysM30;
AddLabel(showlabels and show30MIN and availableM30, "30m", if IsNaN(sStateM30) then Color.DARK_GRAY else
 if sStateM30 == 100 then GlobalColor("Bullish") else
 if sStateM30 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 10 - HOUR
def aH1 = if currentTimeFrame <= AggregationPeriod.HOUR then AggregationPeriod.HOUR else currentTimeFrame;
def availableH1 = currentTimeFrame <= AggregationPeriod.HOUR;
def hiDiffH1 = high(period = aH1) - high(period = aH1)[1];
def loDiffH1 = low(period = aH1)[1] - low(period = aH1);
def plusDMH1 = if hiDiffH1 > loDiffH1 and hiDiffH1 > 0 then hiDiffH1 else 0;
def minusDMH1 =  if loDiffH1 > hiDiffH1 and loDiffH1 > 0 then loDiffH1 else 0;
def ATRH1 = MovingAverage(averageType, TrueRange(high(period = aH1), close(period = aH1), low(period = aH1)), length);
def "DI+H1" = 100 * MovingAverage(averageType, plusDMH1, length) / ATRH1;
def "DI-H1" = 100 * MovingAverage(averageType, minusDMH1, length) / ATRH1;
def DXH1 = if ("DI+H1" + "DI-H1" > 0) then 100 * AbsValue("DI+H1" - "DI-H1") / ("DI+H1" + "DI-H1") else 0;
def ADXH1 = MovingAverage(averageType, DXH1, length);
def bullishH1 = ("DI+H1" > "DI-H1") and (ADXH1 > adxlength);
def bearishH1 = ("DI+H1" < "DI-H1") and (ADXH1 > adxlength);
def sidewaysH1 = (ADXH1 < adxlength);
def sStateH1 =  if !availableH1 then Double.NaN else if bullishH1 then 100 else if bearishH1 then -100 else 0;
def sPOSH1 = if IsNaN(sStateH1) then 0 else bullishH1;
def sNEGH1 = if IsNaN(sStateH1) then 0 else bearishH1;
def sSIDH1 = if IsNaN(sStateH1) then 0 else if sPOSH1 or sNEGH1 then 0 else sidewaysH1;
AddLabel(showlabels and show1HOUR and availableH1, "1H", if IsNaN(sStateH1) then Color.DARK_GRAY else
 if sStateH1 == 100 then GlobalColor("Bullish") else
 if sStateH1 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 11 - TWO HOURS
def aH2 = if currentTimeFrame <= AggregationPeriod.TWO_HOURS then AggregationPeriod.TWO_HOURS else currentTimeFrame;
def availableH2 = currentTimeFrame <= AggregationPeriod.TWO_HOURS;
def hiDiffH2 = high(period = aH2) - high(period = aH2)[1];
def loDiffH2 = low(period = aH2)[1] - low(period = aH2);
def plusDMH2 = if hiDiffH2 > loDiffH2 and hiDiffH2 > 0 then hiDiffH2 else 0;
def minusDMH2 =  if loDiffH2 > hiDiffH2 and loDiffH2 > 0 then loDiffH2 else 0;
def ATRH2 = MovingAverage(averageType, TrueRange(high(period = aH2), close(period = aH2), low(period = aH2)), length);
def "DI+H2" = 100 * MovingAverage(averageType, plusDMH2, length) / ATRH2;
def "DI-H2" = 100 * MovingAverage(averageType, minusDMH2, length) / ATRH2;
def DXH2 = if ("DI+H2" + "DI-H2" > 0) then 100 * AbsValue("DI+H2" - "DI-H2") / ("DI+H2" + "DI-H2") else 0;
def ADXH2 = MovingAverage(averageType, DXH2, length);
def bullishH2 = ("DI+H2" > "DI-H2") and (ADXH2 > adxlength);
def bearishH2 = ("DI+H2" < "DI-H2") and (ADXH2 > adxlength);
def sidewaysH2 = (ADXH2 < adxlength);
def sStateH2 =  if !availableH2 then Double.NaN else if bullishH2 then 100 else if bearishH2 then -100 else 0;
def sPOSH2 = if IsNaN(sStateH2) then 0 else bullishH2;
def sNEGH2 = if IsNaN(sStateH2) then 0 else bearishH2;
def sSIDH2 = if IsNaN(sStateH2) then 0 else if sPOSH2 or sNEGH2 then 0 else sidewaysH2;
AddLabel(showlabels and show2HOUR and availableH2, "2H", if IsNaN(sStateH2) then Color.DARK_GRAY else
 if sStateH2 == 100 then GlobalColor("Bullish") else
 if sStateH2 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 12 - FOUR HOURS
def aH4 = if currentTimeFrame <= AggregationPeriod.FOUR_HOURS then AggregationPeriod.FOUR_HOURS else currentTimeFrame;
def availableH4 = currentTimeFrame <= AggregationPeriod.FOUR_HOURS;
def hiDiffH4 = high(period = aH4) - high(period = aH4)[1];
def loDiffH4 = low(period = aH4)[1] - low(period = aH4);
def plusDMH4 = if hiDiffH4 > loDiffH4 and hiDiffH4 > 0 then hiDiffH4 else 0;
def minusDMH4 =  if loDiffH4 > hiDiffH4 and loDiffH4 > 0 then loDiffH4 else 0;
def ATRH4 = MovingAverage(averageType, TrueRange(high(period = aH4), close(period = aH4), low(period = aH4)), length);
def "DI+H4" = 100 * MovingAverage(averageType, plusDMH4, length) / ATRH4;
def "DI-H4" = 100 * MovingAverage(averageType, minusDMH4, length) / ATRH4;
def DXH4 = if ("DI+H4" + "DI-H4" > 0) then 100 * AbsValue("DI+H4" - "DI-H4") / ("DI+H4" + "DI-H4") else 0;
def ADXH4 = MovingAverage(averageType, DXH4, length);
def bullishH4 = ("DI+H4" > "DI-H4") and (ADXH4 > adxlength);
def bearishH4 = ("DI+H4" < "DI-H4") and (ADXH4 > adxlength);
def sidewaysH4 = (ADXH4 < adxlength);
def sStateH4 =  if !availableH4 then Double.NaN else if bullishH4 then 100 else if bearishH4 then -100 else 0;
def sPOSH4 = if IsNaN(sStateH4) then 0 else bullishH4;
def sNEGH4 = if IsNaN(sStateH4) then 0 else bearishH4;
def sSIDH4 = if IsNaN(sStateH4) then 0 else if sPOSH4 or sNEGH4 then 0 else sidewaysH4;
AddLabel(showlabels and show4HOUR and availableH4, "4HR", if IsNaN(sStateH4) then Color.DARK_GRAY else
 if sStateH4 == 100 then GlobalColor("Bullish") else
 if sStateH4 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 13 - ONE DAY
def aD1 = if currentTimeFrame <= AggregationPeriod.DAY then AggregationPeriod.DAY else currentTimeFrame;
def availableD1 = currentTimeFrame <= AggregationPeriod.DAY;
def hiDiffD1 = high(period = aD1) - high(period = aD1)[1];
def loDiffD1 = low(period = aD1)[1] - low(period = aD1);
def plusDMD1 = if hiDiffD1 > loDiffD1 and hiDiffD1 > 0 then hiDiffD1 else 0;
def minusDMD1 =  if loDiffD1 > hiDiffD1 and loDiffD1 > 0 then loDiffD1 else 0;
def ATRD1 = MovingAverage(averageType, TrueRange(high(period = aD1), close(period = aD1), low(period = aD1)), length);
def "DI+D1" = 100 * MovingAverage(averageType, plusDMD1, length) / ATRD1;
def "DI-D1" = 100 * MovingAverage(averageType, minusDMD1, length) / ATRD1;
def DXD1 = if ("DI+D1" + "DI-D1" > 0) then 100 * AbsValue("DI+D1" - "DI-D1") / ("DI+D1" + "DI-D1") else 0;
def ADXD1 = MovingAverage(averageType, DXD1, length);
def bullishD1 = ("DI+D1" > "DI-D1") and (ADXD1 > adxlength);
def bearishD1 = ("DI+D1" < "DI-D1") and (ADXD1 > adxlength);
def sidewaysD1 = (ADXD1 < adxlength);
def sStateD1 =  if !availableD1 then Double.NaN else if bullishD1 then 100 else if bearishD1 #then -100 else 0;
def sPOSD1 = if IsNaN(sStateD1) then 0 else bullishD1;
def sNEGD1 = if IsNaN(sStateD1) then 0 else bearishD1;
def sSIDD1 = if IsNaN(sStateD1) then 0 else if sPOSD1 or sNEGD1 then 0 else sidewaysD1;
AddLabel(showlabels and show1DAY and availableD1, "1D", if IsNaN(sStateD1) then Color.DARK_GRAY else
 if sStateD1 == 100 then GlobalColor("Bullish") else
 if sStateD1 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 14 - TWO DAYS
def aD2 = if currentTimeFrame <= AggregationPeriod.TWO_DAYS then AggregationPeriod.TWO_DAYS else currentTimeFrame;
def availableD2 = currentTimeFrame <= AggregationPeriod.TWO_DAYS;
def hiDiffD2 = high(period = aD2) - high(period = aD2)[1];
def loDiffD2 = low(period = aD2)[1] - low(period = aD2);
def plusDMD2 = if hiDiffD2 > loDiffD2 and hiDiffD2 > 0 then hiDiffD2 else 0;
def minusDMD2 =  if loDiffD2 > hiDiffD2 and loDiffD2 > 0 then loDiffD2 else 0;
def ATRD2 = MovingAverage(averageType, TrueRange(high(period = aD2), close(period = aD2), low(period = aD2)), length);
def "DI+D2" = 100 * MovingAverage(averageType, plusDMD2, length) / ATRD2;
def "DI-D2" = 100 * MovingAverage(averageType, minusDMD2, length) / ATRD2;
def DXD2 = if ("DI+D2" + "DI-D2" > 0) then 100 * AbsValue("DI+D2" - "DI-D2") / ("DI+D2" + "DI-D2") else 0;
def ADXD2 = MovingAverage(averageType, DXD2, length);
def bullishD2 = ("DI+D2" > "DI-D2") and (ADXD2 > adxlength);
def bearishD2 = ("DI+D2" < "DI-D2") and (ADXD2 > adxlength);
def sidewaysD2 = (ADXD2 < adxlength);
def sStateD2 =  if !availableD2 then Double.NaN else if bullishD2 then 100 else if bearishD2 then -100 else 0;
def sPOSD2 = if IsNaN(sStateD2) then 0 else bullishD2;
def sNEGD2 = if IsNaN(sStateD2) then 0 else bearishD2;
def sSIDD2 = if IsNaN(sStateD2) then 0 else if sPOSD2 or sNEGD2 then 0 else sidewaysD2;
AddLabel(showlabels and show2DAY and availableD2, "2D", if IsNaN(sStateD2) then Color.DARK_GRAY else
 if sStateD2 == 100 then GlobalColor("Bullish") else
 if sStateD2 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 15 - THREE DAYS
def aD3 = if currentTimeFrame <= AggregationPeriod.THREE_DAYS then AggregationPeriod.THREE_DAYS else currentTimeFrame;
def availableD3 = currentTimeFrame <= AggregationPeriod.THREE_DAYS;
def hiDiffD3 = high(period = aD3) - high(period = aD3)[1];
def loDiffD3 = low(period = aD3)[1] - low(period = aD3);
def plusDMD3 = if hiDiffD3 > loDiffD3 and hiDiffD3 > 0 then hiDiffD3 else 0;
def minusDMD3 =  if loDiffD3 > hiDiffD3 and loDiffD3 > 0 then loDiffD3 else 0;
def ATRD3 = MovingAverage(averageType, TrueRange(high(period = aD3), close(period = aD3), low(period = aD3)), length);
def "DI+D3" = 100 * MovingAverage(averageType, plusDMD3, length) / ATRD3;
def "DI-D3" = 100 * MovingAverage(averageType, minusDMD3, length) / ATRD3;
def DXD3 = if ("DI+D3" + "DI-D3" > 0) then 100 * AbsValue("DI+D3" - "DI-D3") / ("DI+D3" + "DI-D3") else 0;
def ADXD3 = MovingAverage(averageType, DXD3, length);
def bullishD3 = ("DI+D3" > "DI-D3") and (ADXD3 > adxlength);
def bearishD3 = ("DI+D3" < "DI-D3") and (ADXD3 > adxlength);
def sidewaysD3 = (ADXD3 < adxlength);
def sStateD3 =  if !availableD3 then Double.NaN else if bullishD3 then 100 else if bearishD3 then -100 else 0;
def sPOSD3 = if IsNaN(sStateD3) then 0 else bullishD3;
def sNEGD3 = if IsNaN(sStateD3) then 0 else bearishD3;
def sSIDD3 = if IsNaN(sStateD3) then 0 else if sPOSD3 or sNEGD3 then 0 else sidewaysD3;
AddLabel(showlabels and show3DAY and availableD3, "3D", if IsNaN(sStateD3) then Color.DARK_GRAY else
 if sStateD3 == 100 then GlobalColor("Bullish") else
 if sStateD3 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 16 - FOUR DAYS
def aD4 = if currentTimeFrame <= AggregationPeriod.FOUR_DAYS then AggregationPeriod.FOUR_DAYS else currentTimeFrame;
def availableD4 = currentTimeFrame <= AggregationPeriod.FOUR_DAYS;
def hiDiffD4 = high(period = aD4) - high(period = aD4)[1];
def loDiffD4 = low(period = aD4)[1] - low(period = aD4);
def plusDMD4 = if hiDiffD4 > loDiffD4 and hiDiffD4 > 0 then hiDiffD4 else 0;
def minusDMD4 =  if loDiffD4 > hiDiffD4 and loDiffD4 > 0 then loDiffD4 else 0;
def ATRD4 = MovingAverage(averageType, TrueRange(high(period = aD4), close(period = aD4), low(period = aD4)), length);
def "DI+D4" = 100 * MovingAverage(averageType, plusDMD4, length) / ATRD4;
def "DI-D4" = 100 * MovingAverage(averageType, minusDMD4, length) / ATRD4;
def DXD4 = if ("DI+D4" + "DI-D4" > 0) then 100 * AbsValue("DI+D4" - "DI-D4") / ("DI+D4" + "DI-D4") else 0;
def ADXD4 = MovingAverage(averageType, DXD4, length);
def bullishD4 = ("DI+D4" > "DI-D4") and (ADXD4 > adxlength);
def bearishD4 = ("DI+D4" < "DI-D4") and (ADXD4 > adxlength);
def sidewaysD4 = (ADXD4 < adxlength);
def sStateD4 =  if !availableD4 then Double.NaN else if bullishD4 then 100 else if bearishD4 then -100 else 0;
def sPOSD4 = if IsNaN(sStateD4) then 0 else bullishD4;
def sNEGD4 = if IsNaN(sStateD4) then 0 else bearishD4;
def sSIDD4 = if IsNaN(sStateD4) then 0 else if sPOSD4 or sNEGD4 then 0 else sidewaysD4;
AddLabel(showlabels and show4DAY and availableD4, "4D", if IsNaN(sStateD4) then Color.DARK_GRAY else
 if sStateD4 == 100 then GlobalColor("Bullish") else
 if sStateD4 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 17 - ONE WEEK
def aW1 = if currentTimeFrame <= AggregationPeriod.WEEK then AggregationPeriod.WEEK else currentTimeFrame;
def availableW1 = currentTimeFrame <= AggregationPeriod.WEEK;
def hiDiffW1 = high(period = aW1) - high(period = aW1)[1];
def loDiffW1 = low(period = aW1)[1] - low(period = aW1);
def plusDMW1 = if hiDiffW1 > loDiffW1 and hiDiffW1 > 0 then hiDiffW1 else 0;
def minusDMW1 =  if loDiffW1 > hiDiffW1 and loDiffW1 > 0 then loDiffW1 else 0;
def ATRW1 = MovingAverage(averageType, TrueRange(high(period = aW1), close(period = aW1), low(period = aW1)), length);
def "DI+W1" = 100 * MovingAverage(averageType, plusDMW1, length) / ATRW1;
def "DI-W1" = 100 * MovingAverage(averageType, minusDMW1, length) / ATRW1;
def DXW1 = if ("DI+W1" + "DI-W1" > 0) then 100 * AbsValue("DI+W1" - "DI-W1") / ("DI+W1" + "DI-W1") else 0;
def ADXW1 = MovingAverage(averageType, DXW1, length);
def bullishW1 = ("DI+W1" > "DI-W1") and (ADXW1 > adxlength);
def bearishW1 = ("DI+W1" < "DI-W1") and (ADXW1 > adxlength);
def sidewaysW1 = (ADXW1 < adxlength);
def sStateW1 =  if !availableW1 then Double.NaN else if bullishW1 then 100 else if bearishW1 then -100 else 0;
def sPOSW1 = if IsNaN(sStateW1) then 0 else bullishW1;
def sNEGW1 = if IsNaN(sStateW1) then 0 else bearishW1;
def sSIDW1 = if IsNaN(sStateW1) then 0 else if sPOSW1 or sNEGW1 then 0 else sidewaysW1;
AddLabel(showlabels and showWEEK and availableW1, "W", if IsNaN(sStateW1) then Color.DARK_GRAY else
 if sStateW1 == 100 then GlobalColor("Bullish") else
 if sStateW1 == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
# AGGREGATION 18 - ONE MONTH
def aMM = if currentTimeFrame <= AggregationPeriod.MONTH then AggregationPeriod.MONTH else currentTimeFrame;
def availableMM = currentTimeFrame <= AggregationPeriod.MONTH;
def hiDiffMM = high(period = aMM) - high(period = aMM)[1];
def loDiffMM = low(period = aMM)[1] - low(period = aMM);
def plusDMMM = if hiDiffMM > loDiffMM and hiDiffMM > 0 then hiDiffMM else 0;
def minusDMMM =  if loDiffMM > hiDiffMM and loDiffMM > 0 then loDiffMM else 0;
def ATRMM = MovingAverage(averageType, TrueRange(high(period = aMM), close(period = aMM), low(period = aMM)), length);
def "DI+MM" = 100 * MovingAverage(averageType, plusDMMM, length) / ATRMM;
def "DI-MM" = 100 * MovingAverage(averageType, minusDMMM, length) / ATRMM;
def DXMM = if ("DI+MM" + "DI-MM" > 0) then 100 * AbsValue("DI+MM" - "DI-MM") / ("DI+MM" + "DI-MM") else 0;
def ADXMM = MovingAverage(averageType, DXMM, length);
def bullishMM = ("DI+MM" > "DI-MM") and (ADXMM > adxlength);
def bearishMM = ("DI+MM" < "DI-MM") and (ADXMM > adxlength);
def sidewaysMM = (ADXMM < adxlength);
def sStateMM =  if !availableMM then Double.NaN else if bullishMM then 100 else if bearishMM then -100 else 0;
def sPOSMM = if IsNaN(sStateMM) then 0 else bullishMM;
def sNEGMM = if IsNaN(sStateMM) then 0 else bearishMM;
def sSIDMM = if IsNaN(sStateMM) then 0 else if sPOSMM or sNEGMM then 0 else sidewaysMM;
AddLabel(showlabels and showMONTH and availableMM, "M", if IsNaN(sStateMM) then Color.DARK_GRAY else
 if sStateMM == 100 then GlobalColor("Bullish") else
 if sStateMM == -100 then GlobalColor("Bearish")
 else GlobalColor("Neutral"));
#What number of the timeframes are increasing or decreasing according the ADX???
def sPOS = sPOSM1 + sPOSM2 + sPOSM3 + sPOSM4 + sPOSM5 + sPOSM10 + sPOSM15 + sPOSM20 + sPOSM30 + sPOSH1 + sPOSH2 + sPOSH4 + sPOSD1 + sPOSD2 + sPOSD3 + sPOSD4 + sPOSW1 + sPOSMM;
def sNEG = sNEGM1 + sNEGM2 + sNEGM3 + sNEGM4 + sNEGM5 + sNEGM10 + sNEGM15 + sNEGM20 + sNEGM30 + sNEGH1 + sNEGH2 + sNEGH4 + sNEGD1 + sNEGD2 + sNEGD3 + sNEGD4 + sNEGW1 + sNEGMM;
def sSID = sSIDM1 + sSIDM2 + sSIDM3 + sSIDM4 + sSIDM5 + sSIDM10 + sSIDM15 + sSIDM20 + sSIDM30 + sSIDH1 + sSIDH2 + sSIDH4 + sSIDD1 + sSIDD2 + sSIDD3 + sSIDD4 + sSIDW1 + sSIDMM;
def sTOL = sPOS + sNEG + sSID;

AddLabel (showstats, "BullTimes: " + sPOS + " (" + AsPercent(Round(sPOS / sTOL, 2)) + ")", GlobalColor("Bullish"));
AddLabel (showstats, "BearTimes: " + sNEG + " (" +  AsPercent(Round(sNEG / sTOL, 2)) + ")", GlobalColor("Bearish"));
AddLabel (showstats, "Neutral: " + sSID + " (" +  AsPercent(Round(sSID / sTOL, 2)) + ")", GlobalColor("Neutral"));
# END OF Visual DMI (The 10x Bars) MTF Labels for ThinkorSwim
#Volume Data
def volLast30DayAvg = (volume(period = "DAY")[1] + volume(period = "DAY")[2] + volume(period = "DAY")[3] + volume(period = "DAY")[4] + volume(period = "DAY")[5] + volume(period = "DAY")[6] + volume(period = "DAY")[7] + volume(period = "DAY")[8] + volume(period = "DAY")[9] + volume(period = "DAY")[10] + volume(period = "DAY")[11] + volume(period = "DAY")[12] + volume(period = "DAY")[13] + volume(period = "DAY")[14] + volume(period = "DAY")[15] + volume(period = "DAY")[16] + volume(period = "DAY")[17] + volume(period = "DAY")[18] + volume(period = "DAY")[19] + volume(period = "DAY")[20] + volume(period = "DAY")[21] + volume(period = "DAY")[22] + volume(period = "DAY")[23] + volume(period = "DAY")[24] + volume(period = "DAY")[25] + volume(period = "DAY")[26] + volume(period = "DAY")[27] + volume(period = "DAY")[28] + volume(period = "DAY")[29] + volume(period = "DAY")[30]) / 30;
def today = volume(period = "DAY");
def percentOf30Day = Round((today / volLast30DayAvg) * 100, 0);
def avg30Bars = (volume[1] + volume[2] + volume[3] + volume[4] + volume[5] + volume[6] + volume[7] + volume[8] + volume[9] + volume[10] + volume[11] + volume[12] + volume[13] + volume[14] + volume[15] + volume[16] + volume[17] + volume[18] + volume[19] + volume[20] + volume[21] + volume[22] + volume[23] + volume[24] + volume[25] + volume[26] + volume[27] + volume[28] + volume[29] + volume[30]) / 30;
def V=volume; def c=close; def h=high; def l=low;
def buying = V * (C - L) / (H - L);
def selling = V * (H - C) / (H - L);
def curVolume = volume;
def percentOf30Bar = Round((curVolume / avg30Bars) * 100, 0);
def SellVolPercent = Round((selling / volume) * 100, 0);
# Labels
AddLabel(1, "Avg 30 Days: " + Round(volLast30DayAvg, 0), Color.GRAY);
AddLabel(percentOf30Day >= UnusualVolumePercent, "High Volume Today: " + today +" DayTo30DayRatio:" +percentOf30Day+"%", color.White);
AddLabel(percentOf30Day < UnusualVolumePercent && percentOf30Day >= 100, "Volume Today +Average: " + today +" DayTo30DayRatio:" +percentOf30Day+"%", color.White);
AddLabel(percentOf30Day < 100, "Volume Today -Average: " + today +" DayTo30DayRatio:" +percentOf30Day+"%", color.Dark_Gray);

AddLabel(1, "Today: " + today, (if percentOf30Day >= UnusualVolumePercent then Color.White else if percentOf30Day >= 100 then Color.Light_Gray else Color.Dark_GRAY));
AddLabel(1, percentOf30Day + "%", (if percentOf30Day >= UnusualVolumePercent then Color.GREEN else if percentOf30Day >= 100 then Color.WHITE else Color.GRAY) );
AddLabel(1, "Avgerage 30 Bar Volume: " + Round(avg30Bars, 0), Color.White);
AddLabel(1, "Current Volume: " + curVolume, (if percentOf30Bar >= UnusualVolumePercent then Color.Cyan else if percentOf30Bar >= 100 then Color.White else Color.Dark_GRAY));
AddLabel(1, percentOf30Bar + "% Of Avg30Bars", (if percentOf30Bar >= UnusualVolumePercent then Color.Cyan else if percentOf30Bar >= 100 then Color.WHITE else Color.Dark_GRAY) );
#AddLabel(1, "Current Bar Price Drop%: " + SellVolPercent, (if SellVolPercent > 51 then Color.RED else if SellVolPercent < 49 then Color.GREEN else Color.YELLOW));
 
Add arrows for DMI indicator
I need help with this indicator, i will like to plot a green arrow for long and red arrow for short, can someone here can help me .. the arrow will be great on the signal candle. here is the script. thank you in advance.

Code:
declare lower;

input length = 10;
input paintBars = yes;
input averageType = AverageType.WILDERS;

def diPlus = DMI(length, averageType)."DI+";
def diMinus = DMI(length, averageType)."DI-";

plot Osc = diPlus - diMinus;
plot Hist = Osc;
plot ZeroLine = 0;

Osc.SetDefaultColor(GetColor(1));
Hist.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
Hist.SetLineWeight(3);
Hist.DefineColor("Positive", Color.UPTICK);
Hist.DefineColor("Negative", Color.DOWNTICK);
Hist.AssignValueColor(if Hist > 0 then Hist.Color("Positive") else Hist.Color("Negative"));
Hist.HideTitle();
ZeroLine.SetDefaultColor(Color.GRAY);

DefineGlobalColor("Positive", Color.UPTICK);
DefineGlobalColor("Negative", Color.DOWNTICK);
AssignPriceColor(if !paintBars
    then Color.CURRENT
    else if Osc > 0
        then GlobalColor("Positive")
        else GlobalColor("Negative"));

Osc.assignValueColor(
         if Osc > 0 then color.dark_green
    else if Osc < 0 then color.dark_red
    else color.black);
 
Last edited by a moderator:
Is this what you are looking for?

aaa2.png


Code:
#Add these lines to the end of your script:

plot greenarrow = if  Osc crosses above 0 then ZeroLine else Double.NaN;
greenarrow.SetDefaultColor(color.green);
greenarrow.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
greenarrow.SetLineWeight(2);
greenarrow.HideBubble() ;
greenarrow.HideTitle() ;

plot redarrow = if Osc crosses below 0 then ZeroLine else double.NaN ;
redarrow.SetDefaultColor(Color.red);
redarrow.SetLineWeight(2);
redarrow.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
redarrow.HideBubble() ;
redarrow.HideTitle() ;
 
thank you some much for your reply, that is was I am looking for, but the arrow is plotting in the lower indicator, i will like the arrow to plot in the price charts, meaning in the upper . thank you very much.
 
@FOTM_8888 To post a lower indicator in an upper chart with just the arrows; requires that all plots except the arrows be changed to 'def' and the arrows which currently print on the zeroline of the histogram to be modified to print above/below the candles in the upper chart.

Here is the script w/ the changes:

Code:
input length = 10;
input paintBars = yes;
input averageType = AverageType.WILDERS;

def diPlus = DMI(length, averageType)."DI+";
def diMinus = DMI(length, averageType)."DI-";

def Osc = diPlus - diMinus;
def Hist = Osc;
def ZeroLine = 0;

DefineGlobalColor("Positive", Color.UPTICK);
DefineGlobalColor("Negative", Color.DOWNTICK);
AssignPriceColor(if !paintBars
    then Color.CURRENT
    else if Osc > 0
        then GlobalColor("Positive")
        else GlobalColor("Negative"));

# This plots arrows at 30% of bar range above the bar high/low
def prange = high – low;
def plotHigh = high + prange * 0.3;
def plotLow  = low  - prange * 0.3;

plot greenarrow = if  Osc crosses above 0 then plotLow else Double.NaN;
greenarrow.SetDefaultColor(color.green);
greenarrow.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
greenarrow.SetLineWeight(2);
greenarrow.HideBubble() ;
greenarrow.HideTitle() ;

plot redarrow = if Osc crosses below 0 then plotHigh else double.NaN ;
redarrow.SetDefaultColor(Color.red);
redarrow.SetLineWeight(2);
redarrow.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
redarrow.HideBubble() ;
redarrow.HideTitle() ;

aaa2.png
 
Hi i will like to plot a lower square or dot on the charts, the way it is now is just a label, how can i create a lower dot or square? thank you in advance.

Code:
input length = 14;
input averageType = AverageType.WILDERS;

DefineGlobalColor("DI+", color.green);
DefineGlobalColor("DI-", color.red);
DefineGlobalColor("Neutral", color.gray);

def ADX = DMI(length, averageType).ADX;
def DIp = DMI(length, averageType)."DI+";
def DIm = DMI(length, averageType)."DI-";
AddLabel(Yes, "ADX("+length+"):" + Round(ADX,1), if ADX > 20 and DIp > Dim then GlobalColor("DI+") else if ADX > 20 and DIm > DIp then GlobalColor("DI-") else GlobalColor("Neutral"));
 
Last edited by a moderator:
Hxdf3XB.png


Code:
input length = 14;
input averageType = AverageType.WILDERS;

DefineGlobalColor("DI+", color.green);
DefineGlobalColor("DI-", color.red);
DefineGlobalColor("Neutral", color.gray);

def ADX = DMI(length, averageType).ADX;
def DIp = DMI(length, averageType)."DI+";
def DIm = DMI(length, averageType)."DI-";
AddLabel(Yes, "ADX("+length+"):" + Round(ADX,1), if ADX > 20 and DIp > Dim then GlobalColor("DI+") else if ADX > 20 and DIm > DIp then GlobalColor("DI-") else GlobalColor("Neutral"));

plot DIp_greater =  if ADX > 20 and DIp > Dim then low else double.NaN ;
plot DIm_greater =  if ADX > 20 and DIm > DIp then high else double.NaN ;

DIp_greater.SetPaintingStrategy(PaintingStrategy.LINE_VS_SQUARES);
DIp_greater.SetLineWeight(1);
DIp_greater.SetDefaultColor(color.dark_green) ;

DIm_greater.SetPaintingStrategy(PaintingStrategy.LINE_VS_SQUARES);
DIm_greater.SetLineWeight(1);
DIm_greater.SetDefaultColor(color.dark_red) ;
 
I'm trying to make a script that shows DMI label . I'm not sure if I did it right. Can anyone guide me please. Thanks in advance

#
# TD Ameritrade IP Company, Inc. (c) 2008-2021
#
declare lower;
input length = 30;
input averageType = AverageType.WILDERS;

def hiDiff = high - high[1];
def loDiff = low[1] - low;

def plusDM = if hiDiff > loDiff and hiDiff > 0 then hiDiff else 0;
def minusDM = if loDiff > hiDiff and loDiff > 0 then loDiff else 0;

def ATR = MovingAverage(averageType, TrueRange(high, close, low), length);
plot "DI+" = 100 * MovingAverage(averageType, plusDM, length) / ATR;
plot "DI-" = 100 * MovingAverage(averageType, minusDM, length) / ATR;

def DX = if ("DI+" + "DI-" > 0) then 100 * AbsValue("DI+" - "DI-") / ("DI+" + "DI-") else 0;

plot ADX = MovingAverage(averageType, DX, length);
"DI+".SetDefaultColor(GetColor(6));
"DI-".SetDefaultColor(GetColor(5));
ADX.SetDefaultColor(GetColor(8));

AddLabel(yes, "DMI("+length+"):" + Round(DX/ATR,1),(if plusDM > minusDM then Color.GREEN else Color.RED));
 
Last edited:

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
369 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top