Troubleshooting

DocumentationHelp

Troubleshooting

The failures people actually hit, and what each one means.

The run

The result looks impossibly good

Check the data first. A run started in the app reads real bars and never the synthetic generator, so the question is how many it saw: compare the bar count with the range you asked for. The guest preview shows fixed synthetic runs, and those numbers mean nothing.

Then check the accuracy tier. On OHLC a bar that spans both your stop and your target is decided by a rule and not by what happened inside it. A strategy whose edge lives inside the bar will look better than it is. Re run it on M1 proxy and compare. If the result moves a lot, the edge was in the rule.

The engine refuses my symbol

The engine prices what it recognises and refuses the rest, rather than pricing a stock ticker as if it were a currency pair. Define it under Data, Instruments with its own contract size and pip size. See Instruments and Custom Symbols.

The download returns nothing

The built in source is OrionQuant's archive of Dukascopy data, and it serves every instrument the archive lists. Anything else needs a plugin data source or an imported CSV. The toolbar warns before the request rather than returning an empty download.

Weekends and market holidays have no ticks. A range that is entirely a closed market is empty because the market was shut, which is not the same as a failed download, and the run says which happened.

I cannot select the accuracy tier I want

Real ticks are Max and Enterprise. Below that, TICK stays in every menu, marked with the plan that carries it, and selecting it opens the upgrade dialog instead of changing the run. The same holds for the default tier under Settings, Engine. A run that still asks for TICK, for example one set up before a downgrade, is refused and says so. Tick accuracy also needs tick data in the cache: a range downloaded as candles cannot be replayed tick by tick, because there are no ticks in it.

"Runs go to the server"

The browser build has no local engine. The run is queued in a container on our server against the data the server holds. Set the run location beside the Run button. On the desktop, the same banner means the local engine has not started yet.

The run stops early

Two different things look alike. Ruin means the account was wiped out and the engine stopped because there was nothing left to trade with. Data ran out means the cached range ended before the period did. The Logs say which, and on a portfolio run a leg reports whether it stopped because the account was wiped out or because its own data ended.

Server runs

When a run on the server ends without a result, the Backtest pane says why and shows a code. Each code has an entry below. When the entry does not help, use Report this beside the message: the report carries the job id, which is what we need to find the run.

strategy_error: the strategy raised an error

The strategy ran and threw. The words beside the code are the last line of the traceback, for example NameError: name 'sma' is not defined. Fix it in the editor and run again. Running it locally first helps: the same error shows there with the whole traceback in the Logs.

data_missing: the server has no data for this

The server fetches what a run needs from the archive before it starts, as far back as your plan reaches, and keeps it for every later run. A run still ends here when the range lies before your plan's window or the archive does not have the instrument. When the archive is still fetching part of the range, the message says to start the run again in a few minutes. Or run locally on data you imported.

spread_missing: this data has no ask side

A candle fills at the bid and the ask it traded at. These bars carry one price, from a CSV with a single price series, a source that sends one side, or minutes downloaded before the engine kept both sides, and its symbol has no average spread to draw from instead. Enter one under Data, Custom data: open the symbol and fill in Average spread (pips). Or download the range again so its bars carry their bid and ask.

news_missing: the economic calendar does not cover this

The strategy asks whether a bar is near economic news, and the calendar has no answer for that time. The app loads the calendar from ForexFactory on your computer before the run. That failed: you are offline, the site blocked the request, or its page changed. The message says which. A server run gets the calendar from the app that starts it, so start it from the desktop app. A run never trades on as if there were no news.

plugin_data_server: plugin feeds are not available on the server

The strategy reads a plugin feed with ctx.data(..., required=True). Data plugins fetch on your computer before a run, and a server run has no network and no plugin folder, so it has no feeds at all. Run the strategy on this computer. See External Data for how the feeds are fetched.

terminal_series_local: this Terminal series is only on your computer

The strategy reads a Terminal series with ctx.series. The Terminal fetches its series on your computer and keeps them there, and a server run has no copy. Run the strategy on this computer. See Terminal for how series are fetched.

timeout: it did not finish in time

A server run gets up to five minutes, and never more than the server minutes left this month. Shorten the period, use a coarser timeframe or a lower accuracy tier, or run it locally, where there is no limit.

memory_limit: it ran out of memory

A server run has 1 GB of memory. An M1 proxy run holds every minute of its range, so about a year fits; an OHLC run holds only its own bars and fits many years. Shorten the period, pick OHLC, or run it locally, where the limit is your computer's memory.

runner_unavailable: nothing is running backtests

The server could not start a container, the queue stood still for fifteen minutes with nothing running, the worker running it stopped, or the server restarted while it ran. Nothing is wrong with the strategy. Try again in a few minutes. When it keeps happening, report it: it means the server needs attention.

