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|
i

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

TypeStatusTrigger conditionFills atBest for
MarketLiveImmediateBest available depthSpeed > slippage
LimitLiveImmediateYour limit price or restsSlippage control
StopComing soonSell: price ≤ trigger · Buy: price ≥ triggerMarket once triggeredCap downside on a position
Stop-limitComing soonSame as StopLimit once triggeredStops with slippage control
Trailing stopComing soonAnchored to running peak/troughMarket once trail offset crossedLet winners run with capped giveback
OCOComing soonEither leg fires → cancels siblingPer leg type (stop/limit)Bracket a position with both ends
BracketComing soonOCO of take-profit + stopPer leg typeWrap an open position
Conditional (cross-market)Coming soonWatches a different marketMarket or limit on the targetPair / hedge automation
TWAPComing soonContinuous over a windowSliced child ordersReduce market impact on thin pairs
IcebergComing soonShow visible slice; refill on fillPer visible sliceHide total size from the book

Time-in-force

TIF flags — when each one wins

TIFMeaningWhen to use
GTCGood-til-cancelDefault for limits you intend to leave on the book
GTDGood-til-dateAuto-expire near a known event window
IOCImmediate-or-cancelTake whatever fills now, drop the rest
FOKFill-or-killAll-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.0

Related Workstation pages

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