FIBO — Fibonacci grid bot (“Aftershock”)
FIBO lays a grid of buy and sell orders on Fibonacci retracement levels inside a price range you define. It automates the “Aftershock” (AS) trading strategy: working the correction wave that follows a growth phase — buys on the retracement levels, sells one level up. When several levels fill, the sells are re-placed around the average entry — part of the position exits at breakeven, part with profit; once the sells execute, that level’s play is complete. In a strong one-way trend the grid accumulates a position — that is what stop-loss rules are for.
Prerequisites: the bot lifecycle and the shared config blocks.
How it trades
- You define the range — bottom (
"0") and top ("1") — and intermediate Fibonacci levels (0.236,0.382,0.5,0.618,0.786), each as a channel with its ownbuyprice,sellprice and share of the deposit. - The bot places buy orders at channel levels below the current price. When a channel’s buy
fills, its sell order goes out at that channel’s
sellprice. - When several levels fill, the sells are placed around the average entry — in the terminal this looks like take-profits shifted to breakeven (knowledge-base example: levels 0.5 and 0.382 both fill → everything is offered at 0.5; one buy exits flat, the other with profit). Once the sells execute, the play is complete — per the AS methodology a worked level is not re-traded — the strategy terminates (FIBO has no auto-restart: restart/reuse exist only for Channel and Squeeze).
- Optional trailing delays entries: buys follow the falling price and execute on a configured reversal, catching knives closer to the bottom.
Minimal working config
Verified POST /v2/bots body — five channels (three active + the two required boundaries):
{
"type": "FIBO",
"settings": {
"type": "FIBO",
"symbol": { "base": "SOL", "quote": "USDT" },
"ticker": "SOLUSDT",
"name": "SOL Fibo Basic",
"exchange": "binance-futures",
"timeFrame": 900000,
"deposit": { "value": "300", "asset": "USDT", "strategy": "fixed", "allocate": "no_reserve" },
"positionSide": "LONG",
"trailing": false,
"strategy": "fixed",
"channels": [
{ "name": "1", "depositePercent": "0", "buy": "68.50", "sell": "69.50", "fiboPrice": "68.50" },
{ "name": "0.500", "depositePercent": "35", "buy": "66.50", "sell": "68.50", "fiboPrice": "66.50" },
{ "name": "0.382", "depositePercent": "30", "buy": "66.00", "sell": "68.00", "fiboPrice": "66.00" },
{ "name": "0.236", "depositePercent": "25", "buy": "65.00", "sell": "67.50", "fiboPrice": "65.00" },
{ "name": "0", "depositePercent": "10", "buy": "64.00", "sell": "66.50", "fiboPrice": "64.00" }
],
"mergeChannels": false,
"green": 2
}
}
Then POST /bots/{id}/runs — and watch the
botStatus and
orders channels.
Channel definition — FiboChannelDef
| Field | Type | Meaning |
|---|---|---|
name ✳ |
string | Level label: "0", "0.236", "0.382", "0.500", "0.618", "0.786", "1" |
depositePercent ✳ |
string | Share of the deposit for this channel (note the spelling — depositePercent, sic). The sum across channels should equal 100; boundary levels may carry "0" |
buy |
string | number | object | Buy price. Usually a string price; an object enables dynamic (polynomial point) pricing |
sell |
string | number | object | Sell price — same forms |
fiboPrice |
string | The calculated Fibonacci level price for the channel |
⚠️ Channels
"0"and"1"are mandatory. They define the grid boundaries; the bot validates their presence and refuses to start without them — even withdepositePercent: "0".
FIBO-specific fields
Everything from the shared blocks applies
(symbol — object form; timeFrame — milliseconds), plus:
| Field | Type | Meaning |
|---|---|---|
strategy |
fixed | auto |
Deposit allocation across channels: fixed — exactly your depositePercent split · auto — automatic rebalancing based on profit levels |
channels ✳ |
array | The grid — see above |
range |
object | array | Price-range constraints, {type, min?, max?} (e.g. scaled_price) |
maxRangePercent |
number | Gate: if the lowest→highest channel span exceeds this %, the bot will not start |
trailing |
boolean | Trail entries: buys follow the price down and execute on reversal |
trailingFrom |
number (ms) | Timestamp trailing starts from — must be within the last year |
trailingMaxChange |
number | Max trailing delta in % — a reversal beyond it triggers the order |
buyOnly |
boolean | Never sell automatically — pure DCA accumulation mode |
waitFullSell |
boolean | Wait until all sell orders of the cycle fill before re-entering buys |
crossChannelSell |
boolean | Allow a sell to close positions opened by a different channel once its target is reached |
mergeChannels |
boolean | Merge adjacent channels with similar allocations into one wider channel (fewer open orders) |
green |
number | «Green zone» threshold: unrealized PnL % above which trailing take-profit logic may engage |
✳ — required (full required set: type, symbol, exchange, deposit).
Advanced example — all 7 levels, trailing, prepared stop-loss
Verified config: full Fibonacci ladder, trailing from a fixed timestamp with a 30% cap,
30-day TTL, a pre-configured but disabled breakeven stop (enable it later at runtime via
update_stoploss), and
waitFullSell discipline:
{
"type": "FIBO",
"settings": {
"type": "FIBO",
"symbol": { "base": "SOL", "quote": "USDT" },
"ticker": "SOLUSDT",
"name": "Lvl: 0.5, 22.15 → 63.93+",
"exchange": "binance-futures",
"timeFrame": 60000,
"deposit": { "value": "100", "asset": "USDT", "allocate": "auto" },
"noticeLevel": 2,
"timeout": { "type": "ttl", "value": 2592000000 },
"positionSide": "LONG",
"short": false,
"trailing": true,
"trailingFrom": 1782311125920,
"trailingMaxChange": 0.3,
"waitFullSell": true,
"strategy": "fixed",
"orders": { "buy": { "type": "LIMIT" }, "sell": { "type": "LIMIT" } },
"stop": [
{ "strategy": "breakeven", "complete": true, "disabled": true,
"trigger": { "type": "kline" }, "order": { "type": "MARKET" } }
],
"range": [ { "type": "scaled_price", "max": "44.438156474850443902" } ],
"channels": [
{ "name": "1", "depositePercent": "0", "buy": "63.93", "sell": "63.93", "fiboPrice": "63.93" },
{ "name": "0.786", "depositePercent": "0", "buy": "55.05", "sell": "54.94", "fiboPrice": "54.99" },
{ "name": "0.618", "depositePercent": "0", "buy": "48.02", "sell": "47.92", "fiboPrice": "47.97" },
{ "name": "0.500", "depositePercent": "20.000", "buy": "43.09", "sell": "43", "fiboPrice": "43.04" },
{ "name": "0.382", "depositePercent": "30.000", "buy": "38.15", "sell": "38.07", "fiboPrice": "38.11" },
{ "name": "0.236", "depositePercent": "50.000", "buy": "32.05", "sell": "31.98", "fiboPrice": "32.01" },
{ "name": "0", "depositePercent": "0", "buy": "22.15", "sell": "22.15", "fiboPrice": "22.15" }
],
"mergeChannels": false,
"green": 3
}
}
Pitfalls
- Missing
"0"/"1"channels — the most common start failure. Add both, even at 0%. depositePercentmust sum to 100 across channels (boundaries may be"0").- The field is spelled
depositePercent— a copy of the platform’s internal name; a «corrected»depositPercentis silently ignored (remember, deep validation happens at start). trailingFromolder than one year is rejected.timeFramehere is milliseconds (60000= 1m) — unlike ALGO where it is minutes (the shapes table).- In strong trends the grid accumulates inventory: cap the damage with a real (enabled)
stop-loss or
maxRangePercent.
Verified against API spec v2.0.0 · 2026-07-11