StratVerra
0DTE GUIDE

Backtest a 0DTE options strategy without writing code

The rules fit in a sentence. Type the sentence, and the assistant writes the strategy, tests it against hosted minute-level option chains, and reads the result back.

Try it yourself

No account, no card. It writes it and backtests it in your browser.

First it shows you its plan. Say go, and it writes the strategy, runs the backtest and reads the numbers back. The preview tests SPX over the last six months and runs three backtests; an account tests SPX, XSP, RUT, SPY, QQQ and IWM over the full history.

Same-day SPX strategies are simple to describe and awkward to test. Sell a 16-delta condor at 10:00, take half the credit, stop at twice it, flatten before the close — and then testing that means either writing code against an options dataset you do not have, or trusting somebody else's screenshot.

Here the sentence is the input, and the box above is the same assistant that comes with the app. It writes a real strategy, tests it against hosted minute-level option chains, and reads the result back to you. When what it wrote will not run, it is told exactly what is wrong with it and fixes it — with nobody in the middle.

What to put in the sentence

A request is a paragraph of ordinary English, not anything resembling a syntax. But it has to be specific, and specific is what makes the difference — a vague request comes back with a strategy that is technically what you asked for and not at all what you meant.

Five things are worth saying out loud. You do not have to say them in this order, or in one message; the assistant will ask about anything you leave out.

  1. 01

    The underlying, and that it is same-day

    Name the index or ETF and say 0DTE, or same-day. Without it you will get whichever expiry the assistant thinks you meant, and on SPX that is a different strategy entirely.

    “a 0DTE SPX iron condor”

  2. 02

    When it opens

    Either a clock time or a condition — the assistant handles both, and the difference is really whether your rule has a trigger or a schedule. A condition can watch the index itself, an opening range you define, or any of the indicators below.

    “enter at 11:00 ET, only when RSI(14) is between 47 and 53”

  3. 03

    What it opens, and where the strikes go

    The structure, and how you want its strikes chosen. Delta is the usual language for a same-day position, but a distance from spot, a fixed strike or a target credit all work.

    “sell 8-delta calls and puts with 20-point wings”

  4. 04

    What gets it in, and what gets it out

    A minimum credit is what decides whether a fill is worth taking at all. Then the exits: a profit target, a stop, and — on a same-day position especially — a time.

    “require at least 0.75 dollars of credit, stop at 3x the credit, close at 15:45 ET”

  5. 05

    The window, and the question

    Give it dates to test over and ask it something. The last clause is not a courtesy: it is what turns a run into a read, and asking to be told honestly whether it made money is a fair thing to ask.

    “backtest it from 2021-01-04 to 2023-12-29 and tell me how it did”

Say when it closes. A 0DTE position that reaches the bell does not politely expire worthless — it settles, and if it settles in the money it settles against you at whatever the index does in the last minutes. A profit target and a stop only fire when the position reaches them. A time exit fires regardless, and on a same-day strategy it is the difference between a tested rule and an untested tail. Ask for one, and the assistant will hold you to it.

The indicators it knows

A same-day rule often turns on an indicator — wait for RSI to sit in a band and for two moving averages to agree, or want them confirming a breakout before trading it. You do not pick these from a menu. You name them in the sentence, the same way you would say them out loud.

Which makes the list worth having, because it is really the answer to a different question: not what the product can do, but whether it can express your rule. Eleven, and this is all of them.

Moving averages

  • SMASimple moving average — every minute in the window counts the same.
  • EMAExponential moving average, weighted towards the most recent minutes.
  • WMAWeighted moving average, falling off linearly rather than exponentially.
  • HMAHull moving average — smoother than the others and quicker to turn.

Momentum

  • RSIRelative strength index, the usual way to say overbought or oversold.
  • ROCRate of change — how far price has moved over the window, as a percentage.
  • MOMMomentum — the same move in points rather than percent.

Dispersion

  • Standard deviationHow far price has been ranging over the window — the plain measure of how busy the session is.
  • Z-scoreHow far price sits from its own mean, counted in those standard deviations.

