Trend Quality Indicator (With Alert)

BenTen

BenTen

Administrative
Staff
VIP
This is a Trend Quality Indicator for ThinkorSwim shared by Anupam Bagchi who is a data scientist. This indicator is useful for showing buying, selling, and sideways action.
  • Green = buying pressure
  • Selling = selling pressure
  • Yellow = sideways



thinkScript Code

Rich (BB code):
declare lower;

input fastLength = 7;
input slowLength = 15;
input trendLength = 4;
input noiseType = {default linear, squared};
input noiseLength = 250;
input correctionFactor = 2;
input ThresholdValue = 3;
input AlertEnabled = {true, default false};

def smf = 2 / (1 + trendLength);

def reversal = TrendPeriods(fastLength, slowLength);

rec cpc = if isNaN(reversal[1]) then 0 else if reversal[1] != reversal then 0 else cpc[1] + close - close[1];

rec trend = if isNaN(reversal[1]) then 0 else if reversal[1] != reversal then 0 else trend[1] * (1 - smf) + cpc * smf;

def noise;
def diff = AbsValue(cpc - trend);
switch(noiseType) {
case linear:
    noise = correctionFactor * Average(diff, noiseLength);
case squared:
    noise = correctionFactor * Sqrt(Average(diff*diff, noiseLength));
}

plot TQ = if noise == 0 then 0 else trend / noise;
plot ZeroLine = 0;

TQ.SetPaintingStrategy(PaintingStrategy.Histogram);
TQ.SetLineWeight(3);
TQ.DefineColor("Positive", Color.UPTICK);
TQ.DefineColor("Negative", Color.DOWNTICK);
TQ.DefineColor("Neutral", Color.YELLOW);
TQ.AssignValueColor(if TQ > ThresholdValue then TQ.color("Positive") else if TQ < -ThresholdValue then TQ.color("Negative") else TQ.color("Neutral"));
ZeroLine.SetDefaultColor(GetColor(5));

def crossthresholdup = TQ > ThresholdValue && TQ[1] <= ThresholdValue && AlertEnabled;
def crossthresholddown = TQ < -ThresholdValue && TQ[1] >= -ThresholdValue && AlertEnabled;
alert(crossthresholdup, "Trend Quality just crossed above threshold", Alert.BAR, Sound.DING);
alert(crossthresholddown, "Trend Quality just crossed below threshold", Alert.BAR, Sound.DING);

Shareable Link

Original: https://tos.mx/Drcgp5

Modified: https://tos.mx/wbZ5TC
 
Last edited:
I

Ian_Tai

New member
I use the Trend Quality indicator and I wanted an MTF version. I had some help with this, but it's not working correctly and I'm not sure why. Seems the second time frame is always incorrect. I wonder if anyone has an idea what's wrong.
Code:
declare lower;
declare zerobase;

input timeFrame1 = aggregationPeriod.HOUR;
input timeFrame2 = aggregationPeriod.TWO_HOURS;
input timeFrame3 = aggregationPeriod.FOUR_HOURS;
input timeFrame4 = aggregationPeriod.DAY;
input timeFrame5 = aggregationPeriod.TWO_DAYS;

input fastLength = 7;
input slowLength = 15;
input trendLength = 4;
input noiseType = {default linear, squared};
input noiseLength = 250;
input correctionFactor = 2;

assert(trendLength > 0, "'trend length' must be positive: " + trendLength);
assert(correctionFactor > 0, "'correction factor' must be positive: " + correctionFactor);

script TrendQuality {

input timeFrame = aggregationPeriod.HOUR;
input fastLength = 7;
input slowLength = 15;
input trendLength = 4;
input noiseType = {default linear, squared};
input noiseLength = 250;
input correctionFactor = 2;

def smf = 2 / (1 + trendLength);
def reversal = TrendPeriods(fastLength, slowLength);
def close = close(period = timeFrame);
def cpc = if isNaN(reversal[1]) then 0 else if reversal[1] != reversal then 0 else cpc[1] + close - close[1];

def trend = if isNaN(reversal[1]) then 0 else if reversal[1] != reversal then 0 else trend[1] * (1 - smf) + cpc * smf;

def noise;
def diff = AbsValue(cpc - trend);
switch(noiseType) {
case linear:
    noise = correctionFactor * Average(diff, noiseLength);
case squared:
    noise = correctionFactor * Sqrt(Average(diff*diff, noiseLength));
}

plot TQ = if noise == 0 then 0 else trend / noise;}

def tf1 = TrendQuality(timeFrame1, fastLength, slowLength, trendLength, noiseType, noiseLength, correctionFactor).TQ;
def tf2 = TrendQuality(timeFrame2, fastLength, slowLength, trendLength, noiseType, noiseLength, correctionFactor).TQ;
def tf3 = TrendQuality(timeFrame3, fastLength, slowLength, trendLength, noiseType, noiseLength, correctionFactor).TQ;
def tf4 = TrendQuality(timeFrame4, fastLength, slowLength, trendLength, noiseType, noiseLength, correctionFactor).TQ;
def tf5 = TrendQuality(timeFrame5, fastLength, slowLength, trendLength, noiseType, noiseLength, correctionFactor).TQ;

plot MTF1 = if IsNaN(close) then double.NaN else 1;
plot MTF2 = if IsNaN(close) then double.NaN else 2;
plot MTF3 = if IsNaN(close) then double.NaN else 3;
plot MTF4 = if IsNaN(close) then double.NaN else 4;
plot MTF5 = if IsNaN(close) then double.NaN else 5;

MTF1.setPaintingStrategy(PaintingStrategy.POINTS);
MTF2.setPaintingStrategy(PaintingStrategy.POINTS);
MTF3.setPaintingStrategy(PaintingStrategy.POINTS);
MTF4.setPaintingStrategy(PaintingStrategy.POINTS);
MTF5.setPaintingStrategy(PaintingStrategy.POINTS);

MTF1.setLineWeight(5);
MTF2.setLineWeight(5);
MTF3.setLineWeight(5);
MTF4.setLineWeight(5);
MTF5.setLineWeight(5);

MTF1.hideBubble();
MTF2.hideBubble();
MTF3.hideBubble();
MTF4.hideBubble();
MTF5.hideBubble();

MTF1.hideTitle();
MTF2.hideTitle();
MTF3.hideTitle();
MTF4.hideTitle();
MTF5.hideTitle();

defineGlobalColor("UpTrend", Color.GREEN);
defineGlobalColor("DownTrend", Color.MAGENTA);

MTF1.AssignValueColor(if TF1 > 0 then globalColor("UpTrend") else globalColor("DownTrend"));
MTF2.AssignValueColor(if TF2 > 0 then globalColor("UpTrend") else globalColor("DownTrend"));
MTF3.AssignValueColor(if TF3 > 0 then globalColor("UpTrend") else globalColor("DownTrend"));
MTF4.AssignValueColor(if TF4 > 0 then globalColor("UpTrend") else globalColor("DownTrend"));
MTF5.AssignValueColor(if TF5 > 0 then globalColor("UpTrend") else globalColor("DownTrend"));
 
Last edited by a moderator:
G

GimmickFace

New member
Hello Ben - just wanted to say I've been using this indicator and I've been really impressed by it! Helps me stay in trades longer on upswings. Thank you for posting it.
 
horserider

horserider

Well-known member
VIP
@Ian_Tai Not tried the code but just looking at it seems it is based on moving averages. So looks like you need to apply your aggs to the MAs. And then plot those to have some idea what you are getting. Looks like you are only plotting TQ.
The plot MTF1 type plots do not look to be defined.
 
BenTen

BenTen

Administrative
Staff
VIP
@GimmickFace That's wonderful to hear. Thank you for letting me know :)
 
D

dinodotcom

New member
2019 Donor
@Ian_Tai I am also interested in this MTF indicator. I have taken a look at this but my code experience is limited. Take a look at the Trend Magic indicator from Tom to see if you can learn anything from his code.
Code:
# Trend Magic MTF
# tomsk
# 11.26.2019

