BlackMagiK - prediction market trading bot

Guide

Indicators

Twenty-two of them, in three tiers. The tiers are the ranking, and it is a ranking at this horizon: a fifteen-minute contract on a settlement index is a very short instrument with a known strike, and where an indicator sits here says nothing about how it would rank on a daily chart.

Every indicator's parameters are named after it on the settings form, so realized_vol_lookback is the lookback of the realized-volatility indicator. The settings they nearly all share are explained once, at the end of this section.

Predictive Predictive at this horizon

What a fair price for a fifteen-minute binary is actually built out of: where the index sits against the strike, how much variance is left before settlement, and what the book is charging for it. Every one of these refers to the contract's own strike and its own clock, which is the property the rest of the library does not have.

Where this tier sits

Top of the list, and not by a small margin. A binary pays on one question -- is the settlement index above this strike at this time -- and these are the only indicators here that are about that question. The rest are about the price series in general.

Distance to strike distance_to_strike
What it measures
How far the underlying sits from the strike, measured in standard deviations of the volatility still to come before settlement rather than in dollars.
When it matters at 900 seconds
Always, and increasingly as the clock runs down. Two dollars from the strike with twelve minutes left and two dollars with forty seconds left are completely different contracts, and this is the reading that tells them apart. It is the single most informative number on the platform for this instrument.
What the default means
On, off the underlying index, with a blocking warm-up and sigma read from the realized-volatility indicator rather than from a second copy of its own. The Ito drift correction is off: over 900 seconds the drift term is far smaller than the measurement noise, so it is available and not assumed.
Honest ranking
First. It is the reading the fair price is computed from, and the one every other predictive indicator is measured against.
Realized volatility realized_vol
What it measures
How much the source series is actually moving, over a rolling window of bars, as a per-bar or annualised sigma.
When it matters at 900 seconds
Always, but indirectly: almost nothing trades on sigma itself. It matters because distance-to-strike, the implied gap and the regime classifier all divide by it, so an estimate that is wrong makes three other readings wrong in the same direction and none of them look broken.
What the default means
On, Yang-Zhang over 60 five-second bars -- five minutes of history, comfortably inside one contract -- with a blocking warm-up, so it publishes nothing rather than publishing a sigma built from four observations.
Honest ranking
Second, as an input rather than as a signal. Its rank is borrowed from what reads it.
Implied probability implied_probability
What it measures
P(YES) as the market is currently quoting it. A level, published directly -- there is no transfer function here because there is no mapping to declare.
When it matters at 900 seconds
Always. It is the other half of every edge calculation on the platform: a model number is only interesting next to the number the market is charging for the same outcome.
What the default means
On, read off the microprice rather than the mid, and refusing to publish at all once the spread exceeds 20 cents. That ceiling is the important part: in a market that wide the quoted probability is a range, not a number.
Honest ranking
Third, and only because it is a measurement of the market rather than a view about it. Nothing here is more reliable.
Implied vol gap implied_vol_gap
What it measures
The sigma the market's quote implies, minus the sigma being realized, in the same unit as the volatility indicator it is compared against.
When it matters at 900 seconds
When the two disagree by enough to be worth a position: the market pricing more movement than is happening, or less. It is the cleanest mispricing signal available on this instrument, and it is also the one that goes quiet for long stretches because the two numbers mostly agree.
What the default means
On, with a tanh transfer at gain 4 clipped to five cents. The clip is the honest part of that: a gap this indicator is very confident about is still only allowed to move a fair price by a nickel.
Honest ranking
Fourth. Genuinely predictive when it fires, and it does not fire often.
Microprice microprice
What it measures
The size-weighted mid: where the next trade is more likely to happen. The weighting is crossed on purpose, so the price leans towards the side with *less* size behind it, because that is the side that gets consumed first.
When it matters at 900 seconds
On every tick, as the price basis everything else quotes against. A market bid 0.50 for 300 and offered 0.51 for 4 is not at 0.505, and taking the mid there is a systematic error in the same direction all day.
What the default means
On, preferring book depth where the venue provides it, with a three-bar EMA to stop a single lumpy quote moving the basis. A partial warm-up, so it is usable from the first few ticks.
Honest ranking
Fifth as a signal, higher than that as plumbing: it is the default price basis for implied probability and the vol gap.
Settlement progress settlement_progress
What it measures
How far through the settlement averaging window the contract is, from 0 to 1. A feature, emphatically not a signal.
When it matters at 900 seconds
In the last minute, decisively. Once the venue starts averaging, part of the outcome is already fixed and no amount of subsequent movement can change it -- so the variance a position is still exposed to collapses faster than the clock does. It says nothing about direction at any point.
What the default means
On, with a 60-second averaging window. That number describes one venue rule, and the trading engine refuses a configuration where two indicators disagree about it.
Honest ranking
Sixth. Not directional, and not optional either: without it the last minute of every contract is mispriced.
Settlement average vs strike settlement_average
What it measures
Where the number the contract actually settles on -- the venue's own trailing sixty-second average of the index, not its last print -- sits relative to the strike, and the probability that implies.
When it matters at 900 seconds
In the last sixty seconds, and nowhere else. Before the averaging window opens it says roughly what distance to strike already says. Inside it the two separate: spot stops being what decides the contract, and this is the only reading that keeps tracking the outcome as it is fixed.
What the default means
On, with a 60-second window and spot blended into the estimate by how much of the window has elapsed -- exact at both ends of it. Unlike distance to strike it does not stand down when the remaining variance collapses; it reports the certainty, clamped at eight sigma, because inside the window that certainty is real.
Honest ranking
Not ranked against the eight above, because it is not competing with them. It is silent for fourteen of a contract's fifteen minutes and it is the only thing here still worth reading in the last ten seconds.
Time decay edge time_decay_edge
What it measures
Edge per unit of remaining time -- a ranking statistic, derived entirely from a fair price another indicator already published.
When it matters at 900 seconds
When several markets are worth trading and only one can be. Four cents of edge with eight minutes to run and four cents with ninety seconds are not the same opportunity, and this is the ordering between them.
What the default means
On, over distance-to-strike, linear in time, normalised per minute, and refusing to divide once under five seconds remain. Declared a feature rather than a probability on purpose: it is a second opinion about a number already published, and a strategy adding the two together would be counting it twice.
Honest ranking
Seventh. It adds no information -- it re-orders information that is already there, which is a different and narrower job.
Order book imbalance book_imbalance
What it measures
Resting depth on one side against the other, from -1 to +1, with levels weighted by how far they sit from the touch. Positive is more size bid than offered.
When it matters at 900 seconds
Over the next few seconds, and rarely longer. It is real pressure and it is genuinely short-lived, which is why its transfer is clipped to two cents by default -- a lopsided book is worth something and it is not worth a nickel.
What the default means
Off. Not because it is weak, but because a book with depth beyond the touch is not something every venue publishes, and an indicator that is permanently not-ready fills a dashboard with red that means 'you have not configured this' and looks exactly like red that means 'something is broken'.
Honest ranking
Eighth, and the weakest of the predictive set -- but it is the last one still measured against the contract itself.

Sometimes useful Sometimes useful

Flow, range, regime, and one reading from off the platform. None of these know where the strike is. They describe conditions, which is worth something when the answer changes how much to trust an entry or how large to be -- and is worth nothing as an entry signal on its own.

Where this tier sits

Middle. Every one is a real measurement and none of them is about this contract's question. Four of the six are off by default because they need something the platform may not have: three need a traded volume counter on the quote, and the fourth needs an outbound connection to another exchange.

