Level 3 — ProductionSupport, Resistance & Price Action

Support, Resistance & Price Action

45 minutes60 marksprintable — key stays hidden on paper

Level 3 — Production (from-scratch derivations, code-from-memory, explain-out-loud) Time limit: 45 minutes Total marks: 60

Instructions: Show all derivations. Where code is asked, write it from memory (pseudocode or Python accepted). "Explain out loud" prompts require reasoning in full sentences, not one-liners.


Question 1 — Pivot Point Derivation from Scratch (12 marks)

A stock closes a session with:

  • High H=148.00H = 148.00
  • Low L=132.00L = 132.00
  • Close C=140.00C = 140.00

(a) From memory, write the formula for the classic (floor-trader) Pivot Point PP, and compute it. (2)

(b) Derive and compute the first support S1S1, first resistance R1R1, second support S2S2, and second resistance R2R2. State each formula before substituting. (6)

(c) Explain out loud why R1R1 and S1S1 are constructed as reflections around the pivot, and what trading meaning the pivot itself carries. (4)


Question 2 — Role Reversal & Retests (10 marks)

(a) Explain out loud the concept of role reversal of support and resistance. Use the idea of trapped market participants in your explanation. (4)

(b) A resistance level sits at \50.Pricebreaksaboveto. Price breaks above to $53,pullsbackto, pulls back to $50.10$, holds, then rallies. Label each phase (breakout, retest, confirmation) against the price points and state what a trader concludes at each phase. (6)


Question 3 — Breakout vs False Breakout Classifier (12 marks)

You are given a resistance level R and a series of candles, each with high, low, close.

(a) From memory, write a function classify_breakout(candles, R) that returns "breakout", "false_breakout", or "no_break". Define your own rule (e.g. close beyond R = confirmed break; wick beyond but close back inside = false break). State your rules in comments. (8)

(b) Explain out loud two market reasons a false breakout occurs. (4)


Question 4 — Swing Highs / Swing Lows Algorithm (10 marks)

(a) Define, from scratch, what constitutes a swing high and a swing low using a lookback window of n bars on each side. (3)

(b) Write pseudocode/Python find_swing_highs(highs, n) that returns the indices of swing highs. (5)

(c) Explain why the last n bars can never yet be confirmed as swing points. (2)


Question 5 — Psychological Round Numbers & Demand Zones (8 marks)

(a) Explain out loud why round numbers (e.g. 100100, 10001000) tend to act as S/R. Give two behavioural causes. (4)

(b) Contrast a line of support with a demand zone. Why do professionals often prefer zones? (4)


Question 6 — Price Action Without Indicators (8 marks)

Explain out loud how a trader can define trend, support, resistance, and entry timing using only raw price action (no indicators). Structure your answer around: (i) swing structure for trend, (ii) horizontal levels for S/R, (iii) candle behaviour at levels for timing. (8)

Answer keyMark scheme & solutions

Question 1 (12 marks)

(a) Formula (1 mark), computation (1 mark): P=H+L+C3=148+132+1403=4203=140.00P = \frac{H + L + C}{3} = \frac{148 + 132 + 140}{3} = \frac{420}{3} = 140.00

(b) Each formula + value = 1.5 marks (×4 = 6): R1=2PL=2(140)132=148.00R1 = 2P - L = 2(140) - 132 = 148.00 S1=2PH=2(140)148=132.00S1 = 2P - H = 2(140) - 148 = 132.00 R2=P+(HL)=140+16=156.00R2 = P + (H - L) = 140 + 16 = 156.00 S2=P(HL)=14016=124.00S2 = P - (H - L) = 140 - 16 = 124.00

Marking: correct formula (0.75) + correct value (0.75) each.

(c) (4 marks):

  • R1=2PLR1 = 2P - L and S1=2PHS1 = 2P - H are reflections of the low and high across the pivot: R1P=PLR1 - P = P - L and PS1=HPP - S1 = H - P, i.e. equal distances above/below PP. (2)
  • The pivot represents the "average traded price" / consensus value of the prior session; trading above it = intraday bullish bias, below = bearish bias. It acts as the intraday equilibrium/decision point. (2)

Question 2 (10 marks)

(a) (4 marks):

  • Once a level breaks, participants who traded against the move are trapped (e.g. sellers at old resistance now in loss). (2)
  • On a pullback, these trapped traders exit at breakeven (creating buying) while breakout traders add; supply exhausted at the old level now becomes demand → resistance becomes support. Symmetric logic for broken support becoming resistance. (2)

