Skip to main content
Internal catalog for the Season 1 SDK. These are teaching skeletons, not advertised edges. Market: 60-second BTC Yes/No (Up/Down) binary, rolling windows, CLOB.
Series: ob-btc-ud-60s. Yes = Up, No = Down. One Yes + one No = $1.
IDs are stable. Cross-references (#7, #11, #17) keep the original numbers even though families are grouped out of numeric order.

How to read a template

Every runnable template below is a thin wrapper around #0 Fair-value engine. Each one is specified as: gated means do not put it in the default bundle. internal means stress-test on the venue before any user sees it.

Venue facts the templates assume

These are the Omnibook rules that change the math. Do not treat this book as a generic 60-second digital. Taker 250 is ~2.5% of p(100−p). At 50¢ that is about 0.63¢ per share; in the wings it collapses. Maker is free, so posting is the only structure that keeps thin edges. Re-model every taker template if Season 1 pricing hardens. Each template below has a Python SDK skeleton. Teaching code. Not a hosted bot. Paste onto the shared loop and swap the quotes_for function.

Shared skeleton

Websocket (oracle + book + trades), order lifecycle, position tracker, kill switch. Every runnable template is a quotes_for(state) on top of this.
quotes_for returns a list of {side, outcome, tick}, "kill", or None (leave resting). Taker templates call place_order(..., post_only=False) instead of replace_quotes.

7. 99¢ short vol

Thesis: Edge is real and large. At $100k BTC with ~50% annualized vol, per-second σ ≈ 0.9bp. Ten seconds left, 10bps above strike, d = 3.5, N(−3.5) ≈ 0.02%. Someone is paying 1¢ for a 2bp event. Two caveats to bake into the template:
  1. BTC 1-min returns are fat-tailed. Gaussian understates the tail by roughly an order of magnitude.
  2. Needs a hard realized-vol kill switch or one jump erases a month.
TWAP changes the tail. A last-print settle makes a 10bp wick in the last second a full loss. A 10s TWAP does not: a 1s wick is ~10% of the window. The event you are short is a sustained move through the remaining weight, not a single print. That makes the edge cleaner than the Gaussian headline, and it makes the kill switch a “move that holds,” not a “print that spikes.” Habitat: Fair already through 95¢, τ small, realized-vol calm. Off in #15 chaos. Edge: Selling an overpriced digital on a move that the TWAP will not fully credit. Guards: Hard kill on realized vol and on a move that persists across consecutive oracle prints. Position cap such that one full loss is a known fraction of daily budget, not of the account. Dies when: You size like the Gaussian 2bp event is the risk. Ship: First. Top of this page.

Catalog

All 26 templates ship. #7 99¢ short vol is first. Then market making. Taking, lead-lag, and the rest of vol sit under that.

Market making

Then the rest

Ship order

  1. First bot: #7 99¢ short vol
  2. MM library / first: #0 → #15 → #10 → #13
  3. Core MM: #12 → #1 → #2 → #11 → #14
  4. Box MM: #17 with #20, then #18 / #19 → #16. Gate #9
  5. Taking: #4 → #5 → #3
  6. Vol: #6 → #8
  7. Lead-lag: #21 → #24 → #23 / #25. #22 stays internal

0. Fair-value engine

Not a strategy. The base class every template wraps. Ship as a library with the SDK, not as a runnable bot.

Path-fair (τ > 10s)

While the close is still a future 10-second TWAP that has not started, a digital on the open is a usable first shot:
  • K is the round’s open print (oracle median at open)
  • S_t is the live oracle median, not a single exchange
  • τ is seconds to freeze
  • σ is EWMA of 1s log returns of that same oracle
  • N is the standard normal CDF; φ is its density
  • Binary delta is φ(d) / (S σ √τ), which explodes as τ → 0 on a last-print settle

Settlement-fair (τ ≤ 10s)

Close is not S_T. Close is the time-weighted average of the sequenced oracle over the final 10 seconds (4 Hz, each print holds until the next). After t seconds of the window:
Fair is P(close > K), which is a statement about the remaining average, not about the next tick. The residual is bounded and shrinks every ~250ms. A Gaussian on ln(S_t / K) overstates gamma in the window and understates how solved the last seconds are. #22 is this object traded directly. Use path-fair to quote the first 50 seconds. Switch the library to settlement-fair when the TWAP window opens. Do not let templates that assume a last-print digital keep running unmodified through the last 10s. PnL labels the library should emit: realized-vol premium, inventory, complement, markout, arb, settlement-residual. Never “grid profit.”

Market making

1. One-tick-ahead MM

Thesis: Quote one tick inside best bid/ask and earn the spread if the book is slow relative to fair. Habitat: Mid-round, |d| not exploding, both books two-sided. Edge: Queue position plus a one-tick improvement, paid by impatient flow. Guards: Two, or it is a donation:
  1. Pull or widen when |ΔS| exceeds n · σ √Δt on the last oracle print.
  2. Skew the reservation price by inventory. Avellaneda–Stoikov is well-posed here because τ is finite and small:
q is signed inventory, γ risk aversion, k order-arrival density. Recenter r every oracle print. Dies when: You penny into a jump and hold the wrong wing into settlement. Ship: Core. Do not make this the first MM a new user runs, that is #10.

2. Gamma-aware spread

Thesis: Spread widens as 1/√τ when near the strike and stays flat when far. Habitat: Fair in the 20–80 band, especially the last 20s. Edge: You stop being the last quote at 50¢ with 8 seconds left. Guards: Inherit #15. Flatten or pull when |d| < 0.3 and τ < 15. Dies when: The last 10 seconds near 50¢. That is where accounts die. This template exists to teach that. Ship: Core.

9. Fair-anchored adaptive grid

Thesis: Levels at fair ± k·Δ for k = 1..n, re-centered every tick. Spacing Δ ∝ delta · σ_S · √Δt, so the grid widens near the strike and collapses in the tails. Geometric size outward. Habitat: Only while |d| ≥ 1. Auto-disable inside that band. Edge: Realized-vol premium from mean-reversion of fair, not of last trade. Label it that way. Guards: Hard disable at |d| < 1. Inventory cap per side. Jump pull from #1. Dies when: You anchor to last-traded price and accumulate the losing side into settlement.
Grid warning. A grid on a binary is short gamma with no theta to pay for it. Spot grids work because price mean-reverts around a level. A binary’s level is fair value, which is itself running toward 0 or 100. Anchor to last-traded price and you accumulate the losing side into settlement. Anchor to model fair. Always.
Highest-variance template in the set. Gate it behind the conservative bundle. Ship: Gated.

10. Pinned-wing MM

Thesis: Quote only where fair sits outside 5¢ / 95¢. Fair is stable, noise is bounded by the 1¢ floor, fill rate is high because impatient exiters live there. Habitat: |fair − 50| ≥ 45. Off as soon as fair re-enters the middle. Edge: Collect spread where delta is small and markout is bounded. Guards: Still pull on a jump that would drag fair back through 10¢ / 90¢. Size small enough that one reverse-through does not matter. Dies when: You keep quoting the wing after fair has left it. Ship: First. Correct first MM template for a new user. Market-making mirror of #7.

11. Complement-hedged quoting

Thesis: Quote Yes and No books simultaneously. A fill buying Yes at p is instantly layable as a sell of No at 100 − p. Near-zero net delta, spread collected on both books. Habitat: Both books alive. Any τ. Strongest when the two books disagree. Edge: Two-book coupler. If a meaningful share of flow runs this (and the box family), the books stay tight to 100 with no seeding required. Guards: Never rest a hedge that would cross into a locked-in loser after fees. If the lay is not there, you are running #17 by accident, switch logic, do not pretend you are hedged. Dies when: One book fills and you fail to lay the other, then treat the leftover as “inventory” instead of a broken box. Ship: Core. Venue-specific and probably the highest-value template shipped.

12. Cold-start seeder

Thesis: Rolling windows mean a fresh empty book every 60 seconds. Race to post the first two-sided quote at round open with a wide spread, tighten as competitors arrive. Habitat: First 1–3 seconds after open, or any moment both sides are empty. Edge: Uncontested queue position. Maker-fee-free, so the wide-to-tight path is cheap. Guards: Seed from #0, not from 50/50. Open print can already be off the pre-open path. Pull the stale seed if the first oracle print after open moves d by more than a threshold. Dies when: You seed 50/50 into a round that opened 20bp through, and you are the quote everyone lifts. Ship: Core.

13. Queue-join, don’t penny

Thesis: Join best bid/ask rather than improving. Cancel only on fair-value drift past threshold. Habitat: Any two-sided book. Default MM when you do not have an edge on queue. Edge: Queue priority without winning the adverse-selection contest that pennying starts. Guards: Cancel when |quote − fair| exceeds k ticks. Do not “hold the queue” through a jump. Dies when: You confuse being first in queue with being right. Ship: First. Teaches queue priority. Produces far less toxic flow than #1.

14. Markout-filtered MM

Thesis: Track 1s and 5s markout on own fills, bucketed by size and time-in-round. Widen or pull when rolling markout goes negative past threshold. Habitat: Always-on overlay. Every other MM template should expose hooks for it. Edge: This is the template that turns a losing MM into a breakeven one, and the one most users will not build themselves. Guards: The markout itself is the guard. Persist buckets across rounds so a single quiet round does not reset the lesson. Dies when: You measure markout in last-trade space instead of mark-to-fair, and you congratulate yourself for “winning” into a moving strike. Ship: Core.

15. Regime-switch spread

Thesis: Three vol regimes off realized 1s oracle returns, one spread multiplier each, hard kill at the top regime. Habitat: Always-on. This is where the risk-limit scaffolding lives that every other template inherits. Edge: None on its own. Survival. Trivial to write, expensive to skip. Guards: Dies when: The kill is a widen instead of a cancel, and you are still the quote through the jump. Ship: First. Required dependency, not an optional style.

16. Settlement-window liquidity

Thesis: Last 10 seconds, quote 96/99 to holders who want to lock in early rather than carry settlement risk. Selling certainty above true settlement-fair. Habitat: TWAP window only (τ ≤ 10), fair already in the wings, and settlement-fair (not path-fair) says the lock-in is rich. Edge: Impatient winners pay to stop being exposed to the remaining TWAP weight. Guards: Jump filter on the remaining TWAP residual, or this inherits the fat-tail problem from #7. A 20bp wick that lasts 1s of a 10s window moves close by ~2bp; a 20bp move that holds the rest of the window moves close by the leftover weight. Filter the second, ignore the first. Dies when: You use path-fair in the window and sell 99¢ while the running TWAP is still on the wrong side of K. Ship: Later. Needs #0’s settlement-fair switch.

The box family

Mechanically these are all Yes/No book couplers, same as #11. If a meaningful share of flow runs them, the two books stay tight to 100 with no seeding required.
Lifting vs posting. Lifting both asks at 49 is not chop capture, it is arb (#5). Posting both bids at 49 is the actual strategy. Do not conflate them in the docs.
Maker is free and taker is not. Boxes only work as posted bids. A lifted 49/49 box pays taker on both legs: Q(49) = 2499, so ~0.63¢/share/side, ~1.25¢ per completed box, against 2¢ gross. Net is a rounding error. Posted, the 2¢ survives. Tie resolves No. A completed 49/49 box still pays; a broken Yes leg into a tie is the bad one. Slight structural lean: missing the No bid is more dangerous than missing the Yes bid.

17. Symmetric box quoting

Thesis: Post 49 bid Yes and 49 bid No. Position being built is long the box at 98. Cash-and-carry when complete, directional when not. The entire strategy is one number: P(both legs fill). Fill probability is anti-correlated with outcome. In a trending tape only the losing side fills. BTC rips, everyone dumps No into your bid, nobody sells you Yes, you are left long No alone at 49 with fair at 20. You never get a broken leg on the winning side. Honest description: short trend, long chop, with the fills themselves selecting against you. Habitat: Only valid when |d| < ~0.5, roughly the first 20–30 seconds of a round near the strike. Auto-disable on |d| threshold, not on a clock. Edge: 2¢ on 98¢ risked, ~2% per completed box, if both legs fill and you posted. Guards:
  • Disable on |d| (not on a timer).
  • Size as if the typical outcome is a broken leg, not a completed box.
  • Pair with #20 or do not ship.
Dies when: You count completed-box PnL and ignore the inventory from broken legs. That inventory is the strategy. Fees. Gross is 2¢ on 98¢. Per-contract-per-side rake eats it if you lift. On the current maker-0 schedule, posted boxes clear; taker boxes do not. This template is the sharpest test of whether the fee schedule permits MM at all. Model it again before Season 1 pricing hardens. Ship: Later, and only with #20.

18. Skewed box

Thesis: Bid 50/48 instead of 49/49 based on OFI or short-horizon momentum. Deliberately unbalanced. Accept a directional lean to raise fill probability on the side judged safe. Habitat: Same |d| band as #17, plus a signed OFI or lead-lag signal from #4 / #21. Edge: Higher P(complete) in a mild trend, paid for with a 2¢ structural lean (50+48=98, same cash, worse if you are wrong about the skew). Guards: If the signal flips, the 50-bid is the one you pull first. Disable with #17 on |d|. Dies when: You skew into the trend instead of against the side that is about to dump on you. Ship: Later. Bridges #17 and #4.

19. Box ladder

Thesis: 49/48/47 both sides, geometric size. Wider rungs fill only in high realized vol, which is exactly when boxes complete. Habitat: Same as #17, with more room to sit. Edge: Self-scaling to the chop being harvested. The 47s are not “more edge”; they are the fills you only want when the book is already violent. Guards: Cap the 47 rung. A filled 47 with no complement is a worse broken leg than a filled 49. Dies when: Geometric size is inverted (largest at 47) and a one-way tape fills the whole ladder on one side. Ship: Later.

20. Completion-chasing box

Thesis: When one leg fills and the other does not, walk the unfilled bid up toward fair on a timer instead of holding naked. Pays away part of the 2¢, converts broken legs into completed boxes. Habitat: Any time #17/#18/#19 is on and one leg is live. Edge: Survival. Parameter is how much of the box to give up versus how long to sit directional. Guards: Never chase through fair. Never chase into a taker lift that turns a 2¢ box into a negative-edge #5. Stop at maker-posted prices only, unless settlement-fair says the leftover is already a loser. Dies when: You chase with market orders and donate the box plus taker fees. Ship: Later. Makes #17 survivable. Most users will not build it. Do not ship #17 without it.

Taking

3. Stale-quote sniper

Thesis: Oracle updates, book has not. Lift anything more than k ticks off model. Habitat: Any time path-fair (or settlement-fair in the window) jumps and resting quotes do not. Edge: Other people’s stale limits. Highest hit-rate right after an oracle print, especially when quorum flips a median the book was quoting against. Guards: Size by remaining τ and by how stale (ticks off fair), not by available size. Do not chase a book that is already moving. Dies when: You snipe last-trade “stale” against an oracle that has not moved, i.e. you are lifting fair. Ship: Core.

4. Order-flow imbalance

Thesis: Sign trades on the feed, take direction on OFI z-score. Habitat: Mid-round, both books printing. Weak in the last 10s where settlement-fair dominates flow. Edge: Simplest non-arb signal. Short-horizon aggression predicts the next fair tick more often than not, until it does not. Guards: Fade the signal when |d| is already large (flow is exiting, not informing). Kill in #15’s chaos regime. Dies when: You treat informed wing-exits as “imbalance to chase.” Ship: First. Good onboarding template.

5. Crossed-book / complement arb

Thesis: If ask_yes + ask_no < 100 net of taker fees, take both. Locked box, cash-and-carry. Habitat: Any time the two books gap. More common at open (#12 racing) and around jumps. Edge: Mechanical. Not a prediction. Guards: Compute fees on both legs with Q(p) = p(100−p). A 49+50 = 99 looker is not an arb after two taker charges near 50¢. In the wings the same 1¢ gap often is an arb because Q(p) is small. Once multiple strikes are listed, monotonicity arbs come free: P(up > 10bps) ≥ P(up > 25bps). Not live today. Dies when: You lift the 99 without the fee model and call it arb. Ship: First.

Lead-lag

The general form: some series moves first, the binary’s price moves second, and the gap is tradeable. On a 60-second contract the gaps are milliseconds to a few seconds, so every template here is a latency race. Ship them with realistic expectations attached.

21. Cross-venue spot lead-lag

Thesis: Deepest venue leads. Binance BTCUSDT perp typically moves before thinner books. If the settlement oracle were a slow single source, that lead would be a direct predictor of the print. On this venue it is not. The oracle is a 5-venue median at 4 Hz with a 3-of-5 quorum. A Binance spike the other four have not printed often does not move S_t at all. The tradeable object is not “Binance minus a lagging index.” It is:
plus a count of how many of the five have printed the move. Take the binary only when z clears a threshold, at least two other venues have begun to confirm, and τ is long enough that the median can catch up before freeze. Inside the TWAP window, switch the target from path-fair to settlement-fair. Habitat: First 50s, news or liquidation tapes, when venue dispersion is wide. Edge: Oracle update lag, which is a venue parameter (median + quorum + 250ms publish), not a market fact. Publish the oracle cadence and this template becomes a fair game rather than a gotcha. Guards: Require confirmation from a second venue. Kill when the lead reverts before the median moves, that is the usual case, and it is why naive Binance-lead bots bleed. Dies when: You treat Binance as the oracle. Ship: Later. Rewrite any draft that assumes a single-source index.

22. Oracle-print anticipation

Thesis: Narrower version of #21 aimed at the settlement mechanic rather than the path. Settlement is a 10s TWAP of a 4 Hz feed (~40 prints). That value is partially determined before the window closes. After k prints:
The most the remaining prints can move close is w_left times a bounded move. Residual uncertainty shrinks deterministically. Trade P(close > K) against the book. Habitat: Last 10 seconds only. Edge: The sharpest lead-lag on the venue. Users who compute the running TWAP from the public oracle websocket can mark settlement-fair more tightly than a book still quoting path-fair. Guards: This is the one to stress-test internally before shipping. If a user can compute the settlement print early with high confidence, the last seconds of every round are a solved game. Decide whether that is a feature (publish the running TWAP) or a hole (it already is public math on a public feed). Dies when: You ship it as a user bot before the venue has decided the policy. Ship: Internal.

23. Near-round leads far-round

Thesis: With rolling windows, multiple rounds are live at once with different strikes and expiries. They share one underlying path. The near-expiry round has far higher gamma, so its price moves first and hardest on a given spot tick. The far round is mechanically slower to reprice. Trade: near-round fair as a predictor of far-round fair, sized by the ratio of their deltas. Venue-internal, no external feed needed, and therefore the most accessible lead-lag template for users without co-location. Habitat: Not live. Season 1 is a single 60s BTC series. The catalog already names ob-btc-ud-5m, ob-eth-ud-60s, and others, this template waits for a second book. Edge: Cross-gamma. Only once two expiries or two strikes share a path. Guards: Do not fake it by treating consecutive 60s rounds as a spread. They do not overlap; the last one’s strike is dead. Dies when: You ship a runnable bot against one book. Ship: Later. Design only until a second series lists.

24. Yes book leads No book

Thesis: The two books do not update symmetrically. Directional flow hits the side matching sentiment first, so one book carries the information and the other lags. Detect via cross-book price disagreement |p_yes + p_no − 100| with a sign, then take the lagging book. Habitat: Any time the sum leaves 100 by more than k ticks but is not yet a fee-adjusted arb. Edge: Overlaps with #5, but distinct: #5 waits for a completed arb, this one trades the lag before it becomes an arb. Higher frequency, lower per-trade edge, and it can be wrong. Guards: If the gap is already an arb after fees, do #5 instead. If #11 is quoting both sides, this signal is often you. Dies when: You lift the lagging book into a gap that is a posting artifact, not information. Ship: Later.

25. Correlated-asset lead-lag

Thesis: ETH, SOL, and BTC move together at short horizons with asymmetric lead. During news-driven moves, the asset where the news originates leads. Also applies to funding-rate spikes and large perp liquidations, which telegraph short-horizon BTC direction. Habitat: Teaching example. Weakest template of the group at 60-second horizons. Include it so users see a signal that backtests better than it trades. Edge: Usually none after latency and after the BTC oracle has already printed the move. Guards: If you must run it, require the lead asset to move before the BTC median, and flatten when BTC has already repriced. Dies when: The backtest uses minute bars. Ship: Later. Not runnable until those series list, and even then a teaching bot.

Volatility

6. Implied vs realized

Thesis: Invert the quote for implied σ, compare to realized.
  • Implied rich → price compressed toward 50 → buy the leader (the side fair already prefers)
  • Implied cheap → fade the leader (the book is too certain)
Habitat: Mid-round, |d| moderate. Invert with path-fair, not a 30-day option vol. Edge: The book is a vol quote. Most users will not see that. Ship the general form so they see #7 is the tail case of the same object. Guards: Realized must be the oracle’s 1s EWMA, same as #0. Do not mix Binance realized with median implied. Dies when: You invert a 99¢ wing and call it 5-vol. Wings are price floors, not vol quotes. Hand those to #7 / #10. Ship: Core.

8. Delta-hedged binary

Thesis: Hedge φ(d) / (S σ √τ) on a perp elsewhere, hold the binary as pure vol. Habitat: Users who already run options books. Needs an external hedge venue and a funding/fee model for the perp. Edge: Isolated vol. On this venue the interesting vol is the last-10s TWAP residual, not the 60s path. Hedge path-delta in the first 50s; shrink the hedge as settlement-fair takes over, or you will be hedging a delta the TWAP has already killed. Guards: Binary delta explodes as τ → 0 on last-print math. Use settlement-fair delta in the window or the hedge will overtrade. Dies when: You hedge last-print delta through the TWAP window and churn the perp to death. Ship: Later.

Shared risk (every template inherits this)

Lifted from #15 so it is not optional:
  1. Kill switch. Chaos-regime cancel. Manual flatten. Daily loss cap.
  2. Inventory cap. Per side, per round, and net Yes−No.
  3. Jump pull. |ΔS| > n · σ √Δt cancels resting quotes before the next fair compute.
  4. Settlement-fair switch. At τ = 10s, #0 flips models. Templates that cannot speak settlement-fair must flatten or pull.
  5. Fee model. Taker 250 via Q(p). No taker template ships without it. No box template ships as a lifter.
  6. PnL attribution. Edge label required. If you cannot name the edge, you are not running a template.

What changed from the draft

The source note is omnibook-strategy-templates-2.md. Polishes applied here:
  • Bound every template to Omnibook rules (5-venue median, 4 Hz, 10s TWAP close, 1–99¢, maker 0 / taker 250, tie → No).
  • Split #0 into path-fair vs settlement-fair. Last-print digital math is wrong in the window.
  • Rewrote #21: Binance-lead is not oracle-lead on a median-of-five.
  • Made #22 concrete (running TWAP, leftover weight) and marked internal.
  • Marked #23 / #25 as not live (single series today).
  • Added real fee arithmetic to #5 and the box family. Posted boxes work; lifted boxes do not.
  • Noted TWAP helps #7 (wicks dilute) and defines #16 / #22.
  • Forced #17 to ship with #20.
  • Added a consistent field layout, a catalog table, and a ship order.
IDs, family grouping, and the original warnings (grid, lifting vs posting, short-trend/long-chop) are unchanged on purpose. Listing order is market making on top, then taking / vol / lead-lag. Every template stays in the set.