mirror of
https://github.com/BrentNeale1/fx-quant.git
synced 2026-08-14 02:38:03 +00:00
- S7 Liquidity Sweep: built, tested across 6 pairs, tight SL (1.0 ATR) on GBP_JPY is Phase 2 candidate (107 trades, OOS PF 1.39, gen ratio 1.81) - S8 Order Block: built, tested on GBP_JPY (watchlist, 32 trades, OOS PF 1.55) - S9 London Session: built, tested across 8 pairs with filter experiments GBP_USD (OOS PF 1.45) and GBP_AUD filtered (OOS PF 1.94) advance to Phase 2 - Added OBV indicator to technical.py - Added GBP_NZD to engine spread/pip config - Standalone OANDA fetcher (bypasses Supabase dependency) - Fetched EUR_GBP, EUR_USD, GBP_NZD H1 data (2021-2023) - Consolidated STRATEGY_LEARNINGS.md with full Phase 1 scorecard and 11 design principles - Phase 2 roster: S7/GBP_JPY, S9/GBP_USD, S9F/GBP_AUD, S4-F/EUR_AUD, S3/GBP_JPY Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
295 lines
14 KiB
Markdown
295 lines
14 KiB
Markdown
# Strategy Learnings — Phase 1 Complete
|
||
|
||
Captures what we've learned from backtesting, filter analysis, and strategy iteration.
|
||
Updated: 2026-02-19.
|
||
|
||
Data period: 2021-01-01 to 2023-08-31 (OANDA practice account, H1 candles).
|
||
Backtester: Event-driven, no lookahead, spread + slippage modeled per pair.
|
||
Train/Test: 70/30 chronological split. Generalization ratio = OOS PF / IS PF.
|
||
|
||
---
|
||
|
||
## Phase 1 Final Scorecard
|
||
|
||
### Strategies Advancing to Phase 2
|
||
|
||
| Strategy | Pair | Trades (Full) | Trades (OOS) | WR% | PF (Full) | PF (OOS) | Gen Ratio | Edge Type |
|
||
|----------|------|---------------|--------------|-----|-----------|----------|-----------|-----------|
|
||
| **S7 Tight** | GBP_JPY | 107 | 43 | 59.8% | 0.96 | **1.39** | **1.81** | Liquidity sweep reversal |
|
||
| **S9** | GBP_USD | 296 | 42 | 53.7% | 0.75 | **1.45** | **2.10** | London session breakout |
|
||
| **S9 Filtered** | GBP_AUD | 66 | 14 | 60.6% | **1.14** | **1.94** | **2.04** | London session breakout |
|
||
| **S4-F** | EUR_AUD | 95 | — | 45.3% | **1.06** | — | — | EMA Ribbon trend context |
|
||
| **S3** | GBP_JPY | 155 | — | 52.3% | 0.99 | — | — | Key level momentum |
|
||
|
||
**Note on S7 and S9 full-dataset PF**: Both show PF < 1.0 over the full 2021-2023 period but
|
||
strong OOS profit factors (1.39-1.94) with high generalization ratios. This indicates the
|
||
strategies perform better in recent market conditions. Phase 2 will validate whether this
|
||
represents a genuine emerging edge or a recency fluke.
|
||
|
||
### Strategies on Watchlist (Marginal / Needs Work)
|
||
|
||
| Strategy | Pair | Trades (Full) | Trades (OOS) | WR% | PF | Notes |
|
||
|----------|------|---------------|--------------|-----|----|-------|
|
||
| S3 | GBP_USD | 179 | — | 53.1% | 1.02 | Near breakeven. Needs SL tightening. |
|
||
| S8 | GBP_JPY | 32 | 9 | 43.8% | 0.93 | Full PF 0.93, OOS PF 1.55. Low trade count. |
|
||
|
||
### Strategies Rejected
|
||
|
||
| Strategy | Concept | Trades Tested | Best PF | Why It Failed |
|
||
|----------|---------|---------------|---------|---------------|
|
||
| S1 | MA Breakout | ~500 | 0.88 | No edge. 35-47% WR across all pairs. |
|
||
| S2 | VWAP Reversal | ~400 | 0.78 | 20-25% WR. 26 consecutive losses at worst. |
|
||
| S4 (all except F) | EMA Ribbon variants | 0-248 | 0.78 | 7+ filters = 0 trades. Paradigm conflict. |
|
||
| S5 | Momentum Exhaustion | ~2,500 | 0.77 | High trade count but picks up too much noise. |
|
||
| S6 | EMA Bounce | ~440 | 0.84 | Good WR (59%) but terrible R:R — avg loss >> avg win. |
|
||
| S7 (1.5 ATR SL) | Liquidity Sweep wide SL | 46 | 0.71 | Too-wide stops (1.5 ATR). Tight SL (1.0 ATR) fixed it. |
|
||
| S9 | EUR_GBP | 448 | 0.65 | Tiny ranges — 2.0 pip spread eats 17% of avg win. |
|
||
| S9 | GBP_NZD | 191 | 0.67 | Wide spreads + choppy price action. |
|
||
| S9 | USD_JPY | ~30 | — | 31% WR. Asian range breakout doesn't work on USD_JPY. |
|
||
|
||
---
|
||
|
||
## Strategy Details
|
||
|
||
### S7 — Liquidity Sweep Reversal (Phase 2: GBP_JPY)
|
||
|
||
**Concept**: Price sweeps past a significant swing high/low (triggering clustered stop-loss
|
||
orders), then reverses. Based on institutional stop-hunting behavior documented by
|
||
Osler (2005, NY Fed).
|
||
|
||
**Final Parameters** (tight variant):
|
||
- Swing detection: 5-bar fractal, 100-bar lookback
|
||
- Sweep range: 0.7-1.5 ATR penetration past swing level
|
||
- Reversal confirmation: close back inside range, in upper/lower 40% of candle
|
||
- **SL: 1.0 ATR** beyond sweep extreme (tightened from 1.5 — the key improvement)
|
||
- TP1: 1.5 ATR (close 50%), TP2: 3.0 ATR (close 50%), trail at 1.5 ATR
|
||
- HTF: 200 EMA trend alignment (hard gate)
|
||
- Session: 08:00-17:00 UTC
|
||
- Confluence: OBV divergence (+1), RSI extreme (+1), volume spike (+1)
|
||
- Max hold: 40 bars
|
||
|
||
**GBP_JPY Full Dataset Results (2021-2023)**:
|
||
| Split | Trades | WR% | PF | PnL (pips) | Max DD | Expectancy |
|
||
|-------|--------|-----|----|------------|--------|------------|
|
||
| FULL | 107 | 59.8% | 0.96 | -22p | -11.9% | -0.2p |
|
||
| TRAIN | 61 | 54.1% | 0.77 | -337p | -11.8% | -5.5p |
|
||
| TEST | 43 | 67.4% | 1.39 | +331p | -3.8% | +7.7p |
|
||
|
||
**6-Month Results (Mar-Aug 2023)**: 25 trades, 76% WR, PF 2.01, +445p
|
||
|
||
**Exit profile (full dataset)**: 40% hit TP3, 36% partial (TP1+SL), 24% full SL.
|
||
|
||
**Pair suitability tested**: GBP_JPY is the only viable pair. GBP_USD (PF 0.92),
|
||
EUR_USD (PF 0.75), EUR_AUD (PF 0.29), GBP_AUD (PF 0.83), GBP_NZD (PF 0.39) all fail.
|
||
Crosses suffer from wide spreads killing the tight SL approach (R:R stays ~0.63).
|
||
|
||
**Why GBP_JPY works**: High volatility (avg ATR ~80-100 pips) gives enough room for the
|
||
1.0 ATR SL to absorb noise while the 1.5/3.0 ATR TP targets capture meaningful moves.
|
||
JPY pairs have cleaner swing structure due to institutional flow patterns around
|
||
Tokyo/London handoff.
|
||
|
||
---
|
||
|
||
### S9 — London Session Breakout (Phase 2: GBP_USD + GBP_AUD filtered)
|
||
|
||
**Concept**: Asian session (00:00-07:00 UTC) establishes a range; London open breaks it with
|
||
institutional order flow. Among the most well-documented FX phenomena
|
||
(Andersen & Bollerslev 1997, BIS triennial survey data).
|
||
|
||
**Base Parameters**:
|
||
- Asian range: 00:00-07:00 UTC high/low
|
||
- Entry window: 07:00-10:00 UTC (London kill zone)
|
||
- Volume: > 1.5x Asian session average (relaxed from 3.0 for H1 bars)
|
||
- SL: Opposite side of Asian range, capped at 2.5 ATR
|
||
- TP1: 1.0x Asian range width (measured move), TP2: 2.0x range
|
||
- Time exit: 17:00 UTC
|
||
- HTF trend: 200 EMA (soft confluence, not hard gate)
|
||
- ADX > 20 (soft confluence)
|
||
- Max hold: 40 bars
|
||
|
||
**GBP_AUD Filtered Overrides** (the key improvement):
|
||
- Skip Friday trades (44% WR, -17.6p avg — position squaring kills breakouts)
|
||
- ADX hard gate > 25 (low-ADX entries at 43% WR are pure noise)
|
||
- Require EMA50 distance > 40 pips (close-to-EMA trades are 50% WR)
|
||
|
||
**GBP_USD Full Dataset Results (2021-2023)**:
|
||
| Split | Trades | WR% | PF | PnL (pips) | Max DD |
|
||
|-------|--------|-----|----|------------|--------|
|
||
| FULL | 296 | 53.7% | 0.75 | -1,238p | -35.5% |
|
||
| TRAIN | 253 | 50.6% | 0.69 | -1,608p | -35.5% |
|
||
| TEST | 42 | 71.4% | 1.45 | +291p | -4.5% |
|
||
|
||
**GBP_AUD Filtered Full Dataset Results (2021-2023)**:
|
||
| Split | Trades | WR% | PF | PnL (pips) | Max DD |
|
||
|-------|--------|-----|----|------------|--------|
|
||
| FULL | 66 | 60.6% | 1.14 | +474p | -9.5% |
|
||
| TRAIN | 51 | 56.9% | 0.95 | +111p | -9.5% |
|
||
| TEST | 14 | 71.4% | 1.94 | +295p | -2.7% |
|
||
|
||
**Pair suitability tested across 8 pairs**:
|
||
| Pair | Full PF | OOS PF | Verdict |
|
||
|------|---------|--------|---------|
|
||
| GBP_USD | 0.75 | **1.45** | Primary — strong OOS, regime-dependent |
|
||
| GBP_AUD (filtered) | **1.14** | **1.94** | Secondary — excellent generalization |
|
||
| EUR_USD | 0.93 | 1.05 | Marginal — breakeven OOS, filter overfits |
|
||
| GBP_AUD (baseline) | 0.91 | 1.09 | Marginal without filters |
|
||
| GBP_NZD | 0.67 | 0.79 | Rejected — wide spreads |
|
||
| EUR_GBP | 0.65 | 0.55 | Rejected — tiny ranges, spread eats profit |
|
||
| USD_JPY | — | — | Rejected — 31% WR |
|
||
| EUR_AUD | — | — | Rejected — poor results in initial test |
|
||
|
||
**EUR_USD filter experiments** (documented for reference):
|
||
- RSI 40-60 skip + ADX > 30 + entry Hour 8 + TP1 1.5x: In-sample PF 1.26, OOS PF 0.89 (overfit)
|
||
- RSI 40-60 skip + TP1 1.5x only: In-sample PF 1.09, OOS PF 0.90 (overfit)
|
||
- TP1 1.5x only: In-sample PF 1.04, OOS PF 1.00 (structural R:R improvement but no profit)
|
||
- Conclusion: EUR_USD S9 is fundamentally breakeven. No filter combo produces OOS profit.
|
||
|
||
---
|
||
|
||
### S8 — Order Block Retest (Watchlist)
|
||
|
||
**Concept**: Institutional order blocks (last opposing candle before a displacement move) act
|
||
as support/resistance on retest. Requires 1.5 ATR displacement, rejection candle on
|
||
retest, and 2-of-3 confluence (FVG, broken S/R, declining pullback volume).
|
||
|
||
**GBP_JPY Full Dataset Results (2021-2023)**:
|
||
| Split | Trades | WR% | PF | PnL (pips) |
|
||
|-------|--------|-----|----|------------|
|
||
| FULL | 32 | 43.8% | 0.93 | -40p |
|
||
| TRAIN | 23 | 39.1% | 0.72 | -155p |
|
||
| TEST | 9 | 55.6% | 1.55 | +115p |
|
||
|
||
**6-Month Results**: 15 trades, 40% WR, PF 1.47, RR 2.21, +106p
|
||
|
||
**Status**: Promising R:R profile (avg win 55p, avg loss 25p) but too few trades.
|
||
The 1.5 ATR displacement threshold may be too strict for the full dataset. On watchlist
|
||
for Phase 2 with potential to relax displacement to 1.2 ATR and test on more pairs.
|
||
|
||
---
|
||
|
||
### S3 — Key Level Momentum Breakout (Phase 2: GBP_JPY)
|
||
|
||
**Concept**: H1 breakouts above/below significant S/R levels (3+ touch clusters) with
|
||
volume confirmation, strong candle close, MACD alignment, and ADX > 20.
|
||
|
||
**Results (Full Dataset)**:
|
||
| Pair | Trades | WR% | PF | PnL (pips) | Max DD |
|
||
|------|--------|-----|----|------------|--------|
|
||
| GBP_JPY | 155 | 52.3% | 0.99 | +408p | -13.5% |
|
||
| GBP_USD | 179 | 53.1% | 1.02 | +97p | -10.2% |
|
||
| USD_JPY | 138 | 52.9% | 1.00 | +66p | -9.8% |
|
||
|
||
**Status**: The only Phase 1 strategy near breakeven across multiple pairs. Minimal
|
||
filters (4 hard gates), single paradigm. Advancing to Phase 2 on GBP_JPY with
|
||
suggested SL tightening and retest confirmation experiments.
|
||
|
||
---
|
||
|
||
## S4 EMA Ribbon — Detailed Filter Analysis
|
||
|
||
### What We Tested
|
||
- **S4-D** (Volume + ADX Gating): 0 trades across 3 pairs
|
||
- **S4-E** (Compression Quality + Stochastic): 1 trade across 3 pairs
|
||
- **S4-F** (Trend Context Filter): 248 trades, 39.1% WR, PF 0.78
|
||
- **S4-F-v2** (Quick Tune with 3 TFs): 0-2 trades depending on threshold adjustments
|
||
- **S4-G** (Pullback-first): 12 trades, 16.7% WR, PF 0.17
|
||
- **S4-G-Minimal** (Pullback, no M5 EMA): 12 trades, same result
|
||
|
||
### S4 Variant Summary Table
|
||
| Variant | Trades | WR | PF | Verdict |
|
||
|---------|--------|-----|-----|---------|
|
||
| S4-D (Vol+ADX) | 0 | — | — | Dead: filters too strict |
|
||
| S4-E (Compression) | 1 | — | — | Dead: filters too strict |
|
||
| S4-F (Trend Context) | 248 | 39.1% | 0.78 | Best S4, but losing money |
|
||
| S4-F EUR_AUD only | 95 | 45.3% | 1.06 | Only profitable pair |
|
||
| S4-F-v2 (3TF tune) | 0 | — | — | Dead: contradictory filters |
|
||
| S4-G (Pullback-first) | 12 | 16.7% | 0.17 | Dead: pullbacks don't resume |
|
||
| S4-G-Minimal | 12 | 16.7% | 0.17 | Same — M5 EMA wasn't the issue |
|
||
|
||
---
|
||
|
||
## Key Design Principles (Derived from All Phase 1 Testing)
|
||
|
||
### 1. Single Paradigm Per Strategy
|
||
Momentum + mean-reversion filters are contradictory. When momentum is strong (ADX rising,
|
||
ribbon expanding), RSI is NOT at extremes and price is far from the 50 EMA. When stochastic
|
||
is oversold near the EMA, momentum hasn't fired yet. S4-D/E proved this with 0-1 trades.
|
||
|
||
### 2. Maximum 3-4 Hard Filters
|
||
Each additional hard filter compounds multiplicatively. S4-D/E/F-v2 had 7-9 simultaneous
|
||
hard gates, resulting in near-zero trades. Additional conditions should be confluence scores
|
||
(+1 to signal quality) not hard gates.
|
||
|
||
### 3. Validate Thresholds Against Data
|
||
S4 required 0.8% EMA expansion — data shows the maximum expansion within 10 bars was 0.70%.
|
||
The threshold was literally impossible. A 5-minute diagnostic of data distributions saves
|
||
hours of debugging 0-trade results.
|
||
|
||
### 4. Volume as Soft Filter
|
||
Volume > 2.0x 20-period average: only 4% of signals qualify.
|
||
Volume > 1.5x: only 21% qualify.
|
||
Volume > 1.2x: 40% qualify.
|
||
Use 1.2x as hard gate max; higher thresholds as confluence bonus only.
|
||
|
||
### 5. H1 Timeframe Has Natural Edge
|
||
S3 works on H1. Most M15 strategies struggle with noise. H1 bars naturally filter
|
||
whipsaws while capturing meaningful session moves.
|
||
|
||
### 6. Simple Strategies Outperform Complex Ones
|
||
S3 (4 filters) beats S4 (7+ filters) and S5 (complex exhaustion logic).
|
||
The right complexity level is the minimum needed for the concept to work.
|
||
|
||
### 7. Win Rate Isn't Everything
|
||
S6 has 59% WR but PF < 1.0 because avg loss >> avg win. R:R (risk-reward ratio) matters
|
||
as much as WR. A strategy needs WR × avg_win > (1-WR) × avg_loss to be profitable.
|
||
|
||
### 8. Pair Specificity Is Real
|
||
S7 works on GBP_JPY but fails on 5 other pairs. S9 works on GBP_USD and GBP_AUD but
|
||
fails on EUR_GBP and GBP_NZD. Don't assume cross-pair generalization — always validate.
|
||
|
||
### 9. Tighter Stops Often Win
|
||
S7: PF jumped from 0.71 → 2.01 when SL tightened from 1.5 → 1.0 ATR. Wider stops
|
||
don't give "more room" — they give back more profit on reversals. The optimal SL is the
|
||
minimum that avoids noise-triggered exits.
|
||
|
||
### 10. Filter Optimization Overfits Easily
|
||
S9 EUR_USD: Every filter combination improved in-sample but degraded OOS.
|
||
RSI filter, ADX filter, entry hour delay — all overfit the training period.
|
||
Only structural changes (TP1 multiplier adjustment) held across splits.
|
||
Per-pair signal filters (RSI zones, ADX thresholds) are high overfitting risk.
|
||
|
||
### 11. Regime Dependence Is Common
|
||
S7 GBP_JPY and S9 GBP_USD both show: losing in 2021-2022, profitable in 2022-2023.
|
||
This could mean the edge is strengthening (market structure evolution) or that the
|
||
test period was lucky. Phase 2 must validate with forward testing.
|
||
|
||
---
|
||
|
||
## Phase 2 Plan
|
||
|
||
### Strategies to Forward-Test
|
||
| Strategy | Pair | Config |
|
||
|----------|------|--------|
|
||
| S7 Tight | GBP_JPY | SL 1.0 ATR, TP1 1.5 ATR, TP2 3.0 ATR |
|
||
| S9 | GBP_USD | Base parameters, entry 07:00-10:00 UTC |
|
||
| S9 Filtered | GBP_AUD | No Friday, ADX > 25, EMA50 dist > 40 pips |
|
||
| S4-F | EUR_AUD | EMA Ribbon trend context, 2.0 ATR SL, 3.0 ATR TP |
|
||
| S3 | GBP_JPY | Base parameters (pending SL tightening test) |
|
||
|
||
### Phase 2 Objectives
|
||
1. **Forward validation**: Run strategies on live data (paper account) for 3+ months
|
||
2. **Regime analysis**: Monitor whether OOS edge persists or was period-specific
|
||
3. **Portfolio construction**: Test correlation between S7/S9/S3 signals — do they
|
||
diversify or cluster?
|
||
4. **Position sizing**: Implement Kelly criterion or fixed fractional based on
|
||
actual win rate / R:R distributions
|
||
5. **S8 exploration**: Relax displacement threshold (1.2 ATR) and test on additional pairs
|
||
6. **S3 optimization**: Test tighter SL and retest confirmation entry
|
||
7. **Drawdown management**: Define maximum portfolio drawdown limits and auto-pause rules
|
||
|
||
### Infrastructure Needed
|
||
- Live OANDA data feed for paper trading
|
||
- Trade logger with real-time metrics dashboard
|
||
- Automated signal generation (currently backtester-only)
|
||
- Alert system for human review of signals before execution
|