Volatility regime vol_regime
What it measures
Which volatility bucket the market is in -- low, medium or high -- with hysteresis so it does not flap across a boundary.
When it matters at 900 seconds
As a gate rather than a signal. High volatility is not a view on which way a contract resolves; it changes how much a strategy should trust its other inputs and how large it should be, and those are the strategy's decisions.
What the default means
On. Boundaries at 40% and 90% annualised with 10% hysteresis, which means leaving low needs 44 and leaving high needs falling under 81. The trading engine refuses hysteresis wide enough to make the medium regime unreachable.
Honest ranking
Top of this tier. It costs nothing, needs nothing beyond the volatility it reads, and it is the one context reading that changes a decision an operator would otherwise get wrong.
Average true range atr
What it measures
Wilder's average true range: how much ground the source covers per bar, including gaps between them.
When it matters at 900 seconds
As a distance unit. A stop, a trailing gap or an entry band expressed in cents means something different in a quiet market and a fast one, and this is the number that makes them comparable.
What the default means
On, 14 bars of 15 seconds -- three and a half minutes -- Wilder-smoothed, absolute units, blocking warm-up. On by default because it costs nothing and needs nothing.
Honest ranking
Second here, and honestly close to the regime classifier: both are the same kind of statement, one bucketed and one continuous.
VWAP vwap
What it measures
Volume-weighted average traded price from an anchor, with bands, and where the current price sits against it.
When it matters at 900 seconds
As a reference for where the contract has been trading, when there is enough traded volume for the average to mean anything. On a thin fifteen-minute market there frequently is not.
What the default means
Off. Anchored to the window open when enabled, needing 20 contracts of volume before it publishes -- below that it is an average of two prints wearing an authoritative name.
Honest ranking
Third. Sound where volume is real, and volume on a fifteen-minute binary often is not.
Cumulative volume delta cvd
What it measures
Aggressor-signed volume accumulated from an anchor: how much of the traded volume was buyers lifting offers versus sellers hitting bids.
When it matters at 900 seconds
When one side is genuinely leaning on the market. It is a measurement of what has already happened rather than of what is about to, so it leads by very little.
What the default means
Off. Published as a ratio rather than a raw count, which is the setting to leave alone: +400 means something completely different on a contract that has traded 500 lots and one that has traded 40,000. Refuses to publish if more than half the volume could not be classified as buy or sell.
Honest ranking
Fourth. Needs a trade feed with aggressor sides, and repays it modestly.
Volume surge volume_surge
What it measures
Current bar volume over a trailing baseline of the same. A feature, not a view.
When it matters at 900 seconds
As a warning that something is happening, without saying what. Heavy volume is not directional, and what it means depends entirely on what the strategy was doing when it arrived.
What the default means
Off. Three times the twenty-bar mean is the threshold when enabled, over 15-second bars, needing five bars of baseline first.
Honest ranking
Fifth. Useful as an input to a rule that already has a direction from somewhere else; useless on its own.
Funding and basis funding_basis
What it measures
Perpetual funding rate and the spot-perp basis, read from a second exchange.
When it matters at 900 seconds
Rarely, and slowly. Funding turns over on an eight-hour clock; a fifteen-minute contract sees a slice of one funding period, in which the rate is close to constant.
What the default means
Off, and inert until a source is both named and wired in. It is not permitted to be quietly zero: an unconfigured external reading that published a plausible number would be the worst failure on the platform.
Honest ranking
Bottom of this tier. It is here because the positioning information is real, not because the horizon suits it.

Traditional Mostly noise — included because users expect it

RSI, stochastics, MACD, CCI, Williams %R, rate of change, Bollinger bands and moving-average crossovers. Every one is correct, cheap, and off by default, in a form section of its own so that turning one on is a visible decision rather than an inherited setting.

Where this tier sits

Bottom, below every member of the predictive set and below most of the context set. The reason is structural rather than statistical. A classic oscillator is a *relative* statement about a price series -- this close against the last fourteen -- and it carries no reference to a level. A binary carries nothing else: what decides a 900-second contract is where the settlement index sits against one strike with a known amount of variance left, which is what distance-to-strike computes and what an RSI does not contain at any period.

The periods make it worse. These were designed around daily bars: a 14-period RSI on a daily chart looks back a fortnight, and the same 14 periods at a 15-second bar looks back three and a half minutes, in which a Bitcoin index does very little that is not noise. Shortening the bar does not fix it; it samples the same noise more often.

RSI rsi
What it measures
Wilder's relative strength index: average gain against average loss over the lookback, as 0 to 100.
When it matters at 900 seconds
Seldom. At the default it is a three-and-a-half-minute view of momentum on an index that mean-reverts inside that window. It is the most-asked-for indicator on the platform and the one with the least to say about this instrument.
What the default means
Off. 14 bars of 15 seconds, Wilder-smoothed, publishing the level, with the transfer centred on 50 -- which is the neutral reading, so a market with no momentum produces no adjustment. Switching the output to zones without moving that centre to zero is refused by the trading engine, because every neutral reading would otherwise become a full-clip adjustment forever.
Honest ranking
Middle of the bottom tier. Familiar, not informative.
Stochastic stochastic
What it measures
Where the close sits inside the recent high-low range, as 0 to 100, smoothed twice: %K over the slowing period, %D over %K.
When it matters at 900 seconds
Seldom, and for the same reason as the RSI. Its one advantage is that a range position is at least bounded by something observable, unlike an average of gains.
What the default means
Off. 14 bars of 15 seconds with 3-bar slowing and a 3-bar %D -- the classic slow stochastic. Levels at 80 and 20.
Honest ranking
Middle of the bottom tier, alongside the RSI.
MACD macd
What it measures
Fast EMA minus slow EMA, its signal line, and the histogram between them. The slow EMA is the lookback, because that is the longest window it reads.
When it matters at 900 seconds
Almost never at its classic settings. 12/26/9 needs 35 bars before the signal line means anything -- at a one-minute bar that is two and a half contracts, and the trading engine refuses the configuration outright rather than letting it run and never become ready.
What the default means
Off. 26/12/9 over five-second bars, which is the rearrangement that makes it warm inside the first third of a contract. Publishing the histogram in percent units, so the gain does not have to be retuned per price level.
Honest ranking
Low. The warm-up requirement is what really disqualifies it here -- it is at its most confident when least of the contract is left.
Bollinger bands bollinger
What it measures
A moving average with standard-deviation bands either side, and %B -- where the price sits across them.
When it matters at 900 seconds
As a volatility-scaled range position, which is the one thing in this tier that overlaps with something useful. Realized volatility measures the same dispersion directly and without the twenty-bar lag.
What the default means
Off. 20 bars of 15 seconds, two population standard deviations, publishing %B with the transfer centred on 0.5 -- the middle band, which is the neutral reading for that output.
Honest ranking
Highest of the bottom tier, and still below everything above it: whatever it says, realized volatility says earlier.
Commodity channel index cci
What it measures
Typical price against its own average, scaled by mean absolute deviation.
When it matters at 900 seconds
Seldom. It is a z-score with a scaling constant chosen so that roughly three quarters of readings land inside ±100, which is where the conventional levels come from.
What the default means
Off. 20 bars of 15 seconds, the constant at Lambert's 0.015, levels at ±100. Changing the constant rescales the whole indicator and the levels stop meaning what they are named.
Honest ranking
Low. A normalised deviation, arriving late.
Williams %R williams_r
What it measures
The stochastic's %K, upside down, on a -100 to 0 scale. It is the same measurement exactly: %R = %K − 100.
When it matters at 900 seconds
Whenever the stochastic would, which is seldom. It is here because it is asked for by name, not because it adds information the stochastic does not already carry.
What the default means
Off. 14 bars of 15 seconds, levels at -20 and -80, transfer centred on -50. Note that its overbought level is the *larger* number, which is why the trading engine compares the two levels by value rather than by magnitude.
Honest ranking
Bottom. Strictly redundant with the stochastic, and shipped anyway.
Rate of change roc
What it measures
How far the close has moved over the lookback, in percent or in the index's own units.
When it matters at 900 seconds
As raw momentum. It is the simplest thing in this tier and, for that reason, the least likely to be fooling anybody about what it is.
What the default means
Off. 12 bars of 15 seconds -- three minutes -- in percent.
Honest ranking
Low, but honest: everything else in this tier is a transformation of the same underlying move.
Moving average crossover ma_cross
What it measures
A fast average against a slow one, with a minimum separation and a confirmation count so a single tick across the line is not a crossover.
When it matters at 900 seconds
Very rarely. A crossover is a lagging statement by construction, and on a 900-second contract there is not enough runway left by the time it confirms.
What the default means
Off. 9 against 21 over five-second bars, EMA both sides, publishing the -1/0/+1 state with a step transfer centred on zero, requiring 0.02% separation for three bars. The two guards are what make it usable at all; without them it reports a crossover every time the averages touch.
Honest ranking
Bottom, with Williams %R. The confirmation it needs to be trustworthy is the confirmation this horizon cannot afford.

Settings every indicator has

Twenty-two indicators times a dozen fields is more than two hundred and sixty inputs on the settings form, and the overwhelming majority of them are these eight questions asked again. Each one is prefixed with the indicator it belongs to.

Enabled enabled

Whether the feed computes this indicator at all. Off, it costs nothing and publishes nothing.

At the boundaries. There is no middle. An indicator that is enabled and not ready is a different state from one that is off, and the instance page distinguishes them -- the first is waiting, the second was never asked.

Default. Varies by indicator, and the default is the platform's opinion. The predictive set is mostly on; everything needing traded volume or an external feed is off; the traditional set is off entirely.