runner_image_missing: the server is not set up for runs

The image a run starts from is not loaded on the server. That is ours to fix. Report it, and run locally in the meantime.

output_invalid: the result could not be read

The engine finished and what it wrote could not be read. Report it with the job id.

strategy_missing: the strategy is gone

The strategy was deleted, or lost its source, between queueing and starting. Save it and run again.

internal: something else

The words beside the code are the server's own. Report it.

A run is refused before it starts

These come back at once and the run never queues.

  • concurrency_limit: the account already has as many server runs queued or running as its plan allows. Wait for one to finish, or stop one.
  • server_minutes_exhausted: this month's server minutes are used up. Press Buy minutes in the failure panel to pick a minute pack without leaving the run, or buy one under Settings, Billing. You can also wait for the first of the month, or run locally. Once a month, when 80 % of the minutes are used, a warning shows before they run out.
  • server_runs_not_on_plan: the plan has no server time and the account holds no bonus minutes. Server runs start on Pro.
  • rust_not_on_plan: Rust runs on Max and Enterprise, on the desktop and on the server. That includes a .rs file in the workspace beside a strategy in another language. Python, C#, Pine and block strategies run on every plan.
  • optimize_not_on_plan: an optimisation on the server asks for what the plan does not have: the genetic search (Max and Enterprise), an out of sample test (Pro and above), or a second optimizer run in a month on Free.
  • optimize_too_large: an optimisation on the server runs at most 5,000 passes. Lower Max passes.
  • strategy_cap: the plan keeps a limited number of strategies on the server. Remove one, or upgrade.
  • source_too_large and invalid_strategy: the strategy cannot be stored as it is. The words beside the code say which part.
  • strategy_not_found: the server does not know the strategy. Run again, which uploads it.
  • rate_limited: too many requests in a short time. Wait a moment.

A run stays "Queued"

Stop works while a run is queued. Every server run waits in one queue, oldest first, and the run shows its place and, when there is enough history, when it should start. A run behind a busy queue waits as long as the queue moves. A run that has waited fifteen minutes while nothing ran fails as runner_unavailable, so it never waits for good.

Data and disk

The cache is enormous

Tick data is about 588 KB a day per instrument. Bars for the same day are about 5 KB. If disk is the problem, turn tick data off in the engine settings, which caps you at M1 proxy, or use Fetch while the run goes, which downloads the range day by day and throws the ticks away once they have become bars.

A streamed run is slower than I expected

It is not meant to be faster. The download is the slow part either way. What streaming buys is that nothing large is written to disk and the run starts producing output on the first day instead of after the last. Accuracy is bars only, because there are no ticks left to replay.

Strategies

My strategy compiles and never trades

Look at the Logs. The usual causes, in the order they turn up: the entry condition is never true on this instrument and timeframe, the strategy is waiting for an indicator that needs more bars than the period contains, or every entry is being refused for margin. On a portfolio run, margin refusals are counted per leg.

C# will not compile

C# runs on every plan, so a refusal is the compiler's own, with the file and the line it names. A cTrader cBot compiles against the part of the cAlgo API the host carries; a member past it is refused by name, and what the host approximates is listed beside a C# strategy. A Rust strategy below Max is the plan's refusal, not a compiler error, and opens the upgrade dialog.

It worked yesterday and the numbers moved

A run is reproducible from its configuration and its seed. If the numbers moved, something in the configuration moved: the cached range grew, the cost schedule changed, or the strategy was edited. The Report carries the engine version, the seed and the configuration that produced it, so two runs can be compared field by field.

The app

The assistant says there is no provider

It needs a provider and a key, in Settings, AI, and it is desktop only: the key that answers lives in the main process. See AI Assistant.

Something is missing in the browser

Downloads, imports, the plugin folder, the AI assistant and AI apps on this computer are desktop features. The Data view says it is desktop only rather than showing empty panes.

A page will not open in the preview

The guest preview reaches no endpoint that needs a session, so the account area, the admin terminal and Community stay closed. Sign in to open them.

Getting help

Help Center sits at the bottom of the sidebar, next to Settings and this documentation. It has the FAQ and the starting points. The profile menu below it has Support, which is the way to write to us.

The Bug Report button is in the sidebar too. It works in the desktop app only. Your report becomes an issue on the team's list. It carries the title, the category, the description, the steps, the date and, if you give one, your email so we can reply. While Attach app version and operating system is ticked, and it is by default, it carries those two as well. It does not carry the engine version, your logs, your strategies or your data, so write down what you saw and which steps lead to it. When a server run fails, its error panel opens the form with the failure already filled in.

The Forum is the place for a question about a strategy rather than about the app.

OrionQuant