OptionalcompiledWhen the live compilation was produced.
OptionaldetailWhy validation failed, or why a queued check has not reported. Present on failed, and
alongside validationStalled.
OptionaldryThe check did not finish its budget — it ran out of time, was refused because the platform was already holding too many unfinishable runs, or hit a failure attributable to the synthetic instrument rather than to your strategy. The verdict stands as far as it went; it simply reached less than a full run would.
OptionalnoticesWhat the run surfaced. An empty or absent list is not a clean bill of health when
dryRunIncomplete is true — see that field.
OptionalnoticesHow many notices were dropped past the cap. Absent when none were.
OptionalrequiredThe market data a strategy needs, read off the compiled class rather than off anything
you sent — TickerStrategy, KlineStrategy and FundingRateStrategy each declare one,
and a MultiSourceStrategy declares a set.
Absent is not "needs nothing". A strategy always needs market data, so an absent
field never means an empty requirement — it means the platform could not establish the
answer without constructing your strategy, which it will not do to fill in a field.
That happens for a MultiSourceStrategy, for a class that overrides
getMarketDataSource(), and for anything registered before this field existed;
re-registering the source fills it in.
OptionalvalidatedWhen the verdict was recorded. Absent until there is one.
not_validated — registered, never checked. POST /strategy/{strategyId}/validate
checks it.pending — a check was asked for and has not answered yet.passed — the class loaded and survived its first event.failed — it did not; detail says how.OptionalvalidationA queued check has not reported for far longer than one takes. Nothing is disproved about the strategy — the check has not run. Stop waiting and re-request it later.
What is known about a registered strategy: that it compiled, and what validating it found.
validation: passeddoes not mean the strategy is correct. It means the class loaded and survived the first event of a short synthetic run — a floor, not a guarantee. WhendryRunIncompleteis true it is a lower floor still, because the run did not finish.