Source series source

Which price series the indicator reads: the underlying settlement index, or the contract's own price.

At the boundaries. The contract price is refused unless the engine's master switch is also on. That is two deliberate acts rather than one, because a 900-second contract's price series restarts every window, so a 20-period average of it is an average of four observations for the first minute and garbage for several more.

Default. The underlying index, which has no such break and is what the contract settles against.

Bar interval bar_interval

How much time one bar of history covers.

At the boundaries. Lookback times bar interval is how far back the indicator reaches, and the trading engine refuses a configuration where that exceeds 900 seconds -- the window would span a settlement and describe two contracts at once. Going shorter does not add information, it samples the same movement more often.

Default. Between 5 and 15 seconds depending on the indicator, chosen so the default lookback fits inside a contract with room to warm up.

Lookback lookback

How many bars the statistic is computed over. Where an indicator has a fast and a slow period, this is always the slow one -- the longest window it reads.

At the boundaries. Too long and it spans a settlement, which the trading engine refuses. Too short and the statistic is dominated by whichever tick arrived last.

Default. Sized to warm up inside the first third of a contract, which is usually shorter than the textbook period for the same indicator.

Smoothing and smoothing period smoothing

An average applied to the published value, to damp tick-to-tick jitter.

At the boundaries. A smoothing period longer than the window it smooths never finishes warming up, and the trading engine refuses it. Heavier smoothing is not free either: it is lag, and on this horizon lag is the expensive kind of error.

Default. Mostly none. The exceptions are the readings taken straight off the book -- microprice and imbalance -- where a single lumpy quote otherwise moves the number.

Warm-up policy warmup

What the indicator does before it has enough history: block, and publish nothing until the window is full, or partial, and publish once a minimum number of bars have arrived.

At the boundaries. A partial warm-up needing more bars than the window holds is never ready -- a bot that runs cleanly, logs nothing and does not trade -- so the trading engine refuses it. Blocking is the safe answer and it costs the first part of every contract.

Default. Blocking where a half-warm value would be actively misleading, partial where an early estimate is better than silence.

Transfer function, gain, centre and clip transfer

How a statistic that is not a probability becomes an adjustment to one. The centre is the reading that means 'no opinion', the gain is how steeply it departs from there, and the clip is the most it may ever move a fair price.

At the boundaries. The clip is the guard that matters: at its maximum a single indicator may move a fair price by half a dollar, which on a binary is the whole range. The centre is the one that fails quietly -- a discrete -1/0/+1 output left with the centre a continuous output wanted turns every neutral reading into a full-clip adjustment in one direction, forever, which looks exactly like a signal. The trading engine refuses that pairing.

Default. A tanh transfer clipped to two cents on most indicators, five on the implied vol gap. Two cents is a deliberate statement about how much any single reading is trusted.

Orientation orientation

Whether the published adjustment is oriented against the contract's own strike, or left as the raw statistic.

At the boundaries. A direction on the underlying is not a direction on YES. Bullish raises P(YES) on a contract resolving YES above its strike and lowers it on one resolving YES below, and says nothing at all about a range market -- which gets no adjustment and a reason saying why.

Default. Oriented to the strike. The unoriented statistic is available and has to be asked for.

Minimum bars min_bars

How many bars a partial warm-up waits for before publishing.

At the boundaries. Above the lookback it can never be reached. At its floor the first published value rests on two observations.

Default. Roughly a third of the lookback -- enough for the statistic to have a shape, early enough to be useful in the same contract.

Settings

The sections below are the sections of the settings form, in the order the form lays them out: what to trade, when to get in, when to get out, how much, when to run, and what to do when something breaks.

Each entry says what the setting does, what happens at its boundaries, and what the shipped default is actually saying. The form itself carries the same descriptions the trading engine declares alongside each parameter — hover or tap the beside any field — plus its live bounds, which are B's answer and not this page's.

Market Universe

Which contracts are worth quoting at all. These are liquidity guards rather than opinions: they decide where the strategy is willing to operate, not what it thinks.

Outcome outcome_id

Which leg of the market to quote — YES or NO.

At the boundaries. Not a preference between two views. A binary's two legs are the same position with the sign flipped, and the leg to quote is the one whose book is worth quoting.

Default. YES, which is the leg venues quote and chart by convention.

Widest spread max_spread_cents

The liquidity guard: above this the market is not quoted at all.

At the boundaries. At zero nothing ever trades. Wide, the strategy quotes markets it cannot get out of without paying most of what it made — and every stop loss has to clear this number or the bid-ask gap triggers it on the fill.

Default. 10 cents. Wide enough for a normally liquid contract, narrow enough that an exit is not a donation.

Minimum book depth min_book_depth

Contracts that must be resting before the market is quoted.

At the boundaries. At zero the strategy will quote a book with one lot on it. High, it waits for depth that a fifteen-minute contract may never have.

Default. Zero — off. The spread guard is doing the liquidity work by default, and depth is the check to add when the spread guard turns out not to be enough.

Minimum observations min_samples

How many ticks a market must have been watched before it is traded.

At the boundaries. At zero, a single opening print can trigger an entry — which is the worst tick of the contract to trade on. High, the strategy spends the early part of every window watching.

Default. One. Effectively off; the presets raise it.

Depth override per market min_book_depth_by_market

Per-series depth floors, for the markets where the global one is wrong.

At the boundaries. Expert-tier and JSON-only on purpose: a key that does not match a series is silently ignored by every lookup, so an override on a mistyped id is an override that does nothing and says nothing.

Default. Empty. The global floor applies everywhere.

Entry Rules

When to take a position, and at what price. The edge floor and the spread floor have to be set together — see the note below, which is the single most common way to configure a bot that runs cleanly and never trades.

Spread worth capturing min_spread_cents

This strategy's whole signal: quote only where the gap is wide enough to be worth earning.

At the boundaries. A floor on opportunity, and distinct from the maximum spread above it, which is a ceiling on illiquidity. Set the floor above the ceiling and nothing is ever tradeable.

Default. 3 cents.

Minimum edge min_edge_cents

How far the fair price must sit from the quote before a position is worth taking.

At the boundaries. At zero, any spread wide enough is traded regardless of the model's view. Above roughly half the minimum spread it is unreachable, and the bot never trades.

Default. Zero — the edge check is off, and the spread floor is the only entry condition.

Lowest entry price min_entry_price

The cheapest contract the strategy will buy.

At the boundaries. Near zero it buys lottery tickets: the percentage stop losses below are percentages *of stake*, so a stop at 15% of a three-cent entry is half a cent and inside every spread. At 0.5 it will only trade coin flips.

Default. 0.02 — effectively off, and worth raising.

Highest entry price max_entry_price

The dearest contract the strategy will buy.

At the boundaries. Near 1.00 it is paying 97 cents to make three, where one loss erases thirty wins. Below 0.5 it will only take positions it believes are against the market's own view.

Default. 0.95 — effectively off, and worth lowering.

Ticks to improve join_ticks

How far inside the best bid to post.

At the boundaries. One tick is the minimum improvement that takes queue priority. More is the closest this strategy comes to chasing: it posts ahead of the queue rather than behind it, which is what trading the close needs and what a one-tick join does not get in a fast book. Each tick is also a tick of edge given away.

Default. One tick.

Cooldown between entries entry_cooldown_seconds

How long to wait after any entry before taking another.

At the boundaries. At zero the strategy will re-enter on the next tick, which on a moving market is the same position taken three times. Long, and a fifteen-minute contract holds one entry.

Default. Zero — off.

Cooldown after a loss loss_cooldown_seconds

How long to wait after a losing position specifically.

At the boundaries. The one cooldown that survives a restart — it is backed by the ledger rather than by process state, so a crash does not bypass it. At zero, a strategy that is wrong about the market is wrong about it repeatedly and quickly.

Default. Zero — off. Every preset sets it.

Exit Rules

How a position ends. The first switch decides whether any of the rest apply at all, and the trading engine refuses a configuration that sets an exit under a hold-to-expiry toggle rather than silently ignoring it.

Hold to expiry hold_to_expiry

Take the position and let it settle. Nothing closes it on a price move.

At the boundaries. On, every managed exit below must be cleared. The thesis is that the model's number is better than the market's, and a stop is paying the spread to disagree with yourself. Off, at least one exit rule ought to be set — the alternative is a position with no plan.

Default. On. The inert answer: a strategy that says nothing about exits holds to settlement rather than inheriting a stop nobody chose.

Take profit at price take_profit_price

Close when the contract reaches an absolute price.

At the boundaries. Above the entry band's ceiling it never fires. Set with the percentage target as well and the two will disagree; pick one.

