Troubleshooting & FAQ
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.
On this page
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 allNaNrenders 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
Strategybase with a zero-arg ctor. If it doesn't subclassStrategyit 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
NaNby design — guard with a warmup check before computing. -
You divided by zero or propagated a
NaNinput. OneNaNin an arithmetic chain poisons the result; validate inputs before using them. -
NaNis the intended "no value" sentinel. Leaving a plot unassigned on a bar reads back asNaNand is rendered as a gap — that is expected, not a bug.
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.
- 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.