Currencies, markets and charts
Import spot currencies and markets from Binance, choose which pairs to list, set your own fees and precision, and build the chart cache without tripping a rate limit.
A verified provider lists nothing. Two imports pull Binance's catalogue into your database, and then you decide — pair by pair — what your customers can actually see.
Run them in this order. The market import only needs symbols, but the currency import is what gives deposits and withdrawals their network list, minimums and fees, and a market whose currency was never imported cannot be funded.
1. Import spot currencies
Admin → Finance → Currencies → Spot, then Import.
On Binance the currency catalogue comes from a signed endpoint. On a connection that fell back to public-only — wrong key name, wrong IP, expired key — it returns an empty set rather than an error. The import then reports that Binance lists no currencies and offers to delete every currency you have.
Verify credentials on /admin/finance/exchange before running this, and read
the preview's delete count before confirming it.
The import is preview-first. The first press shows a plan — how many currencies would be created, updated and removed — and writes nothing. Only a second, explicit confirmation applies it.
What it writes per currency: the code and name, the decimal precision, whether Binance currently allows deposits and withdrawals, the percentage fee, and a per-network list carrying the minimum and maximum withdrawal, the network withdrawal fee, and whether that network needs a memo or tag.
Two behaviours to know:
statusis preserved. The one field an admin curates by hand — whether a currency is offered at all — is never overwritten by an import.- Currencies Binance no longer lists are deleted. The preview names up to twenty-five of them so you can spot a mistake before agreeing.
A confirmed import then refreshes currency prices immediately rather than waiting for the next cron run.
2. Import markets
Admin → Finance → Markets (/admin/finance/exchange/market), then Import
Markets.
The same preview-then-confirm dialog applies. What survives the filter:
- the market must be active on Binance;
- it must report both a price and an amount precision;
- it must be a spot market — swap and futures markets are skipped, along with any symbol containing a colon, because those symbols break the multi-symbol ticker call the market list depends on.
Each surviving market is stored with the data your platform will enforce locally: price and amount precision as decimal places, the amount, price and cost limits, and Binance's own maker and taker rates as the starting fee.
New markets are created with status: false. Importing eight hundred pairs
changes nothing a customer can see until you enable them one by one. That is
deliberate — see the cost of a long list below.
Removal is where the import is careful:
| Situation | What happens |
|---|---|
| Binance delisted a market you carry | The market row is deleted |
| …but the market still has OPEN orders | The market is kept, and the preview tells you how many |
| Historic orders on a removed market | Retained. Order history is a customer record and a regulatory document; a delisting does not un-happen the trades |
| Watchlist entries pointing at a removed market | Deleted — they are a user preference, not a record |
If a market is blocked by open orders, cancel or settle them and import again.
3. Enable the pairs you want
Toggle status on the markets screen. Only enabled markets are streamed, priced
and tradable.
Keep the list deliberate. The market-list ticker stream builds one
fetchTickers call containing every enabled symbol and repeats it roughly
once a second. Six pairs and six hundred pairs are the same number of requests
but not the same weight, and the weight is what Binance counts. A large enabled
set is the most common way an install walks into a rate-limit ban — see the
connection reference.
Two flags on each market are display-only: isHot and isTrending drive
badges on the market list and change nothing about execution.
If the ticker stream gets an error from Binance that names specific symbols, the platform disables exactly those markets and carries on. It is a self-healing measure against one bad row breaking the whole batch — but it means a market you enabled can be off the next time you look, with the reason only in the backend log.
4. Set your fees
The imported maker and taker rates are Binance's, and they are the platform's starting point, not a constraint. Edit them per market.
How they are applied: a BUY is charged the market's taker rate and the fee is taken in the base currency; a SELL is charged the maker rate and the fee is taken in the quote currency.
That is a simplification of what Binance itself charges you — a resting limit order that gets filled is a maker fill regardless of side — so the two numbers will not agree. The Fees screen on the exchange provider page exists for exactly that comparison: per fee currency, it totals what you charged, what Binance charged, and the difference.
Both screens are disabled on the provider page until credential verification passes, because both fail with an authentication error otherwise.
5. Build the chart cache
Admin → Finance → Exchange Providers → Charts
(/admin/finance/exchange/chart).
Candles are cached to disk under data/chart and to Redis, so the trade screen
does not re-request history from Binance on every page load. The build walks
each enabled market and each configured interval, pulling history and writing
the cache, and it streams its progress to the page over a WebSocket.
The four settings, and what each one costs:
| Setting | Default | Range | What it changes |
|---|---|---|---|
| Cache days | 30 |
1–365 | How much history to fetch per interval. The single biggest driver of request count |
| Rate limit | 500 ms |
100–10000 | Delay between requests. Lower is faster and closer to a ban |
| Intervals | 1m … 1w |
fixed list | Each interval is a separate pass over every market |
| Auto update | off | — | Whether the cache refreshes itself |
Valid intervals are 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h,
8h, 12h, 1d, 3d and 1w. Anything else is rejected outright.
A full rebuild across every enabled market at one-minute resolution for a year is the fastest route to an IP ban this product offers. Build the intervals your customers actually look at, on the markets you actually list, and raise the delay rather than lowering it if the run has to be large.
Where customers see all this
The market list lives at /market and each row links to
/trade?symbol=BTC-USDT. The link target is a platform setting — the
marketLinkRoute setting can point market rows at the binary trading screen
instead, in which case your imported spot markets become the underlying for
binary contracts rather than the venue for spot orders.