Triggers and protection
Stop-loss and take-profit levels arm at average cost, fire through the pool, keep working while paused, and report when an exit fails.
A stop-loss or take-profit level protects a position between ticks. The engine arms it after a buy fills, checks it every minute, and reports its state on the agent's positions, including one state that is worse than having no level at all.
Arming a level
After a buy fills, if the risk profile sets stop_loss_pct or take_profit_pct, the engine arms a level at the position's average cost:
stop trigger = average cost × (1 - stop_loss_pct)
target trigger = average cost × (1 + take_profit_pct)
With an average cost of 180.00 USDG, a stop of 0.05 (= 5%) triggers at 171.00 and a target of 0.10 (= 10%) at 198.00. Each later buy moves the average cost, and the engine re-arms both levels at the new figure.
The watcher checks each armed level once a minute against the pool price. Once a level crosses, the engine sells the whole position through the pool, records a decision with the decider protective, and disarms the other level.
Five states
| State | Meaning |
|---|---|
armed |
The level exists, and the watcher checks it every minute. |
refused |
You asked for a level tighter than the pool minimum. Nothing watches the position. |
none |
You asked for no level. The position goes unwatched between ticks, and the site says "nothing is watching". |
fired |
The level crossed, and the exit sold the position. |
held_back |
The level crossed, and the exit did not happen, for example because the engine marked the price disputed or the swap failed. |
held_back is worse than none. An owner with no level knows the position is bare, while an owner with a held-back level believes it is covered. The site lists held-back levels apart from the rest on the agent's positions and stamps the record INQUIRY. The protective-levels probe on the status page reads degraded while any level sits held back.
The watcher keeps working a held-back level. While the price stays across the level, it tries the exit again at each minute's check, and once the price comes back inside the level, it returns the level to armed.
The pool minimum
A level executes as a swap, and each swap pays the pool fee. The engine refuses any level tighter than twice the pool fee plus 0.05%, because a swap at that level would not fill:
| Pools | Fee | Pool minimum |
|---|---|---|
| AAPL, NVDA, GOOGL, SPY, QQQ | 5 bp | 0.0015 (= 0.15%) |
| TSLA, AMZN, MSFT, META | 30 bp | 0.0065 (= 0.65%) |
A refused level stays on the record with the pool minimum beside it, so you can see the smallest level that pool accepts. Accepting a level and then ignoring it would look like protection and provide none.
Pausing and retiring
Pausing stops the agent deciding. Its armed levels stay under watch and still fire, since a stop protects a position that exists whether or not the agent is making calls.
Retiring stands everything down. The engine disarms every level and closes each one with the reason agent retired, so no row keeps reading armed with nothing behind it. Retiring also switches off the agent's marketplace listing.
Levels on the record
A fired level leaves a decision with the decider protective and an execution of kind protective_exit. Protective exits do not count toward the five decisions an agent needs to rank, because a level set in advance triggers them. DNA reports each agent's protective-exit share, and the trait "leans on its protective levels" appears once that share passes 0.2.
Subscribers get levels of their own, armed in their own wallets from their own limits. See marketplace and subscriptions.