Kalshi Example Strategies
This page collects complete Kalshi event-contract strategies (platform: kalshi), from a one-shot game trade to a built-in strategy with a weekly schedule. Every key they use is listed in All Kalshi parameters.
Each example below passes Studio's checks as written. Tickers and numbers are illustrative: they show how the settings fit together, not what to trade. Check the deployment limits noted under each example before deploying.
One-shot event trade
Enter one game market at most once, with a spend cap, a stop and a target.
version: 1
platform: kalshi
strategy: custom
strategy_name: One-shot YES entry with stop and target
strategy_name_origin: user
market:
ticker: KXNBAGAME-26NOV04LALBOS-LAL
risk:
max_position: 4
price_floor: 0.05
price_ceiling: 0.55
max_entries_per_market: 1
max_notional: 2.00
loop:
interval: 15
rules:
- name: stop_loss
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: "<=", value: 0.20}
action: sell_yes
- name: take_profit
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: ">=", value: 0.65}
action: sell_yes
- name: enter_once
when:
all:
- {field: position_size, op: "==", value: 0}
- {field: yes_best_ask, op: "<=", value: 0.45}
action: buy_yes
size: 4max_entries_per_market: 1allows one buy order in this market per deployment. If that order only partly fills, the rest keeps resting and no second order is placed.- The worst-case entry is 4 × $0.45 = $1.80, inside the $2.00 budget.
- Exits are ordered first, so a held position is always checked for the stop and target before any entry.
- Deploy: Max contracts per order and Max open contracts must allow 4, and Max dollars per order at least $1.80. Studio pre-fills 4, 4 and $4.
Rolling 15-minute crypto series
Follow the current 15-minute BTC market, enter at most once per market, and flatten shortly before each market closes.
version: 1
platform: kalshi
strategy: custom
strategy_name: BTC 15-minute series, one entry per window
market:
series_ticker: KXBTC15M
risk:
max_position: 2
price_floor: 0.10
price_ceiling: 0.90
max_entries_per_market: 1
max_loss: 5.00
loop:
interval: 10
rules:
- name: flatten_before_close
when:
all:
- {field: position_size, op: ">", value: 0}
- {field: time_to_expiry, op: "<=", value: "2m"}
action: sell_all
- name: take_profit
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: ">=", value: 0.75}
action: sell_yes
- name: enter_cheap_yes
when:
all:
- {field: position_size, op: "==", value: 0}
- {field: time_to_expiry, op: ">", value: "8m"}
- {field: yes_best_ask, op: "<=", value: 0.35}
action: buy_yes
size: 2- The Bot moves to each new 15-minute market on its own.
selectionis omitted, so it trades the most liquid bracket. - The entry cap resets for every new market, so this can enter up to 96 times a day.
max_loss: 5.00covers the whole deployment across all those markets. If P&L reaches −$5.00, the Bot sells its inventory and stops entering until you redeploy. Don't trade this series by hand while the Bot runs: a position the deployment can't explain also halts it.- A market that still holds a position after the next one opens keeps running its exits, but gets no new entries.
- Deploy: Max contracts per order at least 2.
Every bracket with a portfolio cap
Buy cheap YES brackets across the whole current NYC high-temperature event, with per-bracket caps, an account-wide cap and a loss halt.
version: 1
platform: kalshi
strategy: custom
strategy_name: NYC high-temp cheap-bracket sweep
strategy_name_origin: generated
market:
series_ticker: KXHIGHNY
selection: all
risk:
max_position: 2
price_floor: 0.03
price_ceiling: 0.30
max_entries_per_market: 1
max_notional: 0.60
max_portfolio_positions: 4
max_loss: 3.00
loop:
interval: 60
rules:
- name: take_profit
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: ">=", value: 0.45}
action: sell_yes
- name: cancel_near_close
when:
all:
- {field: time_to_expiry, op: "<=", value: "30m"}
action: cancel_all
- name: buy_cheap_bracket
when:
all:
- {field: position_size, op: "==", value: 0}
- {field: yes_best_ask, op: "<=", value: 0.12}
- {field: time_to_expiry, op: ">", value: "3h"}
action: buy_yes
size: 2- Every bracket gets its own entry cap and its own $0.60 budget. With 6 brackets the combined budget is $3.60. Here the entry cap binds first: one entry of 2 contracts at $0.12 or less is at most $0.24 per bracket.
max_portfolio_positions: 4counts every market with a position in your Kalshi account, plus markets where this Bot has resting orders. Positions you already hold elsewhere use up slots, so with 6 brackets at most 4 can be entered, and fewer if your account already holds other markets.max_loss: 3.00is one ledger for the whole deployment, across all brackets.- There's no stop rule: positions are held to settlement unless the take-profit fires or
max_losshalts the deployment.cancel_near_closeonly pulls resting orders. It sits below the take-profit on purpose: the first matching rule ends the cycle, so a time-only rule placed first would stop every rule under it from running in the last 30 minutes. - Deploy: Max contracts per order at least 2.
Spend-capped scale-in
Add to a position in steps while the price stays low, with a dollar budget that caps total spending in the market.
version: 1
platform: kalshi
strategy: custom
strategy_name: Scale-in with a spend cap
market:
ticker: KXFEDDECISION-26DEC-H0
risk:
max_position: 6
price_floor: 0.05
price_ceiling: 0.40
max_entries_per_market: 3
max_notional: 1.50
loop:
interval: 30
rules:
- name: stop_loss
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: "<=", value: 0.10}
action: sell_yes
- name: take_profit
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: ">=", value: 0.50}
action: sell_yes
- name: add_on_dip
when:
all:
- {field: position_size, op: "<", value: 6}
- {field: order_count, op: "==", value: 0}
- {field: yes_best_ask, op: "<=", value: 0.30}
action: buy_yes
size: 2- Each add buys 2 contracts at the ask.
order_count == 0waits until none of your orders is resting in this market. - If all three adds are at $0.30, they cost $0.60, $0.60, and then the third is shrunk to 1 contract: floor(($1.50 − $1.20) ÷ $0.30) = 1.
- Selling doesn't give back budget or entry slots. Once $1.50 is spent or three entries are used, this deployment won't buy this market again, even after a stop or take-profit.
- Deploy: Max contracts per order at least 2, and Max open contracts at least 6 (pre-filled from
max_position).
Weekday hours with a blackout
Trade the S&P 500 daily series only during US market hours on weekdays, with a Wednesday afternoon blackout.
version: 1
platform: kalshi
strategy: custom
strategy_name: S&P daily brackets, US session only
market:
series_ticker: KXINX
selection: most_liquid
risk:
max_position: 3
price_floor: 0.10
price_ceiling: 0.90
max_entries_per_market: 2
loop:
interval: 30
trading_schedule:
timezone: America/New_York
trading_hours:
- days: [mon, tue, wed, thu, fri]
start: "09:30"
end: "16:00"
blackouts:
- days: [wed]
start: "13:45"
end: "14:30"
rules:
- name: stop_loss
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: "<=", value: 0.12}
action: sell_yes
- name: take_profit
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: ">=", value: 0.60}
action: sell_yes
- name: enter
when:
all:
- {field: position_size, op: "==", value: 0}
- {field: time_to_expiry, op: ">", value: "1h"}
- {field: yes_best_ask, op: "<=", value: 0.30}
action: buy_yes
size: 1- New entries happen only Mon–Fri 09:30–16:00 New York time, except Wednesday 13:45–14:30. This is the schedule drawn in the weekly grid under Trading schedule.
- The stop and take-profit run at all hours, but because a schedule is present they only sell contracts this deployment bought.
- When the schedule closes, the Bot cancels its resting entry orders.
- If the most liquid bracket changes during the day, the Bot can enter more than one bracket; each has its own
max_entries_per_marketand Max open contracts. - Deploy: Studio's pre-filled limits (1 contract per order, 3 open contracts) fit this strategy.
Event window that stands down
Trade one game market only during a fixed evening, then cancel and stop.
version: 1
platform: kalshi
strategy: custom
strategy_name: Game-night window with one entry
strategy_name_origin: user
market:
ticker: KXMLBGAME-26OCT15NYYBOS-NYY
risk:
max_position: 5
price_floor: 0.05
price_ceiling: 0.60
max_entries_per_market: 1
max_notional: 3.00
loop:
interval: 15
active_window:
start: "2026-10-15T18:30:00-04:00"
end: "2026-10-15T23:30:00-04:00"
rules:
- name: stop_loss
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: "<=", value: 0.25}
action: sell_yes
- name: take_profit
when:
all:
- {field: yes_position_size, op: ">", value: 0}
- {field: yes_best_bid, op: ">=", value: 0.70}
action: sell_yes
- name: enter_yes
when:
all:
- {field: position_size, op: "==", value: 0}
- {field: yes_best_ask, op: "<=", value: 0.45}
action: buy_yes
size: 5- Before 18:30 ET the Bot does nothing. At 23:30 ET it cancels its resting orders once and stops running rules, including the stop and take-profit. An open position is held to settlement.
- The worst-case entry is 5 × $0.45 = $2.25, inside the $3.00 budget.
- This strategy can't be backtested, because of
active_window. - Deploy: Max contracts per order and Max open contracts at least 5, and Max dollars per order at least $2.25.
Built-in strategy with a schedule
Run the panic_fade strategy on one market during weekday daytime hours.
version: 1
platform: kalshi
strategy: panic_fade
strategy_name: Senate market panic fade, weekday daytime
market:
ticker: KXSENATEGA-26-D
risk:
max_position: 2
price_floor: 0.10
price_ceiling: 0.90
max_portfolio_positions: 5
loop:
interval: 30
trading_schedule:
timezone: America/New_York
trading_hours:
- days: [mon, tue, wed, thu, fri]
start: "08:00"
end: "23:00"
params:
panic_threshold: 0.08
fade_size: 1
recovery_exit: 0.04
max_fades: 3- panic_fade buys
fade_sizeYES after a drop of at leastpanic_thresholdfrom the recent high, and sells when the price recovers byrecovery_exitor falls belowprice_floor. See panic_fade for the full logic. - The schedule blocks new fades outside Mon–Fri 08:00–23:00 ET. Exits keep running and only sell contracts this deployment bought.
- A fade opens only once its buy fills. A buy that hasn't filled after two loops is cancelled, and so is one still resting when the schedule closes at 23:00; neither counts toward
max_fades. max_portfolio_positionsworks on built-ins;max_loss,max_notionalandactive_windowdo not.- Deploy: the defaults fit a
fade_sizeof 1.