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
- 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.
- 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.
- 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.
- 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.
- 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.
- No-trade zone. 0%, 10% and 25% of the average position. Number of trades per year versus the result after commissions and spread.
- 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 isstrategy.equity. Round the quantity yourself (math.round), otherwise the test will trade fractional contracts. - Change the position by the difference:
strategy.orderfortarget - strategy.position_size. Withstrategy.entry, adding is limited bypyramiding, 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.atruses 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 Shortwith 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_VALUEandSYMBOL_TRADE_TICK_SIZE, rounded toSYMBOL_VOLUME_STEP, no lower thanSYMBOL_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.