#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));