Several days ago someone asked if anyone had developed a Peaks and Valleys Indicator. Here is a dual I put together. The Large Yellow Arrows are my entry points. They are plus one bar at peak. The Small Yellow Arrows are my heads up indicator (does not always show before large arrow). Feedback always appreciated?
This is the code for the Large Yellow Peaks & Valleys:
#Peaks and Valleys
#AsGood_PeaksValleyArrows 2/19/23
def na = double.nan;
def bn = barnumber();
def high = hl2;
def price = close;
input avgerageType = AverageType.Exponential;
input PeaksValleys = 09;
def length = PeaksValleys;
def lastbn = HighestAll(if IsNaN(close) then 0 else bn);
def offset = Min(length - 1, lastbn - bn);
input IgnoreLastBar = yes;
def ignorelast = if (IgnoreLastBar and bn == lastbn) then 0 else 1;
def peak = ignorelast and high >= highest(high[1], length) and high > GetValue(highest(high, length), -(offset+1));
def valley = ignorelast and low <= Lowest(low[1], length) and low < GetValue(Lowest(low, length), -(offset+1));
input arrows = yes;
def vert = 0.001;
plot pk = if arrows and peak then high+.15 else na;
pk.SetPaintingStrategy(PaintingStrategy.arrow_down);
pk.SetDefaultColor(Color.Yellow);
pk.SetLineWeight(5);
plot val = if arrows and valley then low-.15 else na;
val.SetPaintingStrategy(PaintingStrategy.arrow_up);
val.SetDefaultColor(Color.Yellow);
val.SetLineWeight(5);
#End Code
This is the code for the Heads-up lead-in Small Yellow Arrows:
#Peaks and Valleys
#AsGood_PeaksValleyArrows 2/19/23
def na = double.nan;
def bn = barnumber();
def high = hl2;
def price = close;
input avgerageType = AverageType.Exponential;
input PeaksValleys = 09;
def length = PeaksValleys;
def lastbn = HighestAll(if IsNaN(close) then 0 else bn);
def offset = Min(length - 1, lastbn - bn);
input IgnoreLastBar = yes;
def ignorelast = if (IgnoreLastBar and bn == lastbn) then 0 else 1;
def peak = ignorelast and high >= highest(high[1], length) and high > GetValue(highest(high, length), -(offset+1));
def valley = ignorelast and low <= Lowest(low[1], length) and low < GetValue(Lowest(low, length), -(offset+1));
input arrows = yes;
def vert = 0.001;
plot pk = if arrows and peak then high+.15 else na;
pk.SetPaintingStrategy(PaintingStrategy.arrow_down);
pk.SetDefaultColor(Color.Yellow);
pk.SetLineWeight(5);
plot val = if arrows and valley then low-.15 else na;
val.SetPaintingStrategy(PaintingStrategy.arrow_up);
val.SetDefaultColor(Color.Yellow);
val.SetLineWeight(5);
#End Code
This is the code for the Large Yellow Peaks & Valleys:
#Peaks and Valleys
#AsGood_PeaksValleyArrows 2/19/23
def na = double.nan;
def bn = barnumber();
def high = hl2;
def price = close;
input avgerageType = AverageType.Exponential;
input PeaksValleys = 09;
def length = PeaksValleys;
def lastbn = HighestAll(if IsNaN(close) then 0 else bn);
def offset = Min(length - 1, lastbn - bn);
input IgnoreLastBar = yes;
def ignorelast = if (IgnoreLastBar and bn == lastbn) then 0 else 1;
def peak = ignorelast and high >= highest(high[1], length) and high > GetValue(highest(high, length), -(offset+1));
def valley = ignorelast and low <= Lowest(low[1], length) and low < GetValue(Lowest(low, length), -(offset+1));
input arrows = yes;
def vert = 0.001;
plot pk = if arrows and peak then high+.15 else na;
pk.SetPaintingStrategy(PaintingStrategy.arrow_down);
pk.SetDefaultColor(Color.Yellow);
pk.SetLineWeight(5);
plot val = if arrows and valley then low-.15 else na;
val.SetPaintingStrategy(PaintingStrategy.arrow_up);
val.SetDefaultColor(Color.Yellow);
val.SetLineWeight(5);
#End Code
This is the code for the Heads-up lead-in Small Yellow Arrows:
#Peaks and Valleys
#AsGood_PeaksValleyArrows 2/19/23
def na = double.nan;
def bn = barnumber();
def high = hl2;
def price = close;
input avgerageType = AverageType.Exponential;
input PeaksValleys = 09;
def length = PeaksValleys;
def lastbn = HighestAll(if IsNaN(close) then 0 else bn);
def offset = Min(length - 1, lastbn - bn);
input IgnoreLastBar = yes;
def ignorelast = if (IgnoreLastBar and bn == lastbn) then 0 else 1;
def peak = ignorelast and high >= highest(high[1], length) and high > GetValue(highest(high, length), -(offset+1));
def valley = ignorelast and low <= Lowest(low[1], length) and low < GetValue(Lowest(low, length), -(offset+1));
input arrows = yes;
def vert = 0.001;
plot pk = if arrows and peak then high+.15 else na;
pk.SetPaintingStrategy(PaintingStrategy.arrow_down);
pk.SetDefaultColor(Color.Yellow);
pk.SetLineWeight(5);
plot val = if arrows and valley then low-.15 else na;
val.SetPaintingStrategy(PaintingStrategy.arrow_up);
val.SetDefaultColor(Color.Yellow);
val.SetLineWeight(5);
#End Code