10:11 Mobius: AD (Advance/Decline Line) is an Intraday indicator. It's daily closing value isn't of any value since where it closes in relation to the closing price has no correlation.
Plots the Advance Decline Line Scaled to Current Price with a horizontal line at the RTH Open.
Advance/Decline as Label on chart
# 10:14 Mobius: here is an AD label that includes the open, high and low of the day with bubbles plotted at those price locations on the chart.
Code # 2 of 3
#10:18 Mobius: Here's AD Scaled to Price and plotted along with a plot of the AD zero line at price where crosses. Which is often a price pivot area.
#10:22 MTS1: Thanks Mobius!
#10:26 binh4984: Thank you very much Mobius for your help.
#10:33 Mobius: yw And, bin... you might consider the fact that AD is an oscillator that ranges around 0. So taking a daily average of it's closing value would be that same as taking the daily closing average of any oscillator
#10:35 Mobius: won't tell you anything of value. Now you could write a binary momentum indicator using AD on a daily basis that would tell you when a trend is in place and the momentum of that trend
#10:36 Mobius: See the True Momentum Indicator for a method to do that and adding a weight adjusted by the closing value of AD might be useful
#10:37 MTS1: I guess an average on a cumulative AD could be some sort of signal line. I know some analysts look at longer term MI's like that, also # stocks above or below an MA, new highs/lows etc. But I think AD / VOLD etc are probably more useful intraday.
(I would not endorse #3 of 3 as I don't see it's utility: markos)
Cumulative AD
Code:
#
# TD Ameritrade IP Company, Inc. (c) 2010-2020
#
declare lower;
input type = {default "Advance/Decline Line", "Advance/Decline Line (Breadth)", "Advance/Decline Line (Daily)", "Advance/Decline Ratio", "Advance/Decline Spread (Issues)", "Absolute Breadth Index"};
input exchange = {default NYSE, NASDAQ, AMEX};
def advances;
def declines;
switch (exchange) {
case NYSE:
advances = close("$ADVN");
declines = close("$DECN");
case NASDAQ:
advances = close("$ADVN/Q");
declines = close("$DECN/Q");
case AMEX:
advances = close("$ADVA");
declines = close("$DECA");
}
def advnDecl;
def level;
switch (type){
case "Advance/Decline Line":
advnDecl = advnDecl[1] + if !IsNaN(advances - declines) then advances - declines else 0;
level = 0;
case "Advance/Decline Line (Breadth)":
advnDecl = advances / (advances + declines);
level = 0.5;
case "Advance/Decline Line (Daily)":
advnDecl = (advances - declines) / (advances + declines);
level = 0;
case "Advance/Decline Ratio":
advnDecl = advances / declines;
level = 1;
case "Advance/Decline Spread (Issues)":
advnDecl = advances - declines;
level = 0;
case "Absolute Breadth Index":
advnDecl = AbsValue(advances - declines);
level = 0;
}
plot AD = if !IsNaN(close) then advnDecl else Double.NaN;
plot LevelLine = level;
AD.DefineColor("Up", Color.UPTICK);
AD.DefineColor("Down", Color.DOWNTICK);
AD.AssignValueColor(if advnDecl > advnDecl[1] then AD.color("Up") else AD.color("Down"));
LevelLine.SetDefaultColor(GetColor(7));
AddLabel(type == type."Advance/Decline Ratio", (if advances > declines then round(advances / declines, 2) else round(-declines / advances, 2)) + ":1 Ratio");
Plots the Advance Decline Line Scaled to Current Price with a horizontal line at the RTH Open.
Code:
# AD Line Scaled and Plotted on Upper Graph
# Mobius
input sym = "$ADSPD"; #hint sym: Symbol to be scaled to current price chart.
def AD = close(symbol = sym);
def Min = lowestAll(low);
def Max = highestAll(high);
def bar = barNumber();
def Today = getDay() == getLastDay();
script ScaleFunction{
input c = 0;
input Min = -1;
input Max = 1;
def hh = HighestAll(c);
def ll = LowestAll(c);
plot Range = (((Max - Min) * (c - ll)) / (hh - ll)) + Min;
}
script LinePlot {
input LineLimit = 0;
input OnExpansion = yes;
input data = close;
input bar = 0;
def ThisBar = HighestAll(bar);
def cLine = if bar == ThisBar
then data
else Double.NaN;
def cond1 = CompoundValue(1, if IsNaN(data)
then cond1[1]
else data, data);
plot P = if ThisBar - LineLimit <= bar
then HighestAll(cLine)
else Double.NaN;
}
plot ADline = if Today
then scaleFunction(c = AD,
Min = Min,
Max = Max)
else double.nan;
ADline.SetDefaultColor(Color.gray);
def RTH_Bar1 = if SecondsTillTime(0930) == 0 and
SecondsFromTime(0930) == 0
then bar
else RTH_Bar1[1];
def OpenAD = if bar == RTH_Bar1
then ADline
else OpenAD[1];
def ADLimit = if bar != RTH_Bar1
then bar - RTH_Bar1
else if bar == RTH_Bar1
then Double.NaN
else ADLimit[1];
plot AD_RTH_open = LinePlot(LineLimit = ADLimit,
data = OpenAD,
bar = RTH_Bar1);
AD_RTH_open.SetDefaultColor(Color.gray);
AddLabel(1, "AD = " + AD, if AD > 0
then color.green
else color.red);
# End Code AD Chart Line
Advance/Decline as Label on chart
# 10:14 Mobius: here is an AD label that includes the open, high and low of the day with bubbles plotted at those price locations on the chart.
Code:
# AD Label
# Mobius
# V01
def RTH = getTime() >= regularTradingStart(getYYYYMMDD()) and
getTime() <= regularTradingEnd(getYYYYMMDD());
def o = if RTH and !RTH[1]
then open("$ADSPD")
else o[1];
def c = if isNaN(close("$ADSPD"))
then c[1]
else close("$ADSPD");
def x = barNumber();
def sumx = if RTH and !RTH[1]
then 1
else if RTH then sumx[1] + 1
else if !RTH
then sumx[1]
else sumx[1];
def sumAD = if RTH and !RTH[1]
then c
else if RTH
then sumAD[1] + c
else sumAD[1];
def h = if isNaN(high("$ADSPD", "DAY"))
then h[1]
else high("$ADSPD", "DAY");
def ADHighBar = if high("$ADSPD") == h
then x
else double.nan;
AddChartBubble(barNumber() == HighestAll(ADHighBar),
high + (2 * TickSize()),
"AD",
color.cyan);
def l = if isNaN(low("$ADSPD", "DAY"))
then l[1]
else low("$ADSPD", "DAY");
def ADLowBar = if low("$ADSPD") == l
then x
else double.nan;
AddChartBubble(barNumber() == HighestAll(ADLowBar),
low - (2 * TickSize()),
"AD",
color.orange,
no);
def Avg = Round(sumAD / sumx, 0);
addLabel(1, "AD open " + o +
" high " + h +
" low " + l +
" close " + c +
" Avg " + Avg, if c < 0
then color.red
else color.green);
# End Code AD Label
Code # 2 of 3
#10:18 Mobius: Here's AD Scaled to Price and plotted along with a plot of the AD zero line at price where crosses. Which is often a price pivot area.
Code:
# AD Scaled To Price
# Mobius
# Changed original code to use RegularTrading(Start, End) functions. Use RTH Only.
# V02 2019
script Scale {
input h = high;
input l = low;
input c = close;
def RTH = getTime() >= RegularTradingStart(getYYYYMMDD()) and
getTime() <= RegularTradingEnd(getYYYYMMDD());
def max = if RTH and !RTH[1]
then high
else if RTH and high > max[1]
then high
else max[1];
def min = if RTH and !RTH[1]
then low
else if RTH and low < min[1]
then low
else min[1];
def hh = if RTH and !RTH[1]
then h
else if RTH and h > hh[1]
then h
else hh[1];
def ll = if RTH and !RTH[1]
then l
else if RTH and l < ll[1]
then l
else ll[1];
plot Range = (((Max - Min) * (c - ll)) / (hh - ll)) + Min;
}
plot Scaled_Symbol = scale(high("$ADSPD"), low("$ADSPD"), close("$ADSPD"));
Scaled_Symbol.AssignValueColor(if Scaled_Symbol > Scaled_Symbol[1]
then color.green
else color.red);
Scaled_Symbol.SetLineWeight(2);
Scaled_Symbol.HideBubble();
Scaled_Symbol.HideTitle();
def zero = if close("$ADSPD") crosses 0
then close
else zero[1];
def zero_bar = if close("$ADSPD") crosses 0
then barNumber()
else double.nan;
plot zeroLine = if barNumber() >= highestAll(zero_bar)
then highestAll(if isNaN(close[-1])
then zero
else double.nan)
else double.nan;
zeroLine.SetDefaultColor(Color.Light_Gray);
zeroLine.SetStyle(Curve.Points);
zeroLine.SetLineWeight(2);
zeroLine.HideBubble();
zeroLine.HideTitle();
AddChartBubble(barNumber() == HighestAll(barNumber()),
zeroLine,
"AD 0",
zeroLine.TakeValueColor());
# End Code
#10:22 MTS1: Thanks Mobius!
#10:26 binh4984: Thank you very much Mobius for your help.
#10:33 Mobius: yw And, bin... you might consider the fact that AD is an oscillator that ranges around 0. So taking a daily average of it's closing value would be that same as taking the daily closing average of any oscillator
#10:35 Mobius: won't tell you anything of value. Now you could write a binary momentum indicator using AD on a daily basis that would tell you when a trend is in place and the momentum of that trend
#10:36 Mobius: See the True Momentum Indicator for a method to do that and adding a weight adjusted by the closing value of AD might be useful
#10:37 MTS1: I guess an average on a cumulative AD could be some sort of signal line. I know some analysts look at longer term MI's like that, also # stocks above or below an MA, new highs/lows etc. But I think AD / VOLD etc are probably more useful intraday.
(I would not endorse #3 of 3 as I don't see it's utility: markos)
Cumulative AD
Code:
#10:42 Mobius:
# Cumulative AD
declare lower;
plot Data = TotalSum(close("$ADSPD"));
plot "0" = 0;
#EOC#
Last edited: