Polymarket US Example Strategies
This page collects complete platform: polymarket_us strategies: four custom strategies (NWS weather, shown as a rejected first draft and its fix; Coinbase MACD momentum; the FOMC calendar; and a dip buyer with no outside data) and three built-ins. For what each key means, see All Polymarket US parameters; for how rules and built-ins behave on Polymarket US, see Polymarket US Strategies and Edge Data.
Every complete example below passes the same checks as a Studio save. Slugs are placeholders: use the exact slug of the market you mean to trade. The values are illustrative, not recommendations, and they keep sizes at 1 contract so exits fit the Max contracts per order Studio pre-fills for them (1).
Weather: NO on a cool NWS forecast
A common first draft uses a single exit that sells whenever you hold anything. Studio rejects it, because that exit fires whether the trade is winning, flat or losing:
# Rejected: the only exit sells whenever any position is held, whatever the price
# error: exit rules collectively match every held-position state
# error: exit predicate fires in profitable, neutral, and losing states
version: 1
platform: polymarket_us
strategy: custom
strategy_name: "NYC high-temp NO (first draft)"
market:
slug: "example-nyc-high-temp-market" # placeholder
risk:
max_position: 1
price_floor: 0.05
price_ceiling: 0.95
loop:
interval: 60
edge:
weather:
provider: nws
station: KLGA
fields: [forecast_high_f]
refresh: 5m
rules:
- name: exit_any_position
when:
all:
- field: position_size
op: ">"
value: 0
action: sell_all
- name: enter_no
when:
all:
- field: position_size
op: "=="
value: 0
- field: edge.weather.forecast_high_f
op: "<"
value: 56
action: buy_no
size: 1The corrected version gives each exit a price condition. This strategy holds NO, so one exit fires when YES falls below 0.15 and a stop fires when YES rises above 0.75. The entry only fires while YES is between 0.30 and 0.60, so a fill is never stopped out on the next loop. It also cancels an unfilled entry if the forecast turns against the idea:
version: 1
platform: polymarket_us
strategy: custom
strategy_name: "NYC high-temp NO on cool forecast"
strategy_name_origin: user
market:
slug: "example-nyc-high-temp-market" # placeholder: use the exact market slug
risk:
max_position: 1
price_floor: 0.05
price_ceiling: 0.95
loop:
interval: 60
edge:
weather:
provider: nws
station: KLGA
fields: [forecast_high_f, current_temp_f]
refresh: 5m
rules:
# Exits first: rules run top to bottom and stop at the first match.
- name: take_profit
when:
all:
- field: position_size
op: ">"
value: 0
- field: price # YES price; a NO position gains as this falls
op: "<"
value: 0.15
action: sell_all
- name: stop_loss
when:
all:
- field: position_size
op: ">"
value: 0
- field: price
op: ">"
value: 0.75
action: sell_all
- name: cancel_if_forecast_turns
when:
all:
- field: order_count
op: ">"
value: 0
- field: position_size
op: "=="
value: 0
- field: edge.weather.forecast_high_f
op: ">="
value: 60
action: cancel_all
- name: enter_no
when:
all:
- field: position_size
op: "=="
value: 0
- field: edge.weather.forecast_high_f
op: "<"
value: 56
- field: edge.weather.current_temp_f
op: "<"
value: 58
- field: price
op: ">"
value: 0.30
- field: price
op: "<"
value: 0.60
action: buy_no
size: 1If the NWS feed goes stale, entries are blocked until it returns, while take_profit and stop_loss, which read only price and position_size, keep running. cancel_if_forecast_turns reads the forecast, so it can't fire meanwhile. See Missing or stale data blocks entries.
Crypto: Coinbase MACD momentum
Buys one YES when BTC's 1-minute MACD is above its signal line and BTC is up more than 0.3% over 15 minutes. It exits on a price target, when MACD falls back below its signal (a value_field comparison), or 2 hours before close.
version: 1
platform: polymarket_us
strategy: custom
strategy_name: "BTC MACD momentum YES"
strategy_name_origin: user
market:
slug: "example-btc-price-market" # placeholder: use the exact market slug
risk:
max_position: 1
price_floor: 0.10
price_ceiling: 0.90
loop:
interval: 30
edge:
btc:
provider: coinbase
symbol: BTC-USD
fields: [macd_1m, macd_signal_1m, change_15m]
refresh: 10s
rules:
- name: exit_before_close
when:
all:
- field: position_size
op: ">"
value: 0
- field: time_to_expiry
op: "<"
value: "2h"
action: sell_all
- name: take_profit
when:
all:
- field: position_size
op: ">"
value: 0
- field: price
op: ">"
value: 0.70
action: sell_all
- name: momentum_fades
when:
all:
- field: position_size
op: ">"
value: 0
- field: edge.btc.macd_1m
op: "<"
value_field: edge.btc.macd_signal_1m
action: sell_all
- name: enter_yes
when:
all:
- field: position_size
op: "=="
value: 0
- field: edge.btc.macd_1m
op: ">"
value_field: edge.btc.macd_signal_1m
- field: edge.btc.change_15m
op: ">"
value: 0.003
- field: price
op: "<"
value: 0.55
- field: time_to_expiry
op: ">"
value: "1d"
action: buy_yes
size: 1MACD fields are candle fields, so refresh must be at least 5s. The time_to_expiry > "1d" entry condition also keeps the Bot out of markets that report no end date, where time_to_expiry reads 0.
Economic calendar: flat before the FOMC statement
Enters one YES between 48 hours and 1 hour before the next FOMC statement and sells 45 minutes before it. A late unfilled entry is cancelled, and a skip guard blocks entries when buying power is low or the spread is wide.
version: 1
platform: polymarket_us
strategy: custom
strategy_name: "Fed-day YES, flat before the statement"
strategy_name_origin: user
market:
slug: "example-fed-decision-market" # placeholder: use the exact market slug
risk:
max_position: 1
price_floor: 0.05
price_ceiling: 0.95
loop:
interval: 60
edge:
fed:
provider: economic_calendar
event: FOMC
fields: [seconds_to_next]
refresh: 5m # the countdown updates every 5 minutes (up to 15 if a fetch fails)
rules:
- name: flatten_before_statement
when:
all:
- field: position_size
op: ">"
value: 0
- field: edge.fed.seconds_to_next
op: "<"
value: 2700 # 45 minutes
action: sell_all
- name: take_profit
when:
all:
- field: position_size
op: ">"
value: 0
- field: price
op: ">="
value: 0.85
action: sell_all
- name: stop_loss
when:
all:
- field: position_size
op: ">"
value: 0
- field: price
op: "<"
value: 0.40
action: sell_all
- name: cancel_late_entry
when:
all:
- field: order_count
op: "!="
value: 0
- field: position_size
op: "=="
value: 0
- field: edge.fed.seconds_to_next
op: "<"
value: 3600
action: cancel_all
- name: cash_and_spread_guard
when:
any:
- field: balance
op: "<"
value: 5 # dollars of buying power
- field: spread
op: ">"
value: 0.04
action: skip
- name: enter_yes_in_window
when:
all:
- field: position_size
op: "=="
value: 0
- field: order_count
op: "=="
value: 0
- field: edge.fed.seconds_to_next
op: "<="
value: 172800 # within 48 hours
- field: edge.fed.seconds_to_next
op: ">="
value: 3600 # but not in the final hour
- field: price
op: ">="
value: 0.55
- field: price
op: "<="
value: 0.80
action: buy_yes
size: 1balance reads 0 when your balance can't be read, so the guard also blocks entries in that case.
Dip buyer with a spread and volume guard
No outside data: exits sit at the top, a skip rule blocks entries when the book is wide or thin, and a 1-contract YES entry fires in a 25–35¢ band. Because the guard sits below the exits, exits still run when the spread is wide.
version: 1
platform: polymarket_us
strategy: custom
strategy_name: "Dip buyer with wide-spread guard"
strategy_name_origin: user
market:
slug: "example-market-slug" # placeholder: use the exact market slug
risk:
max_position: 1
price_floor: 0.05
price_ceiling: 0.95
loop:
interval: 30
rules:
- name: take_profit
when:
all:
- field: position_size
op: ">"
value: 0
- field: price
op: ">="
value: 0.55
action: sell_all
- name: stop_loss
when:
all:
- field: position_size
op: ">"
value: 0
- field: price
op: "<"
value: 0.20
action: sell_all
- name: wide_spread_guard
when:
any:
- field: spread
op: ">"
value: 0.05
- field: volume
op: "<"
value: 1000
action: skip
- name: buy_dip
when:
all:
- field: position_size
op: "=="
value: 0
- field: order_count
op: "=="
value: 0
- field: price
op: "<="
value: 0.35
- field: price
op: ">="
value: 0.25
action: buy_yes
size: 1Built-in: one-level spread_capture
When the book is at least 4¢ wide, rests one 1-contract YES bid and one 1-contract YES offer 2¢ either side of the midpoint, maker-only, replaced every loop.
version: 1
platform: polymarket_us
strategy: spread_capture
strategy_name: "One-level maker quotes"
strategy_name_origin: user
market:
slug: "example-market-slug" # placeholder: use the exact market slug
risk:
max_position: 2
price_floor: 0.05
price_ceiling: 0.95
loop:
interval: 30
params:
spread_floor: 0.04 # quote only when ask - bid is at least 4c
order_count: 1 # one bid and one offer, 1 contract each
post_only: true # maker-only quotesWith a 0.45 / 0.55 book this quotes 0.48 / 0.52. With a 0.48 / 0.51 book (3¢, below the floor) it cancels its quotes and places nothing.
Built-in: mean_reversion bands
Buys YES at or below 20¢, buys NO when YES is at or above 80¢, and market-sells when YES comes back within 2¢ of 50¢.
version: 1
platform: polymarket_us
strategy: mean_reversion
strategy_name: "Fade the extremes back to 50c"
strategy_name_origin: user
market:
slug: "example-market-slug" # placeholder: use the exact market slug
risk:
max_position: 1 # entry size is min(max_position, 10)
price_floor: 0.05
price_ceiling: 0.95
loop:
interval: 30
params:
entry_low: 0.20
entry_high: 0.80
exit_target: 0.50
cooldown: 300 # seconds between entry attemptsBuilt-in: bullish pre_announcement_drift
One YES entry in the 6 hours before the market closes, then a market sell of that YES when the final 30-minute blackout begins. max_position: 1 keeps the entry and its exit within the deployment risk limits Studio pre-fills (1 contract per order). See pre_announcement_drift.
version: 1
platform: polymarket_us
strategy: pre_announcement_drift
strategy_name: "Drift into close, flat 30m before"
strategy_name_origin: user
market:
slug: "example-market-slug" # placeholder: use the exact market slug
risk:
max_position: 1
price_floor: 0.10
price_ceiling: 0.90
loop:
interval: 60
params:
entry_hours_before: 6
blackout_minutes_before: 30
drift_direction: bullish
exit_on_release: trueBefore you deploy any of these, read Risk & Limits and plan how you'll watch the Bot in Monitoring.