# Triple Exhaustion Indicator
##
##
## CREDITS
## Requested by @Chence27 from criteria listed here https://usethinkscript.com/threads/triple-exhaustion-indicator.9001/
##
##
## Removing the header Credit credits and description is not permitted, any modification needs to be shared.
##
## V 1.0 : @cos251 - Initial release per request from www.usethinkscript.com forum thread:
## : https://usethinkscript.com/threads/triple-exhaustion-indicator.9001/
##
##
## adding MTF labels @irishgold 08/22/2022
## added MTF Painted Candles with Extreme as well as arrows (create color arrows working but define color paint candles not working for some reason
declare upper;
### --- 4 Aggregation Periods --- ###
#####################################
input agperiod1 = { "1 min", default "2 min", "3 min", "5 min", "10 min", "15 min", "30 min", "1 hour", "2 hours", "4 hours", "Day", "Week", "Month"};
input agperiod2 = {"1 min", "2 min", "3 min", default "5 min", "10 min", "15 min", "30 min", "1 hour", "2 hours", "4 hours", "Day", "Week", "Month"};
input agperiod3 = {"1 min", "2 min", "3 min", "5 min", default "10 min", "15 min", "30 min", "1 hour", "2 hours", "4 hours", "Day", "Week", "Month"};
input agperiod4 = {"1 min", "2 min", "3 min", "5 min", "10 min", default "15 min", "30 min", "1 hour", "2 hours", "4 hours", "Day", "Week", "Month"};
# --- Inputs --- #
input DI_Length = 14;
input over_bought = 80;
input over_sold = 20;
input KPeriod = 10;
input DPeriod = 10;
input averageType = AverageType.SIMPLE;
### --- Ag1 --- ###
input length1 = 900;
### --- Ag2 --- ###
input length2= 900;
### --- Ag3 --- ###
input length3 = 900;
### --- Ag4 --- ###
input length4 = 900;
###########################
input paintBars = yes;
input showLabels = yes;
###########################
def currentPeriod = GetAggregationPeriod();
### --- Ag1 --- ###
def priceH1 = high(period = agperiod1);
def priceL1 = low(period = agperiod1);
def priceC1 = close(period = agperiod1);
### --- Ag2 --- ###
def priceH2 = high(period = agperiod2);
def priceL2 = low(period = agperiod2);
def priceC2 = close(period = agperiod2);
### --- Ag3 --- ###
def priceH3 = high(period = agperiod3);
def priceL3 = low(period = agperiod3);
def priceC3 = close(period = agperiod3);
### --- Ag4 --- ###
def priceH4 = high(period = agperiod4);
def priceL4 = low(period = agperiod4);
def priceC4 = close(period = agperiod4);
###########################
# --- Indicators - StochasticSlow / MACD / MACD StDev / DMI+/-
### --- Ag1 --- ###
def SlowK1 = reference StochasticFull(over_bought, over_sold, KPeriod, DPeriod, priceH1, priceL1, priceC1, 3, averageType).FullK;
def MACD1 = (ExpAverage(priceC1[1], 12)) - (ExpAverage(priceC1[1], 26));
def priceMean1 = SimpleMovingAvg(MACD1, length1);
def MACD_stdev1 = (MACD1 - priceMean1) / StDev(MACD1, length1);
### --- Ag2 --- ###
def SlowK2 = reference StochasticFull(over_bought, over_sold, KPeriod, DPeriod, priceH2, priceL2, priceC2, 3, averageType).FullK;
def MACD2 = (ExpAverage(priceC2[1], 12)) - (ExpAverage(priceC2[1], 26));
def priceMean2 = SimpleMovingAvg(MACD2, length2);
def MACD_stdev2 = (MACD2 - priceMean2) / StDev(MACD2, length2);
### --- Ag3 --- ###
def SlowK3 = reference StochasticFull(over_bought, over_sold, KPeriod, DPeriod, priceH3, priceL3, priceC3, 3, averageType).FullK;
def MACD3 = (ExpAverage(priceC3[1], 12)) - (ExpAverage(priceC3[1], 26));
def priceMean3 = SimpleMovingAvg(MACD3, length3);
def MACD_stdev3 = (MACD3 - priceMean3) / StDev(MACD3, length3);
### --- Ag4 --- ###
def SlowK4 = reference StochasticFull(over_bought, over_sold, KPeriod, DPeriod, priceH4, priceL4, priceC4, 3, averageType).FullK;
def MACD4 = (ExpAverage(priceC4[1], 12)) - (ExpAverage(priceC4[1], 26));
def priceMean4 = SimpleMovingAvg(MACD4, length4);
def MACD_stdev4 = (MACD4 - priceMean4) / StDev(MACD4, length4);
### --- All --- ###
def dPlus = reference DMI()."DI+";
def dMinus = reference DMI()."DI-";
### --- DMI computations --- ###
### --- Ag1 --- ###
def hiDiff1 = priceH1 - priceH1[1];
def loDiff1 = priceL1[1] - priceL1;
def plusDM1 = if hiDiff1 > loDiff1 and hiDiff1 > 0 then hiDiff1 else 0;
def minusDM1 = if loDiff1 > hiDiff1 and loDiff1 > 0 then loDiff1 else 0;
def ATR1 = MovingAverage(averageType, TrueRange(priceH1, priceC1, priceL1), DI_Length);
def dPlus1 = 100 * MovingAverage(AverageType.WILDERS, plusDM1, DI_Length) / ATR1;
def dMinus1 = 100 * MovingAverage(AverageType.WILDERS, minusDM1, DI_Length) / ATR1;
### --- Ag2 --- ###
def hiDiff2 = priceH2 - priceH2[1];
def loDiff2 = priceL2[1] - priceL2;
def plusDM2 = if hiDiff2 > loDiff2 and hiDiff2 > 0 then hiDiff2 else 0;
def minusDM2 = if loDiff2 > hiDiff2 and loDiff2 > 0 then loDiff2 else 0;
def ATR2 = MovingAverage(averageType, TrueRange(priceH2, priceC2, priceL2), DI_Length);
def dPlus2 = 100 * MovingAverage(AverageType.WILDERS, plusDM2, DI_Length) / ATR2;
def dMinus2 = 100 * MovingAverage(AverageType.WILDERS, minusDM2, DI_Length) / ATR2;
### --- Ag3 --- ###
def hiDiff3 = priceH3 - priceH3[1];
def loDiff3 = priceL3[1] - priceL3;
def plusDM3 = if hiDiff3 > loDiff3 and hiDiff3 > 0 then hiDiff3 else 0;
def minusDM3 = if loDiff3 > hiDiff3 and loDiff3 > 0 then loDiff3 else 0;
def ATR3 = MovingAverage(averageType, TrueRange(priceH3, priceC3, priceL3), DI_Length);
def dPlus3 = 100 * MovingAverage(AverageType.WILDERS, plusDM3, DI_Length) / ATR3;
def dMinus3 = 100 * MovingAverage(AverageType.WILDERS, minusDM3, DI_Length) / ATR3;
### --- Ag4 --- ###
def hiDiff4 = priceH4 - priceH4[1];
def loDiff4 = priceL4[1] - priceL4;
def plusDM4 = if hiDiff4 > loDiff4 and hiDiff4 > 0 then hiDiff4 else 0;
def minusDM4 = if loDiff4 > hiDiff4 and loDiff4 > 0 then loDiff4 else 0;
def ATR4 = MovingAverage(averageType, TrueRange(priceH4, priceC4, priceL4), DI_Length);
def dPlus4 = 100 * MovingAverage(AverageType.WILDERS, plusDM4, DI_Length) / ATR4;
def dMinus4 = 100 * MovingAverage(AverageType.WILDERS, minusDM4, DI_Length) / ATR4;
###########################
# --- Conditions
### --- Ag1 --- ###
def sellerRegular1 = SlowK1 < 20 and MACD_stdev1 < -1 and dPlus1 < 15;
def sellerExtreme1 = SlowK1 < 20 and MACD_stdev1 < -2 and dPlus1 < 15;
def buyerRegular1 = SlowK1 > 80 and MACD_stdev1 > 1 and dMinus1 < 15;
def buyerExtreme1 = SlowK1 > 80 and MACD_stdev1 > 2 and dMinus1 < 15;
### --- Ag2 --- ###
def sellerRegular2 = SlowK2 < 20 and MACD_stdev2 < -1 and dPlus2 < 15;
def sellerExtreme2 = SlowK2 < 20 and MACD_stdev2 < -2 and dPlus2 < 15;
def buyerRegular2 = SlowK2 > 80 and MACD_stdev2 > 1 and dMinus2 < 15;
def buyerExtreme2 = SlowK2 > 80 and MACD_stdev2 > 2 and dMinus2 < 15;
### --- Ag3 --- ###
def sellerRegular3 = SlowK3 < 20 and MACD_stdev3 < -1 and dPlus3 < 15;
def sellerExtreme3 = SlowK3 < 20 and MACD_stdev3 < -2 and dPlus3 < 15;
def buyerRegular3 = SlowK3 > 80 and MACD_stdev3 > 1 and dMinus3 < 15;
def buyerExtreme3 = SlowK3 > 80 and MACD_stdev3 > 2 and dMinus3 < 15;
### --- Ag4 --- ###
def sellerRegular4 = SlowK4 < 20 and MACD_stdev4 < -1 and dPlus4 < 15;
def sellerExtreme4 = SlowK4 < 20 and MACD_stdev4 < -2 and dPlus4 < 15;
def buyerRegular4 = SlowK4 > 80 and MACD_stdev4 > 1 and dMinus4 < 15;
def buyerExtreme4 = SlowK4 > 80 and MACD_stdev4 > 2 and dMinus4 < 15;
###########################
### --- Plot Arrows --- ###
### --- Ag1 --- ###
plot RegularBuy1 = if sellerRegular1[1] and !sellerRegular1 then low else Double.NaN;
plot ExtremeBuy1 = if sellerExtreme1[1] and !sellerExtreme1 then low else Double.NaN;
plot RegularSell1 = if buyerRegular1[1] and !buyerRegular1 then high else Double.NaN;
plot ExtremeSell1 = if buyerExtreme1[1] and !buyerExtreme1 then high else Double.NaN;
### --- Ag2 --- ###
plot RegularBuy2 = if sellerRegular2[1] and !sellerRegular2 then low else Double.NaN;
plot ExtremeBuy2 = if sellerExtreme2[1] and !sellerExtreme2 then low else Double.NaN;
plot RegularSell2 = if buyerRegular2[1] and !buyerRegular2 then high else Double.NaN;
plot ExtremeSell2 = if buyerExtreme2[1] and !buyerExtreme2 then high else Double.NaN;
### --- Ag3 --- ###
plot RegularBuy3 = if sellerRegular3[1] and !sellerRegular3 then low else Double.NaN;
plot ExtremeBuy3 = if sellerExtreme3[1] and !sellerExtreme3 then low else Double.NaN;
plot RegularSell3 = if buyerRegular3[1] and !buyerRegular3 then high else Double.NaN;
plot ExtremeSell3 = if buyerExtreme3[1] and !buyerExtreme3 then high else Double.NaN;
### --- Ag4 --- ###
plot RegularBuy4 = if sellerRegular4[1] and !sellerRegular4 then low else Double.NaN;
plot ExtremeBuy4 = if sellerExtreme4[1] and !sellerExtreme4 then low else Double.NaN;
plot RegularSell4 = if buyerRegular4[1] and !buyerRegular4 then high else Double.NaN;
plot ExtremeSell4 = if buyerExtreme4[1] and !buyerExtreme4 then high else Double.NaN;
###########################
### --- Arrows --- ###
### --- Ag1 --- ###
RegularBuy1.SetPaintingStrategy(PaintingSTrategy.ARROW_UP);
ExtremeBuy1.SetPaintingStrategy(PaintingSTrategy.ARROW_UP);
RegularSell1.SetPaintingStrategy(PaintingSTrategy.ARROW_down);
ExtremeSell1.SetPaintingSTrategy(paintingSTrategy.Arrow_DOWN);
### --- Ag2 --- ###
RegularBuy2.SetPaintingStrategy(PaintingSTrategy.ARROW_UP);
ExtremeBuy2.SetPaintingStrategy(PaintingSTrategy.ARROW_UP);
RegularSell2.SetPaintingStrategy(PaintingSTrategy.ARROW_down);
ExtremeSell2.SetPaintingSTrategy(paintingSTrategy.Arrow_DOWN);
### --- Ag3 --- ###
RegularBuy3.SetPaintingStrategy(paintingSTrategy.triangles);
ExtremeBuy3.SetPaintingStrategy(paintingSTrategy.triangles);
RegularSell3.SetPaintingStrategy(paintingSTrategy.triangles);
ExtremeSell3.SetPaintingSTrategy(paintingSTrategy.triangles);
### --- Ag4 --- ###
RegularSell4.SetPaintingStrategy(PaintingSTrategy.ARROW_down);
ExtremeSell4.SetPaintingSTrategy(paintingSTrategy.Arrow_DOWN);
RegularBuy4.SetPaintingStrategy(PaintingSTrategy.ARROW_UP);
ExtremeBuy4.SetPaintingStrategy(PaintingSTrategy.ARROW_UP);
### --- Color --- ###
### --- Ag1 --- ###
RegularBuy1.SetDefaultColor(CreateColor(0, 205, 1));
ExtremeBuy1.SetDefaultColor(CreateColor(102, 255, 135));
RegularSell1.SetDefaultColor(CreateColor(205, 0, 1));
ExtremeSell1.SetDefaultColor(CreateColor(205, 51, 51));
### --- Ag2 --- ###
RegularBuy2.SetDefaultColor(CreateColor(0, 155, 1));
ExtremeBuy2.SetDefaultColor(CreateColor(102, 255, 105));
RegularSell2.SetDefaultColor(CreateColor(155, 0, 1));
ExtremeSell2.SetDefaultColor(CreateColor(155, 51, 51));
### --- Ag3 --- ###
RegularBuy3.SetDefaultColor(CreateColor(0, 105, 1));
ExtremeBuy3.SetDefaultColor(CreateColor(102, 255, 75));
RegularSell3.SetDefaultColor(CreateColor(105, 0, 1));
ExtremeSell3.SetDefaultColor(CreateColor(105, 51, 51));
### --- Ag4 --- ###
#RegularBuy4.SetDefaultColor(CreateColor(0, 55, 1));
#ExtremeBuy4.SetDefaultColor(CreateColor(102, 255, 45));
#RegularSell4.SetDefaultColor(CreateColor(55, 0, 1));
#ExtremeSell4.SetDefaultColor(CreateColor(55, 51, 51));
### --- Ag4 --- ###
RegularBuy4.SetDefaultColor(Color.White);
ExtremeBuy4.SetDefaultColor(Color.Gray);
RegularSell4.SetDefaultColor(Color.White);
ExtremeSell4.SetDefaultColor(Color.Gray);
###########################
### Define Color For Price Color (not working) ###
### --- Ag1 --- ###
#RegularBuy1.DefineColor("RegularBuy1",(CreateColor(0, 205, 1)));
#ExtremeBuy1.DefineColor("ExtremeBuy1",(CreateColor(102, 255, 135)));
#RegularSell1.DefineColor("RegularSell1",(CreateColor(205, 0, 1)));
#ExtremeSell1.DefineColor("ExtremeSell1",(CreateColor(205, 51, 51)));
### --- Ag2 --- ###
#RegularBuy2.DefineColor("RegularBuy2",(CreateColor(0, 155, 1)));
#ExtremeBuy2.DefineColor("ExtremeBuy2",(CreateColor(102, 255, 105)));
#RegularSell2.DefineColor("RegularSell2",(CreateColor(155, 0, 1)));
#ExtremeSell2.DefineColor("ExtremeSell2",(CreateColor(155, 51, 51)));
### --- Ag3 --- ###
#RegularBuy3.DefineColor("RegularBuy3",(CreateColor(0, 105, 1)));
#ExtremeBuy3.DefineColor("ExtremeBuy3",(CreateColor(102, 255, 75)));
#RegularSell3.DefineColor("RegularSell3",(CreateColor(105, 0, 1)));
#ExtremeSell3.DefineColor("ExtremeSell3",(CreateColor(105, 51, 51)));
### --- Ag4 --- ###
#RegularBuy4.DefineColor("RegularBuy4",(CreateColor(0, 55, 1)));
#ExtremeBuy4.DefineColor("ExtremeBuy4",(CreateColor(102, 255, 45)));
#RegularSell4.DefineColor("RegularSell4",(CreateColor(55, 0, 1)));
#ExtremeSell4.DefineColor("ExtremeSell4",(CreateColor(55, 51, 51)));
###########################
### Price Color ###
AssignPriceColor( if paintBars and sellerExtreme1 then Color.Downtick
else if buyerExtreme1 and paintBars then Color.Lime
else if paintBars and sellerRegular1 then Color.Downtick
else if buyerRegular1 and paintBars then Color.Lime
else if paintBars and sellerExtreme2 then Color.Light_red
else if buyerExtreme2 and paintBars then Color.Light_GREEN
else if paintBars and sellerRegular2 then Color.Light_red
else if buyerRegular2 and paintBars then Color.Light_GREEN
else if paintBars and sellerExtreme3 then Color.red
else if buyerExtreme3 and paintBars then Color.Green
else if paintBars and sellerRegular3 then Color.red
else if buyerRegular3 and paintBars then Color.GREEN
else if paintBars and sellerExtreme4 then Color.Dark_Red
else if buyerExtreme4 and paintBars then Color.Dark_GREEN
else if paintBars and sellerRegular4 then Color.Dark_red
else if buyerRegular4 and paintBars then Color.DARK_GREEN
else if paintBars then Color.GRAY else Color.Current);
### NOT WORKING PRICE COLOR? ####
#AssignPriceColor(
# if paintBars and sellerExtreme1 then ExtremeSell1.Color("ExtremeSell")
#else if buyerExtreme1 and paintBars then ExtremeBuy1.Color("ExtremeBuy")
#else if paintBars and sellerRegular1 then RegularSell1.Color("RegularSell")
#else if buyerRegular1 and paintBars then RegularBuy1.Color("RegularBuy")
#else if paintBars and sellerExtreme2 then ExtremeSell2.Color("ExtremeSell")
#else if buyerExtreme2 and paintBars then ExtremeBuy2.Color("ExtremeBuy")
#else if paintBars and sellerRegular2 then RegularSell2.Color("RegularSell")
#else if buyerRegular2 and paintBars then RegularBuy2.Color("RegularBuy")
#else if paintBars and sellerExtreme3 then ExtremeSell3.Color("ExtremeSell")
#else if buyerExtreme3 and paintBars then ExtremeBuy3.Color("ExtremeBuy")
#else if paintBars and sellerRegular3 then RegularSell3.Color("RegularSell")
#else if buyerRegular3 and paintBars then RegularBuy3.Color("RegularBuy")
#else if paintBars and sellerExtreme4 then ExtremeSell4.Color("ExtremeSell")
#else if buyerExtreme4 and paintBars then ExtremeBuy4.Color("ExtremeBuy")
#else if paintBars and sellerRegular4 then RegularSell4.Color("RegularSell")
#else if buyerRegular4 and paintBars then RegularBuy4.Color("RegularBuy")
#else if paintBars then Color.GRAY else Color.Current);
###########################
# --- VERTICLE LINE DAILY --- #
AddVerticalLine(( GetDay() <> GetDay()[1]), "", Color.DARK_GRAY, Curve.SHORT_DASH);
#--- END ---