# V1.0 - 08.08.2019 - Horserider - Added MTF to Trend Magic
# V1.1 - 11.26.2019 - tomsk      - Optimized code structure, removed duplicate variables
# V1.2 - 11.26.2019 - tomsk      - Converted this study to a lower study with MTF triangles

declare lower;

# GLOBAL DEFINITIONS

DefineGlobalColor("TrendUp", CreateColor(0, 254, 30));
DefineGlobalColor("TrendDown", CreateColor(255, 3, 2));

input agg = AggregationPeriod.FIFTEEN_MIN;
input agg2 = AggregationPeriod.THIRTY_MIN;
input agg3 = AggregationPeriod.HOUR;
input agg4 = AggregationPeriod.FOUR_HOURS;
input agg5 = AggregationPeriod.DAY;

input lengthCCI = 50;
input lengthATR = 5;
input AtrFactor = 0.7;

input DotSize = 3;
input n = 3;

def n1  = n + 1;

# AGGREGATION 1

def c = close(period = agg);
def h = high(period = agg);
def l = low(period = agg);
def pricedata = HL2(period = agg);
def ATRcci = Average(TrueRange(h, c, l), lengthATR) * AtrFactor;
def price = c + l + h;
def linDev = lindev(price, lengthCCI);
def CCI = if lindev == 0 then 0 else (price - Average(price, lengthCCI)) / linDev / 0.015;
def MT1 = if CCI > 0
          then Max(MT1[1], pricedata - ATRcci)
          else Min(MT1[1], pricedata + ATRcci);
plot MT1_Dot = if IsNaN(close) then Double.NaN else 1;
MT1_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT1_Dot.SetLineWeight(DotSize);
MT1_Dot.AssignValueColor(if c < MT1 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 1, (agg/1000/60) + " min", Color.Yellow, yes);

# AGGREGATION 2

def c2 = close(period = agg2);
def h2 = high(period = agg2);
def l2 = low(period = agg2);
def pricedata2 = HL2(period = agg2);
def ATRcci2 = Average(TrueRange(h2, c2, l2), lengthATR) * AtrFactor;
def price2 = c2 + l2 + h2;
def linDev2 = lindev(price2, lengthCCI);
def CCI2 = if linDev2 == 0 then 0 else (price2 - Average(price2, lengthCCI)) / linDev2 / 0.015;
def MT2 = if CCI2 > 0
          then Max(MT2[1], pricedata2 - ATRcci2)
          else Min(MT2[1], pricedata2 + ATRcci2);
plot MT2_Dot = if IsNaN(close) then Double.NaN else 2;
MT2_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT2_Dot.SetLineWeight(DotSize);
MT2_Dot.AssignValueColor(if c2 < MT2 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 2, (agg2/1000/60) + " min", Color.Yellow, yes);

# AGGREGATION 3

def c3 = close(period = agg3);
def h3 = high(period = agg3);
def l3 = low(period = agg3);
def pricedata3 = HL2(period = agg3);

def ATRcci3 = Average(TrueRange(h3, c3, l3), lengthATR) * AtrFactor;
def price3 = c3 + l3 + h3;
def linDev3 = lindev(price3, lengthCCI);
def CCI3 = if linDev3 == 0 then 0 else (price3 - Average(price3, lengthCCI)) / linDev3 / 0.015;
def MT3 = if CCI3 > 0
          then Max(MT3[1], pricedata3 - ATRcci3)
          else Min(MT3[1], pricedata3 + ATRcci3);
plot MT3_Dot = if IsNaN(close) then Double.NaN else 3;
MT3_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT3_Dot.SetLineWeight(DotSize);
MT3_Dot.AssignValueColor(if c3 < MT3 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 3, (agg3/1000/60) + " min", Color.Yellow, yes);

# AGGREGATION 4

def c4 = close(period = agg4);
def h4 = high(period = agg4);
def l4 = low(period = agg4);
def pricedata4 = HL2(period = agg4);