(b) (6 marks — 2 each):

  • Breakout: price moves from ≤50upthroughto50 up through to 53 → conviction the level is broken; trader watches for follow-through. (2)
  • Retest: pullback to 50.10(nearoldresistance50.10 (near old resistance 50) tests whether it now holds as support. (2)
  • Confirmation: it holds (50.10>50.10 > 50, no close back below) and rallies → role reversal confirmed; higher-probability long entry with stop below $50. (2)

Question 3 (12 marks)

(a) (8 marks) — example solution:

def classify_breakout(candles, R):
    # Rules:
    # - A candle "pierces" R if its high > R.
    # - Confirmed breakout: a candle CLOSES above R.
    # - False breakout: high pierces R but close falls back <= R.
    # - No break: high never exceeds R.
    pierced = False
    for c in candles:
        if c['high'] > R:
            pierced = True
            if c['close'] > R:
                return "breakout"          # closed beyond -> confirmed
    if pierced:
        return "false_breakout"            # wicked above but never closed above
    return "no_break"

Marking: clear stated rules (2); loop/pierce detection (2); breakout condition on close (2); false-breakout & no-break returns (2). Any consistent rule set earns full marks.

(b) (4 marks, 2 each):

  • Liquidity grab / stop hunt: larger players push price beyond the level to trigger stop-loss and breakout orders, then reverse. (2)
  • Lack of follow-through volume: insufficient real demand/supply to sustain the move; price returns inside the range. (2)

Question 4 (10 marks)

(a) (3 marks):

  • A swing high at index ii: high[i]>high[ik]high[i] > high[i-k] and high[i]>high[i+k]high[i] > high[i+k] for all k=1..nk=1..n. (1.5)
  • A swing low at index ii: low[i]<low[ik]low[i] < low[i-k] and low[i]<low[i+k]low[i] < low[i+k] for all k=1..nk=1..n. (1.5)

(b) (5 marks):

def find_swing_highs(highs, n):
    swings = []
    for i in range(n, len(highs) - n):
        left  = all(highs[i] > highs[i-k] for k in range(1, n+1))
        right = all(highs[i] > highs[i+k] for k in range(1, n+1))
        if left and right:
            swings.append(i)
    return swings

Marking: correct loop bounds n .. len-n (2); left comparison (1); right comparison (1); collect index (1).

(c) (2 marks): The last nn bars lack the required nn future bars to their right, so the right-side condition cannot be evaluated yet — a swing point is only confirmable in hindsight.


Question 5 (8 marks)

(a) (4 marks, 2 each):

  • Anchoring / cognitive salience: round numbers are memorable reference prices; traders cluster orders and targets there. (2)
  • Order clustering: institutions place limit/stop and options strike-related orders at round levels, creating real supply/demand and self-fulfilling reactions. (2)

(b) (4 marks):

  • A line is a single price; a demand zone is a price range (e.g. the base a strong rally launched from). (2)
  • Zones are preferred because exact turning prices rarely repeat; a zone accommodates noise/wicks, reduces premature stop-outs, and better reflects where accumulation actually occurred. (2)

Question 6 (8 marks)

Award ~2.5 per pillar (i)–(iii) + 0.5 coherence:

  • (i) Trend via swing structure: higher highs + higher lows = uptrend; lower highs + lower lows = downtrend; ranging = flat swings. (≈2.5)
  • (ii) S/R via horizontal levels: mark prior swing highs/lows and areas of repeated reaction; these become S/R and can role-reverse. (≈2.5)
  • (iii) Timing via candle behaviour at levels: rejection wicks, engulfing candles, or holds at a level signal entries; breakout+retest confirms; stops placed beyond the level. (≈2.5)
  • Coherent integration of all three without indicators. (0.5)

[
  {"claim":"Pivot P = 140","code":"H,L,C=148,132,140; P=(H+L+C)/3; result=(P==140)"},
  {"claim":"R1=148, S1=132","code":"H,L,C=148,132,140; P=(H+L+C)/3; R1=2*P-L; S1=2*P-H; result=(R1==148 and S1==132)"},
  {"claim":"R2=156, S2=124","code":"H,L,C=148,132,140; P=(H+L+C)/3; R2=P+(H-L); S2=P-(H-L); result=(R2==156 and S2==124)"},
  {"claim":"R1 and S1 are equidistant from P","code":"H,L,C=148,132,140; P=(H+L+C)/3; R1=2*P-L; S1=2*P-H; result=((R1-P)==(P-L) and (P-S1)==(H-P))"}
]