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.

9 min readUpdated 3 August 2026troubleshooting, empty-chart, websocket, licence

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

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

  2. 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
  3. 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
  4. Check the licence. In Admin → Extension Manager, confirm chart_engine reports 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.

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

  2. 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.

  3. Read the response. [] means the endpoint has no candles for that window. A 400 names the problem in its message.

  4. Check the symbol. It must be BASE/QUOTE. /api/exchange/chart rejects anything that does not match ^[A-Z0-9]+/[A-Z0-9]+$ with a 400.

  5. 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.

  1. Look for the socket in the network tab, filtered to WS. The chart connects to /api/exchange/market, /api/ecosystem/market, /api/futures/market or /api/forex-trading/market depending on market type.

  2. 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.

  3. If NEXT_PUBLIC_WEBSOCKET_URL is set, confirm it is right. It overrides everything else.

  4. In development, the socket goes straight to the backend port — Next.js rewrites do not proxy upgrades. Check NEXT_PUBLIC_BACKEND_PORT and 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 /chart request from the network tab — full URL and response length
    • Whether a WS connection to /api/…/market exists
    • Any console message beginning [ChartSwitcher]
    • Whether chart_engine reports 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.