Order Types and Exits on Tradovate
Getting into a trade is one line. Getting out well is the actual work. This guide covers every exit and order-type tool the Tradovate destination offers, including several that don't exist on the NinjaTrader webhook path, because Tradovate orders run in the broker's cloud.
The big idea throughout: everything here is server-side. Brackets, trailing stops, scale-out tiers, and scheduled cancels live on Tradovate's servers once placed. Your computer can be off; the exits keep working.
The Three Approaches
1. A simple bracket (take_profit / stop_loss): one target, one stop, linked as an OCO. Right for most single-target setups.
2. A scale-out ATM (atm_* fields or a named template): multiple target tiers, per-tier stops, trailing runners, auto-breakeven. Right when you exit in pieces.
3. TradingView-managed exits: your strategy or indicator sends the exit signals and no resting protection exists. Only right when paired with at least a catastrophic stop from approach 1.
You choose one bracket style per entry: atm_* cannot be combined with take_profit / stop_loss in the same alert.
Approach 1: The Simple Bracket
Add two fields to any place and CrossTrade sends a single broker-side OSO: the entry plus a linked target and stop that cancel each other when one fills.
key=your-secret-key;
command=PLACE;
account=DemoAccount;
instrument=ES1!;
action=BUY;
qty=1;
order_type=MARKET;
take_profit=5300.00;
stop_loss=5285.00;
destination=tradovate;
Price formats: absolute prices always work. Relative offsets work too: ticks (take_profit=20 or 20tick), points (5pt), percentage, and dollar forms. They are resolved to absolute tick-rounded prices by CrossTrade's quote service at send time, measured from your submitted limit_price or stop_price when the entry carries one, or from the live quote for market entries. If no fresh, trusted quote is available, the alert fails closed: no order is placed, and the failure is recorded in Alert History. Continuous-contract alerts are pinned to the concrete contract that was quoted.
How this differs from NinjaTrader: the NT8 Add-On holds a bracket for a working limit or stop entry and measures the offsets from the actual fill price once the entry fills. On Tradovate the bracket prices are fixed when the order is submitted and are not recalculated from the fill. If you want fill-measured distances on Tradovate, use a scale-out ATM (Approach 2): atm_targets / atm_stops offsets are applied by Tradovate's native order strategy to the actual fill. Full breakdown: which price an offset is measured from.
The bracket stop is a plain Stop order. The NinjaTrader stop-limit bracket fields (stop_loss_stop, stop_loss_limit) are rejected on Tradovate. Manual oco_id grouping is also rejected: setting both take_profit and stop_loss links the legs for you.
Approach 2: Scale-Out ATMs (atm_*)
For multi-tier exits, the atm_* fields build a native Tradovate multibracket order strategy: one managed entry with any number of scale-out target and stop tiers.
Enter 2 contracts, take 1 off at 20 ticks and 1 at 40 ticks, each protected by a 15-tick stop, with the runner trailing:
key=your-secret-key;
command=PLACE;
account=DemoAccount;
instrument=ES1!;
action=BUY;
qty=2;
order_type=MARKET;
atm_targets=20,40;
atm_stops=15;
atm_qtys=1,1;
atm_trail=false,true;
destination=tradovate;
Move the surviving stops to breakeven (plus 2 ticks) once the first target fills:
atm_targets=20,40;
atm_stops=15;
atm_qtys=1,1;
atm_breakeven=1;
atm_breakeven_offset=2;
Offsets are distances from entry, not absolute prices: bare numbers are ticks, pt means points, and direction is automatic from the order side (always give positive numbers). Breakeven is target-fill-triggered: stops move after tier 1 actually fills, not merely when price gets there.
The rules that keep you out of trouble (v1 limits):
- A stop is required. A target-only ATM is rejected, so an entry is never left unprotected.
atm_*can't be combined withtake_profit/stop_lossor withcancel_after.atm_breakevencan't point at the final tier, and can't be combined with a trailing tier after the trigger.- To cancel the whole ATM, send
command=cancel;with theorder_idyou set on the entry. Modifying a running ATM isn't supported yet: cancel and re-send.
Tradovate may accept the ATM before CrossTrade's breakeven watcher starts. If the watcher can't start or can't confirm a stop move, the ATM stays live at the broker but automatic breakeven is degraded. CrossTrade warns on the alert (and in the Copy Log for copied followers). Don't assume breakeven is active when that warning appears.
Named templates: save the same fields once as a CrossTrade ATM Template on Tradovate Webhooks → ATM Templates, then reference it with atm_strategy=Two Target Runner;. The active template is resolved when each signal arrives, so edits apply to the next signal immediately. Template atm_qtys must sum to the alert's qty, and named templates can't be mixed with inline atm_* fields. Full reference: Tradovate ATM.
Native Trailing Stops
On NinjaTrader, trailing from a webhook requires an ATM template. Tradovate has trailing as a first-class order type:
key=your-secret-key;
command=PLACE;
account=DemoAccount;
instrument=ES1!;
action=SELL;
qty=1;
order_type=TRAILINGSTOP;
stop_price=5290.00;
trail_offset=8;
destination=tradovate;
stop_price is the initial trigger and trail_offset (alias peg_difference) is the trail distance. order_type=trailingstoplimit adds limit_price; all three fields are then required.
Tradovate-Only Order Types and Modifiers
MIT (market if touched): order_type=MIT; with the touch price in limit_price. A resting order that becomes a market order when touched.
Iceberg: max_show=2; displays only part of the true size in the book.
Extra TIFs: tif=IOC, tif=FOK, and tif=GTD (GTD requires expire_time= in ISO-8601). Day and GTC work as on NinjaTrader, and on Tradovate entries, tif is optional entirely.
Broker-side limit-order timeouts: cancel_after=30; (minutes, 1 to 180) schedules the cancel on Tradovate's servers, so on live accounts an unfilled limit order dies on time even if your machine and CrossTrade are both unreachable at that moment.
Scheduled cancels: on the cancel command, activation_time= (ISO-8601) schedules the cancellation broker-side for a specific moment.
Tradovate's demo environment, which also hosts most prop-firm evaluation accounts, records GTD expirations and scheduled cancels but never executes them. CrossTrade watches those deadlines server-side and cancels the order itself shortly after they pass, so GTD, cancel_after, and activation_time work on every account type. On demo accounts the cancel typically lands within half a minute of the deadline.
Order notes: notes=morning breakout; rides to Tradovate as the order's text, visible in Tradovate's own UI and reports. Tradovate caps order text at 64 characters; longer notes are truncated on the way to the broker (Alert History keeps the full text).
Protecting a Position You're Already In
cancelandbracket wraps a live position in a TP/SL OCO after the fact: it cancels the instrument's working orders, then places the bracket around the existing position. action=buy protects a long, action=sell protects a short (it names the protected side, not the exit side). It requires a matching open position, clamps quantity to live size, and aborts if the position goes flat or flips during cancellation.
key=your-secret-key;
command=CANCELANDBRACKET;
account=DemoAccount;
instrument=ES1!;
action=BUY;
take_profit=5305.00;
stop_loss=5288.00;
destination=tradovate;
The Orphaned Orders Problem
Exit orders can outlive the position they protect: the classic case is a manual close that leaves the old bracket resting. On Tradovate the built-in cleanups are:
flatten_first=true;on an entry clears the same account and contract (position and nonterminal working orders) and waits for settlement before entering.- A full
closepositionuses Tradovate's liquidate endpoint, which also cancels that contract's working orders. cancelorders(account-scoped, optionally per-instrument) andcancelallorderssweep resting orders explicitly.flatplaceis the atomic version: flatten, cancel, confirm both cleared, then enter. The entry is withheld if settlement can't be confirmed.
If you regularly close positions manually inside Tradovate, remember signal-side cleanups can't see what you did there; sweep with cancelorders or check the platform.
Accepted Is Not Resting: Late Broker Rejections
Tradovate's API can accept an order (green row, order id) and reject it a second later in its risk layer: the classic case is a stop or limit outside the product's exchange price bands (InvalidPrice). CrossTrade re-checks ordinary placements a few seconds after acceptance and flips the Alert History row to a yellow warning carrying Tradovate's reason. If your prices sit near the bands, glance back after placement. Native multibracket ATMs use their own strategy lifecycle instead.
Choosing Your Exit Style
- One target, one stop →
take_profit+stop_loss. Simplest, fully server-side. - Scaling out, trailing runner, breakeven automation →
atm_*or a named template. - Exit levels computed per-trade in Pine → build the payload in
alert_messagewith calculated offsets (strategies guide). - TradingView manages exits → keep a catastrophic
stop_losson the entry anyway.
Tradovate ATM support is still beta: verify the complete entry, target, stop, and breakeven lifecycle on a Demo account before using it live.
Related: Tradovate ATM reference · Bracket Orders · Tradovate: Exclusive Features & Execution Internals · Destinations matrix