AI limitations
The builder refuses rather than guesses. This page is the complete list of what it refuses, why, and what to say instead.
A refusal is a feature. The alternative, a model confidently producing something adjacent to what you asked for, is worse in exactly the situations where it matters most, because a plausible-looking wrong rule backtests and deploys as happily as a correct one.
The four refusal reasons
A compile failure is a typed value, not an absence. That matters because three different problems would otherwise be indistinguishable:
| The phrase | The problem |
|---|---|
| "buy on strong momentum" | A phrase we do not know |
| "buy when price is near the 20 EMA" | A real comparison, but no threshold |
| "buy unless RSI above 70" | An exception scope we cannot express |
These are not the same failure and they do not want the same response.
UNKNOWN_PHRASE: no pattern matched
The ordinary deferral, and the cheapest thing that can happen after a miss. A language model may still read it, so it is retried, narrowly, only this span, with everything else frozen.
| Triggers on | What happens |
|---|---|
| "buy on strong momentum" | Retried once. If the second pass reads it, it proceeds |
| Unusual phrasings of a supported rule | Usually resolves |
| A genuinely novel construct | Falls through to a question |
What to do: nothing, usually. If it comes back a second time, restate the rule in terms of an indicator and a comparison.
MISSING_THRESHOLD: a real comparison with no number
The structure is understood; only the value is absent. Cheap to resolve and safe to default,
which is why it is separated from UNKNOWN_PHRASE.
| Triggers on | Why |
|---|---|
| "near the 20 EMA" | Near by how much? |
| "strong volume" | Above what? |
| "high RSI" | Above what level? |
| "close to the previous high" | Within what distance? |
Words that trigger it: near, around, about, approximately, close to, strong, weak, high, low, heavy, light, significant, decent, good.
One subtlety worth knowing. The check does not simply look for any digit. In "near the 20 EMA" the 20 is the indicator's period, not the level the price must reach. Indicator periods are subtracted before the threshold search, so that span is correctly identified as missing a threshold rather than treated as fully specified.
What to do: state the number. "Within 0.5% of the 20 EMA". "Volume above 1.5× the 20-period average".
AMBIGUOUS_SCOPE: never retried
Words that re-scope everything around them: unless, except, except when, other than, apart from, rather than.
The compiler bails on these deliberately, and does not retry, because the failure mode of guessing is an inverted rule that looks plausible.
Consider: "buy when RSI crosses 55 unless volume is falling." Does "unless" negate the whole entry, or only the RSI clause? Both readings produce a valid strategy. One of them is the opposite of what you meant, and there is no way to tell which from the backtest.
So you are asked.
What to do: state the rule positively. Instead of "buy unless RSI is above 70", say "buy when RSI is between 40 and 70". Instead of "enter except during the first 15 minutes", say "enter between 09:30 and 15:15".
NOT_REPRESENTABLE: refused, and retrying cannot help
No field on the strategy specification can hold what you asked for. The only truthful answers are "we cannot do that" or an explicit hand-off, never a silently substituted approximation.
Known cases:
| You asked for | Why it cannot be expressed | Nearest thing available |
|---|---|---|
| A mark-to-market breaker in rupees, at build time | The strategy object has no field for it | Configure mark_to_market_loss as an execution gate after deploying |
| "Keep 20% of capital in cash" | No cash-reserve field exists | Allocate 80% of the capital to the strategy instead |
The list is short because most trading rules are representable. When you hit one of these, the message names it rather than approximating.
Scope limits: what the platform will not build
Distinct from the refusal reasons above. These are about coverage, not language.
Forex is out of scope
The builder will not create an FX strategy. FX OTC instruments and an adapter exist in the platform, but the user-facing picker is disabled by default and the AI's own scope statement excludes forex.
The reason is regulatory rather than technical: retail OTC forex on offshore venues raises questions under FEMA and RBI rules that are separate from equity or crypto. See Regulatory position.
Derivatives: buildable and backtestable, not live-tradeable
Futures and options are supported by the builder, NSE index and stock futures and options, and crypto perpetual futures. Named multi-leg structures are supported: straddle, strangle, vertical spreads, iron condor, butterfly, covered call.
Live derivative entry is refused by the execution engine, because the live exit path is not implemented and a capability that can open a position it cannot close must not be reachable. So you can build, backtest and paper-trade derivatives; you cannot trade them live. See Derivatives.
Instruments outside the universe
An instrument not in the platform's universe is refused with the supported set shown, grouped by category. This is a data-coverage limit, not a language one, see Instruments.
Backtest window floor
No backtest can start before 1 January 2024. Requesting an earlier start returns the earliest supported date rather than silently clamping. See Choosing a test period.
Timeframes
Any well-formed interval from 1 minute to 1 day is accepted. The engine fetches 1-minute data and resamples, so arbitrary intervals work, 2m, 7m, 45m, 4h are all valid, not just the curated presets. Anything outside 1m-1d is refused with both bounds stated.
Limits of the AI as a component
Being explicit about what the builder is not:
It does not know your account. No balance, no positions, no P&L. The state it receives is a bounded projection of the strategy conversation and nothing else. It cannot size a position against your real capital.
It does not evaluate whether your idea is good. It builds what you describe. A well-constructed strategy expressing a poor idea passes every check.
It does not remember across sessions in the way you might expect. It sees the last six non-system messages, truncated, plus the resolved strategy state. It is not reading your whole history.
It cannot invent an indicator. Every value it produces is parsed against the engine grammar before insertion, precisely so a fabricated indicator name cannot reach a formula. See Validation.
It will not tell you what to trade. A dedicated refusal path handles requests of that shape. See What the AI will not do.
Known guard limitation, stated plainly
The reply guard that catches buy/sell phrasing and overpromise language currently applies to
conversational intents only: general_chat and clarification. Replies on other intents,
including strategy explanation and backtest narration, take a path with no content check.
The control exists and is well built; its scope is narrower than its purpose. It is documented here rather than left for you to discover, and the remedy is on the compliance roadmap. In the meantime: a statement about expected outcomes in a backtest narration is not a platform guarantee, and the risk disclosure applies regardless of how a reply is worded.
Quick reference
| Symptom | Reason | Fix |
|---|---|---|
| "I could not read near the 20 EMA" | MISSING_THRESHOLD | State the distance |
| A question about what "unless" applies to | AMBIGUOUS_SCOPE | Restate positively |
| "The platform cannot express a cash reserve" | NOT_REPRESENTABLE | Reduce the allocation instead |
| "Forex is out of scope" | Scope limit | Not available |
| "Live F&O entry is refused" | Safety gate | Backtest and paper only |
| "Backtests are supported from 01 Jan 2024" | Data floor | Choose a later start |
| "That stock isn't in my universe yet" | Coverage | Pick from the shown set |
| A safety boundary instead of an answer | Advice request | See safety boundary |