← All ideas
#073NewPosition sizingPosition

Forecast-scaled position sizing with a volatility floor and a notional cap

Rob Carver converts the signal of any rule into a forecast from −20 to +20 and multiplies the risk-based average position by forecast / 10. Instruments that are too quiet are not traded, and position notional has a hard cap.

The Algorithmic Advantage · Rob Carver · Watch video

Markets

Futures, Indices, Commodities, Forex, Bonds

Timeframe

D1

Data

OHLC

Rules

Partly formalised

Difficulty

Medium

Status

Untested

Some rules were added by us and are marked in the text.

TradingView has pitfalls
EasyLanguage has pitfalls
MetaTrader 5 has pitfalls

Idea in brief

This is not a signal but a position sizing block. It fits any rule that outputs a signed number: the moving average crossover from ma-cross-continuous-forecast, the price position in a range from range-position-breakout, or your own indicator.

Rob Carver, who once headed a unit at Man AHL, converts the signal of each rule into a forecast. 0 means no opinion, ±10 the average position, ±20 the maximum. Carver combines the forecasts of several rules into one number per instrument with a weighted average. The position equals the average position multiplied by forecast / 10. The average position is based on risk and is calculated the same way for all instruments.

Risk-based sizing has a weak spot: the quieter the instrument, the more contracts. So the author uses two limiters. A volatility floor: below it the instrument is not traded. A hard size cap: position notional does not exceed a set share of capital, even if volatility has fallen between reviews.

Why it might work

Risk-based sizing equalizes the contribution of instruments. Without it, gold and two-year bonds in one portfolio live on different scales, and the most volatile market determines the result. The forecast adds a second axis: a strong signal gets more risk, a weak one less. According to the author, this provides a natural stop. When price moves against the position, the forecast declines, and the position is reduced gradually, just as it was built. Carver explains the ±20 cap as a limit on the risk of a single instrument.

The author names the weak spot. An instrument that looks safe because of low volatility gets a huge notional position. The author's example: with a notional of 100% of capital, a 10% drop in the instrument costs 10% of the account. At five times capital, that is already half the account. The floor screens out such instruments in advance. The cap provides insurance between reviews of the instrument list, which the author runs once every few months: if volatility has fallen in the meantime, the position and leverage grow on their own.

The author gets the benefit of this block on a portfolio of about 200 futures. On a single instrument the forecast, floor and cap work the same way, but their effect is harder to see.

Rules

Forecast (author, normalization Finetiq)

// daily bars, calculated once a day after the close
// any rule i outputs a signed raw number RawF_i
Scalar_i = 10 / Average(|RawF_i|)                  // author: average |forecast| = 10; Finetiq: average over past bars only
F_i      = max(-20, min(+20, RawF_i * Scalar_i))   // author: cap ±20

F = Σ w_i * F_i                                    // author: weighted average; Finetiq: equal weights, Σ w_i = 1
F = F * K                                          // Finetiq: K brings the average |F| back to 10 over past history
F = max(-20, min(+20, F))

Average and target position

// author: the same risk calculation for all instruments, the budget is split top-down by sector
RiskPerInstr = 0.5%                                // Finetiq: share of capital per one daily ATR(25) for a single instrument
// this is not the author's average instrument weight of about 0.5%: that is a share in a portfolio of ~200 futures,
// the numbers match by chance; in a portfolio, split the total risk budget by weights
AvgPos = Equity * RiskPerInstr / (ATR(25) * PointValue)   // Finetiq: as in the Carver cards of this base
Target = F / 10 * AvgPos                           // author: +10 average position, +20 double

IF AvgPos < 4                                      // author: fewer than 4 contracts, no continuity
    // Finetiq: discrete mode on the same forecast
    Target = sign(F) * max(1, round(AvgPos)) IF |F| >= 10, otherwise 0
// Finetiq: discrete mode is applied before the floor and the cap, so they can zero it out or cut it too

Volatility floor (author, threshold Finetiq)

// author: the instrument list is reviewed once every few months
Review = every 63 trading days                     // Finetiq: a quarter
VolPct = Average(ATR(25) / Close, 63)              // Finetiq: on the price of the current contract, not the continuous series

IF VolPct < 0.2% THEN Tradable = FALSE             // author: do not trade below the minimum; Finetiq: threshold 0.2% per day
IF NOT Tradable THEN Target = 0
// author: risk can be moved into a correlated and more volatile instrument,
//        example: US two-year bonds → 5- or 10-year
// author: liquidity and cost limits belong here too; Finetiq: set their thresholds for your own account

Notional cap (author, multiplier Finetiq)

