> For the complete documentation index, see [llms.txt](https://fx100.gitbook.io/fx100-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://fx100.gitbook.io/fx100-docs/trading/order-types.md).

# Order types

Market orders, trigger orders, and the slippage rule that catches people out.

FX100 supports market orders and four kinds of trigger order.

The distinction that matters: **market orders let you set a worst acceptable price. Trigger orders do not.** Every trigger order fills at market once its condition is met.

## Market orders

Fill immediately at the current execution price. You can set slippage protection:

```
maxAcceptablePrice = execPrice · (1 ± slippage)

  open long  / close short:  · (1 + slippage)    worst price is higher
  open short / close long:   · (1 − slippage)    worst price is lower
```

If the actual execution price falls outside your tolerance, **the order is cancelled rather than filled at a worse price**. It is not partially filled and not retried.

## Trigger orders

A trigger order is a conditional instruction: when the oracle reaches your price, the order converts to a market fill.

<table><thead><tr><th>Type</th><th width="287">Purpose</th><th width="158">Trigger (long)</th><th>Trigger (short)</th></tr></thead><tbody><tr><td><strong>Limit</strong></td><td>Enter at a price better than current — below market for a long, above for a short</td><td>oracle ≤ trigger</td><td>oracle ≥ trigger</td></tr><tr><td><strong>Stop (entry)</strong></td><td>Enter once price breaks past a level — above market for a long, below for a short</td><td>oracle ≥ trigger</td><td>oracle ≤ trigger</td></tr><tr><td><strong>Take profit</strong></td><td>Close an open position at a profit target</td><td>oracle ≥ trigger</td><td>oracle ≤ trigger</td></tr><tr><td><strong>Stop loss</strong></td><td>Close an open position to cap a loss</td><td>oracle ≤ trigger</td><td>oracle ≥ trigger</td></tr></tbody></table>

**You don't choose "Limit" or "Stop" directly.** When opening a position you set a single trigger price, and the interface reads it as a limit or a stop from where it sits relative to the current price — a long entry below market is a limit, above market is a stop. This removes an entire class of wrong-direction mistake: you can't accidentally place the wrong order type, because you're only ever setting a price.

Open orders can be viewed, edited, or cancelled at any time before they trigger.

## The trigger price is not your fill price

{% hint style="warning" %}
Once triggered, a trigger order fills at the prevailing market price — **not at the trigger price**. Your fill slightly differ than the price you set.
{% endhint %}

Under the hood, trigger orders carry a sentinel acceptable price meaning "accept any market price":

```
open:   long → MaxUint256 ,  short → 0
close:  long → 0          ,  short → MaxUint256
```

Two rules follow:

**1. The trigger price is not a cap or a floor.** A $200 limit order to open a long, once triggered, fills at the oracle price plus spread — which may be slightly above $200.

**2. Trigger orders do not support max slippage.** The slippage setting applies only to market orders.

This guarantees that stop losses actually fill in fast-moving markets, which is exactly when you need them to.

## Take profit and stop loss previews

```
Expected profit (TP) = sizeInTokens · (triggerPrice − entryPrice)     long; inverted for short
Expected loss  (SL)  = sizeInTokens · |markPrice − triggerPrice|
TP% / SL%            = priceChange / mark · leverage
```

These previews are price calculations. They do not deduct closing fees, closing price impact, or pending funding. What actually reaches your balance is covered in [PnL and closing](/fx100-docs/trading/pnl-and-closing.md).

## Minimum time before closing

There is a short minimum holding time between opening a position and closing it: you must wait at least {{\~30s — TBD}} after opening before a close will execute. This is a fixed, brief delay applied to every position, not a lockup — once it passes, you can close at any time.

## Reduce-only

Reduce-only is a modifier you can toggle on any order, not an order type of its own. With it on, the order can only shrink or close your existing position — it will never open a new one or add to what you hold.

Use it when you want to be certain an order takes size off rather than putting it on — for example, setting an exit without risking that a mistyped size flips you into a larger position instead of closing the one you have.

## Why an order might not fill

**Market orders** are cancelled rather than filled at a worse price if execution would exceed your slippage tolerance.

**Any order**, including a triggered stop loss, will not fill if:

* available liquidity can't accommodate it — see [available liquidity](/fx100-docs/how-the-system-works/available-liquidity.md)
* the oracle price is stale, or the market is paused — see [oracle and price risk](/fx100-docs/how-the-system-works/oracle.md)
* it's below the minimum collateral or notional size

{% hint style="warning" %}
Note the limit of this guarantee: a triggered order fills at market *if it can fill at all*. In extreme conditions — insufficient vault liquidity, a stale oracle, or a paused market — even a triggered stop loss can fail to execute. The trigger mechanism removes price as a reason for non-fill; it can't manufacture liquidity that isn't there.
{% endhint %}
