Destinations: NinjaTrader vs Tradovate
Every CrossTrade webhook is routed to a destination: the broker connection that actually executes the order. CrossTrade supports two destinations today.
| Destination | How it executes | Requires |
|---|---|---|
NinjaTrader 8 (nt8) | The CrossTrade XT Add-On running inside your NinjaTrader 8 desktop application receives the order and submits it through NinjaTrader. | NinjaTrader 8 open, XT Add-On installed and connected. |
Tradovate (tradovate) | CrossTrade sends the order directly to Tradovate's cloud API over HTTPS. No desktop software runs on your side. | A linked Tradovate account (My Account, Brokers tab). |
Choosing a destination
Add a destination= field to your alert. When you omit it, the order routes to NinjaTrader 8, which keeps every existing alert working exactly as before.
| In your alert | Routes to |
|---|---|
(no destination field) | NinjaTrader 8 (default) |
destination=nt8; | NinjaTrader 8 (explicit) |
destination=tradovate; | Your linked Tradovate account |
The destination value is case-insensitive, and only nt8 and tradovate are valid. Any other value is rejected with a clear error.
NinjaTrader (default)
key=your-secret-key;
command=place;
account=Sim101;
instrument=ES 06-26;
action=buy;
qty=1;
order_type=market;
tif=day;
Tradovate
key=your-secret-key;
command=place;
account=DemoAccount;
instrument=ES 06-26;
action=buy;
qty=1;
order_type=market;
tif=day;
destination=tradovate;
The account for a Tradovate order is the Tradovate account name shown in My Account, Brokers tab after you link. Instruments accept the same three forms as NinjaTrader: TradingView continuous (ES1!, front month auto-resolved), NinjaTrader style (ES 06-26), or Tradovate style (ESM6).
Connecting Tradovate
- Open My Account and select the Brokers tab.
- In the Tradovate card, click Link Live or Link Demo and authorize through Tradovate's OAuth screen.
- Your accounts appear under the card once linked. Live and Demo are separate environments, and you can link multiple Tradovate identities (for example a personal account plus a funded firm) under each.
CrossTrade stores only an access token, refreshes it automatically, and never sees your Tradovate password.
About the "automated" flag
Tradovate's exchanges require that orders placed by a bot or any algorithmic process are flagged as automated. The field is isAutomated, it applies per order (not to login or to data requests), and CrossTrade sets it to true on every order it places to Tradovate for you. You do not add an automated= field to your webhook, and there is no such field. CrossTrade handles the compliance flag automatically.
If you place orders through Tradovate from another tool as well, make sure that tool also marks its automated orders correctly. CrossTrade only controls the flag on the orders it sends.
Command availability
Both destinations share the same command vocabulary. Where a command is unavailable on Tradovate, the reason is always the same kind of thing: the command is tied to a NinjaTrader-only concept (ATM strategies, the add-on's local order book, or a NinjaTrader-specific atomic primitive).
| Command | NT8 | Tradovate | Notes |
|---|---|---|---|
place | Yes | Yes | Core entry. Tradovate adds server-side brackets, trailing stops, iceberg, and GTD. See the option tables below. |
flatplace | Yes | Yes | Flatten the same account and instrument (which also cancels working orders), then enter. |
closeposition | Yes | Yes | Tradovate uses its liquidate endpoint. Partial close by percent is NinjaTrader-only (see ignored fields). |
flatten | Yes | Yes | Flatten one account and instrument. |
flatteneverything | Yes | Yes | Scope differs. On NinjaTrader this flattens every account. On Tradovate it flattens the one account you name (Tradovate liquidation is per account), so account is required. |
reverse | Yes | Yes | Flip the current position. On Tradovate, include action and qty in the payload; the live net position still determines the actual flip size. |
reverseposition | Yes | Yes | Same as above with an explicit direction. |
cancel | Yes | Yes | Cancel one order by order_id. |
cancelorders | Yes | Yes | On Tradovate this cancels working orders on your linked account. |
cancelallorders | Yes | Yes | On Tradovate this cancels working orders on your linked account. |
change | Yes | Yes | Modify a working order (price, quantity, type, TIF) by order_id. |
closestrategy | Yes | No | Closes a NinjaTrader ATM strategy by id. Tradovate has no ATM strategy concept, so there is nothing to close. |
cancelreplace | Yes | No | A NinjaTrader atomic cancel-and-resubmit primitive. On Tradovate, use change to modify a working order instead. |
cancelandbracket | Yes | No | A NinjaTrader composite that cancels working orders and attaches a protective bracket to a live position. On Tradovate, place a new entry with take_profit and stop_loss (a server-side OSO bracket) instead. |
You never get a silent failure. If you set destination=tradovate with a command that is not supported, CrossTrade rejects the alert with a message naming the command and listing the supported set, and the rejection is recorded in your Alert History.
Order types and time in force
| Capability | NT8 | Tradovate | Notes |
|---|---|---|---|
| Market | Yes | Yes | |
| Limit | Yes | Yes | limit_price required. |
| Stop / Stopmarket | Yes | Yes | stop_price required. |
| Stoplimit | Yes | Yes | limit_price and stop_price required. |
| MIT (market if touched) | No | Yes | Tradovate native order type. |
| QTS | No | Yes | Tradovate native quote-triggered type. |
| Trailing stop | No (webhook) | Yes | order_type=trailingstop with trail_offset. On NinjaTrader, trailing is handled through ATM strategies, not the webhook order type. |
| Trailing stop limit | No (webhook) | Yes | order_type=trailingstoplimit with trail_offset. |
| TIF Day, GTC | Yes | Yes | The documented NinjaTrader webhook values. |
| TIF IOC, FOK, GTD | No | Yes | Tradovate adds immediate-or-cancel, fill-or-kill, and good-till-date. GTD requires expire_time (ISO-8601). |
Options and fields on the Tradovate destination
Supported
These fields behave on Tradovate the same way you expect from NinjaTrader, unless a note says otherwise.
| Field | Behavior on Tradovate |
|---|---|
account | Tradovate account name (or comma list for multi-account, see below). |
instrument | ES1!, ES 06-26, or ESM6. |
action, qty, order_type, tif | Standard entry fields. |
limit_price, stop_price | Required for the matching order types. |
take_profit, stop_loss | Absolute prices only. Attaches a server-side OSO bracket. Percentage, tick, and point offsets are NinjaTrader-only. |
flatten_first | true flattens the same account and instrument (and cancels working orders) before the entry, then enters whether or not a position existed. Matches the NinjaTrader behavior. |
order_id | For cancel and change. |
cl_ord_id | Client order id passed to Tradovate. |
expire_time | ISO-8601 datetime, required with tif=gtd. |
max_show | Iceberg display quantity. |
trail_offset (alias peg_difference) | Trailing distance for trailing-stop order types. |
activation_time | Scheduled activation time passed to Tradovate. |
text, custom_tag, notes | Free-form labels. |
delay, rate_limit + id | Same delay and rate-limiting behavior as the NinjaTrader path. |
start_time, end_time, closing_only_after, bypass_trade_windows | Trade-window controls apply on both destinations. |
Accepted but ignored
These NinjaTrader fields do nothing on Tradovate. CrossTrade accepts them without error so a shared alert template does not break, but they have no effect because they describe NinjaTrader-only behavior.
| Field | Why it has no effect on Tradovate |
|---|---|
strategy, strategy_id, strategy_tag, append_atm | ATM strategies and strategy tags are NinjaTrader concepts. |
sync_strategy, market_position, prev_market_position, out_of_sync, target_quantity, strategy_exit_block | Strategy synchronization relies on the add-on's local strategy and position state. |
require_market_position | Position gating relies on the add-on's live position snapshot. |
max_positions | Position-count limiting relies on the add-on's local order and position book. |
percent | Percentage-based partial close is implemented in the add-on. |
cycle_accounts | Applies only to NinjaTrader multi-account placement behavior. |
Not supported (rejected)
These fields are tied so tightly to NinjaTrader that sending them with destination=tradovate is rejected with a clear error, rather than quietly doing nothing.
| Field | Reason and Tradovate alternative |
|---|---|
oco_id | Manual OCO grouping is a NinjaTrader feature. On Tradovate, set both take_profit and stop_loss and the two legs are linked as an OCO bracket for you. |
stop_loss_stop, stop_loss_limit | The stop-limit stop-loss leg is a NinjaTrader bracket detail. Tradovate brackets use a single absolute stop price. |
cancel_after | The limit-order timeout is implemented in the add-on. On Tradovate, use tif with expire_time instead. |
playbook | Playbooks are server-defined lifecycle plans built for the NinjaTrader execution model and are NinjaTrader-only. |
xtstrategy | Cross-signal strategy tracking is part of the NinjaTrader signal pipeline. |
What only Tradovate can do
Because Tradovate orders run in Tradovate's cloud, some things are possible that the NinjaTrader webhook path does not offer.
- No desktop software. Orders execute even when your computer is off. There is no add-on to install, keep open, or reconnect.
- Server-side OSO brackets. A
placewithtake_profitandstop_lossbecomes a single broker-side bracket order. The target and stop are linked as an OCO and live on Tradovate's servers, so they survive a disconnect. - Native trailing stops from a webhook.
order_type=trailingstop(ortrailingstoplimit) withtrail_offset. - Iceberg orders.
max_showsets the displayed quantity below the true order size. - GTD orders.
tif=gtdwith anexpire_time. - Extra order types.
mit(market if touched) andqts.
What only NinjaTrader can do
- ATM strategies (
strategy,append_atm) and template-based bracket management. - Strategy synchronization and Signal Share sync (
sync_strategy,market_position,out_of_sync,target_quantity). - Strategy tags and locks (
strategy_tag) for trade-copy coordination. - Position gating and limits (
require_market_position,max_positions). - Opposing Position Protection across accounts.
- Playbooks (
playbook). - Relative bracket offsets: percentage, tick, and point based
take_profitandstop_loss(Tradovate brackets take absolute prices). - NinjaTrader composites:
cancelreplace,cancelandbracket,closestrategy. - Connection health features: data watchdog and auto-reconnect, which monitor the add-on.
Multi-account placement
Both destinations accept a comma-separated account list and place the order on each account. On Tradovate, every name must be a linked Tradovate account.
key=your-secret-key;
command=place;
account=APEX1234,APEX1235;
instrument=ES 06-26;
action=buy;
qty=1;
order_type=market;
tif=day;
destination=tradovate;
Seeing the destination in Alert History
Every alert is recorded in Alert History with its resolved destination. Orders routed to Tradovate carry a blue Tradovate badge next to the command, and the expanded row shows the destination in its Order Info panel. NinjaTrader orders are unbadged, since that is the default. This makes it easy to confirm at a glance that a non-NinjaTrader order went where you intended.
Bracket example on Tradovate
A market entry with a server-side target and stop, both absolute prices:
key=your-secret-key;
command=place;
account=DemoAccount;
instrument=ES 06-26;
action=buy;
qty=1;
order_type=market;
tif=day;
take_profit=5300.00;
stop_loss=5285.00;
destination=tradovate;
CrossTrade sends this as one OSO order: the entry plus a linked target and stop that cancel each other when one fills.