Default. Off.

Take profit at percent of maximum gain take_profit_pct

Close after capturing this share of the distance between the entry and a dollar.

At the boundaries. At 100 it only fires on a contract that has already resolved in everything but name. Low, it books a few cents and pays the spread to do it.

Default. Off.

Stop loss at price stop_loss_price

Close when the contract falls to an absolute price.

At the boundaries. Inside the spread it fires on the fill. Below zero is not expressible, so a stop that never fires is written as no stop.

Default. Off.

Stop loss at percent of stake stop_loss_pct

Close after losing this share of what was put up.

At the boundaries. The percentage is of stake, so its cash value depends on the entry price: 15% of a 35-cent entry is 5.25 cents, and 15% of a 5-cent entry is under a tick. Both the entry band and the spread ceiling therefore constrain it.

Default. Off.

Trailing stop activation trailing_activation_pct

How far into profit the position must be before the trail arms.

At the boundaries. Set without a gap, or a gap without this, and the trading engine refuses the configuration — half a trailing stop is not a rule. Armed immediately, the trail is a stop loss wearing a different name.

Default. Off.

Trailing stop gap trailing_gap_cents

How far below the high-water mark the trail sits.

At the boundaries. Narrower than the spread and the bid-ask gap takes the position off on the first quote update. Wide and it is a stop loss that moves occasionally.

Default. Off.

Sizing & Risk

How large, against what bankroll, and when to stop for the day. Nothing in this section is enforcement — the risk limits that are enforced live on the trading engine and are pushed separately.

Order size quantity

Contracts per entry, before the risk budget trims it.

At the boundaries. The budget can only reduce this, never raise it. Large enough that the budget trims every order, and the effective size is the budget's rather than this one's.

Default. One contract.

Bankroll basis bankroll_basis

Whether sizing measures itself against the live account balance or against a figure you declare.

At the boundaries. The live balance moves with P&L, so size compounds in both directions. A declared figure does not, which makes a backtest and a live run comparable — and a backtest has no account to ask, so a run that sizes against the live balance refuses every entry in a replay and says so.

Default. The live balance.

Declared bankroll declared_bankroll

The fixed figure to size against, when the basis is declared.

At the boundaries. Larger than the account actually holds and every fraction below is a fraction of money that is not there.

Default. Empty — the live balance is used.

Cash reserve floor cash_reserve_floor

Cash that is never committed to a position.

At the boundaries. At zero the account can be fully deployed, and a margin call or a fee has nothing behind it. Above the balance, nothing trades. It is a floor on what may be deployed and not a stop: nothing is closed to restore it.

Default. Zero — off.

Kelly fraction kelly_fraction

Size as a fraction of the Kelly-optimal stake for the edge the model believes it has.

At the boundaries. Full Kelly is optimal only if the edge estimate is exactly right, and it is not; the usual practice is a quarter or less. It needs a strategy that prices an outcome and can state how far the market is from it — a strategy that earns a spread has no edge to size against, and every entry it proposes is refused while this is set. Left off in every preset deliberately: the presets size through the order quantity.

Default. Empty — flat sizing.

Kelly cap: share of bankroll kelly_cap_fraction

A hard ceiling on any one position as a fraction of bankroll.

At the boundaries. This binds whatever the Kelly fraction computes, which is the point of having it. At 1.0 there is no cap.

Default. 0.10 — a tenth of bankroll in any one position.

Daily profit stop daily_profit_stop

Stop trading for the day once realised profit reaches this.

At the boundaries. Only meaningful for a strategy that books P&L in small realised pieces. A bot that realises at settlement in lumps would fire this on the timing of the settlements rather than on how the day went.

Default. Off.

Rolling drawdown limit rolling_drawdown_limit

Stop trading once the drop from the peak exceeds this, in cash.

At the boundaries. Tight, and it fires on a strategy that is early rather than wrong — which for a convergence trade is the same shape as working as designed.

Default. Off.

Rolling drawdown window rolling_drawdown_window

How far back the drawdown is measured.

At the boundaries. Match it to how often the strategy trades. Thirty days for a scalper is several hundred round trips before a bad week is noticed; seven days for a strategy taking two positions a day is a sample of fourteen.

Default. 7 days.

Schedule

When the bot is allowed to act — on the contract's clock and on the operator's. All of it is inert by default: round the clock, every day, no blackout, no warm-up, no circuit breaker. A strategy that says nothing about the schedule behaves as though it did not exist.

Earliest entry (seconds to close) min_seconds_to_close

Entries only once the contract is at least this close to settling.

At the boundaries. It must sit above the no-entry window below it, or the two describe an empty interval and nothing is ever entered. Set high it confines the strategy to the beginning of a contract.

Default. Zero — no floor.

Latest entry (seconds to close) max_seconds_to_close

Entries only once the contract is within this far from settling.

At the boundaries. Together with the setting above it, this is the entry window. Empty means no ceiling — a mispricing is worth taking whenever it appears.

Default. Empty.

No-entry window before close no_entry_seconds_before_close

A hard stop on new positions in the run-up to settlement.

At the boundaries. It must be larger than the time exit below, or a position can be opened into its own exit. At zero the strategy will enter with one second left, when the venue is already averaging.

Default. 60 seconds — one settlement averaging window, which is the period in which entering is a bet on an outcome that is already partly fixed.

Time exit before close time_exit_seconds_before_close

Close any open position this long before settlement.

At the boundaries. Must fire before the market closes and after entries have stopped; the trading engine checks both. Set too tight against the no-entry window and the strategy opens positions it immediately closes.

Default. Off — positions run to settlement.

Timezone trading_timezone

The zone the trading hours and floating blackouts are read in.

At the boundaries. It is a separate setting from the hours on purpose: '09:30' and 'the zone 09:30 is in' are two decisions, and a combined field makes one of them invisible.

Default. UTC.

Trading hours start trading_hours_start

The wall-clock time trading is allowed to begin.

At the boundaries. Equal to the end time means round the clock, which is how the inert default is expressed. A start after the end is a window that wraps midnight, which is legitimate and worth being deliberate about.

Default. 00:00, with the end at 00:00 — always open.

Trading hours end trading_hours_end

The wall-clock time trading stops.

At the boundaries. See the start time. These contracts settle every fifteen minutes through the night and the weekend, so office hours here are a real decision rather than a formality.

Default. 00:00 — always open.

Trading days trading_days

Which days of the week the bot may act on.

At the boundaries. At least one must be picked — the trading engine refuses an empty selection, because a bot with no trading days runs cleanly, reports nothing wrong, and never trades.

Default. All seven.

Blackout windows blackout_windows

Named periods in which the bot does not act at all.

At the boundaries. A window whose ends carry a zone names an instant; one without names a wall clock, read in the timezone above. Give one end a zone and not the other and the trading engine refuses it — the window's length would depend on who was reading it.

Default. None.

Warm-up period warm_up_period_seconds

How long after starting the bot watches before it is allowed to trade.

At the boundaries. The coarse floor under every indicator's own warm-up. At zero a bot that has just come up may act on its first two observations; longer than a contract and it never trades the one it started in.

Default. Zero — off.

Pause above realized volatility vol_circuit_breaker_high

Stop entering when measured volatility exceeds this.

At the boundaries. Read against the realized-volatility indicator, in whatever unit that indicator is publishing — so annualising it changes what this number means. A ceiling switches a scalper off in exactly the conditions it exists for.

Default. Off.

Pause below realized volatility vol_circuit_breaker_low

Stop entering when measured volatility falls under this.

At the boundaries. The right number depends entirely on the bar interval and estimator configured on the volatility indicator, which is why no preset sets one.

Default. Off.

Reliability

What happens when the platform cannot see. These are the settings that decide whether an outage costs money, and they are the ones most worth reading before the outage.

Flatten on disconnect flatten_on_disconnect

Close open positions when the market feed goes away.

At the boundaries. Off, positions ride through an outage to settlement, which is an acceptable answer for a hold-to-expiry strategy and a bad one for anything with a stop, because the stop is not being watched.

Default. On.

Disconnect grace period flatten_after_disconnect_seconds

How long the feed may be silent before flattening begins.

At the boundaries. At zero a one-second reconnect closes every position. Long, and the flatten happens after the move it was there to avoid.

Default. 30 seconds.

Exit slippage allowance exit_slippage_cents

How far through the touch an exit may reach to get filled.

At the boundaries. At zero an exit only fills at the touch, which in a moving market means it does not fill. Wide, and the exit pays whatever is being asked.

Default. 2 cents.

