Moving a stop by alert

breakeven and update: move the stop behind an open position, never place one. Being proven on Tradovate, switched on per account.

Two actions trade nothing at all. breakeven and update move the stop — and the target, if you send one — that rests at your broker behind a position that is already open, normally the stop and target Tradeus sent with the entry. They change the level of an order that is already there. They never place a stop, never cancel one, and never open, size or close a position. This is being proven on Tradovate and switched on per account, and not on any other broker yet (see Which brokers, below): until it is switched on for your account, every move is answered not_supported and nothing is sent.

Which stop. The one stop working behind the position is the one moved — normally the stop Tradeus placed with the entry, but a single stop you placed by hand is moved just the same. Tradeus's record of which stops it placed does not survive a restart of the server, so it cannot be what decides; a stop resting on the other side of the market, waiting to enter a trade, is not behind the position and is never touched. With several stops behind the position, the move is refused — unless exactly one of them is the stop Tradeus's own entry placed, which is then the one moved, for as long as that record is there.

Your bot decides when
Tradeus has no market feed, so it cannot see a trade reach a profit by itself — the sender decides the moment and sends the alert then. For a move at 2R, the trigger is twice the stop's distance: a stop 10 points from the entry means sending breakeven once the trade is 20 points in profit; a stop 20 points away, at +40. Send price with it — your market price at that moment.
Breakeven — stop to each account's own entry, plus 1 point
{
  "passphrase": "YOUR-PASSPHRASE",
  "ticker": "MNQ1!",
  "action": "breakeven",
  "be_offset": 1,
  "account": "APEX-1234",
  "price": 19862.25,
  "id": "t8812-be"
}
Update — stop and target to prices you name
{
  "passphrase": "YOUR-PASSPHRASE",
  "ticker": "MNQ1!",
  "action": "update",
  "sl": 19850.25,
  "tp": 19920,
  "account": "APEX-1234",
  "price": 19871.5,
  "id": "t8812-trail1"
}

The fields

action
breakeven moves the stop to each account's own average entry, plus be_offset. update moves the stop to sl and the target to tp — either or both; with neither it is refused, naming both fields. update with "sl": "entry" is the same as breakeven.
sl
On update: a price, or the word entry. entry on a buy or sell is refused — an order that opens a position has no entry yet. TradersPost's stopLoss.stopPrice is read too, with the same warnings as on an entry. A price between two ticks goes onto the instrument's tick grid on the tighter side — up on a long, down on a short — and the answer names the level that was sent.
tp
Optional. The new target price, or TradersPost's takeProfit.limitPrice. A price between two ticks goes onto the grid away from the market — up on a long, down on a short — so rounding can never bring it to the price, where a limit fills at once.
be_offset
Optional. How far past the entry the stop goes, in price points (on MNQ one point is four ticks), 0 or more, and only with breakeven or "sl": "entry". On a long the stop goes to entry + offset, on a short to entry − offset, rounded to the instrument's tick on the side that keeps it at or past that level: up on a long, down on a short. TradersPost's breakevenOffset is refused rather than read: TradersPost's own pages give it in dollars on one and in ticks on another, and a stop placed in the wrong unit is a stop in the wrong place.
price
Required. Your market price when the bot decided. It is the only view of the market Tradeus has, so every new level is checked against it before the broker is asked: on a long the stop must be below it and the target above it, on a short the other way round. A move without price is refused.
account
Send the same account as the entry. Without it, the stop moves on every subscribed account that holds the instrument — see The TradingView alert.
position / sentiment
Optional: long or short. An account holding the other side is skipped. flat is refused — to close, send exit.
quantity
Ignored. A move covers the whole position in the instrument.
id
Optional. A move is never a duplicate of its entry, even under the entry's own id. The same move — same id, instrument, account and levels — sent again inside 60 seconds is a duplicate; the same id with new levels is a new move. Without an id, the alert's price is part of what makes it one move: a breakeven names no level, so two breakevens for two trades a minute apart are told apart by their prices. One id per trade is still the surer way.
time
Optional. A move older than the subscription's age limit is skipped — the opposite of an exit, because not moving leaves the stop that is already resting, and a late breakeven is worked out for a market that has moved on.

Each account's own entry

entry is each account's average entry as its broker reports it — not the alert's price, and not your fill. Two accounts that filled two ticks apart get two different breakevens, each at or past its own. On a copy group the same holds for every follower: breakeven moves each follower to its own entry. An absolute sl or tp moves each follower to exactly the leader's level — and only where the follower names the instrument the same way the leader does, because a level is a price on one instrument. A follower whose broker cannot move a stop by alert is named in the answer and left as it is.

What it will not do

  • Widen a stop. A move only tightens: on a long the new stop must be above the one resting, on a short below it. A looser one is refused, naming both levels. If you really mean to widen, do it by hand in your broker's platform.
  • Place a stop. With no stop resting behind the position, the move is refused. Nothing is placed in its stead.
  • Move a trailing stop or a stop-limit — or a stop whose status is not Working, because a change to it is already under way. Each is refused with the broker's own name for it.
  • Pick one of several stops. If more than one stop rests behind the position, the move is refused and the levels are listed — unless exactly one of them is the stop Tradeus's own entry placed, which is then the one moved. A single stop is moved whoever placed it (see Which stop, above).
  • Act on a flat account. Skipped, nothing sent. That is the usual answer when the stop filled before the move arrived.
  • Run late. Older than the age limit, it is skipped. A position opened in an earlier session is refused a breakeven too: what the broker's average means for it is not proven.
  • Park for confirmation. On a subscription that confirms orders by hand, a move is held with a reason, never parked: by the time anyone confirmed it, it would be stale.
  • Race the account lock. While the lock is closing the account, the move is skipped. A locked account that is not being closed still takes a move — it can only take risk off — and outside your trading window a move follows the exits setting.
