CHANNEL — channel trading bot
CHANNEL trades bounces inside horizontal price zones: buy at the bottom of a zone, sell at its top. One bot type, three flavors — the terminal calls them GRID / LEVELS / SCALE; pick the one that matches how you think:
| Flavor (terminal name) | strategy |
channels field |
You define |
|---|---|---|---|
| LEVELS — individual level work | horizontal_fixed |
array of channels | Each zone by hand, in absolute prices |
| GRID — an order grid for a range/sideways market | horizontal_fixed |
one object {name: "horizontal_grid", …} |
Just count + min/max — zones are generated evenly |
| SCALE — a Channel × Fibonacci hybrid | horizontal_scaled |
array of channels + scale |
Zones as 0…1 fractions of a price window — a reusable template |
Prerequisites: the bot lifecycle and the
shared config blocks. Required fields for every
flavor: type, symbol, exchange, deposit, strategy, channels.
LEVELS — hand-picked zones
You know your support/resistance map; each channel is a zone with absolute buy/sell prices
and its own share of the deposit. Verified config — four stacked zones on SOL with two
stop-loss rules (a disabled breakeven blank plus a hard price stop at 41.45):
{
"type": "CHANNEL",
"settings": {
"type": "CHANNEL",
"symbol": { "base": "SOL", "quote": "USDT" },
"ticker": "SOLUSDT",
"name": "Levels: 4, 60.03 → 126.72",
"exchange": "binance-futures",
"deposit": { "value": "100", "asset": "USDT", "allocate": "auto" },
"noticeLevel": 1,
"timeout": { "type": "ttl", "value": 604800000 },
"positionSide": "LONG",
"marginType": "CROSSED",
"strategy": "horizontal_fixed",
"channels": [
{ "name": "L1", "buy": 115.38, "sell": 126.72, "buyPercent": 0.83, "depositePercent": "25.0" },
{ "name": "L2", "buy": 104.05, "sell": 115.38, "buyPercent": 0.66, "depositePercent": "25.0" },
{ "name": "L3", "buy": 82.04, "sell": 104.05, "buyPercent": 0.33, "depositePercent": "25.0" },
{ "name": "L4", "buy": 60.03, "sell": 82.04, "buyPercent": 0, "depositePercent": "25.0" }
],
"green": 1,
"mergeChannels": false,
"range": [ { "type": "price", "max": 121.05 } ],
"stop": [
{ "strategy": "breakeven", "complete": true, "disabled": true,
"trigger": { "type": "kline" }, "order": { "type": "MARKET" } },
{ "strategy": "price", "disabled": false, "complete": true,
"trigger": { "type": "kline", "value": 41.45, "edge": "close",
"closed": true, "timeFrame": 60000 },
"order": { "type": "MARKET" } }
]
}
}
GRID — auto-generated zones
Don’t want to hand-place levels? Give the boundaries and a count — the bot builds evenly
spaced zones itself. Note that channels here is a single object, not an array:
{
"type": "CHANNEL",
"settings": {
"type": "CHANNEL",
"symbol": { "base": "SOL", "quote": "USDT" },
"ticker": "SOLUSDT",
"name": "Grid: 10, 20.28 → 56.65",
"exchange": "binance-futures",
"deposit": { "value": "222", "asset": "USDT", "allocate": "no_reserve" },
"noticeLevel": 1,
"timeout": { "type": "ttl", "value": 604800000 },
"positionSide": "LONG",
"marginType": "CROSSED",
"strategy": "horizontal_fixed",
"channels": { "name": "horizontal_grid", "count": 10, "min": 20.28, "max": 56.65, "percent": false },
"mergeChannels": false,
"profitAsset": "USDT",
"stop": [
{ "strategy": "breakeven", "complete": true, "disabled": true,
"trigger": { "type": "kline" }, "order": { "type": "MARKET" } }
]
}
}
Grid options: percent: true switches from fixed price steps to percentage steps;
martingale multiplies each next level’s deposit share by the given factor — in the terminal
this is the “geometric (Martingale) distribution”, and percent: true is the “fixed
percentage step” between grid levels.
SCALE — a template over a price window
Channels are defined as fractions 0…1 of a price window (scale), so the same channel
layout can be reused on any range or symbol. The bot maps each fraction to an absolute price:
price = scale.min + position × (scale.max − scale.min)
{
"type": "CHANNEL",
"settings": {
"type": "CHANNEL",
"symbol": { "base": "SOL", "quote": "USDT" },
"ticker": "SOLUSDT",
"name": "Scale: 4, 23.33 → 64.87",
"exchange": "binance-futures",
"deposit": { "value": "300", "asset": "USDT", "allocate": "no_reserve" },
"noticeLevel": 1,
"timeout": { "type": "ttl", "value": 604800000 },
"positionSide": "LONG",
"marginType": "CROSSED",
"strategy": "horizontal_scaled",
"scale": { "min": 23.33, "max": 64.87 },
"channels": [
{ "name": "S1", "buy": 0.8, "sell": 1, "depositePercent": "18.6", "isActive": true },
{ "name": "S2", "buy": 0.6, "sell": 0.8, "depositePercent": "22.4", "isActive": true },
{ "name": "S3", "buy": 0.4, "sell": 0.6, "depositePercent": "26.8", "isActive": true },
{ "name": "S4", "buy": 0.2, "sell": 0.4, "depositePercent": "32.2", "isActive": true }
],
"mergeChannels": false,
"stop": [
{ "strategy": "breakeven", "complete": true, "disabled": true,
"trigger": { "type": "kline" }, "order": { "type": "MARKET" } }
]
}
}
Field reference
HorizontalChannel (LEVELS & SCALE):
| Field | Type | Meaning |
|---|---|---|
name ✳ |
string | Zone label — L1, L2… (LEVELS) / S1, S2… (SCALE) |
depositePercent ✳ |
string | Share of the deposit; sum across channels should equal 100 |
buy ✳ / sell ✳ |
number | string | horizontal_fixed: absolute prices. horizontal_scaled: relative positions 0…1 within scale |
buyPercent |
number 0…1 | Where inside the zone to buy: 0 = zone bottom, 1 = zone top |
isActive |
boolean (default true) |
Set false to park a zone without deleting it |
HorizontalGrid (GRID): name: "horizontal_grid" ✳ · count ✳ · min ✳ · max ✳ ·
percent (percentage steps) · martingale (per-level deposit multiplier).
ChannelScale (SCALE): min ✳, max ✳ — the price window; required when
strategy: "horizontal_scaled".
CHANNEL-specific top-level fields: strategy ✳ (horizontal_fixed |
horizontal_scaled) · channels ✳ (array or grid object — must match the strategy) ·
scale (SCALE only) · mergeChannels (merge zones sharing boundary prices) · green
(integer — how many zones ahead count as the «green zone» for optimistic order placement).
Everything else — deposit, stop (object or array), orders, timeout, filters,
range, positionSide, marginType, short, profitAsset, onetime, noticeLevel — is
shared. timeFrame (ms) is optional here: omit it
and the bot reacts to every tick.
Pitfalls
strategyand thechannelsform must match.horizontal_scaled+ grid object, orhorizontal_fixed+ 0…1 fractions, are configuration nonsense the gateway will not catch at create time (deep validation happens at start).scaleis required forhorizontal_scaled— without it the 0…1 positions have nothing to map onto.- The meaning of
buy/sellflips between flavors (absolute price ↔ fraction). Re-check after copy-pasting between configs. greenhere is an integer count of zones, not the percent threshold of the same-named FIBO field. Same name, different unit — beware when porting configs.- Grid
martingalegrows position sizes down the grid fast — model your worst-case inventory before enabling it.
Verified against API spec v2.0.0 · 2026-07-11