Allow market orders when blind allow_blind_market_exit

Whether an exit may be sent as a market order when there is no usable quote to price it against.

At the boundaries. Off, a position that has to be closed while the book is invisible stays open. On, it is closed at whatever price the venue has. Neither is comfortable; on is the less bad answer for a position that must not be held.

Default. On.

Exit retry interval exit_repropose_seconds

How often an unfilled exit is re-proposed at a new price.

At the boundaries. Expert-tier because of the low end: an interval shorter than the venue's acknowledgement round trip queues retries behind each other, and the symptom is a bot that appears to be hammering the exchange for no reason.

Default. 15 seconds.

Connection & Account

What this bot is allowed to do at the venue.

Read-only mode read_only_mode

Run the whole strategy — indicators, decisions, proposed orders — and send nothing.

At the boundaries. The honest way to watch a configuration before trusting it. It is not a risk control: nothing about it survives being switched off. Turning it on stops a running bot sending as soon as the settings are saved; turning it off frees one again, unless the bot was started read-only — then its connection to the venue is wired shut for the life of the process and it has to be restarted.

Default. Off — orders are sent.

Rate limit tier rate_limit_tier

How fast this account is permitted to send requests.

At the boundaries. A statement about what the account holds, not a preference — and one the bot checks rather than takes your word for. It asks the venue for the account's real tier on its first request and paces against that, so a wrong answer here costs you the first moment of a session rather than the session. Worth setting correctly anyway: it is what pacing falls back to if the venue will not say.

Default. Basic — the entry tier, which is what a preset can safely assume.

Indicators

What the platform measures. Every field here belongs to one indicator and is named after it, so `realized_vol_lookback` is the lookback of the realized-volatility indicator. The individual indicators are covered above; the settings they share are covered below.

See the indicator reference above.

Traditional Indicators

The same shape of settings as above, for the classic technical set. They are in a section of their own so that an operator scrolling the form can tell at a glance which indicators the fair price is actually built out of — and every one of them is off until switched on.

See the indicator reference above.

Combining Indicators

How readings become a decision. Three modes, covered in full below, plus the settings they share: which phase of the contract each configuration applies to, how many ticks a signal must hold before it counts, and how long to wait afterwards.

See the three combination modes below.

Combining indicators

Indicators answer what is the market doing. A bot has to answer so do we trade, and these are the three declared ways to get from one to the other without writing code. They are a ladder of honesty, and the parameters keep it visible: what each mode publishes is different, and that difference is the whole distinction between them.

Rule builder

Publishes: A signal. Not a price.

How it works

A boolean expression over indicator readings, with AND/OR/NOT nesting, written as JSON. Each leaf compares one reading against a threshold or against another reading — above, below, crossing above, crossing below. A signal has to hold for the confirmation window before it counts, an invalidation condition can cancel a pending one, and a cooldown stops the same condition firing repeatedly.

No branch is short-circuited: every comparison is evaluated on every tick, because a `crosses_above` that was not watching on the tick the cross happened would miss it outright, or report it one tick late against a stale previous value.

When to use it

When you can state the entry condition in words and mean it literally. It is the mode that claims the least — 'these conditions hold' is the most an operator writing thresholds can truthfully say — and for that reason it is the one to start with.

Example

Enter when the market is quoting well under the model, and the book agrees.

{
  "all": [
    {"reading": "implied_probability", "op": "below",
     "other": "distance_to_strike", "by": 0.04},
    {"reading": "book_imbalance", "op": "above", "value": 0.2}
  ]
}

Settings: combination_rule_entry, combination_rule_exit, combination_rule_invalidate, combination_confirmation_ticks, combination_cooldown_seconds.

Weighted score

Publishes: An adjustment to a fair value the platform already computed. Deliberately not a probability.

How it works

Each named reading is normalised — a z-score against a rolling window by default — multiplied by its weight, and the weighted results are summed into one number. That number goes through a logistic with a configurable slope and midpoint, and out the far side as a bounded adjustment to the fair value: at most five cents by default, and never more than half a dollar.

A dead band around zero and a minimum score keep small readings from producing small trades. When indicators disagree, the agreement setting decides whether the net weighted view is taken or the disagreement is treated as no view at all.

When to use it

When several readings each say something and none is decisive. It is honest about what it is: a weighted sum of z-scores has never been fitted to anything, so its logistic is published as an adjustment and never as P(YES). Calling it a probability would be inventing a calibration nobody measured.

Example

Lean on the vol gap, take the book as a tiebreaker, fade the tape.

{
  "implied_vol_gap": 1.0,
  "book_imbalance": 0.4,
  "cvd": -0.2
}

Settings: combination_score_weights, combination_normalization, combination_normalization_window, combination_transfer_slope, combination_min_score, combination_dead_band, combination_max_adjustment, combination_agreement.

Model input

Publishes: P(YES). The only mode here that does.

How it works

Selected readings, each at a declared lag, multiplied by fitted coefficients, summed with an intercept and put through a link function — logistic by default. The result is a probability, and the blend setting decides how much of the platform's fair value it replaces: at 1.0 the model is the fair value, at 0 it is ignored, and in between the two are mixed.

When to use it

When the coefficients came from a fit you ran, on data you have, and you can say what they were fitted against. This is the only mode that may replace a fair value rather than nudge it, and the reason it is allowed to is that its numbers are stored in the configuration where they can be read back and argued with.

Example

Two features, one of them lagged, blended half-and-half with the platform's fair value.

{
  "implied_vol_gap": 2.4,
  "book_imbalance@3": 0.8
}

Settings: combination_model_features, combination_model_intercept, combination_model_link, combination_model_blend, combination_model_min_edge_cents.

Settings all three modes share

Combination mode combination_mode

Which of the three modes above is in force, or none of them.

At the boundaries. None is the default and it is genuinely inert — the strategy behaves as though this layer did not exist. Switching modes does not carry configuration across: a rule tree means nothing to the score mode.

Default. None.

Switch to the close phase at combination_phase_switch_seconds

Splits a contract's life in two, so the open phase and the close phase can name different indicators, weights and rules.

At the boundaries. An unknown close time is not 'plenty of time': with a phase switch configured and no close time known, the combination reports itself not-ready rather than guessing which phase it is in. A close phase that declares no override reuses the open phase's configuration, so switching this on changes nothing until something is actually said about the close.

Default. Empty — one configuration for the whole contract.

Confirmation window combination_confirmation_ticks

How many consecutive ticks a signal must hold before it counts.

At the boundaries. At one, every flicker is a signal. High, and a fifteen-minute contract can pass while a signal is still being confirmed. This counter is process state: a restart re-confirms a pending signal from scratch.

Default. One — off.

Cooldown after a signal combination_cooldown_seconds

How long the combination stays quiet after firing.

At the boundaries. Also process state, and this one is not conservative about it: a restart forgets a cooldown that had been running. The cooldown that survives a crash is the entry cooldown in the entry rules.

Default. Zero — off.

Fair value indicator combination_fair_indicator

Which reading the score mode adjusts and the model mode blends against.

At the boundaries. Empty means the strategy's own fair value. Naming an indicator that is not enabled leaves the whole combination not-ready, and it names what it is waiting for.

Default. Empty.

Strategies

Five of them ship with the platform. They are not five settings of one bot: each reads a different thing and takes a different kind of bet, and the choice between them is a larger decision than any number on the settings form. Two rest an order and wait to be filled; three pay the touch and take the price in front of them.

Every entry below is platform-authored, which means none of them can trade real money as they ship — that is a statement about ownership rather than about quality, and the going-live section explains what cloning changes.

Spread capture spread_capture
What it does
Quotes passively inside a wide book and waits to be filled. It joins the bid one tick better than the touch, so what it earns is the difference between where it rests and the mid -- roughly half the spread, less that tick. It reads a book and nothing else: no indicator gates an entry, and it would behave identically on a market nobody had ever computed a statistic for. That is what makes it the reference implementation of the contract between a strategy and the platform rather than a demonstration of the platform itself.
When it works
Wide, two-sided, reasonably deep books where the spread is a real cost of immediacy somebody else is paying, and where the mid is a fair estimate of the contract's value. It is the only shipped strategy that earns the spread rather than paying it, so it is the one that survives being early.
When it does not
A tight book, where there is no spread to capture and the edge floor refuses everything -- a bot that runs cleanly and never trades. And a book that is wide because the market has an opinion: resting on the bid in front of a move means being filled by exactly the person who was right about it, which is adverse selection and no indicator here is asked to warn about it.

What to tune first

min_spread_cents