def ATRcci4 = Average(TrueRange(h4, c4, l4), lengthATR) * AtrFactor;
def price4 = c4 + l4 + h4;
def linDev4 = lindev(price4, lengthCCI);
def CCI4 = if linDev4 == 0 then 0 else (price4 - Average(price4, lengthCCI)) / linDev4 / 0.015;
def MT4 = if CCI4 > 0
          then Max(MT4[1], pricedata4 - ATRcci4)
          else Min(MT4[1], pricedata4 + ATRcci4);
plot MT4_Dot = if IsNaN(close) then Double.NaN else 4;
MT4_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT4_Dot.SetLineWeight(DotSize);
MT4_Dot.AssignValueColor(if c4 < MT4 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 4, (agg4/1000/60) + " min", Color.Yellow, yes);

# AGGREGATION 5

def c5 = close(period = agg5);
def h5 = high(period = agg5);
def l5 = low(period = agg5);
def pricedata5 = HL2(period = agg5);

def ATRcci5 = Average(TrueRange(h5, c5, l5), lengthATR) * AtrFactor;
def price5 = c5 + l5 + h5;
def linDev5 = lindev(price5, lengthCCI);
def CCI5 = if linDev5 == 0 then 0 else (price5 - Average(price5, lengthCCI)) / linDev5 / 0.015;
def MT5 = if CCI5 > 0
          then Max(MT5[1], pricedata5 - ATRcci5)
          else Min(MT5[1], pricedata5 + ATRcci5);
plot MT5_Dot = if IsNaN(close) then Double.NaN else 5;
MT5_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT5_Dot.SetLineWeight(DotSize);
MT5_Dot.AssignValueColor(if c5 < MT5 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 5, (agg5/1000/60) + " min", Color.Yellow, yes);
# End Trend Magic MTF
 
G

GimmickFace

New member
@BenTen - question, any chance you could edit/adjust the code to remove the selling pressure (red), only leaving the yellow and green (sideways and buying). I have been trying to do it on my own for a few hours but I am failing miserably.
 
D

dinodotcom

New member
2019 Donor
@GimmickFace , just curious why you would want that to be removed?
 
BenTen

BenTen

Administrative
Staff
VIP
@GimmickFace You can just adjust the color to grey or something.

 
K

Kimberly

New member
@Ian_Tai I am also interested in this MTF indicator. I have taken a look at this but my code experience is limited. Take a look at the Trend Magic indicator from Tom to see if you can learn anything from his code.
Code:
# Trend Magic MTF
# tomsk
# 11.26.2019

# V1.0 - 08.08.2019 - Horserider - Added MTF to Trend Magic
# V1.1 - 11.26.2019 - tomsk      - Optimized code structure, removed duplicate variables
# V1.2 - 11.26.2019 - tomsk      - Converted this study to a lower study with MTF triangles

declare lower;

# GLOBAL DEFINITIONS

DefineGlobalColor("TrendUp", CreateColor(0, 254, 30));
DefineGlobalColor("TrendDown", CreateColor(255, 3, 2));

input agg = AggregationPeriod.FIFTEEN_MIN;
input agg2 = AggregationPeriod.THIRTY_MIN;
input agg3 = AggregationPeriod.HOUR;
input agg4 = AggregationPeriod.FOUR_HOURS;
input agg5 = AggregationPeriod.DAY;

input lengthCCI = 50;
input lengthATR = 5;
input AtrFactor = 0.7;

input DotSize = 3;
input n = 3;

def n1  = n + 1;

# AGGREGATION 1

def c = close(period = agg);
def h = high(period = agg);
def l = low(period = agg);
def pricedata = HL2(period = agg);
def ATRcci = Average(TrueRange(h, c, l), lengthATR) * AtrFactor;
def price = c + l + h;
def linDev = lindev(price, lengthCCI);
def CCI = if lindev == 0 then 0 else (price - Average(price, lengthCCI)) / linDev / 0.015;
def MT1 = if CCI > 0
          then Max(MT1[1], pricedata - ATRcci)
          else Min(MT1[1], pricedata + ATRcci);
