DCA ladder
Long-only safety-order DCA on SOL/USD, ETH/USD and BTC/USD through Jupiter — three bots, one strategy. One cycle at a time: a base buy, a take-profit above the running cost basis, and a ladder of larger buys at widening discounts below entry.
Intent
The strategy is a bet on mean reversion within a cycle, not on direction. It buys a small base position, then commits progressively more capital as price falls away from that entry, which drags the average cost down faster than the price falls. The exit is a fixed percentage above whatever the average cost currently is, so a shallower bounce is needed to close a deep cycle than to close a shallow one. What it buys with that arithmetic is a high proportion of winning cycles. What it pays for it is an unbounded hold on the cycles that never bounce — there is no stop.
Model
Base order
A cycle opens on the first bar the strategy is flat, with a market buy of dollars sized off that bar's close. The price that matters afterwards is the price it actually filled at, — the whole ladder is anchored on the fill, not on the signal.
Safety ladder
Immediately after the base fills, the entire ladder is posted at once. The -th safety order sits at a cumulative deviation below entry, where each successive gap is times the last:
and its size grows geometrically too:
With the live values on dca-sol — , , , and — the whole ladder is:
| Order | Deviation | Price | Notional | Cumulative cost |
|---|---|---|---|---|
| base | — | P₀ | $1.20 | $1.20 |
| safety 1 | 3.00% | 0.9700 · P₀ | $1.20 | $2.40 |
| safety 2 | 7.20% | 0.9280 · P₀ | $1.80 | $4.20 |
| safety 3 | 13.08% | 0.8692 · P₀ | $2.70 | $6.90 |
The same ladder on ETH and BTC
dca-eth and dca-btc run identical dollar rungs and differ only in how far apart those rungs sit. and scale with each asset's realised volatility relative to SOL — measured on the same 1-minute closes, 0.845× for ETH and 0.644× for BTC — so a rung is reached about as often on each market rather than a BTC ladder sitting idle behind a SOL-sized deviation.
| Bot | Market | deviation_pct | Safety deviations | tp_pct |
|---|---|---|---|---|
| dca-sol | SOL/USD | 3.0 | −3.00% / −7.20% / −13.08% | 2.5 |
| dca-eth | ETH/USD | 2.5 | −2.50% / −6.00% / −10.90% | 2.1 |
| dca-btc | BTC/USD | 1.9 | −1.90% / −4.56% / −8.28% | 1.6 |
ETH/USD and BTC/USD are traded as their canonical Solana representations: whETH (Ether via Portal, the Wormhole bridge) and cbBTC (Coinbase Wrapped BTC). Both are claims on the underlying asset, so the reference price is the underlying's — Coinbase ETH-USD and BTC-USD minute candles — the same way SOL/USD prices a wrapped-SOL leg. A bridged claim carries bridge risk that its price feed does not show, and whETH carries more of it than cbBTC does. Said here rather than left to be inferred from a mint address.
Take-profit
After every buy fill — base or safety — the existing take-profit is cancelled and a new one posted for the whole position, at a fixed margin above the volume-weighted cost basis:
That re-anchoring is the whole mechanism. Assume every rung fills exactly at its limit price and ignore costs: after the full ladder the average cost sits at — 7.79% below the original entry — and with the take-profit sits at , 5.49% below it. Price never has to recover to where the cycle started for the cycle to close green.
Capital at risk
A cycle can commit at most
against the $10 allocated to each DCA bot, so the shipped ladder fits inside its allocation with room to spare. A ladder configured larger than its allocation is not resized — the loader warns and lets it run, and the cash on hand and the risk gate clip at order time instead. That is a deliberate choice: a silently shrunk ladder is a strategy you did not configure.
Signal rules
- Open. On any bar where no cycle is open, buy at market and mark the cycle open. There is no entry filter — no trend, no oscillator, no time of day. The cycle simply restarts.
- On a base fill. Post the take-profit, then post all safety limits at once.
- On a safety fill. Add to cost and quantity, cancel the outstanding take-profit, post a new one on the new cost basis. The remaining safety orders are untouched — the ladder is never re-anchored downward onto the new price.
- On a take-profit fill. Cancel every remaining safety order, reset to flat. The next bar opens a fresh cycle.
- One cycle at a time. While a cycle is open, bars produce no new orders at all.
Parameters
| Parameter | Live value | Meaning |
|---|---|---|
| capital_usd | 10 | Allocation for each of the three DCA bots. |
| base_usd | 1.2 | Base order size opening each cycle. |
| safety_usd | 1.2 | First safety order; later ones scale up. |
| max_safety | 3 | Ladder depth K. |
| deviation_pct | 3.0 / 2.5 / 1.9 | First safety order's deviation below entry (d), on SOL / ETH / BTC. |
| step_scale | 1.4 | Each further gap widens by this factor (σ). |
| volume_scale | 1.5 | Each further safety order grows by this factor (ν). |
| tp_pct | 2.5 / 2.1 / 1.6 | Take-profit above the volume-weighted cost basis (τ), on SOL / ETH / BTC. |
| max_order_pct | 72 | Order-size cap: 72% of $10 = $7.20. |
Risk behaviour
- No stop loss. Nothing in the strategy ever sells at a loss. The only sell it emits is the take-profit. A cycle that goes against it is held.
- Order cap $7.20. 72% of the allocation, sized against the largest order the strategy can emit — which is the take-profit at full ladder depth, $7.07, not the largest buy. Any order valued above the cap is rejected by the risk gate.
- Limits are emulated, not resting. Jupiter has no resting order book, so the runner holds each limit locally and converts it to a market order on the first bar whose low (buy) or high (sell) touches the price. Fills therefore happen at market, around the trigger, not at the limit price — a gap through a level fills worse than the level.
- Stale prices. A bar older than 90 seconds at receipt is never delivered, so the strategy emits nothing rather than acting on a stale price. A resting limit whose conversion is rejected for a transient reason — stale feed, pause, momentarily tied-up cash — keeps resting and converts on a later touch.
- Rejected base buy. The strategy marks the cycle open before the order is approved, so a gate rejection would wedge it flat forever. The runner resets the cycle flag on rejection and the next bar tries again.
- Daily loss floor. Equity below 95% of the day's opening equity pauses the bot. Resting limits sleep through a pause intact rather than being cancelled.
Failure modes
A trend that does not bounce. Past the deepest rung — 13.08% below entry on SOL, 10.90% on ETH, 8.28% on BTC — the ladder is exhausted and the strategy has nothing left to do. It holds the position — indefinitely, with no stop — and the take-profit only comes back into reach if price recovers to within tp_pct of the average cost. This is the dominant loss mode and it is structural, not a tuning problem. The scaling that keeps rung frequency comparable across the three markets also means the BTC bot is exhausted by a smaller move than the SOL bot is.
The win-rate illusion. Every closed cycle is a winner by construction, because the only exit is a profitable one. A DCA bot can print a 100% win rate while losing money on open inventory. That is why every win-rate figure on this site carries its definition, and why open positions are marked to market rather than quietly excluded.
The take-profit is the order the cap has to clear. The take-profit is a single sell for the entire position, so its notional grows with the ladder: about $1.23 after the base alone, $2.46 after one safety order, $4.31 after two, $7.07 after all three. The order cap applies to sells as well as buys, but an order the ledger confirms is shrinking the position now bypasses the size cap, alongside the pause and the daily-loss floor it already bypassed. An exit’s size is not a choice — it is whatever the ladder already holds — and refusing it for being large would leave the risk on the book. The $7.20 cap is still set from that $7.07 figure rather than from the largest rung, so the exit clears on its own size without leaning on that exemption.
Cost at this size. A $1.20 base order paying 10 bps in fees plus slippage is thin margin against a 2.5% target. The strategy clears its costs comfortably at the shipped parameters, but the margin is percentage-based and the costs are not — a venue with worse execution moves the break-even, and the desk reports cost as a share of capital for exactly this reason.