#Automatic Quadrant Lines
#based on Mobius's Fractal Pivot Strategy
#developed by Chewie76 on 8/27/2021
# User Inputs
input n = 20;
input FractalEnergyLength = 8;
input FractalEnergyThreshold = .68;
input AtrMult = .70;
input nATR = 4;
input AvgType = AverageType.HULL;
input LabelsOn = yes;
input AlertsOn = yes;
# Variables
def o = open;
def h = high;
def l = low;
def c = close;
def bar = BarNumber();
def TS = TickSize();
def nan = double.nan;
def ATR = Round((MovingAverage(AvgType, TrueRange(h, c, l), nATR)) / TS, 0) * TS;
def risk = if Between(c, 0, 1500)
then ATR
else if Between(c, 1500, 3500)
then 2
else if Between(c, 3500, 5500)
then 4
else 6;
def FE = Log(Sum((Max(h, c[1]) - Min(l, c[1])), FractalEnergyLength) /
(Highest(h, FractalEnergyLength) - Lowest(l, FractalEnergyLength)))
/ Log(FractalEnergyLength);
# Parent Aggregation Pivot High
# Pivot High Variables
def p_hh = fold i = 1 to n + 1
with p = 1
while p
do h > GetValue(h, -1);
def p_PivotH = if (bar > n and
h == Highest(h, n) and
p_hh)
then h
else NaN;
def p_PHValue = if !IsNaN(p_PivotH)
then p_PivotH
else p_PHValue[1];
def p_PHBar = if !IsNaN(p_PivotH)
then bar
else nan;
# Pivot High and Pivot High Exit Variables
# Pivot High Variables
def hh = fold ii = 1 to n + 1
with pp = 1
while pp
do h > GetValue(h, -1);
def PivotH = if (bar > n and
h == Highest(h, n) and
hh)
then h
else Double.NaN;
def PHValue = if !IsNaN(PivotH)
then PivotH
else PHValue[1];
def PHBar = if !IsNaN(PivotH)
then bar
else nan;
# Pivot High Exit Variables
def PHExit = if (bar > n and
h == Highest(h, n) and
hh)
then if l[1] < l
then l[1]
else fold r = 0 to 20
with a = NaN
while IsNaN(a)
do if GetValue(l[1], r) < l
then GetValue(l[1], r)
else NaN
else Double.NaN;
def PHExitValue = if !IsNaN(PHExit)
then PHExit
else PHExitValue[1];
def PHExitBar = if (bar > n and
h == Highest(h, n) and
hh)
then if l[1] < l
then bar - 1
else fold d = 0 to 20
with y = NaN
while IsNaN(y)
do if GetValue(l[1], d) < l
then GetValue(bar - 1, d)
else NaN
else NaN;
# Pivot Low and Pivot Low Entry Variables
# Parent Pivot Low Variables
def p_ll = fold j = 1 to n + 1
with q = 1
while q
do l < GetValue(l, -1);
def p_PivotL = if (bar > n and
l == Lowest(l, n) and
p_ll)
then l
else NaN;
def p_PLValue = if !IsNaN(p_PivotL)
then p_PivotL
else p_PLValue[1];
def p_PLBar = if !IsNaN(p_PivotL)
then bar
else nan;
# Pivot Low Variables
def ll = fold jj = 1 to n + 1
with qq = 1
while qq
do l < GetValue(l, -1);
def PivotL = if (bar > n and
l == Lowest(l, n) and
ll)
then l
else NaN;
def PLValue = if !IsNaN(PivotL)
then PivotL
else PLValue[1];
def PLBar = if !IsNaN(PivotL)
then bar
else nan;
# Pivot Low Entry Variables
def PLEntry = if (bar > n and
l == Lowest(l, n) and
ll)
then if h[1] > h
then h[1]
else fold t = 0 to 20
with w = NaN
while IsNaN(w)
do if GetValue(h[1], t) > h
then GetValue(h[1], t)
else NaN
else NaN;
def PLEntryValue = if !IsNaN(PLEntry)
then PLEntry
else PLEntryValue[1];
def PLEntryBar = if (bar > n and
l == Lowest(l, n) and
ll)
then if h[1] > h
then bar - 1
else fold u = 0 to 20
with z = NaN
while IsNaN(z)
do if GetValue(h[1], u) > h
then GetValue(bar - 1, u)
else NaN
else NaN;
# Plots
plot R1 = if bar >= HighestAll(PHBar)
then HighestAll(if isNaN(close[-1])
then PHValue
else nan)
else nan;
R1.SetDefaultColor(Color.dark_red);
R1.SetLineWeight(1);
plot ShortEntry = if bar >= HighestAll(PHexitBar)
then HighestAll(if isNaN(close[-1])
then PHExitValue
else nan)
else nan;
ShortEntry.SetDefaultColor(Color.red);
def SE =(if isNaN(ShortEntry[1]) then ShortEntry else Double.NaN);
addchartBubble(LabelsOn and ShortEntry, SE,"S/E",color.red);
plot S1 = if bar >= HighestAll(PLBar)
then HighestAll(if isNaN(c[-1])
then PLValue
else nan)
else nan;
S1.SetDefaultColor(Color.dark_red);
S1.SetLineWeight(3);
plot LongEntry = if bar >= HighestAll(PLEntryBar)
then HighestAll(if isNaN(c[-1])
then PLEntryValue
else nan)
else nan;
LongEntry.SetDefaultColor(Color.GREEN);
LongEntry.SetStyle(Curve.long_DASH);
LongEntry.SetLineWeight(2);
def LE =(if isNaN(LongEntry[1]) then LongEntry else Double.NaN);
addchartBubble(LabelsOn and LongEntry, LE,"L/E",color.green);
plot UpArrow = if c crosses above LongEntry and FE > .5
then l
else Double.NaN;
UpArrow.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
UpArrow.SetLineWeight(5);
UpArrow.SetDefaultColor(Color.GREEN);
plot DnArrow = if c crosses below ShortEntry and ((FE > .618)
or (FE < .382))
then h
else Double.NaN;
DnArrow.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
DnArrow.SetLineWeight(5);
DnArrow.SetDefaultColor(Color.RED);
plot Fifty = (LongEntry - S1) + LongEntry;
Fifty.setdefaultcolor(color.yellow);
Fifty.SetStyle(Curve.long_DASH);
Fifty.setlineweight(2);
plot SeventyFive = (LongEntry - S1) + Fifty;
SeventyFive.setdefaultcolor(color.cyan);
SeventyFive.SetStyle(Curve.long_DASH);
SeventyFive.setlineweight(2);
plot Target = (LongEntry - S1) + SeventyFive;
Target.setdefaultcolor(color.red);
Target.SetStyle(Curve.long_DASH);
Target.setlineweight(3);
def LT =(if isNaN(TARGET[1]) then Target else Double.NaN);
addchartBubble(LabelsOn and Target, LT,"LONG TARGET: " + asDollars(LT),color.red);
plot BreakDownTarget = S1 -(LongEntry - S1);
BreakDownTarget.setdefaultcolor(color.dark_Green);
BreakDownTarget.SetStyle(Curve.long_DASH);
BreakDownTarget.setlineweight(3);
plot S_Fifty = ShortEntry - (R1 - ShortEntry);
S_Fifty.setdefaultcolor(color.yellow);
S_Fifty.setlineweight(1);
plot S_SeventyFive = S_Fifty - (R1 - ShortEntry);
S_SeventyFive.setdefaultcolor(color.cyan);
S_SeventyFive.setlineweight(1);
plot S_ShortTarget = S_SeventyFive - (R1 - ShortEntry);
S_ShortTarget.setdefaultcolor(color.green);
S_ShortTarget.setlineweight(1);
def ST =(if isNaN(S_ShortTarget[1]) then S_ShortTarget else Double.NaN);
addchartBubble(LabelsOn and S_ShortTarget, ST,"SHORT TARGET: " + asDollars(ST),color.light_green);
# Alerts
Alert(AlertsOn and UpArrow, " ", Alert.Bar, Sound.ding);
Alert(AlertsOn and DnArrow, " ", Alert.Bar, Sound.ding);