The floor that makes the edge reachable at all. The edge this strategy can earn is about half the spread less one tick, so this and `min_edge_cents` have to be set together — a five-cent edge demanded in a six-cent market is a bot that watches forever.

min_edge_cents

What the fill has to be worth against the mid. Raising it trades frequency for quality until it passes what the spread floor can supply, at which point it trades frequency for nothing.

join_ticks

How far inside the touch to rest. One tick is the queue position this strategy was written for; two posts ahead of the queue and fills faster, which is the closest thing it has to chasing.

hold_to_expiry

The switch between two entirely different bots. On, the thesis is the settlement and the managed exits are refused; off, the thesis is the round trip and the exits are what realise it.

Fair value fair_value
What it does
Prices the contract itself and trades the difference. A binary that pays out above a strike is worth the probability of finishing above it, and under a driftless lognormal underlying that probability is a closed form: Phi of the log distance to the strike divided by the effective volatility. Both inputs arrive from indicators — `distance_to_strike` for the numerator, measured against the settlement index rather than the contract's own price, and `realized_vol` for the denominator — so nothing in the strategy estimates anything. It compares that price with the touch and takes the side the difference favours, immediate-or-cancel, because an edge measured against the ask is only real if the ask is what gets paid.
When it works
Markets that are liquid enough to have a tight touch but slow to reprice the index — the disagreement is real and it is takeable before it closes. It is also the only shipped strategy whose intents state an edge, so it is the only one Kelly sizing can size from: the bet grows with the mispricing rather than with the operator's confidence.
When it does not
Anywhere the inputs are wrong rather than the market. A stale index, a strike parsed from the wrong contract or a volatility estimate that collapsed because the underlying stopped printing all produce their *largest* apparent edge exactly when they are most wrong, which is why the edge band has a ceiling as well as a floor. It also stops trading inside the settlement averaging window, where the remaining variance collapses cubically and the model is at its least reliable in the minute a mispricing looks largest.

What to tune first

min_theo_edge_cents

How large a disagreement is worth paying the touch for. A real edge on a binary is a couple of cents; below the fee and half the spread there is nothing left to earn.

max_theo_edge_cents

The ceiling, and the more important half. Raising it does not buy bigger opportunities — it buys the trades where an input is broken.

vol_multiplier

The one opinion the strategy holds about the model: forward volatility as a multiple of the volatility just realised. At one, the price it computes is exactly the probability the distance indicator already published.

min_sigma_effective

The floor under the denominator. Without it, a quiet index produces a large number divided by nearly nothing, which is where a theoretical price is most confident and least right.

kelly_fraction

In the sizing section, and only usable here and on `settlement_sniper`: the other strategies state no edge and the trading engine refuses the pairing at save.

Momentum scalper momentum_scalper
What it does
Trades continuation near the close. It reads a short rate of change on the settlement index, and when the index has moved more than a threshold towards a strike that is still within reach, it takes the side it is moving to at the touch, immediate-or-cancel. Two gates do the work: the move has to be large enough to be a move, and the strike has to be between a floor and a ceiling measured in sigma — close enough to be reached in the time left, far enough away to still be worth something.
When it works
The last few minutes of a contract, when a move in the index has less remaining time to be given back and the contract's price is most sensitive to it. It wants a fast, tight book: it pays the touch on the way in and on the way out, so the spread is a cost it pays twice on every round trip.
When it does not
A chopping market, where the threshold is crossed in both directions and each entry is stopped out by the reversal that follows. It has no view on whether a move is exhausted — it is the same reading `mean_reversion` fades, read the opposite way — so the two are genuinely opposed bets and running both on one market is paying two spreads to hold no position. The quieter failure is the configuration one: a threshold in percent against an indicator publishing absolute units is met on every tick, in both directions.

What to tune first

momentum_threshold

How large a move counts. In percent of index, so a hundredth here is a real move on a fifteen-minute contract and a thousandth is the tape.

momentum_window_seconds

The horizon the move is measured over — and it is only a label until it matches the indicator's own bar interval times its lookback, which is what the trading engine checks at save.

entry_window_seconds

How long before the close entries open. This is the whole premise: the same signal earlier in a contract has far more time to be given back.

max_distance_sigma

How far out a strike may be and still be considered reachable. Widening it buys cheaper contracts that need a larger move.

stop_loss_pct

Tight by design here, and floored by the spread: a stop closer than the bid-ask gap fires on every fill and looks exactly like a strategy that does not work.

Mean reversion mean_reversion
What it does
Fades an excursion. It reads a z-score of the index against its own recent mean — the `bollinger` indicator, set to publish standard deviations rather than %B or bandwidth — and when the move is beyond the threshold it takes the side betting on the return. It rests a GTC order rather than taking the touch, because the whole thesis is that the current price is temporarily wrong and there is no hurry to pay for immediacy. A volatility-regime gate sits in front of every entry, and a missing classification counts as not having cleared it.
When it works
Quiet and ordinary conditions, with enough clock left for the excursion to unwind — which is why it declares a time floor of its own above the inherited blackout. Fading is the one shipped thesis that improves with patience, and the preset written for it holds to settlement rather than exiting on a price move.
When it does not
A trend. In a high-volatility regime a two-sigma excursion is what a trend looks like from inside it, and fading one is a series of entries each of which is immediately further underwater — which is why the regime gate, not an exit, is this strategy's actual risk control, and why the entry cooldown is the averaging-down guard. It also has nothing to say about news: a move caused by an event that changes the settlement is a move that does not revert.

What to tune first

z_threshold

How far from the mean counts as an excursion. Lower trades more often against a weaker signal; higher waits for moves that are rarer and, in a trending market, more likely to be real.

lookback_seconds

What the mean is a mean of — and, like the momentum window, only a label until it matches the indicator's bar interval times its lookback.

vol_regime_max

The gate that keeps this out of a trend. The single most consequential setting on the strategy, and the one whose loosening is hardest to detect from the P&L alone.

min_time_remaining_seconds

How much clock a fade needs. The trading engine refuses a value at or below the inherited no-entry window, because a floor that never binds is a setting an operator can tune all day with no effect.

entry_cooldown_seconds

How long to wait between fades. This is what stops a move that keeps going from being a move this strategy keeps buying.

Settlement sniper settlement_sniper
What it does
Trades the arithmetic of the settlement itself. Kalshi settles these contracts on an average of the index over a window at the close, so once that window has opened the settlement number is partly fixed and the ticks still to come can move it by less and less. This reads `settlement_average` for where the running average has got to and `settlement_progress` for how much of the window has elapsed, and when the running average implies an outcome with high enough probability and the market is still pricing doubt, it takes the touch.
When it works
The last seconds of a contract whose outcome the average has effectively already decided, while the book has not finished repricing it. The edge is not a forecast — it is arithmetic — which makes it the most mechanical of the shipped strategies and the shortest-horizon one.
When it does not
A stale index. The entire thesis is that the running average is current, and an average computed from a feed that has stopped updating reads as maximally decided exactly when it is least trustworthy — the same failure shape as `fair_value`, at the moment there is no time left to discover it. It also depends on a venue that actually settles on an average over a window: on a contract settled at a single print there is no arithmetic to be early to. And it needs the inherited no-entry blackout lowered, or the window it exists to trade is blacked out in its entirety.

What to tune first

min_settlement_progress

How much of the averaging window has to have elapsed. Earlier is more opportunity and weaker arithmetic; a floor of 1 is reached only at the close, which is too late to enter, and the trading engine refuses it.

min_settled_probability

How decided the running average has to make the outcome before this will act on it.

min_settlement_edge_cents

How far the market has to be from that, measured against the price actually paid rather than the mid. The floor is what makes a wide market unprofitable to take.

no_entry_seconds_before_close

Inherited, and the one setting this strategy cannot leave at its managed default: sixty seconds is exactly the averaging window.

