#1 – Doing time.
Time is measured by the 4-hour stochastic. On an hourly chart this equates to 60 samples of HL2. No need for the D line.
The 4-hour stochastic can be acceptive or rejective.

If you have 4 hours or more printed with oversold / overbought stochastic readings, the time was sufficient for the invocation of the new range. If price got rejected before a full 4-Hour close in the periphery, it is likely to relapse to the 30 SMA to regroup and re-attempt further on.
The invocation is the second Skeleton Key, but is not today’s subject. All you need to know for now is that it calls upon a target, it starts a timer and you should take this trade unless the 3rd Skeleton Key is in strong opposition of this.

def LEMA = ExpAverage(close, 18 * 23);
plot LEMAU = ExpAverage(high, 18 * 23);
LEMAU.setDefaultColor(color.black);
LEMAU.setLineWeight(2);
plot LEMAL = ExpAverage(low, 18 * 23);
LEMAL.setDefaultColor(color.black);
LEMAL.setLineWeight(2);
def lowtarg = LEMAL - AbsValue((LEMAL[36] - LEMAL) / 36) * 60;
def hitarg = LEMAU + AbsValue(((LEMAU - LEMAU[36]) / 36) * 60);
AddCloud(if hitarg[7] > .02 then hitarg[7] else Double.NaN, lowtarg[8], Color.green, Color.BLACK);
AddCloud(if hitarg[7] > .02 then hitarg[7] else Double.NaN, lowtarg[8], Color.orange, Color.BLACK);
def LEMAW = ExpAverage(close(period="2 HOURS"), 36 * 23);
plot LEMAUW = ExpAverage(high(period="2 HOURS"), 36 * 23);
LEMAUW.setDefaultColor(color.black);
LEMAUW.setLineWeight(2);
plot LEMALW = ExpAverage(low(period="2 HOURS"), 36 * 23);
LEMALW.setDefaultColor(color.black);
LEMALW.setLineWeight(2);
def lowtargw = LEMALw - AbsValue((LEMALw[36] - LEMALw) / 36) * 60;
def hitargw = LEMAUw + AbsValue(((LEMAUw - LEMAUw[36]) / 36) * 60);
AddCloud(if hitargw[7] > .02 then hitargw[7] else Double.NaN, lowtargw[8], Color.red, Color.BLACK);
…
