Tradovate ATM (Scale-Out Brackets)
On the NT8 Add-On, an ATM strategy is a template you save inside NinjaTrader and reference by name (atm_strategy=your-template;). Tradovate has no desktop template store, so those template names are not portable. Instead, Tradovate webhooks build the managed bracket inline with atm_* fields, which CrossTrade sends to Tradovate as a native multibracket order strategy: one managed entry with any number of scale-out target and stop tiers.
Sending strategy= or atm_strategy= with destination=tradovate; returns an error. (Previously these fields were ignored, which placed an unprotected entry with no stop and no warning.) Build the bracket inline with the atm_* fields below instead.
Fields
| Field | Required | Meaning |
|---|---|---|
atm_targets | Yes | Comma-separated profit-target offsets, one per tier (scale-out). |
atm_stops | Yes | Stop offset(s). One value applies to every tier, or give one per tier. |
atm_qtys | No | Contracts per tier. Must sum to qty. If omitted, qty is split evenly with the remainder on the last tier. |
atm_trail | No | Per-tier trailing stop (true/false). One value applies to all tiers. |
atm_breakeven | No | Target tier number whose fill moves the remaining stops to breakeven. |
atm_breakeven_offset | No | Ticks or points past entry for the breakeven stop. Default 0. |
Units and direction
Offsets are distances from the entry price, not absolute prices. A bare number or a tick suffix means ticks; a pt suffix means points. On ES (tick size 0.25), atm_targets=20 is 20 ticks (5.00 points) and atm_targets=5pt is 5.00 points. Direction is automatic from the order side, so always give positive numbers: a long targets above and stops below the entry, and a short is the mirror image.
Example: two-target scale-out with a trailing runner
Enter 2 contracts, scale out 1 at 20 ticks and 1 at 40 ticks, each protected by a 15-tick stop, and let the runner trail:
key=your-secret-key;
command=place;
account=your-tradovate-account;
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;
Example: breakeven after the first target
Move the remaining stop to breakeven (plus 2 ticks) once the first target fills:
key=your-secret-key;
command=place;
account=your-tradovate-account;
instrument=ES1!;
action=sell;
qty=2;
order_type=market;
atm_targets=20,40;
atm_stops=15;
atm_qtys=1,1;
atm_breakeven=1;
atm_breakeven_offset=2;
destination=tradovate;
Breakeven is target-fill-triggered: the remaining stops move only after target tier 1 fully fills, not merely when price moves that far. Tradovate's automated bracket has no native breakeven parameter, so CrossTrade manages it: it watches for the target fill, then moves the surviving stop orders. The pending move is stored server-side, so it still fires if CrossTrade restarts in the meantime.
Where it works
atm_* is valid on the entry commands: place, flatplace, reverse, and reverseposition. On flatplace the same-instrument position is flattened first; on a reverse the tiers are re-sized to the reversed position.
Limits (v1)
- A stop is required (
atm_stops). A target-only ATM is rejected, so a Tradovate entry is never left unprotected. atm_*cannot be combined withtake_profit/stop_loss(use one bracket style, not both) or withcancel_after.atm_breakevencannot point at the final tier (there is no remaining stop to move), and cannot be combined with a trailing tier after the trigger.- To cancel the whole ATM, send
command=cancel;with the sameorder_idyou set on the entry alert. Modifying a running ATM (change) is not supported yet, so cancel and re-send. - Copiers replicate the ATM to followers, re-sized to each follower's quantity with the same scale-out proportions.
For a single target and stop (no scale-out), the simpler take_profit / stop_loss bracket also works on Tradovate.