Magik classic magik_classic
What it does
A port of a bot that traded fifteen-minute crypto windows live, brought over rule for rule. It prices the contract the way `fair_value` does — Phi of the distance from the settlement index to the strike, over the realized volatility still to come — and then puts the result through six entry gates that have to pass together: enough edge left after Kalshi's fee, enough size resting on the side it has to cross, no Bitcoin move running against an altcoin entry, a padded limit inside a narrow price band, one entry per asset per window with minutes still on the clock, and at most two positions open and never two on the same side. Size scales with conviction and is then cut by the book, by a cost ceiling and by a hard contract backstop. Positions leave by four rules in strict order: hold anything already decided, take a ninety-nine-cent certainty, trail a winner, and stop a loser only when there is a book to stop it into.
When it works
The market it was written for: short crypto windows with a live settlement index, a book thin enough that a fair price and a market price can disagree, and enough of them running at once that two positions is a real constraint. Its narrow entry band is the expression of that — it trades windows the market has not made up its mind about and leaves the ones it has. It is also the shipped strategy with the most opinionated exits: the trailing stop and the settlement locks between them decide most outcomes, not the entry.
When it does not
Anywhere its cross-market assumptions do not hold. The Bitcoin veto needs a Bitcoin market in the same instance's universe, and without one it refuses every altcoin entry rather than assuming Bitcoin is calm — a bot that trades nothing and says why, which is the harder failure to notice. Pairs are resolved from market-id prefixes, so a venue that renames its series turns every altcoin into an unclassified market that is never vetoed. And the same broken-input problem every model-priced strategy has: a stale index or a collapsed volatility estimate produces its largest apparent edge exactly when it is most wrong, which is why the entry band is narrow and the dead zone and saturation refusals sit in front of the gates rather than among them.

What to tune first

edge_threshold_cents

What has to be left after the fee before crossing is worth it. Measured against the padded limit actually sent, not the mid, so it is the edge really captured. Two cents is what the live bot ran.

entry_min_depth

Size that has to be resting on the side the entry crosses. The per-pair overrides beside it are the point: one floor across Bitcoin and the altcoins either stops the alts trading or lets Bitcoin trade on nothing.

btc_veto_threshold_bps

How far Bitcoin has to move before it vetoes an altcoin entry on the other side of that move. Directional — a fall vetoes a YES and says nothing about a NO.

min_entry_price

With its ceiling, the band the padded limit has to land in. Narrow on purpose; widening it is the single largest change you can make to what this strategy trades.

stop_loss_cents

The loss it will take — but only into a book with size resting on the side being sold. No depth, or a touch already worse than the stop plus its tolerance, means hold and wait rather than dump into a collapsed book.

trail_activate_cents

Profit before the trailing stop starts watching, with trail_gap_cents for how far it may fall back. These two settle more of this strategy's outcomes than any entry setting.

Presets

A preset is a set of parameter values. It is not a strategy and it does not change what a bot can do: picking one runs exactly the same code as picking nothing, with different numbers. Each is internally consistent — the cross-field rules on the trading engine pass, and the entry band and the stop can both be satisfied by the same market — and none of that is a claim that it makes money.

They are grouped by the strategy they are written against, because a preset is values for a schema: loading one is only offered where its parameters exist. The selector on a settings page shows the group for the strategy in front of it and nothing else.

Spread capture spread_capture

Conservative Hold-to-Expiry

Optimises for: Optimises for being right rather than for being out early.

Takes a position only where the price is well inside the band and the edge against the mid is worth having, then holds it to settlement. The managed exits are off, so nothing closes the position on a price move: the thesis is that the model's number is better than the market's, and a stop would be paying the spread to disagree with yourself. The auto-flatten is still armed, because a feed nobody can see through is not the settlement risk this describes accepting. Small size, long cooldowns, and a wide spread tolerance -- the exit cost of a wide market does not matter to a position that is never exited.

Active Scalper

Optimises for: Optimises for many small round trips in the last minutes.

Quotes only tight, deep books, takes a few cents, and gets out on a target, a stop, a trail or the clock -- whichever comes first. Entry is confined to a window near the close, where the price is moving and the contract is about to resolve, and every position is out before settlement. Larger size than the other presets because each trade is smaller; a tighter stop because it has to be, given how little is being risked per round trip; and a short retry interval on exits, because an unfilled exit in the last minute is the one that costs money.

Signal Follower

Optimises for: Optimises for taking few, large mispricings and sitting through noise.

Waits for a market wide enough that four cents of edge against the mid is actually available, then gives the position room: a stop at seventy percent of stake, no trailing stop to cut it early, and a target well up the range. The exits are on -- this is not a hold-to-expiry bot -- but they are set where only a thesis that was wrong will reach them. Every indicator the mispricing rests on is enabled and warmed on a partial policy so it publishes early in the contract's life rather than halfway through it.

How they differ

Read straight out of the presets themselves, so this table cannot disagree with what loading one would put in the form. An em dash means the preset has no opinion about that setting and the strategy's own default applies; "off" means the preset deliberately clears it.

Setting Conservative Hold-to-Expiry Active Scalper Signal Follower
Spread worth capturing 14 2 10
Widest spread 24 3 16
Minimum edge 5 0 4
Entry band, low 0.20 0.35 0.25
Entry band, high 0.80 0.65 0.75
Minimum observations 12 3 24
Cooldown between entries 60 0 120
Hold to expiry yes no no
Take profit (% of max gain) off 30 70
Stop loss (% of stake) off 15 70
Trailing gap off 4 off
Time exit before close off 60 180
Earliest entry 0 90 240
Latest entry off 420 off
Warm-up 300 30 180
Order size 1 5 3
Daily profit stop off 50 off
Rolling drawdown limit 75 50 100
Drawdown window 30d 7d 30d

Fair value fair_value

Model Trader

Optimises for: Optimises for taking the price the pricing model disagrees with.

Prices the binary from the settlement index -- Phi(d), the closed form for a driftless lognormal underlying -- and takes the side the difference favours when it is worth more than the fee and the spread. Four cents is the floor and twenty is the ceiling, and the ceiling is the more important of the two: a forty-cent disagreement with a liquid market is a stale index or a collapsed volatility estimate rather than forty cents of free money. The model is left exactly as the indicators publish it, at a volatility multiplier of one and full confidence, and both inputs are warmed on a blocking policy -- a fair price formed on a half-warm sigma is the one number this preset most needs not to act on. Kelly sizing is on, because this is the only shipped strategy that states an edge the risk engine can size from, and capped at a tenth of bankroll because a Kelly fraction read off a model is only as good as the model.

What it sets

Read straight out of the presets themselves, so this table cannot disagree with what loading one would put in the form. An em dash means the preset has no opinion about that setting and the strategy's own default applies; "off" means the preset deliberately clears it.

Setting Model Trader
Edge worth trading 4
Edge worth believing 20
Widest spread 4
Volatility multiplier 1
Volatility floor 0.0008
Entry band, low 0.15
Entry band, high 0.85
Hold to expiry no
Take profit (% of max gain) 60
Stop loss (% of stake) 50
Time exit before close 90
Order size ceiling 3
Kelly fraction 0.25
Kelly cap 0.10

Momentum scalper momentum_scalper

Close Trader

Optimises for: Optimises for riding a late move in the last two minutes.

Watches the index for a short, sharp move towards a strike that is still reachable, and takes the side it is moving to -- but only in the last two minutes, where a move has less time left to be given back. The signal is a fifteen-second rate of change measured on three five-second bars, and the threshold is three hundredths of a percent, which on a fifteen-minute contract is a real move rather than tape noise. Orders are immediate-or-cancel at the touch -- that is the strategy rather than this preset, and it is the point: a resting order that gets filled after the move is an order filled by the person on the right side of it. Exits are tight in both directions, and everything is out twenty seconds before the close.

What it sets

Read straight out of the presets themselves, so this table cannot disagree with what loading one would put in the form. An em dash means the preset has no opinion about that setting and the strategy's own default applies; "off" means the preset deliberately clears it.

Setting Close Trader
Move that counts (%) 0.03
Momentum window 15
Entries open before close 120
Nearest strike (sigma) 0.15
Furthest strike (sigma) 1.20
Widest spread 3
Take profit (% of max gain) 25
Stop loss (% of stake) 25
Time exit before close 20
Order size 5
Daily profit stop 50

Mean reversion mean_reversion

Fade the Move

Optimises for: Optimises for taking the other side of a two-sigma move and waiting.

Takes the opposite side of a move that has gone two standard deviations from its two-minute mean, and then does nothing: the position is held to settlement, with no target, no stop and no time exit. That is the thesis stated honestly -- a fade that is stopped out on the move continuing is a fade that pays the spread to be wrong twice, and a fade that takes profit early is one that has given up the settlement it was betting on. What keeps this out of trouble is not an exit, it is the regime gate: entries are refused outright in high volatility, where a two-sigma move is usually a trend rather than an excursion. Four minutes of clock is required before entering, because a move needs time to unwind, and the cooldown between entries is what stops this averaging down into a move that keeps going.

What it sets

Read straight out of the presets themselves, so this table cannot disagree with what loading one would put in the form. An em dash means the preset has no opinion about that setting and the strategy's own default applies; "off" means the preset deliberately clears it.

