# TR-SMA-cross — Results (vectorbtpro)

Article claim: ~100 manual trades, win rate ~48% (reward-to-risk not restated here).
Measurement (base, pooled): 1,476 trades, 593 TP / 883 SL / 0 END, win rate 40.18%.

## Measurement

- Period: Dukascopy H1 Bid, 2017-01-02 to 2026-06-26 (59,132 / 59,131 bars).
- Split (predeclared): IS = exit before 2024-01-01, OOS = exit on/after it.
- Engine: vectorbtpro 2026.9.5 Portfolio.from_signals, closed-bar signals,
  next-bar entry at open, one position per symbol, stop-first on ambiguous bars.
  (Run used interpreter Python 3.13.9; canonical command is `py -3.11 test.py`.)
- Base: SMA9/SMA21 cross + whole-candle location + SMA200 filter, 5-bar swing
  stop +/- 1 pip, 1.5R.

| Scope | Trades | TP | SL | END | Win rate | IS (n/rate) | OOS (n/rate) |
| EURUSD | 733 | 293 | 440 | 0 | 39.97% | 519 / 40.3% | 214 / 39.3% |
| EURJPY | 743 | 300 | 443 | 0 | 40.38% | 551 / 40.8% | 192 / 39.1% |
| POOLED | 1,476 | 593 | 883 | 0 | 40.18% | 1,070 / 40.6% | 406 / 39.2% |

## Costs (fixed assumptions, bid-only data)

- Spread EURUSD 1.0 pip / EURJPY 1.2 pip, half-spread adverse on every fill.
- Commission $7/lot round trip ($0.07 at 0.01 lot); EURJPY converted to
  price at a fixed USDJPY 140 (simplification, recorded in summary.csv).
- Pooled base: breakeven win rate with costs 42.38%, effective R 1.36,
  R-denominated max drawdown 105.8R (trade-sequence units, no profit claim).

## Variants (one dimension each, both symbols)

- swing10 (10-bar swing stop): pooled 1,218 trades, 40.07%.
- Range across variants: 40.1-40.2%, both below the claimed ~48%.

## Limits

- H1 bid bars: intrabar paths unknown; a bar touching both TP and SL exits
  at SL (6 pooled base trades affected); fills are modeled, not observed.
- Spread, commission and USDJPY are fixed assumptions, not measured costs.
- Mechanical variant only: the article's manual 30m sample, typo'd short stop
  and vague lookback cannot be reconstructed; no exact replication is claimed
  and no parity with the ~48% manual figure is asserted.
- No profitability claim is made.
- Audit trail: results/summary.csv + results/trades.csv (no raw bars).
- Engine receipt: test.py requires vectorbtpro and replays every ledger trade
  in the engine at exact fills (same-bar trades as single-trade receipts);
  see vbt_reconciled in summary.csv.