Notional    = |Target| * Close * PointValue
MaxNotional = 1.0 * Equity                         // author: "not five times capital"; Finetiq: 1.0
IF Notional > MaxNotional
    Target = sign(Target) * floor(MaxNotional / (Close * PointValue))
// author: the cap kicks in between reviews, when volatility has fallen and the position has grown
// author: such an instrument is a candidate for removal at the review

Rounding and execution

// order: target position and discrete mode → floor → cap → rounding
Target = round(Target)

IF |Target - Position| >= max(1, 0.1 * AvgPos)     // Finetiq: no-trade zone
    trade the difference AT NEXT BAR OPEN
// the author executes at the next day's close in the backtest; compare both variants

Example

An account of $500,000. Two rules from neighboring cards run on the Micro E-mini S&P 500 futures (MES, $5 per point). Prices and ATR are hypothetical.

F_ma    = +12                      // ma-cross-continuous-forecast: six EMA speeds
F_range = +18                      // range-position-breakout: 80-day window
F       = 0.5 * 12 + 0.5 * 18      // = +15, equal weights (Finetiq), K = 1 for simplicity

Close = 5000, ATR(25) = 62 points
VolPct = 62 / 5000 = 1.24%                     // above the 0.2% floor
AvgPos = 500000 * 0.5% / (62 * 5) = 8.06       // more than 4, continuous mode
Target = 15 / 10 * 8.06 = 12.1 → 12 contracts
Notional = 12 * 5000 * 5 = 300000              // 0.6 of capital, below the 1.0 cap

The second instrument is quiet: US two-year bond futures (ZT, $2,000 per point), hypothetically Close = 104, ATR(25) = 0.12 points.

VolPct = 0.12 / 104 = 0.115%                   // below the 0.2% floor: Tradable = FALSE

// what would happen without the floor, with F = +20
AvgPos   = 500000 * 0.5% / (0.12 * 2000) = 10.4
Target   = 20 / 10 * 10.4 = 20.8 → 21 contracts
Notional = 21 * 104 * 2000 = 4368000           // 8.7 times capital
// the 1.0 cap would cut the position to floor(500000 / 208000) = 2 contracts,
// and 2 contracts is fewer than 4: for this account the instrument is effectively discrete

Parameters

Parameter Value Source
Forecast scale average absolute value 10, cap ±20 author
Combining rules weighted average author
Rule weights equal Finetiq
Position forecast / 10 × average position author
Average position risk-based, the same for all instruments author
Risk per instrument 0.5% of capital per ATR(25), not the author's 0.5% weight Finetiq
Volatility floor yes, below it the instrument is not traded author
Floor threshold ATR(25) / price below 0.2% per day Finetiq
Notional cap yes, example "not five times capital" author
Cap multiplier 1.0 of capital per instrument Finetiq
List review once every few months author
Review period 63 trading days Finetiq
Minimum for continuous mode 4 contracts author
Discrete mode by forecast sign when |F| is 10 or more Finetiq
No-trade zone 10% of the average position, minimum 1 contract Finetiq
Backtest execution next day's close author

What to test

  1. The block versus fixed size. One rule, for example an EMA 16/64 crossover, in three modes: always 1 contract, risk-based size without a forecast, and the full block. Compare return per unit of risk, the worst month and the number of trades.
  2. Volatility floor. 10-20 futures, including bonds and short-term interest rates. With and without the floor, thresholds of 0.1%, 0.2%, 0.4%. The main metric is the portfolio's worst day as a percentage of capital, not the annual return.
  3. Notional cap. Multiplier of 0.5, 1, 2 and no cap. Find the periods when the cap was triggered and look at what happened to the instrument afterward.
  4. Rounding on your account. Fractional contracts versus whole contracts at your capital. Count the share of instruments with an average position below 4 contracts: for them, the smoothness seen in the test is not available on a real account.
  5. Delay. Execution at the next day's open, at the next day's close, after 5 and after 10 days. The author estimates two weeks of delay at about 10% of performance. If your loss is much larger, your rules are faster than the author's.
  6. No-trade zone. 0%, 10% and 25% of the average position. Number of trades per year versus the result after commissions and spread.
  7. Look-ahead. The average |forecast| for Scalar and K over the full history versus an expanding window. The first version knows the future distribution and inflates the test.

Platform notes

TradingView (Pine Script)

  • Point value is syminfo.pointvalue, capital is strategy.equity. Round the quantity yourself (math.round), otherwise the test will trade fractional contracts.
  • Change the position by the difference: strategy.order for target - strategy.position_size. With strategy.entry, adding is limited by pyramiding, and by default there are no additional entries.
  • A strategy trades one symbol. A shared portfolio risk budget and replacement of a quiet instrument cannot be built in Pine: test each instrument separately with its share of capital.
  • ta.atr uses Wilder smoothing, while the built-in ATR in EasyLanguage and MQL5 is a simple average. The average position will match across platforms only if ATR is calculated the same way.