Setting Fade the Move
Excursion that counts (sigma) 2
Mean lookback 120
Highest regime traded medium
Clock a fade needs 240
Cooldown between entries 60
Widest spread 6
Entry band, low 0.10
Entry band, high 0.90
Hold to expiry yes
Order size 3
Rolling drawdown limit 75

Settlement sniper settlement_sniper

Settlement Edge

Optimises for: Optimises for buying a contract the settlement average has already decided.

Does nothing until the venue's averaging window is half over, then asks a narrow question: given how much of the settlement number is already fixed, is this contract still priced as though the answer were in doubt? Past halfway the remaining ticks can move the average by less and less, so a contract the running average puts at 95% and the market prices at 90 is not a forecast -- it is arithmetic that has not finished being priced in. The edge floor is strict at five cents against the touch, because at this end of a contract's life the cheap disagreements are the ones where somebody else's fee explains the whole gap. Positions are held to settlement, which for a bet on an average that is already half fixed is the only exit that makes sense.

What it sets

Read straight out of the presets themselves, so this table cannot disagree with what loading one would put in the form. An em dash means the preset has no opinion about that setting and the strategy's own default applies; "off" means the preset deliberately clears it.

Setting Settlement Edge
Window elapsed before acting 0.5
How decided the average must be 0.95
Edge against the touch 5
No-entry window 0
Widest spread 4
Entry band, low 0.02
Entry band, high 0.98
Hold to expiry yes
Order size 10
Flatten after silence 15

MagiK classic magik_classic

Classic MagiK

Optimises for: The original live-proven configuration for crypto 15-minute contracts.

The port's own defaults, unchanged. Every other preset here is an opinion laid over a strategy's declared values; this one is the declared values, and that is the whole point of it. `magik_classic` is a rule-for-rule port of a bot that traded Kalshi's fifteen-minute crypto windows with real money, and its defaults are not a cautious starting point somebody chose for a sample -- they are the numbers that ran. Two cents of edge after fees, five contracts of depth to cross, the Bitcoin veto on, one entry per window, two positions at once. Departing from them is a reasonable thing to do and the reason the fields are editable; doing it knowingly is why this preset exists to depart from. One number is deliberately not the original's. Order size is five rather than six, because six peaks at twelve contracts and the engine's default max position size is ten -- and that limit refuses an order rather than shrinking it, so the pairing that shipped threw away every highest-conviction entry. Raise max position size to twelve and six becomes available again.

What it sets

Read straight out of the presets themselves, so this table cannot disagree with what loading one would put in the form. An em dash means the preset has no opinion about that setting and the strategy's own default applies; "off" means the preset deliberately clears it.

Setting Classic MagiK
Edge worth trading 2
Dead zone 7
Minimum depth to cross 5
Veto alts on Bitcoin moves no
Veto threshold 5
Minutes left to enter 5
One entry per window yes
Positions at once 2
Order size 5
Cap: contracts per entry 12
Trailing stop arms at 6
Hard stop 10
Held to settlement above 97

Going live

Every other section on this page describes what a number means. This one describes a rule: which strategies are allowed to trade real money, and what stands between a bot and doing it. It is here because the page an operator lands on after being refused is usually this one.

Who authored a strategy

Every strategy carries an origin, and it is the field the live-mode rule is derived from — once, on the trading engine. The dashboard greys the live toggle out with the answer and the sentence that goes with it; nothing on this box decides it.

Platform-authored platform

Code this project ships. The sample strategy is one: it has no owner, nobody's account stands behind it, and it changes when this box is deployed rather than when anybody asks for it.

In live mode. Demo only, and refused twice rather than hidden once. The trading engine will not launch a live instance on a platform strategy, and its risk engine rejects every intent one produces while the mode reads live — so a bot that somehow got past the first check still cannot reach a venue through the second.

Where it comes from. Registered from the shipped samples when the trading engine starts, with its origin read off the class rather than asked for. A sample that forgot to declare itself platform is refused at registration, because the alternative is a shipped strategy that is live-eligible and owned by nobody.

User-authored user

A strategy that exists because you cloned a platform one. It carries your user id as its owner, its own snapshot of the parameters, and a record of what it was a copy of.

In live mode. Eligible for live mode — which is the first of the five gates below, not a substitute for the other four. An eligible strategy with no second factor, no credential, no confirmation or a running bot is still refused, and told which one stopped it.

Where it comes from. Cloning, and nothing else. There is no create-strategy call, no origin argument on any public method of the registry, and no path that turns an existing strategy into a different origin: the record is frozen once written. Changing an entry's origin means editing a file on the trading box as root, which is a different conversation from a form submission.

Cloning

Cloning is the only way a user-authored strategy is ever created, and it is the one operation on the platform that changes what a configuration is permitted to do. What it does, step by step:

The copy is created with origin `user`, and it is yours.
Written once, by the operation that creates the entry, and never settable again. Origin decides who may trade real money, so it is not an argument anybody can pass a second time.
It records who owns it, what it came from, and when.
The owner is what stops another account seeing, configuring or starting it. The source name and the version it was taken at are recorded and never checked — they answer "what was this a copy of?" long after both have moved on.
It takes a snapshot of the parameters, not a pointer to them.
Editing the strategy you cloned from afterwards does not reach your copy. The snapshot is coerced through the source's own schema on the way in, so a clone cannot be seeded with a configuration the settings form would have refused.
It runs the same code as its source.
The clone's implementation is the source's, subclassed to change its origin and its name and nothing else. Behaviour is identical by construction — a clone that could drift from what it was copied from would be a second implementation to audit, and the backtest you ran before cloning would stop meaning anything.
A name that is already taken is refused, never adjusted.
Ask for `btc-spread` when it exists and you get an error. Silently handing back `btc-spread-2` is how somebody ends up configuring a strategy they did not think they were configuring. Ask for no name and one is generated.
A clone cannot itself be cloned.
Clone the platform strategy again instead. A copy of a copy has two plausible readings of what version it came from and neither is worth the ambiguity.

The clone is a copy, not a link. Editing the strategy you cloned from does not reach it, and editing your copy does not reach anybody else's.

The five gates

Being a clone is the first of five conditions, not a substitute for the other four. Each is checked on its own rather than as one composite may go live — a composite check is the one that fails open the day a sixth condition is added and a branch is forgotten, and an operator stopped by a gate is owed the specific reason rather than "not allowed".

  1. The strategy is yours

    The instance runs a user-authored strategy — a clone — rather than platform code.

    Why it stands alone. It is the only gate cloning can satisfy, and the only one that is a property of the strategy rather than of you, your account or the moment. It is also the one enforced in both places: the dashboard greys the toggle out, and the trading engine would refuse the instance at startup and every intent after it even if the dashboard did not.

    What a refusal looks like. The live toggle is disabled, carrying the sentence the trading engine sent with it: platform-authored strategies run in demo only, clone this strategy and the clone can go live.

  2. Two-factor authentication is on

    The account switching the instance to live has a second factor enrolled.

    Why it stands alone. Real money is the point at which a stolen password stops being an inconvenience. It is checked against the session doing the switching rather than against the account that owns the instance, so borrowing somebody else's bot does not borrow their second factor.

    What a refusal looks like. The switch is refused with the reason, and the confirmation page says which gate is outstanding rather than only that something is.

  3. An active venue credential exists

    The trading engine holds an active credential for the venue this instance trades, belonging to this user.

    Why it stands alone. A bot set live against a venue it cannot sign an order for looks live on every page and finds out at the first entry. The trading engine is asked every time and the answer is never cached — a remembered "yes" is how a bot goes live on a credential that was revoked an hour ago.

    What a refusal looks like. Refused, and the trading engine being unreachable is also a refusal rather than a pass. Guessing here produces a live bot with nothing to sign with, which is worse than waiting for the link to come back.

  4. You confirmed, on a page that says what live means

    The switch carried an explicit confirmation, submitted from the confirmation step.

    Why it stands alone. The mode control says what is wanted; the confirmation says it was meant. A form carrying only the first could be submitted by a stray click on a page nobody read. It is a page of its own rather than a dialog, so it survives a browser with no JavaScript, can be linked to, read and left — and it states every gate and which of them you already pass, because a confirmation that only asks "are you sure?" tells you nothing you did not know when you clicked.

    What a refusal looks like. The switch redirects to the confirmation step instead of taking effect.

  5. The bot is not running

    The instance is stopped when the mode changes.

    Why it stands alone. Mode is read when a bot starts. Changing it under a running process would leave the page saying live over a bot that is still demo — the one disagreement on the platform that costs real money in either direction. Stopping first makes the restart the thing that picks the change up.

    What a refusal looks like. The mode control is unavailable while the instance is running, and the switch is refused if it arrives anyway.