Troubleshooting & FAQ

Help

Troubleshooting & FAQ

A cross-cutting guide organised by symptom: your plugin doesn't load, an indicator renders nothing, a strategy gets no callbacks, a provider doesn't list, you see no live data or a NaN series, or a threading exception. Each entry names the real cause, the fix, and where to read more.

Before anything else: read the Control Center Log tab. Plugin loading, registration errors, and most runtime warnings are written there at startup and as they happen. The log usually names the exact problem before you start guessing.

Symptom: plugin doesn't load or appear

The plugin DLL was built but its types never show up in the host — no indicator in the picker, no strategy in the analyzer, no column in the Market Analyzer.

Cause Fix
Type isn't public, is abstract/interface/open generic, or has no zero-arg constructable ctor Satisfy all discovery rules. The most common miss is a constructor with a required parameter.
DLL is in the wrong folder (e.g. the auto-deploy default %AppData%\AlgoStudioPro\Plugins) Deploy to the Plugins folder next to the EXE. See Where to deploy.
A contract DLL or .deps.json was shipped alongside, causing a load error or type-identity clash Deploy your DLL only. See Dependencies & isolation.
You rebuilt while TradeStrike was running There is no hot reload — fully restart the host.

The full diagnostic walkthrough is in Building & deploying → Troubleshooting.

Symptom: indicator loads but renders nothing

The indicator appears in the picker and can be added to a chart, but draws nothing.

  • No plot was declared, or values were never written to it. An indicator only draws what you push into its plot series each bar. Confirm you declared a plot and assigned a value on the current bar. See Plots & styles.
  • Every value is NaN. A series that is all NaN renders as empty — see NaN values below.
  • The calculation never ran. If your work is gated on a cadence (per-bar vs per-tick) it may not be firing as you expect. See Calculation & market data.
  • Custom rendering throws or draws off-panel. If you implement custom rendering, an exception in the render path is swallowed per-frame and shows as a blank panel; check coordinates and the log. See Custom rendering.

Symptom: strategy gets no callbacks

The strategy is selected and started, but your OnBar / calculation logic never seems to run.

  • It wasn't discovered as a strategy. A pipeline strategy must be a public, concrete subclass of the Strategy base with a zero-arg ctor. If it doesn't subclass Strategy it won't be cataloged. See Discovery & metadata.
  • No data series is loaded. Callbacks are driven by incoming bars; with no instrument/bar data there is nothing to call back on. Confirm the run is configured with a data series.
  • Cadence mismatch. If you expect per-tick calls but the strategy is configured per-bar (or vice versa), the callbacks fire at a different granularity than you assume. See Calculation cadence.
  • It threw on the first call. An exception during initialization can stop a strategy before it produces visible work — check the log.

Symptom: data or trading provider not listed

You wrote an IDataProviderFactory (or trading provider) but it doesn't appear in the connection list.

  • The factory failed a discovery rule. Same four rules as everything else: public, concrete, zero-arg constructable, implements the contract. See Discovery rules.
  • It's a factory contract, not the provider, that gets discovered. The host discovers your factory type; the factory then creates the provider. Make sure the factory meets the rules. See Connections and Trading providers.
  • The DLL didn't deploy or the host wasn't restarted. Same loading checklist as above.

Symptom: no live data

A provider is connected but no live ticks, quotes, or depth arrive.

  • You subscribed to the wrong symbol or exchange. A symbol that doesn't match the venue's listing yields an empty subscription. Verify the instrument and exchange.
  • Backfill works but live doesn't (or vice versa). History and the live tick path are separate responsibilities. Confirm both the backfill and the live-tick parts of your provider are implemented and wired. See Live ticks & depth and Backfill.
  • The connection silently auth-failed. A data plane can connect for public data while a trading-auth failure is only logged. Check the log for a connect/auth failure.

Symptom: NaN values in a series

A plot or indicator series reads as NaN and renders as a gap or nothing at all.

  • You read a bar before enough history exists. Indexing back further than the available bars (e.g. a 20-period average on bar 3) yields NaN by design — guard with a warmup check before computing.
  • You divided by zero or propagated a NaN input. One NaN in an arithmetic chain poisons the result; validate inputs before using them.
  • NaN is the intended "no value" sentinel. Leaving a plot unassigned on a bar reads back as NaN and is rendered as a gap — that is expected, not a bug.
Prefer NaN over 0 for "no value". Writing 0 where you have no value draws a misleading line at zero; leaving the value unset (NaN) draws a clean gap. See Reading bars & series.

Symptom: threading exceptions

You see cross-thread or "object can only be used from the thread it was created on" exceptions, or intermittent corruption when touching UI from plugin code.

Do your work on the threads the host gives you. Indicator calculation, strategy callbacks, and provider callbacks run on host-managed threads. Don't spin up your own threads to mutate plugin state that the host also reads, and never touch UI objects directly — the host owns the render thread. Keep per-callback work synchronous and side-effect-free beyond your own series.
  • Don't capture and reuse host objects across callbacks on another thread. Series, bars, and context objects are valid within the callback that hands them to you.
  • Avoid blocking calls in a callback. Long or blocking work in a per-tick callback stalls the pipeline feeding it.

Common mistakes

Mistake Consequence Fix
Constructor takes a required parameter Type silently not discovered Add a zero-arg ctor; expose tunables as parameter properties.
Shipping TradeStrike.Pipeline.* contract DLLs Type-identity clash, plugin skipped Deploy your DLL only.
Deploying to the auto-deploy default folder Builds fine, never appears Point AlgoStudioProPluginsFolder at the EXE's Plugins folder.
Rebuilding without restarting the host Changes don't take effect Fully restart TradeStrike (no hot reload).
Writing 0 instead of leaving a plot unset Misleading line at zero Leave the value NaN for "no value".
Targeting an older framework Plugin fails to load Target net10.0 (or higher within the same major).

FAQ

Do I need to register my plugin anywhere?

No. There is no manifest and no registration call. Discovery is purely by the contracts your public types implement. Drop the DLL in the Plugins folder and restart.

Can one DLL contain several kinds of extension?

Yes. A single assembly can carry any mix of indicators, strategies, bar-type builders, data-provider factories and Market Analyzer columns. Each type is cataloged independently by the contract it implements.

Where exactly does the DLL go?

The Plugins folder next to the running host executable. See Where to deploy.

Why does my plugin build but never show up?

Almost always one of two things: it landed in the auto-deploy default folder (%AppData%\AlgoStudioPro\Plugins) rather than the folder next to the EXE, or a discovery rule failed (commonly a required constructor parameter). Check the Log tab.

Can I ship third-party libraries?

Yes — genuine third-party dependencies the host doesn't provide go next to your plugin DLL and are resolved from the plugin's own folder. Never ship the TradeStrike.Pipeline.* contract assemblies; the host provides those. See Dependencies & isolation.

Can two plugins use different versions of the same library?

Yes. Each plugin loads into its own isolated AssemblyLoadContext, so private dependency versions don't collide between plugins or with the host.

Is there hot reload?

No. Plugins are scanned once at startup. Rebuild, redeploy, and fully restart TradeStrike to pick up changes.

What framework should I target?

net10.0 (or higher within the same major) — the same baseline as the contract assemblies and the TradeStrike host.

Does a failing plugin crash the host?

No. A missing folder, a malformed DLL, or a type that fails to register is captured in the install report and host startup continues. The failure is surfaced in the Log tab.