Idea in brief
A regular moving average crossover answers "yes" or "no": the fast average is above the slow one, so go long with full size. Rob Carver, who once headed a unit at Man AHL, uses the same difference between two averages as a measure of trend strength. The further the fast EMA has moved from the slow one relative to the market's normal volatility, the larger the position. The number is converted into a forecast: 0 means no position, ±10 the average position, ±20 the maximum.
Carver does not trust a single speed pair. The author trades six crossover variations, from fast trends to slow ones, and takes a weighted average of their forecasts. The position is recalculated once a day. There is no stop-loss: when the trend weakens, the averages converge, the forecast moves toward zero, and the position is closed gradually.
Why it might work
Carver considers trend following in futures a risk premium that anyone can earn, not a secret inefficiency. The author sees the advantage in two things. The first is diversification: in Carver's book, a simple trend system on 100 markets instead of one gives a 4–5 times better result with the same signal. The second is the continuous position, which, according to Carver, gives a smoother risk profile.
Several speeds are needed because trends come in different lengths, and the best pair cannot be guessed in advance. Averaging avoids having to make that choice. The author points out an important consequence: permutations do not require additional capital. However many variations there are, the output is one number and one position per instrument. Capital is needed for the number of instruments.
A forecast expressed as a number also serves as a stop. If price turns against the position, the fast average approaches the slow one, and the position shrinks before the trend has fully broken. The exit stretches over several days, just like the entry.
In the author's view, it is almost impossible to verify that slow trend has stopped working. Carver's estimate of the half-life of such an edge is one to two decades, and the degradation is lost in statistical noise.
Rules
Forecast from a single pair
// daily bars, calculated once a day after the close
Fast = 16 // Finetiq: the author did not name the lengths
Slow = 4 * Fast // Finetiq: 1:4 ratio, starting value
Raw = EMA(Close, Fast) - EMA(Close, Slow) // author: momentum means crossovers of exponential averages
// Finetiq: normalization so the number is comparable across markets and years
Sigma = StdDev(Close - Close[1], 25) // volatility of daily changes in price points
F0 = Raw / Sigma
// author: forecasts are scaled to an average absolute value of 10 and capped at ±20
Scalar = 10 / Average(|F0|) // Finetiq: average over past bars only (expanding window)
F = max(-20, min(+20, F0 * Scalar))
Six speeds in one forecast
// author: six crossover variations from fast trends to slow ones, weighted average
Pairs = (2,8) (4,16) (8,32) (16,64) (32,128) (64,256) // Finetiq: starting set
F_i = forecast for pair i, each pair has its own Scalar
Combined = (F_1 + F_2 + F_3 + F_4 + F_5 + F_6) / 6 // Finetiq: equal weights
// averaging similar forecasts pushes the average |Combined| below 10
Combined = Combined * K // Finetiq: K brings the average |Combined| back to 10 on past history
Combined = max(-20, min(+20, Combined)) // author: cap ±20
Position
// author: +10 is the average position, +20 is double, the position is proportional to the forecast
AvgPos = Equity * 0.5% / (ATR(25) * PointValue) // Finetiq
Target = round(Combined / 10 * AvgPos)
IF |Target - Position| >= max(1, 0.1 * AvgPos) // Finetiq: no-trade zone
trade the difference AT NEXT BAR OPEN
// no stop-loss (author). There is no position when Target rounds to zero
Variant B. Discrete trading on the same forecast
The author says the forecast can also be traded in a binary way: by its sign or only after a 5–10 threshold.
IF Position <= 0 AND Combined >= +10 BUY AvgPos AT NEXT BAR OPEN // author: threshold 5 or 10
IF Position >= 0 AND Combined <= -10 SELL SHORT AvgPos AT NEXT BAR OPEN
// Finetiq: from a short, BUY is a reversal: the short is closed and a long of AvgPos is opened.
// SELL SHORT from a long works the same way. Where an opposite order only closes the position, double the order size
IF Position > 0 AND Combined <= 0 EXIT AT NEXT BAR OPEN // Finetiq
IF Position < 0 AND Combined >= 0 EXIT AT NEXT BAR OPEN // Finetiq
// a threshold of 0 with a single pair gives a regular moving average crossover with reversal
Parameters
| Parameter | Value | Source |
|---|---|---|
| Timeframe | daily bars, recalculated once a day | author |
| Average type | exponential | author |
| Number of speed pairs | 6, from fast to slow | author |
| Pair lengths | 2/8, 4/16, 8/32, 16/64, 32/128, 64/256 | Finetiq |
| Normalization | standard deviation of daily changes over 25 days | Finetiq |
| Average absolute forecast | 10 | author |
| Forecast cap | ±20 | author |
| Pair weights | equal | Finetiq |
| Stop-loss | none | author |
| Average position | 0.5% of capital per ATR(25) | Finetiq |
| No-trade zone | 10% of the average position, minimum 1 contract | Finetiq |
| B: entry threshold | sign, +5 or +10 | author |
| B: exit | forecast back to zero | Finetiq |
What to test
- Continuous versus binary. A single 16/64 pair: continuous position versus full size by the sign of the difference. Look at return per unit of risk, the worst month and turnover.
- One pair versus six. Does averaging smooth the curve or only dilute the signal. Compare each pair separately with the average forecast on the same markets.
- Neighborhood. Fast to slow ratio 1:2, 1:4, 1:8; all lengths ×0.5 and ×2; normalization window 25 versus 60 days. The result should not change sharply between neighboring values.
- Lookahead in Scalar. Scalar over the whole history versus an expanding window. The first version knows the future distribution of the forecast and inflates the test.
- Costs by speed. Fast pairs (2/8, 4/16) change the position often. On each market, calculate the pair's result after commission and spread, and drop the pairs that do not cover their costs.
- Execution delay. Signal at the close and execution at the next day's open versus execution one day later. The author says a one-day delay is not a problem for a daily system like Carver's. Check this on your markets.
- Your own account size. A test with rounding to whole contracts at your capital. The author also says that on a small account small forecast changes do not change the position at all.
Platform notes
TradingView (Pine Script)
- The six pairs use eight distinct lengths, from 2 to 256, so eight
ta.emacalls are enough: neighboring pairs share lengths. Warm-up: the slowest EMA 256 needs 3–4 lengths of history, that is about four years of daily bars before the first trade. History is limited by the subscription plan. - Accumulate the expanding average of |F0| for Scalar in
varvariables (sum and bar count) after the warm-up. Functions with a fixed window over the whole history do not fit here. - Adding via
strategy.entryis limited bypyramiding, and by default no additional entries are allowed. Sendstrategy.orderfor the difference between the target position andstrategy.position_size, and round the size yourself. - Calculate the standard deviation of
close - close[1], not of price.
MultiCharts and TradeStation (EasyLanguage)
- EMA:
XAverage(Close, 16). For the 64/256 pair, load history several years before the start of the test, otherwise the first trades will run on averages that have not settled yet. - Normalization:
StdDev(Close - Close[1], 25). This is the population deviation, as on the other platforms. - Adding is enabled in the strategy properties, and partial reduction is
Sell N contracts total next bar at market.Sell Shortwith an open long reverses the whole position at once. - On a back-adjusted continuous future, do the normalization in points, as in the rules. Dividing by price breaks on series that have dropped toward zero or below it.
MetaTrader 5 (MQL5)
iMA(..., MODE_EMA, ...)requires a separate handle for each length, eight handles per symbol. Check the first values against the formula: EMA initialization differs between platforms.iStdDevcalculates the deviation of price from a moving average, not the spread of daily changes. For the normalization in the rules, calculate the standard deviation of changes yourself.- Netting and hedging accounts behave differently with partial reductions and reversals. Round the volume to
SYMBOL_VOLUME_STEP; at the minimum lot the continuous position turns into a binary one. - A broker's daily bars with Sunday candles change both the EMAs and the volatility. Before testing, compare the daily series with TradingView.
Where the idea can break
- In the interview the author gave the framework: EMA crossovers, six speeds, the ±10 and ±20 scale, no stop. The lengths, normalization, weights and position size were set by us. The author publishes the full formulas in books and open-source code, and we have not checked them against the interview.
- The author's result was obtained on 200+ futures together with a dozen other rules. A single crossover on a single market gives a much noisier picture, and the author directly links most of the gain to diversification.
- Slow trend can fail to make money for years, and statistically this cannot be told apart from a breakdown. Be prepared for long flat periods.
- Small accounts: rounding and the no-trade zone eat the continuity, and fast pairs eat costs.
- Volatility normalization increases the forecast after calm periods, right before volatility spikes.
- The forecast is recalculated at the close. Within the day the position is unprotected, and a gap against a large position is taken in full.