The two with their own settings

  • Bollinger BandsA period and a standard-deviation multiplier. Ask for the upper, middle or lower band, or for %B — where price sits between them.
  • MACDA fast, a slow and a signal period. Ask for the line, the signal, or the histogram between them.

Any of them can be compared against the index itself, against a plain number, or against another indicator — a moving average crossing another moving average is two operands, not a special case. The comparison is one of above, below, crossesAbove, crossesBelow, and the last two mean what they say: crossing is an event on the minute it happens, not a state that stays true afterwards. Stack as many conditions as you like and every one of them has to hold — they combine with AND, so each one you add makes the strategy trade less.

The unit that catches people out: indicator periods here are in minutes, not days. Ask for a 20-period moving average on a same-day strategy and you get one twenty minutes old. That is the right unit for a position whose whole life is one session — but a rule carried over from a daily chart needs translating rather than copying, and the assistant will take the number you give it at its word. If you mean the daily chart, say so in the sentence.

0DTE is not a mode. It is DTE = 0.

Worth stating because it decides how much of the rest of the product applies to you: there is no separate same-day engine. A strategy declares which expiries it may trade, and 0DTE is what you get when that number is zero. The machinery that prices, fills and settles a 45-day position is the machinery that does it for a same-day one — which is also why you can ask for either, or both, in the same sentence.

What you cannot ask for is an underlying the hosted chains do not cover. There are six, all at minute resolution, and the app shows you which dates each one holds when you set a backtest up:

UnderlyingRootsSettlement
SPX S&P 500 indexSPX, SPXWCash-settled, European
XSP Mini S&P 500 indexXSPCash-settled, European
RUT Russell 2000 indexRUTWCash-settled, European
SPY S&P 500 ETFSPYPhysically settled, American
QQQ Nasdaq 100 ETFQQQPhysically settled, American
IWM Russell 2000 ETFIWMPhysically settled, American

Two of those columns change how a result should be read. Where an index lists its dailies under a separate weekly root — SPXW for SPX, RUTW for RUT — a same-day request is really a request for the weekly root, which is why a strategy naming only the monthly one would have nothing to trade on most days. And a short SPY, QQQ or IWM leg is American-style: it can be assigned before expiry and leave the long leg of your spread standing on its own. The index options never do that — they settle in cash.

What the backtest then does with it

Your sentence decides what is attempted. What the run reports depends just as much on how an attempt becomes a fill — which price a leg gets, when an order is allowed to fill at all, what commission is charged, and what the simulation deliberately refuses to model. That is a longer argument and it has its own page.

It is worth reading before you trust a number from any backtester, ours included: a same-day condor is four legs crossing a spread twice, so the fill assumption is not a detail on a 0DTE strategy — it is frequently the whole result.

How a backtest fills an order →

Three things 0DTE makes harder

  • Not every past weekday had a same-day expiry

    Daily expirations were phased in, not always there. SPX did not always list one on all five weekdays, and the other five underlyings filled their calendars in on their own schedules — so a backtest window reaching back far enough contains sessions with no 0DTE contract to trade, and the engine passes over them. Nothing is wrong when that happens, but your strategy ran on fewer days than the window suggests. Ask how many trades it actually took; a good answer names the count, not just the average.

  • A condor is one managed position, not two spreads

    An iron condor is a single position, and that is the unit a stop or a profit target acts on. Its two sides contribute their legs to that one position — they are not entered, stopped or closed separately. So if your rule manages the put side independently of the call side, say that: ask for two credit spreads rather than a condor, and you get two positions the engine runs on their own. Ask for a condor and you get one, however the sentence was phrased.

  • Orders fill whole or not at all

    The simulator cannot report a partial fill. On a liquid SPX spread that is a fair approximation; on a wide same-day wing late in the session it is the assumption most likely to flatter you. It is one of several the methodology page lists outright rather than leaves for you to discover.

Ask for one

The assistant comes with the app, and so does the data every backtest runs on — all six underlyings at minute resolution, nothing to source and nothing to wire up. What it writes lands in your library as a real, versioned strategy: you can open it, read it, change it by hand, and run it again. And it can write and test all day without ever being able to place a live order.