Strategy Patterns Playbook¶
Approved Patterns¶
These patterns have been validated and are approved for use. Follow the implementation guidelines exactly.
Pattern 1: ICT Quasimodo (QM) Reversal¶
Edge Source¶
Institutional order flow creates liquidity sweeps before major reversals.
Setup Sequence¶
1. Trend established (BoS)
2. Liquidity sweep (Sweep)
3. Structure shift confirmation (MSS)
4. Entry at Order Block retest
Implementation¶
// State machine
var int state = 0 // 0=looking, 1=BoS, 2=sweep, 3=MSS
// State transitions
if state == 0 and detectBoS()
state := 1
else if state == 1 and detectSweep()
state := 2
else if state == 2 and detectMSS()
state := 3
// Setup complete, wait for retest
// Entry on retest
if state == 3 and priceRetestsOB()
enterLong()
state := 0
Risk Parameters¶
| Parameter | Default | Range |
|---|---|---|
| Pivot Length | 5 | 3-8 |
| SL Buffer (ticks) | 5 | 3-10 |
| TP1 R:R | 1.0 | 1.0 |
| TP2 R:R | 2.0 | 1.5-3.0 |
Known Weaknesses¶
- Fails in strong trends without pullbacks
- Requires clear structure (choppy markets fail)
- Session-dependent (best in NY AM)
Pattern 2: Session Breakout with Confirmation¶
Edge Source¶
Asian range compression releases during London/NY open.
Setup Sequence¶
1. Define Asian range (20:00-00:00 UTC)
2. Wait for London/NY session
3. Breakout of Asian high/low
4. Confirmation candle close beyond range
5. Entry on pullback to range edge
Implementation¶
def session_breakout_signal(df, session='london'):
asian_high = df[df['session'] == 'asia']['high'].max()
asian_low = df[df['session'] == 'asia']['low'].min()
current = df.iloc[-1]
if current['session'] != session:
return None
# Bullish breakout
if current['close'] > asian_high:
return {
'direction': 'long',
'entry': asian_high, # Pullback entry
'stop': asian_low,
'target': asian_high + (asian_high - asian_low)
}
# Bearish breakout
elif current['close'] < asian_low:
return {
'direction': 'short',
'entry': asian_low,
'stop': asian_high,
'target': asian_low - (asian_high - asian_low)
}
return None
Risk Parameters¶
| Parameter | Default | Range |
|---|---|---|
| Min range (pips) | 30 | 20-50 |
| Max range (pips) | 80 | 60-100 |
| Confirmation bars | 1 | 1-2 |
Known Weaknesses¶
- False breakouts common on NFP/FOMC days
- Range too wide = poor R:R
- Range too narrow = noise
Pattern 3: Mean Reversion with Vol Filter¶
Edge Source¶
Overextended moves revert when volatility is contracting.
Setup Sequence¶
1. Price extends beyond 2 ATR from mean
2. Volatility is below average (contracting)
3. RSI/Stochastic shows divergence
4. Entry toward mean with tight stop
Implementation¶
def mean_reversion_signal(df, atr_mult=2.0, vol_percentile=50):
current = df.iloc[-1]
sma = df['close'].rolling(20).mean().iloc[-1]
atr = df['atr'].iloc[-1]
vol_pct = (df['atr'].iloc[-1] / df['atr'].rolling(90).mean().iloc[-1]) * 100
# Only trade in low vol
if vol_pct > vol_percentile:
return None
distance = (current['close'] - sma) / atr
if distance > atr_mult: # Overbought
return {
'direction': 'short',
'entry': current['close'],
'stop': current['close'] + atr,
'target': sma
}
elif distance < -atr_mult: # Oversold
return {
'direction': 'long',
'entry': current['close'],
'stop': current['close'] - atr,
'target': sma
}
return None
Risk Parameters¶
| Parameter | Default | Range |
|---|---|---|
| ATR multiplier | 2.0 | 1.5-3.0 |
| Vol percentile | 50 | 30-70 |
| Mean period | 20 | 10-50 |
Known Weaknesses¶
- Fails spectacularly in trending markets
- Requires strict vol filter
- Max 1 position at a time
Pattern 4: Momentum Continuation¶
Edge Source¶
Strong moves often continue after brief consolidation.
Setup Sequence¶
1. Strong move (>1.5 ATR candle)
2. 2-5 bars of consolidation (<0.5 ATR range)
3. Break of consolidation in original direction
4. Entry on break, stop below consolidation
Implementation¶
// Detect impulse
impulse = math.abs(close - open) > ta.atr(14) * 1.5
impulseDir = close > open ? 1 : -1
// Detect consolidation (2-5 bars, range < 0.5 ATR)
consol = ta.highest(high, 5) - ta.lowest(low, 5) < ta.atr(14) * 0.5
// Entry on break
longEntry = impulseDir == 1 and consol[1] and close > ta.highest(high[1], 5)
shortEntry = impulseDir == -1 and consol[1] and close < ta.lowest(low[1], 5)
Risk Parameters¶
| Parameter | Default | Range |
|---|---|---|
| Impulse threshold | 1.5 ATR | 1.2-2.0 |
| Max consol bars | 5 | 3-8 |
| Consol range max | 0.5 ATR | 0.3-0.7 |
Known Weaknesses¶
- Whipsaws in choppy markets
- Requires clear impulse
- Time-sensitive (stale setups fail)
Anti-Patterns (DO NOT USE)¶
Anti-Pattern 1: Indicator Stacking¶
Description: Combining 5+ indicators hoping for confluence.
Why It Fails: - Overfitting to historical data - Conflicting signals cause indecision - Each indicator adds lag
Instead: Use max 2-3 complementary indicators.
Anti-Pattern 2: Optimization to Perfection¶
Description: Parameter optimization until backtest Sharpe > 3.
Why It Fails: - Curve fitting to noise - OOS performance collapses - Parameters break on new data
Instead: Accept Sharpe 1.0-2.0 with robust parameters.
Anti-Pattern 3: Ignoring Costs¶
Description: Backtesting without spreads, commissions, slippage.
Why It Fails: - False profitability - High-frequency strategies destroyed by costs - Reality check at deployment
Instead: Include 1.5x expected costs in backtest.
Anti-Pattern 4: Single Regime Specialist¶
Description: Strategy only works in trending markets.
Why It Fails: - Markets change regimes - No warning when regime shifts - Catastrophic losses possible
Instead: Either filter for regime OR be robust across regimes.
Pattern Selection Guide¶
| Market Condition | Recommended Pattern | Avoid |
|---|---|---|
| Low vol, ranging | Mean Reversion | Momentum |
| High vol, trending | Momentum | Mean Reversion |
| Session open | Session Breakout | Mean Reversion |
| Clear structure | ICT QM | Momentum |
| Choppy/unclear | NONE - sit out | All patterns |
Pattern Combination Rules¶
- Never run opposing patterns simultaneously on same instrument
- Correlation check: Patterns on same instrument should have correlation < 0.5
- Risk aggregation: Combined exposure across patterns ≤ 2x single pattern risk
- Regime filter: If using regime-specific pattern, must have regime detector active