Trend & pullback
252-Day Time-Series Momentum
A monthly decision based on roughly one year of price momentum. Published momentum research motivates the family; the retail spot rules and protective stop below are a separate specification.
- Category
- Trend & pullback
- Timeframes
- D1 (monthly rebalance)
- Pairs
- EURUSD, GBPUSD, USDJPY, USDCHF, USDCAD, AUDUSD, NZDUSD
- Test status
- Mechanical bar tests completed; profitability unverified

How the rule works
Time-series momentum compares one instrument with its own past, unlike cross-sectional momentum, which ranks instruments against peers. A 252-bar price return discards financing and differs from the futures excess returns in the cited study. Monthly decisions reduce turnover but can retain exposure through a sudden trend reversal. The ATR stop makes this an editorial retail adaptation, not a replication of the paper.
Setup
- At the first tradable tick of a new calendar month, identify the final completed daily close of the previous month. Calculate R252 = that close / the close 252 completed trading bars earlier − 1. This is a 252-trading-day approximation, not an exact calendar-year or futures excess return.
- Require 300 valid daily observations. Rebalance only once per month. If stopped during the month, wait for the next monthly decision; do not re-enter daily. Zero return means cash.
Indicators
- 252-trading-bar price return: Close[1] / Close[253] − 1
- MT5 ATR(20), completed D1 bars
Long entry
- If the 12-month close-to-close return is positive, buy at the next available D1-bar open; retain an existing long rather than adding. A zero or negative reading cannot open a buy.
Short entry
- If the return is negative, sell at the next available D1-bar open; retain an existing short rather than adding. A zero or positive reading cannot open a sell.
Stop loss
- Initial stop is 3×ATR(20) from entry. It is a risk stop, not a claim about the academic construction.
Exit
- Close and reverse only after the next month-end signal has the opposite sign; close to cash if the return is exactly zero. A protective stop always takes precedence.
Risk and position size
- Allocate 0.25% equity risk per pair, capped at 1% total across correlated USD exposures. Calculate position size from the actual stop and contract specification.
Costs and execution
- The 12-month observation must end on the completed month-end bar; do not use an unfinished monthly candle. Include financing, as slow signals can hold positions through many rollovers.
When the method can fail
- Avoid treating a single retail pair as the diversified futures portfolio in the evidence. Momentum can reverse sharply after policy surprises or at regime turns.
Worked example
- Hypothetical month-end: final close 1.1000 versus 1.0000 252 trading bars earlier gives +10% price momentum. A next-month entry at 1.1002 with ATR20 0.0050 has initial SL 1.0852. This does not imply a 10% strategy gain: it is the formation-period signal, before entry, financing or position sizing.
Historical test results
No tested pair meets the complete research-screen criterion. Positive cells alone do not qualify the strategy.
42 mechanical runs across 7 pairs on D1. Decisions use completed strategy bars; fills use native ICMarketsEU-Demo M15 Bid candles with explicitly modelled costs. Full window: 1 January 2025–18 September 2026. Shorter available histories: USDCAD: 2026-03-03. Each row starts with an independent USD10,000 account.
| Pair | Period | Costs | Trades | Net return | Profit factor | Max drawdown | Ambiguous bars |
|---|---|---|---|---|---|---|---|
| EURUSD | combined | base | 5 | -0.93% | 0.1196 | 1.25% | 0 |
| EURUSD | combined | stress | 5 | -1.22% | 0.0823 | 1.53% | 0 |
| GBPUSD | combined | base | 3 | -0.05% | 0.8758 | 0.92% | 0 |
| GBPUSD | combined | stress | 3 | -0.30% | 0.263 | 1.12% | 0 |
| USDJPY | combined | base | 5 | -0.02% | 0.9015 | 0.69% | 0 |
| USDJPY | combined | stress | 5 | -0.20% | 0.336 | 0.71% | 0 |
| USDCHF | combined | base | 5 | +0.01% | 1.0298 | 1.09% | 0 |
| USDCHF | combined | stress | 5 | -0.89% | 0.1355 | 1.71% | 0 |
| USDCAD (shorter coverage) | combined | base | 2 | +0.27% | n/a | 0.74% | 0 |
| USDCAD (shorter coverage) | combined | stress | 2 | +0.09% | 6.2775 | 0.81% | 0 |
| AUDUSD | combined | base | 5 | -0.09% | 0.8646 | 0.74% | 0 |
| AUDUSD | combined | stress | 5 | -0.44% | 0.408 | 0.84% | 0 |
| NZDUSD | combined | base | 6 | -0.01% | 0.9783 | 0.88% | 0 |
| NZDUSD | combined | stress | 6 | -0.48% | 0.1622 | 0.96% | 0 |
Show 2025 and 2026 separately
| Pair | Period | Costs | Trades | Net return | Profit factor | Max drawdown | Ambiguous bars |
|---|---|---|---|---|---|---|---|
| EURUSD | 2025 | base | 2 | -0.28% | 0.0 | 0.67% | 0 |
| EURUSD | 2025 | stress | 2 | -0.42% | 0.0 | 0.77% | 0 |
| EURUSD | 2026 | base | 5 | -0.74% | 0.1455 | 0.92% | 0 |
| EURUSD | 2026 | stress | 5 | -0.86% | 0.113 | 1.03% | 0 |
| GBPUSD | 2025 | base | 1 | +0.42% | n/a | 0.83% | 0 |
| GBPUSD | 2025 | stress | 1 | +0.28% | n/a | 0.90% | 0 |
| GBPUSD | 2026 | base | 3 | -0.63% | 0.0 | 1.06% | 0 |
| GBPUSD | 2026 | stress | 3 | -0.70% | 0.0 | 1.12% | 0 |
| USDJPY | 2025 | base | 3 | -0.14% | 0.3777 | 0.47% | 0 |
| USDJPY | 2025 | stress | 3 | -0.18% | 0.2239 | 0.49% | 0 |
| USDJPY | 2026 | base | 2 | +0.12% | n/a | 0.69% | 0 |
| USDJPY | 2026 | stress | 2 | -0.02% | 0.761 | 0.71% | 0 |
| USDCHF | 2025 | base | 2 | +0.48% | 3.1113 | 0.59% | 0 |
| USDCHF | 2025 | stress | 2 | -0.01% | 0.9586 | 0.81% | 0 |
| USDCHF | 2026 | base | 4 | -0.41% | 0.2794 | 0.99% | 0 |
| USDCHF | 2026 | stress | 4 | -0.79% | 0.1494 | 1.31% | 0 |
| USDCAD (shorter coverage) | 2025 | base | 0 | +0.00% | n/a | 0.00% | 0 |
| USDCAD (shorter coverage) | 2025 | stress | 0 | +0.00% | n/a | 0.00% | 0 |
| USDCAD (shorter coverage) | 2026 | base | 2 | +0.27% | n/a | 0.74% | 0 |
| USDCAD (shorter coverage) | 2026 | stress | 2 | +0.09% | 6.2775 | 0.81% | 0 |
| AUDUSD | 2025 | base | 5 | -0.47% | 0.2722 | 0.74% | 0 |
| AUDUSD | 2025 | stress | 5 | -0.63% | 0.1538 | 0.84% | 0 |
| AUDUSD | 2026 | base | 1 | +0.76% | n/a | 0.83% | 0 |
| AUDUSD | 2026 | stress | 1 | +0.39% | n/a | 0.91% | 0 |
| NZDUSD | 2025 | base | 4 | -0.36% | 0.2996 | 0.74% | 0 |
| NZDUSD | 2025 | stress | 4 | -0.57% | 0.0 | 0.78% | 0 |
| NZDUSD | 2026 | base | 2 | +0.35% | n/a | 0.88% | 0 |
| NZDUSD | 2026 | stress | 2 | +0.09% | n/a | 0.95% | 0 |
Costs, execution and qualification criteria
Base: Spread 1.0 pip for majors; 1.5 EURGBP/EURJPY; 2.0 GBPJPY/AUDNZD. USD7/100k round-trip commission; 0.1 pip adverse market/stop slippage per fill. Financing=max(negative current native swap,0.2pip/night), no positive credit, native triple-swap day.
Stress: Double base spread; 0.3 pip adverse slippage/fill; same commission; double max(negative current native swap,0.5pip/night).
Research candidate only if a pair has >=30 trades in EACH calendar subperiod, positive net returns and PF >=1.10 in EACH subperiod under BOTH cost scenarios, and combined maximum drawdown <=15% under BOTH scenarios. Not a statistical profitability proof. All pairs and failures are retained.
Profit factor is the sum of positive net trade results divided by the absolute sum of negative results. Drawdown includes adverse M15 intrabar marks. The end of each test window liquidates open positions, so separate subperiod returns do not add exactly to the continuous-window return.
- Bar execution, not a real-tick MT5 Strategy Tester run. Same-bar ambiguity is treated adversely and counted.
- Current swap snapshot is an explicit stress assumption, not historical funding.
- One isolated USD10,000 account per strategy/pair, leverage ceiling30, broker minimum lots and steps. Results cannot be added into one portfolio.
- 2026 is a later evaluation slice, not untouched independent out-of-sample evidence; no parameter optimization was performed.
- Retrospective scheduled MT5 calendar may contain revised release times. UTC export normalized to NY-close broker clock against BLS releases.
- General discretionary event avoidance is fixed as high-impact events for either currency +/-30min. IDs1/17 next60min; ID20 next120min. ID13 UK bank holidays excluded. Subjective trend quality, unscheduled events and all-country holiday/session quality are not fully quantifiable; these are documented mechanical variants.
- Sparse broker histories are reported with shorter effective coverage and are ineligible for a candidate label.
- Native indicator parity: ATR, SMA, RSI, MACD, bands, stochastic, WPR, CCI and Ichimoku matched native buffers on EURUSD H4 within rounding tolerance; Wilder ADX matched the MetaQuotes ADXW example. EMA200 seed residual at 1,000 bars was 0.000000715, falling below 0.0000000001 after 2,000 bars.
- Built-in iSAR differs from the published MetaQuotes example on reversal bars. ID9 therefore uses actual built-in iSAR buffers exported by MT5, joined by timestamp, not the approximate Python SAR. Native GBPUSD/USDJPY SAR history needs 300 warm-up bars from January 2025, so those rows start later and cannot pass the full-period screen.
- 37 automated checks passed: execution gaps, short ask prices, ambiguous stop/target candles, partial commissions, pending expiry, time zones, rule regression cases and monthly portfolio no-lookahead/cash costs.
Interpretation: these are mechanical bar-model tests, not verified real-tick or live performance. Price rules were held fixed; subjective market-quality exclusions remain outside the mechanical model. Strategy adaptation requires a new test.
Download all test metrics and assumptions (JSON) · Download simulated trade logs and reproducible research code · Broker commission and swap documentation
Execution conventions
- Bar [0] is forming; [1] is the most recently completed bar. Unless explicitly stated otherwise, indicators use Close with zero plot shift and signals use completed bars. EMA is exponential, SMA is arithmetic and MT5 ATR is its native true-range average. Use at least 300 completed warm-up bars; a longer rule-specific requirement takes priority.
- A close-based signal is executed at the first available quote after the close, never retrospectively at the signal close. Buy at ask, sell at bid; close longs at bid and shorts at ask. A standing stop or target can fill within a bar. A gap through a stop fills at the first executable price, which can be worse than the stop.
- R means the initial entry-to-protective-stop distance, fixed at entry. Convert that distance into account-currency loss using the symbol tick size and loss-side tick value. Lots = cash risk / loss per lot, rounded down to the broker volume step. Round prices to the trade tick and recheck risk plus minimum stop/freeze distances before submitting. Budget commission and slippage separately; skip if minimum size exceeds the risk limit.
- Use one position per symbol and no averaging down. A trailing stop only tightens after a completed bar and becomes active on the next quote. The entry bar is holding bar one; a time exit executes on the quote after the specified holding bar closes. When a hard stop and a close-based exit compete, the stop already active takes precedence. With OHLC-only data, assume stop before target if both can occur in one bar; tick data is needed to resolve the order.
- The article defines the price rule. Any discretionary news exclusion changes the tested variant and must be recorded in advance. Map broker timestamps to the named London/New York time zone using historical daylight-saving offsets; do not assume a fixed UTC offset. Include spread, commission, slippage, overnight financing and triple-swap days in a profitability test.
Adapt and test your version
- Treat these inputs as a reproducible starting specification. Choose a currency pair, session and holding period that match the time you can monitor the market, then record any changes to indicator periods, thresholds, stop distance or exits as a new version.
- Change one hypothesis at a time. Reserve a later period and additional pairs for evaluation before looking at their results. Include your account’s actual trading and financing costs, compare small parameter changes, and forward-test on demo. A selected profitable window does not validate the strategy or its modified version.
Reproduce the chart in MT5
- Open EURUSD on D1 (monthly rebalance). Add the indicators listed above through Insert → Indicators; use Close and zero shift unless a different setting is specified. The Data Window displays exact values for the selected completed candle.
- Compare the signal candle with the required earlier bars before moving forward. Use the crosshair to read prices and times. For custom channels, session levels or Supertrend, reproduce the formula in this guide and check the calculation before relying on an external indicator.
- Draw entry, initial SL and target only after a candle has satisfied every condition. Label planned levels as plans; they do not demonstrate a historical fill. The featured chart is genuine historical MT5 context and is not a trade-performance report.
Sources
- Time Series Momentum — Moskowitz, Ooi and Pedersen (2012) — The paper studies time-series momentum in 58 liquid futures, including currencies, over 1–12 month horizons; it does not validate this retail-FX rule set.
- MT5 Help: Average True Range — Indicator/platform definition; not strategy performance.
