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.

4 min readUpdated 3 August 2026markets, currencies, import, fees, charts

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.

Reads Binance's currency catalogue. Without confirm=true it computes the plan and writes nothing.

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:

  • status is 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.

Reads Binance's market list. Without confirm=true it returns the plan only. Delisted markets that still carry OPEN orders are never removed.

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.

Compares the fees charged by the platform against Binance's own market rates, grouped by fee currency.
The live balance of your Binance spot account, per asset, split into available and in-order.

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.

Builds or rebuilds cached candles. Accepts an explicit symbol and interval list, a history window in days, and a per-request delay.
Reads the cache settings, and reports whether the exchange connection is currently rate-limit banned.
Updates the cache settings. Stored as JSON in the settings row keyed chart_cache.

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 1m1w 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.