input LookbackPeriod = 3;
input TimeFrame2 = "DAY";
input TimeFrame3 = "DAY";
input price = close;
input BuyEntry2 = 10;
input SellEntry2 = 10;
#input HideSwings = no;
#input HideCurrentTF = no;
#input HideTimeFrame2 = no;
#input HideTimeFrame3 = no;
#input length1 = 8;
#input length21 = 40;
#input length31 = 4;
#assert(length1 > 0, "'length' must be positive: " + length1);
#def ROC = if price[length1] != 0 then (price / price[length1] - 1) * 100 else 0;
#assert(length21 > 0, "'length' must be positive: " + length21);
#def ROC2 = if price[length21] != 0 then (price / price[length21] - 1) * 100 else 0;
#assert(length31 > 0, "'length' must be positive: " + length31);
#def ROC3 = if price[length21] != 0 then (price / price[length31] - 1) * 100 else 0;
#def xx = roc >= roc2 or roc2 > roc3;
#def yy = roc <= roc2 or roc2 < roc3;
#input BuyEntry3 = 10;
#input SellEntry3 = 10;
#def displace2 = 0;
#def QB3 = Highest(roc, BuyEntry3);
#def QS3 = Lowest(roc, SellEntry3);
#def trueqb3 = QB3[1];
#def trueqs3 = QS3[1];
#def SMaoftruedepth= Average(trueqb3-trueqs3[-displace2], length21);
#def squeeze = (trueqb3 - trueqs3) < (smaoftruedepth/2);
#def bottom = 10;
#def top = -10;
#def goodlong = squeeze or squeeze[1] or squeeze[2];
#def goodshort = roc < trueqb3 or (roc[1] < top);
#def SwingsLagBar = 1;
#def BuyEntry = 3;
#def SellEntry = 3;
#def QB = Highest(high, BuyEntry);
#def QS = Lowest(low, SellEntry);
#def trueqb = QB[1];
#def trueqs = QS[1];
def length = 1;
def displace = 0;
def SMA = Average(price[-displace], length);
#--------------------------------------------------------------
def _highInPeriod1 = Highest(high, LookbackPeriod);
def _lowInPeriod1 = Lowest(low, LookbackPeriod);
#--------------------------------------------------------------
def marketLow1 = if _lowInPeriod1 < _lowInPeriod1[-LookbackPeriod] then _lowInPeriod1 else _lowInPeriod1[-LookbackPeriod];
def _markedLow1 = low == marketLow1;
rec _lastMarkedLow1 = CompoundValue(1, if IsNaN(_markedLow1) then _lastMarkedLow1[1] else if _markedLow1 then low else _lastMarkedLow1[1], low);
#--------------------------------------------------------------
def marketHigh1 = if _highInPeriod1 > _highInPeriod1[-LookbackPeriod] then _highInPeriod1 else _highInPeriod1[-LookbackPeriod];
def _markedHigh1 = high == marketHigh1;
rec _lastMarkedHigh1 = CompoundValue(1, if IsNaN(_markedHigh1) then _lastMarkedHigh1[1] else if _markedHigh1 then high else _lastMarkedHigh1[1], high);
#--------------------------------------------------------------
def Resistance1 = _lastMarkedHigh1;
def Support1 = _lastMarkedLow1;
#--------------------------------------------------------------
#def LowSwingForw = Lowest(low, SwingsLagBar)[-SwingsLagBar];
#def LowSwingBack = Lowest(low, LookbackPeriod)[1];
#def SwingLow = if low < LowSwingForw and low <= LowSwingBack then 1 else 0;
#def LowSwing = if SwingLow then low else Double.NaN;
#--------------------------------------------------------------
#def HighSwingForw = Highest(high, SwingsLagBar)[-SwingsLagBar];
#def HighSwingBack = Highest(high, LookbackPeriod)[1];
#def SwingHigh = if high > HighSwingForw and high >= HighSwingBack then 1 else 0;
#def HighSwing = if SwingHigh then high else Double.NaN;
#--------------------------------------------------------------
def _highInPeriod2 = Highest(high(period = TimeFrame2), LookbackPeriod);
def _lowInPeriod2 = Lowest(low(period = TimeFrame2), LookbackPeriod);
#--------------------------------------------------------------
def marketLow2 = if _lowInPeriod2 < _lowInPeriod2[-LookbackPeriod] then _lowInPeriod2 else _lowInPeriod2[-LookbackPeriod];
def _markedLow2 = low(period = TimeFrame2) == marketLow2;
rec _lastMarkedLow2 = CompoundValue(1, if IsNaN(_markedLow2) then _lastMarkedLow2[1] else if _markedLow2 then low(period = TimeFrame2) else _lastMarkedLow2[1], low(period = TimeFrame2));
#--------------------------------------------------------------
def marketHigh2 = if _highInPeriod2 > _highInPeriod2[-LookbackPeriod] then _highInPeriod2 else _highInPeriod2[-LookbackPeriod];
def _markedHigh2 = high(period = TimeFrame2) == marketHigh2;
rec _lastMarkedHigh2 = CompoundValue(1, if IsNaN(_markedHigh2) then _lastMarkedHigh2[1] else if _markedHigh2 then high(period = TimeFrame2) else _lastMarkedHigh2[1], high(period = TimeFrame2));
#--------------------------------------------------------------
def Resistance2 = _lastMarkedHigh2;
def Support2 = _lastMarkedLow2;
#--------------------------------------------------------------
def _highInPeriod3 = Highest(high(period = TimeFrame3), LookbackPeriod);
def _lowInPeriod3 = Lowest(low(period = TimeFrame3), LookbackPeriod);
#--------------------------------------------------------------
def marketLow3 = if _lowInPeriod3 < _lowInPeriod3[-LookbackPeriod] then _lowInPeriod3 else _lowInPeriod3[-LookbackPeriod];
def _markedLow3 = low(period = TimeFrame3) == marketLow3;
rec _lastMarkedLow3 = CompoundValue(1, if IsNaN(_markedLow3) then _lastMarkedLow3[1] else if _markedLow3 then low(period = TimeFrame3) else _lastMarkedLow3[1], low(period = TimeFrame3));
#--------------------------------------------------------------
def marketHigh3 = if _highInPeriod3 > _highInPeriod3[-LookbackPeriod] then _highInPeriod3 else _highInPeriod3[-LookbackPeriod];
def _markedHigh3 = high(period = TimeFrame3) == marketHigh3;
rec _lastMarkedHigh3 = CompoundValue(1, if IsNaN(_markedHigh3) then _lastMarkedHigh3[1] else if _markedHigh3 then high(period = TimeFrame3) else _lastMarkedHigh3[1], high(period = TimeFrame3));
def Resistance3 = _lastMarkedHigh3;
def Support3 = _lastMarkedLow3;
#--------------------------------------------------------------
def lower_close1 = (SMA crosses below Support1[1]);
def higher_close1 = (SMA crosses above Resistance1[1]);
def lower_close2 = (SMA crosses below Support2[1]);
def higher_close2 = (SMA crosses above Resistance2[1]);
def lower_close3 = (SMA crosses below Support3[1]);
def higher_close3 = (SMA crosses above Resistance3[1]);
#def x = (close > trueqb);
#def c = (close[1] < trueqb[1]);
#def v = (close[2] < trueqb[2]);
#def b = x and (c or v);
#def y = (close > trueqs);
#def w = (close[1] < trueqs[1]);
#def e = (close[2] < trueqs[2]);
#def r = y and (w or e);
def allbreakdown = (lower_close1 or lower_close2 or lower_close3);
def allbreakup = (higher_close1 or higher_close2 or higher_close3);
def QB2 = Highest(high, BuyEntry2);
def QS2 = Lowest(low, SellEntry2);
def trueqb2 = QB2[1];
def trueqs2 = QS2[1];
def ath = (((trueqb2 - trueqb2[3]) / 100) < .10);
def atl = (((trueqs2 - trueqs2[3]) / 100) >= -.10);
plot goldenbuy = (allbreakup or allbreakup[1]) and ((high) > trueqb2) and ath;