plot MT1_Dot = if IsNaN(close) then Double.NaN else 1;
MT1_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT1_Dot.SetLineWeight(DotSize);
MT1_Dot.AssignValueColor(if c < MT1 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 1, (agg/1000/60) + " min", Color.Yellow, yes);

# AGGREGATION 2

def c2 = close(period = agg2);
def h2 = high(period = agg2);
def l2 = low(period = agg2);
def pricedata2 = HL2(period = agg2);
def ATRcci2 = Average(TrueRange(h2, c2, l2), lengthATR) * AtrFactor;
def price2 = c2 + l2 + h2;
def linDev2 = lindev(price2, lengthCCI);
def CCI2 = if linDev2 == 0 then 0 else (price2 - Average(price2, lengthCCI)) / linDev2 / 0.015;
def MT2 = if CCI2 > 0
          then Max(MT2[1], pricedata2 - ATRcci2)
          else Min(MT2[1], pricedata2 + ATRcci2);
plot MT2_Dot = if IsNaN(close) then Double.NaN else 2;
MT2_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT2_Dot.SetLineWeight(DotSize);
MT2_Dot.AssignValueColor(if c2 < MT2 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 2, (agg2/1000/60) + " min", Color.Yellow, yes);

# AGGREGATION 3

def c3 = close(period = agg3);
def h3 = high(period = agg3);
def l3 = low(period = agg3);
def pricedata3 = HL2(period = agg3);

def ATRcci3 = Average(TrueRange(h3, c3, l3), lengthATR) * AtrFactor;
def price3 = c3 + l3 + h3;
def linDev3 = lindev(price3, lengthCCI);
def CCI3 = if linDev3 == 0 then 0 else (price3 - Average(price3, lengthCCI)) / linDev3 / 0.015;
def MT3 = if CCI3 > 0
          then Max(MT3[1], pricedata3 - ATRcci3)
          else Min(MT3[1], pricedata3 + ATRcci3);
plot MT3_Dot = if IsNaN(close) then Double.NaN else 3;
MT3_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT3_Dot.SetLineWeight(DotSize);
MT3_Dot.AssignValueColor(if c3 < MT3 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 3, (agg3/1000/60) + " min", Color.Yellow, yes);

# AGGREGATION 4

def c4 = close(period = agg4);
def h4 = high(period = agg4);
def l4 = low(period = agg4);
def pricedata4 = HL2(period = agg4);

def ATRcci4 = Average(TrueRange(h4, c4, l4), lengthATR) * AtrFactor;
def price4 = c4 + l4 + h4;
def linDev4 = lindev(price4, lengthCCI);
def CCI4 = if linDev4 == 0 then 0 else (price4 - Average(price4, lengthCCI)) / linDev4 / 0.015;
def MT4 = if CCI4 > 0
          then Max(MT4[1], pricedata4 - ATRcci4)
          else Min(MT4[1], pricedata4 + ATRcci4);
plot MT4_Dot = if IsNaN(close) then Double.NaN else 4;
MT4_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT4_Dot.SetLineWeight(DotSize);
MT4_Dot.AssignValueColor(if c4 < MT4 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 4, (agg4/1000/60) + " min", Color.Yellow, yes);

# AGGREGATION 5

def c5 = close(period = agg5);
def h5 = high(period = agg5);
def l5 = low(period = agg5);
def pricedata5 = HL2(period = agg5);

def ATRcci5 = Average(TrueRange(h5, c5, l5), lengthATR) * AtrFactor;
def price5 = c5 + l5 + h5;
def linDev5 = lindev(price5, lengthCCI);
def CCI5 = if linDev5 == 0 then 0 else (price5 - Average(price5, lengthCCI)) / linDev5 / 0.015;
def MT5 = if CCI5 > 0
          then Max(MT5[1], pricedata5 - ATRcci5)
          else Min(MT5[1], pricedata5 + ATRcci5);
