HFT Elite
Order types
Every order type a desk options trader expects, layered on top of Polymarket's CLOB. Stops, brackets, OCO, trailing stops, conditional cross-market triggers, TWAP, and iceberg — with full TIF flags (GTC, GTD, IOC, FOK).
Why Polymarket needs synthetic order types
Polymarket’s CLOB exposes only two primitives: market and limit. There is no native stop, no bracket, no OCO, and no trailing stop. For copy-trading or for any active position management, that gap forces you to either babysit the screen or accept that a position can ride to zero. The Pro Workstation closes that gap with server-side conditional orders that submit the underlying CLOB order through the same execution path as a manual ticket once a trigger fires.
Every workstation order is signed client-side with the official polymarket_client_sdk_v2 and submitted with the V2 builder code attached for attribution. PolyZig never custodies your funds, never holds your private key, and never resigns your order — the conditional-order watcher is just an automated trigger that re-uses your authenticated session.
Stop and stop-limit
A stop fires a market order when price crosses your trigger. A stop-limit fires a limit order at the price you set, giving you slippage control at the cost of a possible non-fill in fast markets. Both apply in either direction: a sell stop fires when price drops below the trigger; a buy stop fires when price climbs above it.
side=sell, trigger_price=0.45 → fires when price ≤ 0.45 side=buy, trigger_price=0.55 → fires when price ≥ 0.55
Trailing stop
A trailing stop re-anchors its trigger to the running peak (sell side) or trough (buy side) of observed price. The trail offset defines how far price has to retrace from that peak before the stop fires. Useful for letting winners run while still capping the round-trip drawdown — the workstation tracks the peak in-memory inside the per-order monitor task.
sell trailing-stop, trail_offset=0.05 → peak rises to 0.70, trigger sits at 0.65 → if price drops to 0.65, stop fires
OCO and bracket — atomic, reciprocal links
An OCO ticket is two legs that cancel each other on fill: typically a stop loss and a take profit. A bracket is the OCO pattern wrapping an existing position. The Workstation creates both legs in one database transaction and writes a reciprocal linked_order_id so whichever leg fires first cancels the sibling — there is no scenario where you end up with a half-cancelled bracket.
Cancellation is user-scoped: the watcher will only cancel a sibling that belongs to the same user as the firing order, even if a malicious link were somehow injected.
Conditional cross-market triggers
A conditional order watches one market and acts on another. Example: "if the Trump-2024 YES drops below $0.40, fire a buy on the Trump-loss correlated leg." The Workstation persists these the same way as stops; the cross-market evaluator is wired in alongside the multi-leg ticket builder.
TWAP and iceberg (roadmap)
On thin Polymarket pairs even a few thousand dollars can move the book. The plan: TWAP slices a large order into N child orders over a configurable window; iceberg shows the book only the visible slice and refills as the visible portion fills, hiding total size. Both reduce market-impact slippage on illiquid markets. Neither is implemented in this build — these belong to the Phase 4 execution-strategies cut, after the conditional-orders watcher exposes a real CLOB executor.
Time in force flags
Every limit ticket today is submitted as GTC (good-till-cancelled), since that is what `polymarket_client_sdk_v2` exposes on the order builder. GTD, IOC, and FOK are part of the Phase 1b TIF cut — once the SDK’s upstream branch lands the flag (or the workstation contributes it), the ticket UI exposes a TIF dropdown and the order API extends `PlaceOrderRequest` with `time_in_force` + `expires_at`. Until then, IOC-style behaviour can be approximated by submitting a tight limit and cancelling on the next poller pass.
Risk-defined sizing
The order ticket includes a "max loss" helper. Enter the dollar amount you’re willing to risk and the entry + stop prices, and the ticket auto-computes the size that caps your loss at exactly that figure. Same primitive options traders use to size verticals: position your downside, not your notional.
size = max_loss / |entry_price − stop_price|
Live today: Market & Limit orders. Coming soon: Stop / Stop-limit / Trailing stop / OCO / Bracket / Conditional / TWAP / Iceberg — the production CLOB executor adapter is the remaining piece. The status column on the matrix below reflects the real deployment state; HFT subscribers get the rest on launch without re-upgrading.
Reference matrix
Every order type at a glance
| Type | Status | Trigger condition | Fills at | Best for |
|---|---|---|---|---|
| Market | Live | Immediate | Best available depth | Speed > slippage |
| Limit | Live | Immediate | Your limit price or rests | Slippage control |
| Stop | Coming soon | Sell: price ≤ trigger · Buy: price ≥ trigger | Market once triggered | Cap downside on a position |
| Stop-limit | Coming soon | Same as Stop | Limit once triggered | Stops with slippage control |
| Trailing stop | Coming soon | Anchored to running peak/trough | Market once trail offset crossed | Let winners run with capped giveback |
| OCO | Coming soon | Either leg fires → cancels sibling | Per leg type (stop/limit) | Bracket a position with both ends |
| Bracket | Coming soon | OCO of take-profit + stop | Per leg type | Wrap an open position |
| Conditional (cross-market) | Coming soon | Watches a different market | Market or limit on the target | Pair / hedge automation |
| TWAP | Coming soon | Continuous over a window | Sliced child orders | Reduce market impact on thin pairs |
| Iceberg | Coming soon | Show visible slice; refill on fill | Per visible slice | Hide total size from the book |
Time-in-force
TIF flags — when each one wins
| TIF | Meaning | When to use |
|---|---|---|
| GTC | Good-til-cancel | Default for limits you intend to leave on the book |
| GTD | Good-til-date | Auto-expire near a known event window |
| IOC | Immediate-or-cancel | Take whatever fills now, drop the rest |
| FOK | Fill-or-kill | All-or-none atomic execution |
Worked example
Bracket on a long YES at $0.42
Open 100 shares YES at $0.42. Cap downside at the cost of 6¢ per share, ride upside to a 12¢ take-profit. Created in one ticket with reciprocal links — whichever leg fires cancels the sibling.
POSITION long 100 YES @ 0.42
BRACKET take-profit → sell @ 0.54 (bracket_target)
stop loss → sell @ 0.36 (bracket_stop)
RESULT max gain 12¢ × 100 = +$12.00
max loss 6¢ × 100 = − $6.00
R:R 2.0Related Workstation pages
Position Greeks
Per-position delta and theta for binary outcomes.
Multi-leg strategies
Verticals, calendars, pairs, and box-spread arbitrage.
Discovery & screeners
IV-rank, theta-harvest, mispricing, whale activity.
Options primer
New to options? Start here. Includes IV, IV surface, and the Polymarket mapping.
FAQ
Common questions
Does Polymarket support stop-loss orders natively?
No. Polymarket’s CLOB exposes market and limit only. The PolyZig Pro Workstation closes that gap by persisting synthetic orders (stops, stop-limits, trailing stops, OCO, brackets, conditional cross-market triggers) server-side and firing the underlying CLOB order through the same execution path as a manual ticket once the trigger evaluates true. The watcher, schema, validation, and OCO sibling-cancellation logic ship today; the production CLOB executor that turns a fired trigger into a posted order is the remaining wire-up.
How is OCO implemented on Polymarket?
PolyZig creates both legs of the OCO in one database transaction and writes a reciprocal linked_order_id so each leg references the other. When either leg fires, the watcher cancels its sibling. The cancellation is scoped to the same user_id that owns the firing order, so a stray link can never reach into another account.
How fast will a stop fire when execution lights up?
The conditional-orders watcher subscribes to the same WebSocket subscription manager that drives the price chart. On a price-cross event it atomically promotes the row pending → triggered and is wired to submit the underlying CLOB order through the OrderExecutor on the same hot path the manual ticket uses. The Noop executor is the placeholder shipping today; once the production OrderExecutor adapter lands, median price-cross-to-CLOB-submission latency gets published on the workstation hub.
Can I attach a stop and a take-profit to an existing position?
That is what the bracket primitive is built for: open a position normally, then create a bracket — a target leg (limit at your take-profit) and a stop leg (stop or stop-limit), atomically linked, with whichever fills first cancelling the other. The bracket persists today; the live trigger-to-CLOB execution arrives with the production OrderExecutor wire-up flagged in the status banner above.
What happens to my conditional orders if PolyZig restarts?
They persist in Postgres. On startup the ConditionalOrderWatcher calls restore() and re-subscribes to every pending order’s token. There is no in-memory-only state, so a restart costs you nothing.
Get this on your account
The Pro Workstation surface — and everything described on this page — ships on the HFT Elite tier ($149/month, 0.10% per-trade fee).
Upgrade to HFT Elite