Why position sizing is the most important parameter
A mediocre strategy with good sizing survives. A brilliant strategy with bad sizing gets liquidated. Ed Seykota, Van Tharp, Ralph Vince — they all agree: sizing matters more than the signal.
Classic approaches
1. Fixed fractional (risk %)
risk_usd = account_equity * risk_pct
position_size = risk_usd / (entry - stop)
With 1% risk and a 1000 USDC account with a 20 USDC stop distance: - risk_usd = 10 USDC - position = 10 / 20 = 0.5 units
No matter how far the stop is — a stop hit always costs exactly 1% of the account. This is by far the most common method.
2. ATR-based sizing (volatility position sizing)
risk_usd = account_equity * risk_pct
position_size = risk_usd / (ATR * stop_mult)
The stop distance is not chosen as a fixed value but derived from current volatility (ATR). That way every trade carries the same effective risk — regardless of whether the market is currently quiet or turbulent.
3. Kelly criterion
f* = edge / odds = (W*p - L*(1-p)) / L
Mathematically optimal, but only sensible with stable expected values. In practice usually half or quarter Kelly, because full Kelly draws down too brutally under parameter estimation errors.
Rules of thumb
- 0.5 – 1% per trade: conservative, sustainable long-term.
- 1 – 2% per trade: aggressive, but still survivable.
- > 2% per trade: the classic route to insolvency. After 10 consecutive losses (statistically not unusual) you are 20%+ in drawdown.
How Botty implements it
execution/config.py — the live values (updated with every registry sync):
| Parameter | Live value |
|---|---|
POSITION_SIZE_PCT |
1.0 |
| Position cap | 100% der Equity (MAX_POSITION_PCT = 1.0, MAX_POSITION_USD = 12.0) |
LEVERAGE |
3x |
| Vol-target sizing | advisory mode (off) |
| Equity throttle (Turtle brake) | active: −30% size per −10% drawdown from the equity high |
MAX_POSITION_PCT (percentage cap) replaces the absolute MAX_POSITION_USD cap once set — an absolute cap chokes compounding, because the exposure ratio falls toward zero as capital grows.
The actual position size is derived by execution/trader.py from this percentage, the leverage, and the ATR stop. Every position is therefore both percentage-capped and volatility-adaptive.
Common mistakes
- Sizing up after losses (martingale) → quick death.
- Sizing down after wins (anti-martingale misinterpreted) → gives away compounding.
- All positions the same size without accounting for stop distance → some trades carry 5x more risk than others.