Spread Mean Reversion Strategy [SciQua]╭───────────────────────────────────────╮
Spread Mean Reversion Strategy
╰───────────────────────────────────────╯
This invite-only futures spread strategy applies a statistical mean reversion framework, executing limit orders exclusively at calculated Z-score thresholds for precise, rules-based entries and exits. It is designed for CME-style spreads and synthetic instruments with well-defined reversion tendencies.
╭────────────╮
Core Concept
╰────────────╯
The strategy calculates a rolling mean and standard deviation of a chosen spread or synthetic price series, then computes the Z-score to measure deviation from the mean in standard deviation units.
Long entries trigger when Z crosses upward through a negative entry threshold (`-devEnter`). A buy limit is placed exactly at the price corresponding to that Z-score, optionally offset by a configurable tick amount.
Short entries trigger when Z crosses downward through a positive entry threshold (`+devEnter`). A sell limit is placed at the corresponding threshold price, also with optional offset.
Exits use the same threshold method, with an independent `Close Limit Offset` to fine-tune exit placement.
╭────────────╮
Key Features
╰────────────╯
Persistence filter – Requires the Z-score to remain beyond threshold for a configurable number of bars before entry.
Cooldown after exits – Prevents immediate re-entry to reduce over-trading.
Daily and weekend flattening – Force-flattens positions via limit orders before exchange maintenance breaks and weekend closes.
Auto-rollover detection with persistence – Detects when the second contract month’s daily volume exceeds the first for a set number of days, then blocks new entries (optional).
Configurable tick offsets – Independently adjust entry and exit levels relative to threshold prices.
Minimum spread width filter – Blocks trades when long/short entry thresholds are too close together.
Contract multiplier override – Allows correct sizing for synthetic symbols where `syminfo.pointvalue` is incorrect or missing.
Limit-only execution – All entries, exits, and forced-flat actions are executed with limit orders for price control.
╭────────────────────╮
Entry Blocking Rules
╰────────────────────╯
New trades are blocked:
During daily maintenance break pre-windows
During weekend close pre-windows
After rollover triggers, if `Block After Roll` is enabled
╭────────────────────────╮
Intended Markets & Usage
╰────────────────────────╯
Built for futures spreads and synthetic instruments , including calendar spreads.
Performs best in markets with clear seasonal or statistical mean-reverting tendencies.
Not designed for strongly trending, non-reverting markets.
╭──────────────────────────╮
Risk Management & Defaults
╰──────────────────────────╯
Fixed default position size of 1 contract (qty calc function available for customization).
Realistic commission and slippage assumptions pre-set.
Pyramiding disabled by default.
Default Z-score levels: Entry at ±2.0, Exit at ±0.5.
Separate tick offset controls for entries and exits.
Note: This strategy is for research and backtesting purposes only. Past performance does not guarantee future results. All use is subject to explicit written permission from the author.
Calendarspread
vx_termsUSAGE
--------
This script helps train your intuition for changes in the VX term structure. I recommend using it on the VIX chart, so you can compare changes in the terms to changes in VIX. It's also nice for calendar spread traders who want to get a feel for the same changes.
1. Select a day, month, and year using the inputs
2. Observe the data table.
3. Open the input again and increment or decrement the day (and month, year as necessary).
4. Click "Ok".
5. Click to deselect the indicator, which allows the chart to load new data.
6. The data table will be reloaded with the next/previous day's data.
The data table has the following columns:
- contract: the VX contracts, in sequence. refer to the CBOE for month codes (F for January, etc.)
- close: the closing price of the contract.
- ma:mb: the spread (difference) between this row and the next row.
- ma:mb chg: the spread's change from prior close.
For example, given the following values for the first two columns:
VXQ2021, 16.5, -3.1, -0.2
VXU2021, 19.6, ..., ...
The front month (Q = august) closed at 16.5, $3.1 below the s\September contract. The negative spread enlarged by $0.20 from $2.90 on the previous trading day.
BUGS, ODDITIES, AND LIMITATIONS:
-------------------------------------------
- The first column will be greyed out after expiration day, which is the 3rd Tuesday of that month. Unfortunately, I can't load the next month's contract due to some limitations with TV.
- The active date is highlighted with a yellow background. When a non-trading date is selected, the highlight will disappear. However, the data table will sometimes fill with the nearest trading date, prematurely. No worries, just know that the data is probably for the previous Friday.
- The script is clunky and slow, but this is the best I can do with TV. Hopefully they add more continuous contracts or allow true dynamic symbol loading.
SPECIAL THANKS:
---------------------
Thanks to HeWhoMustNotBeNamed for helping me get through some messiness. Very helpful guy.
www.tradingview.com