Idea in brief
There are two ways to manage position size. The first: calculate the size at entry and never touch it again. The second: regularly adjust the position to current volatility, reducing it when the market gets wild and increasing it when the market calms down. The second way is called vol-targeting or volatility control.
Moritz Seibert and Moritz Heiden of Takahé Capital trade the first way. ATR is measured once, at the moment the trade is opened, and the size is held until the exit. The equity used for the calculation (the trade level) is taken not from the current account but from a notional value. It is revised rarely and only on realized profit; open profit is not included in the calculation.
The card defines this block for any system and a control variant with daily adjustment, so the authors' claims can be tested on your own trades.
Why it might work
The authors' arguments:
- Fewer trades. Every adjustment pays commission and spread, while a fixed size does not pay them at all.
- Volatility is a poor measure of risk. It is symmetric and counts a move in your favor and a move against you the same way.
- Adjustment breaks the system's logic. A short in a falling market usually coincides with rising volatility, and the rule cuts the winning position. The authors' example: oil in 2020.
- Adjustment cuts off the right tail. The curve becomes smoother, but a trend system lives on rare huge trades, and it is exactly their size that shrinks.
- Their data does not support the thesis that "volatility rises near reversals". Bonds fell smoothly for years. In that situation volatility control would have been increasing a position that had started to lose.
About their own approach the authors say honestly: a single measurement can fall at a moment of unusually low or high volatility, and this can be either a plus or a minus. The research they refer to is not disclosed in the interview. There are no figures from it.
The authors call a trade level based on closed trades conservative: leverage does not grow automatically with every wave of open profit.
Rules
Size block (authors, Finetiq numbers)
// calculated only at the moment of the entry signal
// trade level: notional equity for the size calculation (authors)
// held constant and revised on realized profit when P&L has changed noticeably
ClosedEquity = InitialCapital + sum of closed trades // open profit not included (authors)
IF first trading day of the month // Finetiq: check once a month
AND |ClosedEquity / TradeLevel - 1| >= 10% // Finetiq: threshold for a "noticeable" change
TradeLevel = ClosedEquity
ATRe = ATR(20) at the close of the signal bar // authors: recent average range; Finetiq: 20
RiskMoney = TradeLevel * 0.25% // authors: "a certain percentage"; Finetiq: 0.25%
StopDist = 3 * ATRe // authors: there is an initial stop; Finetiq: 3 ATR
Contracts = floor(RiskMoney / (StopDist * PointValue))
BUY Contracts AT NEXT BAR OPEN // or SELL SHORT
// after entry Contracts does not change until the exit (authors): neither when ATR rises nor when it falls
// the same risk for all markets and for both long and short (authors)
Control variant: daily vol-targeting (Finetiq)
// the same entry, the same exit, the same TradeLevel; only size management changes
Target(t) = floor(TradeLevel * 0.25% / (3 * ATR(20)[t] * PointValue))
IF |Target(t) - CurrentContracts| >= MAX(1, 20% * CurrentContracts) // Finetiq: dead band
bring the position to Target(t) AT NEXT BAR OPEN
tag the trade with the label "vol-adj"
Adjustment basket (the authors' method, Finetiq accounting)
// authors: add up all the adjustment trades separately, with commission and a spread of 0.5-1 tick
// Finetiq: each addition is closed at the nearest reduction or at the overall exit (LIFO)
AdjPnL = Σ over "vol-adj" trades: (close price of the part - open price of the part) * contracts * PointValue
- commission - (0.5 or 1 tick) * contracts * 2
// AdjPnL < 0: adjustment costs money (the authors' claim)
Applying it to the always-in-breakout card
// there size is already calculated at the moment of reversal: Units = Equity * 0.2% / (ATR20 * PointValue)
// the block changes two things:
Equity -> TradeLevel from closed trades, revised once a month on a change of 10% or more
ATR20 -> fixed on the reversal bar and not recalculated until the next reversal
// control variant: the same reversals, Units recalculated every day from ATR20[t]
Parameters
| Parameter | Value | Source |
|---|---|---|
| Volatility measurement | once at entry | author |
| Volatility measure | recent ATR | author |
| Equity for the calculation | trade level from closed trades | author |
| Trade level revision | when P&L has changed noticeably | author |
| Revision threshold | 10%, checked once a month | Finetiq |
| ATR period | 20 | Finetiq |
| Risk per trade | 0.25% of the trade level | Finetiq |
| Stop for the size calculation | 3 ATR | Finetiq |
| Long and short | the same risk budget | author |
| Control: recalculation frequency | every day | Finetiq |
| Control: dead band | 1 contract or 20% | Finetiq |
| Costs in the basket | 0.5-1 tick of spread plus commission | author |
What to test
- The main comparison. The same signals (for example,
always-in-breakoutorturtle-4w-2won 20-30 futures), size at entry versus daily vol-targeting. Look at return, maximum drawdown, average loss, average profit and the skew of the trade distribution. - Adjustment basket. Calculate AdjPnL at 0.5 and at 1 tick. This is a direct test of the authors' claim that adjustment by itself loses money.
- Right tail. The share of total profit that comes from the best 5% of trades, in both variants. If vol-targeting noticeably reduces it, it changes the very nature of the trend system, which is what the authors say.
- Frequency between the extremes. Recalculation every day, once a week, once a month, only when size changes by 50% or more. This shows where the difference disappears.
- Sensitivity of the single measurement. ATR period 10, 20, 50. Separately, trades opened right after a volatility spike: with a short ATR their size will be tiny for the whole trade.
- Equity for the calculation. Trade level with revision, closed equity on every trade, full equity including open profit. Compare drawdown behavior at the end of a long trend, when open profit gets given back.
- Account size. With 1-3 contracts per market, daily adjustment almost always rounds to zero changes. Run the comparison on the equity you will actually trade, not on millions.
Platform notes
TradingView (Pine Script)
- Closed equity:
strategy.initial_capital + strategy.netprofit.strategy.equityalready includes open profit and does not fit the trade level. - Calculate the size at entry on the signal bar and pass it to
strategy.entry(..., qty = n). Point value:syminfo.pointvalue. - The control variant requires adding and partial reduction:
pyramidinginstrategy()andstrategy.close(..., qty = x). Withoutpyramidingadditions will silently not fill, and the comparison will show two identical results. - There is no portfolio testing: a trade level for the whole portfolio cannot be calculated in Pine, only for one symbol (section 5 of the reference guide).
ta.atruses Wilder smoothing.
MultiCharts and TradeStation (EasyLanguage)
- The strategy's closed profit:
NetProfit, open profit:OpenPositionProfit. It is more convenient to set the initial capital as an input, so the trade level is calculated the same way in the backtest and in trading. - Point value is
BigPointValue.AvgTrueRangeis a simple average of TrueRange, not Wilder. - The size is fixed in a variable on the signal bar:
Buy Contracts_ contracts next bar at market. The control variant requires allowing multiple entries in the same direction in the strategy properties and reducing the position with named exits that specify the number of contracts. - A shared trade level across many markets is calculated in Portfolio Maestro or Portfolio Trader. On a single chart the strategy sees only its own profit.
MetaTrader 5 (MQL5)
AccountInfoDouble(ACCOUNT_BALANCE)is the balance without floating profit,ACCOUNT_EQUITYincludes it. The trade level needs the balance, but it is shared by all EAs on the account.- Lot size from risk:
SYMBOL_TRADE_TICK_VALUE,SYMBOL_TRADE_TICK_SIZE, rounding toSYMBOL_VOLUME_STEP. Store the fixed lot in a variable, and when the EA restarts take the volume of the open position. - On a netting account adjustment changes the volume of a single position, on a hedging account it creates separate positions. The adjustment basket is easier to track on a hedging account.
iATRis a simple average of TR. For CFDs every adjustment pays the spread, and a position held for 200 days also pays swap. For CFDs the costs in the basket will be higher than for the authors on exchange-traded futures.
Where the idea can break
- The authors' research is not published in the interview. All claims about the average loss and the adjustment basket are verbal so far.
- The authors trade long-term trend with an average trade of about 200 days. Over that time volatility changes a lot, and the difference between the two ways is noticeable. For a system with 3-10 day trades ATR barely has time to change, and the comparison may show nothing.
- The single ATR measurement can fall on a spike or a lull. If volatility rose several times over after a lull, the position's risk in money also rose several times over, and the block deliberately does not correct this.
- The trade level is conservative only on the way up. After a deep drawdown it stays high until the revision, and risk as a percentage of real equity becomes larger than planned.
- The authors did not name the risk percentage, ATR period, stop multiplier or trade level revision threshold. The values in the table are starting values and need testing.
- On a small account rounding to whole contracts matters more than the choice between the two ways. A fixed risk percentage can only be held approximately there.