Trader_Rich
Member
I came across this "auto trend" indicator (
) and while the auto trend lines are somewhat helpful, I'm finding that the vertical Confirmed Swing is great for further confirmation, and sometimes and early confirmation. Unfortunately every time a new Confirmed Swing appears, the old one goes away. Would anyone have any idea how to code it so that they Confirmed Swing vertical lines don't disappear?
Code:
#rcg_autotrendline
input price = close;
input priceH = high; # swing high
input priceL = low; # swing low
input ATRreversalfactor = 5;
def ATR = reference ATR(length = 5);
def reversalAmount = ATRreversalfactor * ATR;
input showlines = yes;
input displace = 1;
input only_confirmed = yes;
#Assert(reversalAmount > 0, "'reversal amount' should be positive: " + reversalAmount);
def barNumber = BarNumber();
def barCount = HighestAll(If(IsNaN(price), 0, barNumber));
rec state = {default init, undefined, uptrend, downtrend};
rec minMaxPrice;
if (GetValue(state, 1) == GetValue(state.init, 0)) {
minMaxPrice = price;
state = state.undefined;
} else if (GetValue(state, 1) == GetValue(state.undefined, 0)) {
if (price <= GetValue(minMaxPrice, 1) - reversalAmount) {
state = state.downtrend;
minMaxPrice = priceL;
} else if (price >= GetValue(minMaxPrice, 1) + reversalAmount) {
state = state.uptrend;
minMaxPrice = priceH;
} else {
state = state.undefined;
minMaxPrice = GetValue(minMaxPrice, 1);
}
} else if (GetValue(state, 1) == GetValue(state.uptrend, 0)) {
if (price <= GetValue(minMaxPrice, 1) - reversalAmount) {
state = state.downtrend;
minMaxPrice = priceL;
} else {
state = state.uptrend;
minMaxPrice = Max(priceH, GetValue(minMaxPrice, 1));
}
} else {
if (price >= GetValue(minMaxPrice, 1) + reversalAmount) {
state = state.uptrend;
minMaxPrice = priceH;
} else {
state = state.downtrend;
minMaxPrice = Min(priceL, GetValue(minMaxPrice, 1));
}
}
def isCalculated = GetValue(state, 0) != GetValue(state, 1) and barNumber >= 1;
def futureDepth = barCount - barNumber;
def tmpLastPeriodBar;
if (isCalculated) {
if (futureDepth >= 1 and GetValue(state, 0) == GetValue(state, -1)) {
tmpLastPeriodBar = fold lastPeriodBarI = 2 to futureDepth + 1 with lastPeriodBarAcc = 1
while lastPeriodBarAcc > 0
do if (GetValue(state, 0) != GetValue(state, -lastPeriodBarI))
then -lastPeriodBarAcc
else lastPeriodBarAcc + 1;
} else {
tmpLastPeriodBar = 0;
}
} else {
tmpLastPeriodBar = Double.NaN;
}
def lastPeriodBar = if (!IsNaN(tmpLastPeriodBar)) then -AbsValue(tmpLastPeriodBar) else -futureDepth;
rec currentPriceLevel;
rec currentPoints;
if (state == state.uptrend and isCalculated) {
currentPriceLevel =
fold barWithMaxOnPeriodI = lastPeriodBar to 1 with barWithMaxOnPeriodAcc = minMaxPrice
do Max(barWithMaxOnPeriodAcc, GetValue(minMaxPrice, barWithMaxOnPeriodI));
currentPoints =
fold maxPointOnPeriodI = lastPeriodBar to 1 with maxPointOnPeriodAcc = Double.NaN
while IsNaN(maxPointOnPeriodAcc)
do if (GetValue(priceH, maxPointOnPeriodI) == currentPriceLevel)
then maxPointOnPeriodI
else maxPointOnPeriodAcc;
} else if (state == state.downtrend and isCalculated) {
currentPriceLevel =
fold barWithMinOnPeriodI = lastPeriodBar to 1 with barWithMinOnPeriodAcc = minMaxPrice
do Min(barWithMinOnPeriodAcc, GetValue(minMaxPrice, barWithMinOnPeriodI));
currentPoints =
fold minPointOnPeriodI = lastPeriodBar to 1 with minPointOnPeriodAcc = Double.NaN
while IsNaN(minPointOnPeriodAcc)
do if (GetValue(priceL, minPointOnPeriodI) == currentPriceLevel)
then minPointOnPeriodI
else minPointOnPeriodAcc;
} else if (!isCalculated and (state == state.uptrend or state == state.downtrend)) {
currentPriceLevel = GetValue(currentPriceLevel, 1);
currentPoints = GetValue(currentPoints, 1) + 1;
} else {
currentPoints = 1;
currentPriceLevel = GetValue(price, currentPoints);
}
def "ZZ$" = if (barNumber == barCount or barNumber == 1) then if state == state.uptrend then priceH else priceL else if (currentPoints == 0) then currentPriceLevel else Double.NaN;
rec zzSave = if !IsNaN("ZZ$") then if (barNumber == barCount or barNumber == 1) then if IsNaN(barNumber[-1]) and state == state.uptrend then priceH else priceL else currentPriceLevel else GetValue(zzSave, 1);
def chg = (if barNumber == barCount and currentPoints < 0 then priceH else if barNumber == barCount and currentPoints > 0 then priceL else currentPriceLevel) - GetValue(zzSave, 1);
def isUp = chg >= 0;
###points
rec isConf = AbsValue(chg) >= reversalAmount or (IsNaN(GetValue("ZZ$", 1)) and GetValue(isConf, 1));
def zzL = if !IsNaN("ZZ$") and state == state.downtrend then priceL else GetValue(zzL, 1);
def zzH = if !IsNaN("ZZ$") and state == state.uptrend then priceH else GetValue(zzH, 1);
def dir = CompoundValue(1, if zzL != zzL[1] then 1 else if zzH != zzH[1] then -1 else dir[1], 0);
def signal = CompoundValue(1,
if dir > 0 and low > zzL then
if signal[1] <= 0 then 1 else signal[1]
else if dir < 0 and high < zzH then
if signal[1] >= 0 then -1 else signal[1]
else signal[1]
, 0);
#########################################
#########################################
#########################################
rec confirmed = if !isConf[1] and isConf then BarNumber() else confirmed[1];
def isconfirmed = BarNumber() < HighestAll(confirmed);
def use = (only_confirmed and isconfirmed) or !only_confirmed;
plot up = if signal[-1] > 0 and signal <= 0 and use then low else 0;
plot dn = if signal[-1] < 0 and signal >= 0 and use then high else 0;
up.SetDefaultColor(Color.CYAN);
dn.SetDefaultColor(Color.CYAN);
up.SetPaintingStrategy(PaintingStrategy.POINTS);
dn.SetPaintingStrategy(PaintingStrategy.POINTS);
up.Hide();
dn.Hide();
def p1 = low;
def p2 = high;
rec up_y1 = if up then p1 else up_y1[1];
rec up_y2 = if up_y1 != up_y1[1] then up_y1[1] else up_y2[1];
rec up_y3 = if up_y2 != up_y2[1] then up_y2[1] else up_y3[1];
rec up_y4 = if up_y3 != up_y3[1] then up_y3[1] else up_y4[1];
rec up_y5 = if up_y4 != up_y4[1] then up_y4[1] else up_y5[1];
rec up_x1 = if up then BarNumber() else up_x1[1];
rec up_x2 = if up_x1 != up_x1[1] then up_x1[1] else up_x2[1];
rec up_x3 = if up_x2 != up_x2[1] then up_x2[1] else up_x3[1];
rec up_x4 = if up_x3 != up_x3[1] then up_x3[1] else up_x4[1];
rec up_x5 = if up_x4 != up_x4[1] then up_x4[1] else up_x5[1];
rec dn_y1 = if dn then p2 else dn_y1[1];
rec dn_y2 = if dn_y1 != dn_y1[1] then dn_y1[1] else dn_y2[1];
rec dn_y3 = if dn_y2 != dn_y2[1] then dn_y2[1] else dn_y3[1];
rec dn_y4 = if dn_y3 != dn_y3[1] then dn_y3[1] else dn_y4[1];
rec dn_y5 = if dn_y4 != dn_y4[1] then dn_y4[1] else dn_y5[1];
rec dn_x1 = if dn then BarNumber() else dn_x1[1];
rec dn_x2 = if dn_x1 != dn_x1[1] then dn_x1[1] else dn_x2[1];
rec dn_x3 = if dn_x2 != dn_x2[1] then dn_x2[1] else dn_x3[1];
rec dn_x4 = if dn_x3 != dn_x3[1] then dn_x3[1] else dn_x4[1];
rec dn_x5 = if dn_x4 != dn_x4[1] then dn_x4[1] else dn_x5[1];
##Extra crap because you're a terrible scripter who didn't plan ahead
def up_y1a = HighestAll(if barNumber >= HighestAll(up_x1) then up_y1 else 0);
def up_y2a = HighestAll(if barNumber >= HighestAll(up_x1) then up_y2 else 0);
def up_y3a = HighestAll(if barNumber >= HighestAll(up_x1) then up_y3 else 0);
def up_y4a = HighestAll(if barNumber >= HighestAll(up_x1) then up_y4 else 0);
def up_y5a = HighestAll(if barNumber >= HighestAll(up_x1) then up_y5 else 0);
def up_x1a = HighestAll(up_x1);
def up_x2a = HighestAll(up_x2);
def up_x3a = HighestAll(up_x3);
def up_x4a = HighestAll(up_x4);
def up_x5a = HighestAll(up_x5);
def dn_y1a = HighestAll(if barNumber >= HighestAll(dn_x1) then dn_y1 else 0);
def dn_y2a = HighestAll(if barNumber >= HighestAll(dn_x1) then dn_y2 else 0);
def dn_y3a = HighestAll(if barNumber >= HighestAll(dn_x1) then dn_y3 else 0);
def dn_y4a = HighestAll(if barNumber >= HighestAll(dn_x1) then dn_y4 else 0);
def dn_y5a = HighestAll(if barNumber >= HighestAll(dn_x1) then dn_y5 else 0);
def dn_x1a = HighestAll(dn_x1);
def dn_x2a = HighestAll(dn_x2);
def dn_x3a = HighestAll(dn_x3);
def dn_x4a = HighestAll(dn_x4);
def dn_x5a = HighestAll(dn_x5);
#1's and 2's switched in script
script trend {
input x1 = 0;
input x2 = 0;
input y1 = 0;
input y2 = 0;
def slope = (y2 - y1) / (x2 - x1);
def diff = BarNumber() - HighestAll(x1);
def last = BarNumber() >= HighestAll(x1);
plot line = if last then (slope * diff) + y1 else Double.NaN;
}
def ATR1 = Average(TrueRange(high, close, low), 5) * 1.5;
plot up1 = if HighestAll(close + ATR1 < trend(up_x2a, up_x1a, up_y2a, up_y1a))
== 0 then
trend(up_x2a, up_x1a, up_y2a, up_y1a) else
if HighestAll(close + ATR1 > trend(up_x2a, up_x1a, up_y2a, up_y1a))
== 0 then
trend(up_x2a, up_x1a, up_y2a, up_y1a) else
Double.NaN;
plot up2 = if HighestAll(close + ATR1 < trend(up_x3a, up_x1a, up_y3a, up_y1a))
== 0 then
trend(up_x3a, up_x1a, up_y3a, up_y1a) else
if HighestAll(close + ATR1 > trend(up_x3a, up_x2a, up_y3a, up_y2a))
== 0 then
trend(up_x3a, up_x2a, up_y3a, up_y2a) else
Double.NaN;
plot up3 = if HighestAll(close + ATR1 < trend(up_x4a, up_x1a, up_y4a, up_y1a))
== 0 then
trend(up_x4a, up_x1a, up_y4a, up_y1a) else
if HighestAll(close + ATR1 > trend(up_x4a, up_x3a, up_y4a, up_y3a))
== 0 then
trend(up_x4a, up_x3a, up_y4a, up_y3a) else
Double.NaN;
plot up4 = if HighestAll(close + ATR1 < trend(up_x5a, up_x1a, up_y5a, up_y1a))
== 0 then
trend(up_x5a, up_x1a, up_y5a, up_y1a) else
if HighestAll(close + ATR1 > trend(up_x5a, up_x4a, up_y5a, up_y4a))
== 0 then
trend(up_x5a, up_x4a, up_y5a, up_y4a) else
Double.NaN;
plot dn1 = if HighestAll(close - ATR1 > trend(dn_x2a, dn_x1a, dn_y2a, dn_y1a))
== 0 then
trend(dn_x2a, dn_x1a, dn_y2a, dn_y1a) else
if HighestAll(close + ATR1 > trend(dn_x2a, dn_x1a, dn_y2a, dn_y1a))
== 0 then
trend(dn_x2a, dn_x1a, dn_y2a, dn_y1a) else
Double.NaN;
plot dn2 = if HighestAll(close - ATR1 < trend(dn_x3a, dn_x1a, dn_y3a, dn_y1a))
== 0 then
trend(dn_x3a, dn_x1a, dn_y3a, dn_y1a) else
if HighestAll(close - ATR < trend(dn_x3a, dn_x2a, dn_y3a, dn_y2a))
== 0 then
trend(dn_x3a, dn_x2a, dn_y3a, dn_y2a) else
Double.NaN;
plot dn3 = if HighestAll(close - ATR1 > trend(dn_x4a, dn_x1a, dn_y4a, dn_y1a))
== 0 then
trend(dn_x4a, dn_x1a, dn_y4a, dn_y1a) else
if HighestAll(close - ATR1 < trend(dn_x4a, dn_x3a, dn_y4a, dn_y3a))
== 0 then
trend(dn_x4a, dn_x3a, dn_y4a, dn_y3a)
else Double.NaN;
plot dn4 = if HighestAll(close - ATR1 > trend(dn_x5a, dn_x1a, dn_y5a, dn_y1a))
== 0 then
trend(dn_x5a, dn_x1a, dn_y5a, dn_y1a) else
if HighestAll(close - ATR1 > trend(dn_x5a, dn_x4a, dn_y5a, dn_y4a))
== 0 then
trend(dn_x5a, dn_x4a, dn_y5a, dn_y4a) else
Double.NaN;
up1.SetDefaultColor(Color.GREEN);
up2.SetDefaultColor(Color.GREEN);
up3.SetDefaultColor(Color.GREEN);
up4.SetDefaultColor(Color.GREEN);
dn1.SetDefaultColor(Color.RED);
dn2.SetDefaultColor(Color.RED);
dn3.SetDefaultColor(Color.RED);
dn4.SetDefaultColor(Color.RED);
up2.SetLineWeight(2);
up3.SetLineWeight(3);
up4.SetLineWeight(4);
dn2.SetLineWeight(2);
dn3.SetLineWeight(3);
dn4.SetLineWeight(4);
AddVerticalLine(BarNumber() == HighestAll(confirmed), "Conifirmed Swing", Color.WHITE, Curve.LONG_DASH);
##########################################
##########################################
##########################################
#"ZZ$".EnableApproximation();
#"ZZ$".DefineColor("Up Trend", Color.UPTICK);
#"ZZ$".DefineColor("Down Trend", Color.DOWNTICK);
#"ZZ$".DefineColor("Undefined", Color.WHITE);
#"ZZ$".AssignValueColor(if !isConf then "ZZ$".Color("Undefined") else if isUp then #"ZZ$".Color("Up Trend") else "ZZ$".Color("Down Trend"));
Last edited by a moderator: