How the system works
Proposals and approval
The life of one trade proposal: how it is formed, every gate it must pass, when it needs your explicit approval, and what each rejection reason means.
Last reviewed: 25 August 2026
What a proposal is
A structured request, not an instruction. It names a symbol and a direction, proposes a size and stop and target levels, and carries a confidence score the model is required to produce. It is published to a message bus, where the risk engine picks it up.
Nothing about a proposal reserves margin, touches your broker, or commits you to anything. Until the risk engine approves it and the execution engine dispatches it, it is a row in a list.
Before the model is consulted
Your watchlist is screened first. Instruments that do not currently look tradeable on trend-strength and noise measures are dropped before the model sees them. This is a cost and quality control at once: it stops the agent being asked to have an opinion on an instrument that is going nowhere, which is where low-conviction trades come from.
The model then reads candles, volatility context, and the economic calendar for what survived. A proposal whose confidence falls below the configured threshold is discarded on the Python side and never reaches the risk engine at all.
The gates, in the order they are applied
The risk engine re-checks everything independently. It does not treat the confidence score as evidence, and it does not trust that the upstream validator ran.
| Gate | Rejects when |
|---|---|
| News blackout | A scheduled high-impact release for the instrument’s currency is imminent or just passed |
| Volatility circuit breaker | Recent price movement is outside the configured band for that symbol |
| Stale data | The last tick for that symbol is older than the freshness limit |
| Rate limit | That symbol has already produced its allowed number of proposals this hour |
| Correlation and concentration | The new position would push correlated exposure past the configured ceiling |
| Session and liquidity | The current time falls in a blackout window, such as daily rollover or the weekend close |
| Position count | You already hold the maximum number of concurrent positions |
| Margin sufficiency | The account cannot support the position |
| Spread | The current spread on that symbol is above its configured ceiling |
| Daily loss and drawdown | The day’s loss limit or the equity drawdown limit has already been reached |
Every default value for these is listed in the risk policy reference.
Sizing is calculated, not accepted
The size that gets traded is computed by the risk engine from your configured base size and current account state. It is not taken from whatever number the model suggested. A model proposing ten times your usual size receives your usual size, or a rejection — not ten times your usual size.
When a human has to say yes
If the size to be traded reaches your human-approval threshold, the proposal does not execute. Its status becomes REQUIRES_HUMAN_APPROVAL and it waits in the console for an explicit approve or reject.
Understand what the threshold actually controls
If you never answer, it never executes. The default outcome of your silence is always inaction.
After approval
The execution engine dispatches an order command to your terminal, the broker fills it, and the fill is reported back and reconciled into the record. From that moment the trade belongs to position management, and the AI has no further involvement in it.
A rejected order — a requote, a closed market, an invalid level — is reported back with the broker's own error code rather than silently retried at the terminal. Retry decisions belong to the execution engine, where they can be seen and recorded.
Why a rejection is not a malfunction
Most proposals are rejected, and the rejection reason is always recorded with the specific rule that produced it. A system that approved everything the model suggested would not need a risk engine. Seeing the rejections is how you audit whether the limits you set are the limits you meant to set — see Audit trail.