plot MT5_Dot = if IsNaN(close) then Double.NaN else 5;
MT5_Dot.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
MT5_Dot.SetLineWeight(DotSize);
MT5_Dot.AssignValueColor(if c5 < MT5 then GlobalColor("TrendDown") else GlobalColor("TrendUp"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 5, (agg5/1000/60) + " min", Color.Yellow, yes);
# End Trend Magic MTF

Can anyone elaborate on how to properly use this indicator? Thank you.
 
D

dinodotcom

New member
2019 Donor
@Kimberly sometimes the best way to see the value of an indicator is to load on your chart and play with it rather than have someone tell you the value. You may gain more than someone else’s interpretation.
 
O

Oleron

New member
I've been tinkering with this indicator for a bit, and I've noticed that it occasionally comes up blank. Why is that?
 
G

GimmickFace

New member
@Oleron I've noticed that also as I use it, and I treat those blank spots the same as sideways action. I just disregard those areas entirely.
 
K

Kimberly

New member
@Kimberly sometimes the best way to see the value of an indicator is to load on your chart and play with it rather than have someone tell you the value. You may gain more than someone else’s interpretation.
@Kimberly sometimes the best way to see the value of an indicator is to load on your chart and play with it rather than have someone tell you the value. You may gain more than someone else’s interpretation.
I had already done that. As someone new to trading I was simply asking for someone to elaborate on its use. My question was in reference to Trend Magic MTF.
 
horserider

horserider

Well-known member
VIP
@Kimberly The idea of any MTF study is to see on one chart time frame what is happening on a different chart time frames. An attempt to eliminate needing two or three different time frame charts open. With most studies turning green or red indicates the direction. It follows with a MTF study if all are turning green or red it simply means the current direction has lasted for an amount of time to include all the specified time frames. Maybe that suggests a bigger trend in that direction, maybe not and direction may change on the next bar.
So the suggestion (dinodotcom)of loading an indicator and watching it is a good one. The best teacher can be just watching the market and how it moves. Add indicators, watch. Look for patterns, watch. Time will let you better understand how it all fits together.
 
K

Kimberly

New member
@Kimberly The idea of any MTF study is to see on one chart time frame what is happening on a different chart time frames. An attempt to eliminate needing two or three different time frame charts open. With most studies turning green or red indicates the direction. It follows with a MTF study if all are turning green or red it simply means the current direction has lasted for an amount of time to include all the specified time frames. Maybe that suggests a bigger trend in that direction, maybe not and direction may change on the next bar.
So the suggestion (dinodotcom)of loading an indicator and watching it is a good one. The best teacher can be just watching the market and how it moves. Add indicators, watch. Look for patterns, watch. Time will let you better understand how it all fits together.
@horserider, Thank you for your response. It is truly appreciated. I have a better understanding. I plan on having this loaded tomorrow and I will watch it's behavior.
 
madeinnyc

madeinnyc

Member
This is an overall interesting thread as I myself have been looking at the Trend Quality indicator (no access to the code), but found that it has a lag on the reset with no way to modify the code...so I left it alone. With @BenTen posting the code above, I am hopeful to improve on the reset feature of this indicator above. But before doing so, has anyone here attempted to improve the reset of this indicator so that it resets right before the high point and right before the low point as illustrated on this screenshot? (The screenshot was taken from my Tradestation Platform using a specialized indicator....no access to the source code). If you've noticed the Trend Quality Indicator resets several bars after the trend is over. This is not good as it causes severe draw downs! I've illustrated below with vertical dashed-lined how it should reset. Any thoughts on how to improve the TQI would be appreciated.
 
D

diazlaz

Well-known member
2019 Donor
VIP
Based on initial testing, I find MTF Trend Quality is a good indicator to confirm the direction of the trend, if multiple timeframe agree, generally provides forecast of potential direction. I been looking at it in a intermediate timeframe (days to weeks) to confirm cycle analysis. I haven't had change to observe this indicator series in lower time frames yet.
 
Top