Not for trailing every few seconds
Every move costs your broker login several requests, and the login's budget is shared with the lock's own measurement. So moves by alert are capped at 600 an hour per broker login, and a move past that is skipped with that reason — the stop already resting still protects. When several moves for one account queue up, only the newest is sent; the ones it overtook are skipped as superseded. If that newest one is then turned down as a whole — its target already passed, say — nothing moves: send the move again, and it is routed again.

How you know

Every account row in the answer carries a status and a code — the word to branch on, listed below; the reason is the same thing as a sentence for a person, and its wording can change. A move is there only where a leg was looked at or sent: the stop's from and to, its order id, confirmed, and the entry a breakeven was worked out from. A row that never reached the account's stop — not supported, stale, flat, superseded, aimed at another account, turned down by Tradeus itself — has none, so read code first and move only where it is there. "status": "ok" means the broker read back the new level — or that the stop was already there and nothing was sent, which the reason says. "confirmed": false means the change was sent and not seen to land; the row is an error, and Tradeus reads the stop again a few seconds later and writes the final word to your log. A refusal by the BROKER carries the broker's own words and where the stop is now; a refusal Tradeus decided before asking the broker — a widening, a stop past the price — names both levels in the reason. A stop that filled while the move was on its way, or was cancelled because the target filled, is not a refusal to worry about: the position is read again, and a flat account is answered flat_after. Only where the position is still open with no stop working behind it does the log say that position is unprotected, and the operator is alerted. Sending the same breakeven again is always safe: a stop already at its level is answered as already there. A move whose answer was an error or rate_limited is routed again when you resend it, even inside the 60-second duplicate window; one that landed, or is still being sent, is answered as a duplicate.

Answer, shortened
{
  "ok": true,
  "accounts": [
    { "accountId": "70276688", "role": "subscriber", "status": "ok",
      "code": "moved", "reason": "stop moved 19818 → 19842.5 (breakeven: entry 19842.37 +0)",
      "move": { "stop": { "from": 19818, "to": 19842.5, "orderId": "687826985974", "confirmed": true }, "entry": 19842.37 } },
    { "accountId": "70276695", "role": "subscriber", "status": "skipped",
      "code": "flat", "reason": "flat — no MNQZ2026 position to move a stop behind" }
  ]
}
The codes
Moved, or nothing to do
moved — the broker read back the new level. already_there — the stop or target already rests at that level; nothing was sent.
Sent, not settled
unconfirmed — sent and not seen to land; the log has the second read's verdict. refused — the broker refused it; the reason has its words and where the stop is now.
Flat
flat — no position to move a stop behind. flat_after — the stop filled, or the target filled and took it along, while the move was on its way: the account is flat and nothing is left to protect.
Never sent to this account
not_supported — not switched on for this account or broker. other_account / account_unmatched — the alert's account names another account, or none of them. stale — older than the age limit. outside_window — outside the trading window, with exits held to it. manual_not_parked — a subscription that confirms by hand. lock_close_in_flight — the lock is closing the account. superseded — a newer move for the same stop or target arrived while it waited. invalid_move — a move without a level reached the account.
Follower or instrument
market_mismatch — a follower trading another market. different_symbol — a follower naming the instrument differently, for an absolute level. symbol_lookup_failed / symbol_unresolved — the account's name for the instrument could not be looked up, or there is none. read_failed — the position and its stop could not be read. position_mismatch — the account holds the other side than position says.
What rests behind the position
no_working_stop / no_working_target — none to move; none is ever placed. several_stops / several_targets — more than one, none plainly Tradeus's. unmovable_type — a trailing stop, a stop-limit or another type. change_in_flight — a change to it is already under way. level_unknown — the broker reports no level for it.
Breakeven
entry_unknown — no average entry reported. carried_over — opened in an earlier session. tick_unknown — the instrument's tick is not known.
The level itself
would_widen — the stop would loosen. wrong_side_of_price — the stop is at or past your price, or no price came. crosses_target — stop and target would cross. target_wrong_side — the target is at or behind your price.
Budgets
modify_ceiling — the login's hourly ceiling for moves is reached. rate_limited — the connection's order limiter is.

Your log has the same under Risk: stop moved · … with both levels, stop not moved · … with the reason, and stop move refused · … with the broker's words.

Which brokers

Tradovate
Being proven. It is switched on per account once a walk on a Tradovate practice login has shown that a move lands where it was sent and that a refused one leaves the old stop working. Until it is on for your account, the answer says so and nothing is sent.
Rithmic and every other broker
Not yet. The answer says so and nothing is sent. A stop you move by hand in your broker's own platform is a different thing — see the Trade Copier page for what the copier does with that.

Also in Strategies and signals