Troubleshooting
Symptom-first diagnosis for Chart Engine — the empty chart, the chart that will not appear at all, the one that draws and then freezes, and the analysis that vanished overnight.
Almost every Chart Engine problem falls into one of four symptoms. Identify which one you have before changing anything, because three of them look similar and have completely different causes.
| Symptom | Usually |
|---|---|
| TradingView renders where you expected Chart Engine | A setting, a licence, or a missing rebuild |
| "No chart data available" with a Retry button | The wrong market type, or a market with no candles |
| The chart draws correctly and then never moves | The WebSocket, not the chart |
| The chart area is completely blank — no message, no Retry | The container has no measured height |
The chart is TradingView, not Chart Engine
-
Check the setting for that specific screen. Binary and spot/futures have separate switches, and the Trading Pro workspace follows the spot one. See Administering Chart Engine.
-
Open the browser console. This message is definitive:
[ChartSwitcher] Chart Engine addon not installed. Falling back to TradingView.It means the setting is set to Chart Engine and the build could not find the addon. Rebuild the frontend:
pnpm build:frontend && pnpm restart -
Confirm the files exist. The build's detection is a file check, so this is the thing it looked at:
ls frontend/components/\(ext\)/chart-engine/dist/index.js -
Check the licence. In Admin → Extension Manager, confirm
chart_enginereports as verified.
The hourly heartbeat handles a revoked or expired Chart Engine licence by writing
TRADINGVIEW back into both settings and clearing the settings cache. There is
no banner and no audit entry naming the licence. Charts that changed provider
overnight, with nobody having touched the admin panel, is that — every time.
Reactivating the licence does not restore your choice; set both settings again.
It works on the trade page but not in Trading Pro (or the reverse)
There is only one setting for both. The Pro workspace mounts the same chart in
spot or futures context and resolves its provider from spotChartEngine, exactly
like the classic trade page. Expecting the two to differ is the bug.
The binary page ignores the setting
If the binarySettings row has never been saved, or display.chartType is
missing from it, the page treats the value as TRADINGVIEW. Open
Admin → Binary Options → Binary Settings, pick Chart Engine, and save once so
the key exists.
"No chart data available"
This panel appears when the chart has been measured, is not loading, and has zero candles. It is an honest report: the request succeeded and came back empty.
-
Open the network tab and reload. Find the request to
/chart. Which of the four endpoints was it?/api/exchange/chart·/api/ecosystem/chart·/api/futures/chart·/api/forex-trading/chart -
Confirm that is the right one for the market. This is the most common cause by a wide margin. A native Ecosystem market queried against the CEX endpoint returns an empty array with a 200 — no error anywhere.
-
Read the response.
[]means the endpoint has no candles for that window. A 400 names the problem in its message. -
Check the symbol. It must be
BASE/QUOTE./api/exchange/chartrejects anything that does not match^[A-Z0-9]+/[A-Z0-9]+$with a 400. -
Check the interval. Ecosystem validates the interval against its own list and returns a 400 naming the supported set rather than an empty array — an unrecognised interval there is a full-partition miss, not "no data".
Common causes, ranked
Bots trade Ecosystem markets, so a bot terminal must use eco. A custom screen
left on the default spot asks the CEX for a market that does not exist there,
gets [], and renders this exact panel. The stock bot terminal pins eco
already; if you have built your own view, that is the first thing to check.
/api/exchange/chart returns whatever its cache holds and nothing more when the
provider is unavailable — no error, no warning. For a market it has never cached,
that is an empty array. Check the backend logs for the exchange module.
Ecosystem and futures candles come from ScyllaDB. If it is unreachable, those endpoints cannot answer. Everything else on the platform keeps working, which is why this presents as "one type of chart is empty" rather than as an outage.
A brand-new Ecosystem market has no history until it has traded. A thinly traded pair has gaps. Try a longer timeframe — a market with no 1-minute candles in the last two hours may still have daily bars.
If the host passes a concatenated symbol such as BTCFOO, the chart splits it by
matching a known quote asset off the end — USDT, USDC, BTC, ETH, BNB,
BUSD. An unlisted quote is passed through unchanged and then rejected by the
endpoint's symbol validation. Pass the slashed form.
Opening a stock or FX instrument at an intraday timeframe used to produce a thin sliver of price against a wall of weekend and overnight void, because the opening window was sized from the clock rather than from the candles. Both edges are now derived from the candles themselves. If you still see it, you are on a build older than v6.0.0.
The chart draws, then never moves
Historical candles arrive over HTTP; live updates arrive over a WebSocket. When the socket fails, the chart renders perfectly from history and then freezes. It looks like a rendering bug and is not.
-
Look for the socket in the network tab, filtered to WS. The chart connects to
/api/exchange/market,/api/ecosystem/market,/api/futures/marketor/api/forex-trading/marketdepending on market type. -
If there is no connection at all in production, your reverse proxy is not forwarding the WebSocket upgrade on those paths. That is an nginx or Apache configuration change, not a platform setting.
-
If
NEXT_PUBLIC_WEBSOCKET_URLis set, confirm it is right. It overrides everything else. -
In development, the socket goes straight to the backend port — Next.js rewrites do not proxy upgrades. Check
NEXT_PUBLIC_BACKEND_PORTand that the backend is actually listening.
If you have panned back into old candles, a live tick from now is more than one candle-length ahead of what is loaded. The chart updates the displayed price and deliberately does not append the candle, because stapling today onto last Tuesday would draw a false gap. Press Reset view in the toolbar to jump back to the present.
The chart area is completely blank
Nothing at all — no candles, no empty-state message, no Retry button. The empty-state panel only appears once the chart has a measured width, so a chart with no measured size shows nothing.
The cause is almost always a container with no resolvable height. A chart placed
inside a flex column needs min-h-0 on its wrapper; without it the flex child
refuses to shrink, the canvas measures zero, and the chart renders blank. This is
an integration problem in the host page, not a chart setting.
Resizing the browser window usually makes it appear, which is the confirming test.
Colours look wrong
Flipping light and dark while looking at a chart clears the colour cache without forcing a repaint, so the chart keeps its current pixels until the next tick, pan, zoom or resize. On a live market that is under a second. On an idle chart — or in the admin design manager's preview — it persists until you touch it. Pan the chart one pixel and it corrects.
A saved theme is honoured on every page load, so this only affects live toggling.
Check the palette in Appearance & Design → Site Design. The chart reads those tokens directly, so a chart that disagrees with the site means the tokens themselves changed and something else is stale — a hard reload usually settles it.
Expected. A one-time cleanup removes stored indicator colours, and only colours, so un-customised indicators pick up the themed palette while a colour a user chose by hand is kept. Parameters and line widths are never touched.
Report it. Label text on badges, barriers, expiry strips and crosshair chips is derived from the fill it sits on rather than being hardcoded, so an unreadable combination means the palette itself has a contrast problem worth fixing in Site Design.
Indicators or drawings disappeared
All of it lives in the browser, on that device, for that browser profile. There is no server-side copy.
| What vanished | Why |
|---|---|
| Everything | Site data was cleared, or this is a different browser, device or private window |
| Drawings on one market only | Drawings are stored per symbol; you are on a different market |
| Indicators, everywhere at once | Indicators are stored globally for the browser — removing one removes it from every chart |
| Timeframe and zoom reset | Per-symbol chart state expires after 24 hours |
| Back to just Volume | Removing the last indicator deletes the stored list, so the next load restores the default |
If a trader needs a reusable arrangement, that is what templates are for — they capture indicators, drawings, chart type and timeframe together and apply to any market.
Bot terminal problems
Chart Engine is not installed. The terminal falls back to TradingView, which cannot draw a strategy's levels. Install the addon and rebuild the frontend.
Mirrors are skipped rather than guessed. They are dropped when the chart's timeframe differs from the strategy's, when the user already has that indicator at that period, or when the chart does not implement it. The terminal opens on the timeframe the strategy declares precisely so the mirrors are eligible — changing the timeframe by hand will lose them.
Price-driven strategies such as grid and trailing stop declare no indicators at all, and there is nothing to mirror.
The bot claims to be running and has not produced a tick for more than 30 seconds. That is a bot problem, not a chart problem — the cockpit exists to surface it. Check the engine and the bot's last error, which the panel also reports along with how many times it has occurred.
Price has left the strategy's operating band, so the bot has nothing to do. It is running correctly and doing nothing, which is the honest thing for the chart to say.
The terminal polls its state every 15 seconds in addition to its socket, because the broadcast registry is per backend thread and a worker-thread deployment can drop events. Wait one poll, or press the refresh control in the header.
The timeframe changed by itself
Zooming out past the maximum readable candle count promotes the chart to the next timeframe up; zooming in past the minimum demotes it. That is deliberate — the alternative is candles collapsing into a solid block. The thresholds are derived from the chart's measured width, so the exact zoom level at which it happens differs between a phone and a desktop.
Collecting evidence for a support request
- Which screen, and whether the setting for that screen says Chart Engine
- The exact
/chartrequest from the network tab — full URL and response length - Whether a WS connection to
/api/…/marketexists - Any console message beginning
[ChartSwitcher] - Whether
chart_enginereports as licensed in Extension Manager - Whether the frontend has been rebuilt since the addon files landed
Those six answers identify the cause of nearly every report on this page.