Skip to main content

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.

DestinationHow it executesRequires
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 alertRoutes to
(no destination field)NinjaTrader 8 (default)
destination=nt8;NinjaTrader 8 (explicit)
destination=tradovate;Your linked Tradovate account
info

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

  1. Open My Account and select the Brokers tab.
  2. In the Tradovate card, click Link Live or Link Demo and authorize through Tradovate's OAuth screen.
  3. 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.

warning

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).

CommandNT8TradovateNotes
placeYesYesCore entry. Tradovate adds server-side brackets, trailing stops, iceberg, and GTD. See the option tables below.
flatplaceYesYesFlatten the same account and instrument (which also cancels working orders), then enter.
closepositionYesYesTradovate uses its liquidate endpoint. Partial close by percent is NinjaTrader-only (see ignored fields).
flattenYesYesFlatten one account and instrument.
flatteneverythingYesYesScope 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.
reverseYesYesFlip the current position. On Tradovate, include action and qty in the payload; the live net position still determines the actual flip size.
reversepositionYesYesSame as above with an explicit direction.
cancelYesYesCancel one order by order_id.
cancelordersYesYesOn Tradovate this cancels working orders on your linked account.
cancelallordersYesYesOn Tradovate this cancels working orders on your linked account.
changeYesYesModify a working order (price, quantity, type, TIF) by order_id.
closestrategyYesNoCloses a NinjaTrader ATM strategy by id. Tradovate has no ATM strategy concept, so there is nothing to close.
cancelreplaceYesNoA NinjaTrader atomic cancel-and-resubmit primitive. On Tradovate, use change to modify a working order instead.
cancelandbracketYesNoA 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.
Sending an unsupported command to Tradovate

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

CapabilityNT8TradovateNotes
MarketYesYes
LimitYesYeslimit_price required.
Stop / StopmarketYesYesstop_price required.
StoplimitYesYeslimit_price and stop_price required.
MIT (market if touched)NoYesTradovate native order type.
QTSNoYesTradovate native quote-triggered type.
Trailing stopNo (webhook)Yesorder_type=trailingstop with trail_offset. On NinjaTrader, trailing is handled through ATM strategies, not the webhook order type.
Trailing stop limitNo (webhook)Yesorder_type=trailingstoplimit with trail_offset.
TIF Day, GTCYesYesThe documented NinjaTrader webhook values.
TIF IOC, FOK, GTDNoYesTradovate 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.

FieldBehavior on Tradovate
accountTradovate account name (or comma list for multi-account, see below).
instrumentES1!, ES 06-26, or ESM6.
action, qty, order_type, tifStandard entry fields.
limit_price, stop_priceRequired for the matching order types.
take_profit, stop_lossAbsolute prices only. Attaches a server-side OSO bracket. Percentage, tick, and point offsets are NinjaTrader-only.
flatten_firsttrue 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_idFor cancel and change.
cl_ord_idClient order id passed to Tradovate.
expire_timeISO-8601 datetime, required with tif=gtd.
max_showIceberg display quantity.
trail_offset (alias peg_difference)Trailing distance for trailing-stop order types.
activation_timeScheduled activation time passed to Tradovate.
text, custom_tag, notesFree-form labels.
delay, rate_limit + idSame delay and rate-limiting behavior as the NinjaTrader path.
start_time, end_time, closing_only_after, bypass_trade_windowsTrade-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.

FieldWhy it has no effect on Tradovate
strategy, strategy_id, strategy_tag, append_atmATM strategies and strategy tags are NinjaTrader concepts.
sync_strategy, market_position, prev_market_position, out_of_sync, target_quantity, strategy_exit_blockStrategy synchronization relies on the add-on's local strategy and position state.
require_market_positionPosition gating relies on the add-on's live position snapshot.
max_positionsPosition-count limiting relies on the add-on's local order and position book.
percentPercentage-based partial close is implemented in the add-on.
cycle_accountsApplies 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.

FieldReason and Tradovate alternative
oco_idManual 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_limitThe stop-limit stop-loss leg is a NinjaTrader bracket detail. Tradovate brackets use a single absolute stop price.
cancel_afterThe limit-order timeout is implemented in the add-on. On Tradovate, use tif with expire_time instead.
playbookPlaybooks are server-defined lifecycle plans built for the NinjaTrader execution model and are NinjaTrader-only.
xtstrategyCross-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 place with take_profit and stop_loss becomes 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 (or trailingstoplimit) with trail_offset.
  • Iceberg orders. max_show sets the displayed quantity below the true order size.
  • GTD orders. tif=gtd with an expire_time.
  • Extra order types. mit (market if touched) and qts.

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_profit and stop_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.