MultiCharts and TradeStation (EasyLanguage)

  • Point value is BigPointValue. Partial reduction: Sell N contracts total next bar at market, and adding to a position is enabled in the strategy properties.
  • Sell Short with an open long reverses the entire position at once. When the forecast crosses zero, do it in two steps: reduce the long, then go short.
  • On a continuous futures series back-adjusted by subtraction, price can drift to zero and below. Calculate the floor and cap on the price of the current contract (a separate unadjusted data stream), while ATR in points can be taken from the continuous series.
  • Portfolio risk budget and replacement of quiet instruments: Portfolio Trader in MultiCharts or Portfolio Maestro in TradeStation.

MetaTrader 5 (MQL5)

  • Volume from risk: SYMBOL_TRADE_TICK_VALUE and SYMBOL_TRADE_TICK_SIZE, rounded to SYMBOL_VOLUME_STEP, no lower than SYMBOL_VOLUME_MIN. At the minimum lot, continuous mode becomes discrete.
  • Calculate notional from the symbol's contract size (SYMBOL_TRADE_CONTRACT_SIZE) and price. Broker leverage is not a risk limiter: margin will allow a position far larger than the cap.
  • A multi-symbol EA can manage the whole list and replace instruments, but the broker must offer all the symbols. CFD brokers often have no bond futures.
  • Daily bars are built on the broker's server time, and short Sunday bars understate ATR. Positions are held for weeks, so include swap in the test.

Where the idea can break

  • The author does not name the floor threshold, cap multiplier, risk per instrument, rule weights or review period. The numbers in this card are our starting values.
  • The author describes the benefit of the block on a portfolio of about 200 futures. On one or two instruments, the floor may simply switch trading off, and the cap may reduce the position to a single contract.
  • Small accounts. With an average position below four contracts, the forecast changes the position in steps, and the advantages of continuous trading disappear. On expensive contracts, the notional cap cuts the position to one or two contracts.
  • Risk-based size grows after calm periods. A volatility spike catches the system with a large position, and the floor and cap protect against this only partially.
  • The cap does not protect against a gap. With a notional of 100% of capital, a 10% drop still costs 10% of the account, as in the author's example.
  • Delay is safe only for slow rules. The two-week figure refers to the author's system, and a fast forecast can lose noticeably more from a one-day lag.
  • ATR as a percentage of price is distorted on a continuous series. A floor calculated on the continuous series will switch off or switch on the wrong instruments.

Sources

  • 033 - Rob Carver - The Comprehensive Guide to a Diversified Futures Strategy

    The Algorithmic Advantage · Rob Carver · 2025-02-19

    • 39:43A weighted average of all rules into one number
    • 41:47Small account: the forecast changes, the number of contracts does not
    • 44:40Scale: +10 is the average position
    • 45:17A cap of 20 limits the risk of one instrument
    • 45:50Forecast +20: the position doubles
    • 47:49A natural stop instead of a stop-loss
    • 49:50Forecast as a measure of signal strength, no more than two average positions
    • 1:01:34At least four contracts per instrument
    • 1:03:43Top-down risk: seven sectors at 14% each
    • 1:04:50Average instrument weight about 0.5%
    • 1:05:27Maximum position size in an instrument
    • 1:12:18The problem: a quiet instrument inflates the position
    • 1:12:39Volatility floor, liquidity and cost limits
    • 1:13:33Example: US two-year bonds are replaced with 5- and 10-year bonds
    • 1:14:03Hard cap: not five times capital in notional
    • 1:14:53Volatility fell between reviews, leverage rose
    • 1:26:24In the backtest, execution at the next day's close
    • 1:27:10Two weeks of delay: about 10% of performance

Author's claims

These figures and statements are the author's. We have not verified them.

  • The author trades about 200 futures, and the average instrument weight in the portfolio is about 0.5%. Risk is allocated top-down: for example, seven sectors at roughly 14% each.
  • For continuous trading, the author needs at least four contracts per instrument. With one contract, trading is essentially discrete.
  • The author's example: a notional of five times capital in a quiet instrument is unacceptable. Even with a notional of 100% of capital, a 10% drop in the instrument costs 10% of capital.
  • In the backtest, the author executes signals at the next day's close. Over 20-30 years of history, a one-day lag barely changes the result of the author's slow system, and two weeks of delay cost about 10% of performance by the author's estimate.

Related ideas

Updated: 2026-09-11