Markets: A Rigorous Course

15.1 Playbook 1: a swing breakout from a volatility contraction (BEL, March 2026)

Core about 30 min

15.1.1Prerequisites and what this playbook teaches#

Read first (essential) M04 · 4.2.2 (Minervini's Trend Template and the volatility contraction pattern as Definitions 4.6 and 4.7), M04 · 4.2.5 (the breakout archetype and Proposition 4.5), M04A · 4A.7–4A.8 (ATR stops and the trailing-stop rule), M03 · 3.1, 3.1.1 and 3.9.

For depth: M04 · 4.3 (the momentum evidence behind breakouts) and the law-of-the-peak derivation in M04A · 4A.8.

The playbook teaches how to turn a chart pattern into a scan, how the stop sets the size, how a trailing stop is updated from data, and how little one breakout says about a breakout method.

15.1.2The setup as testable rules#

All prices are daily bars; Ct,Ht,Lt,VtC_t, H_t, L_t, V_t are close, high, low and volume on day tt.

  1. Trend Template (M04 Definition 4.6, criteria 1–7): CtC_t above its 150- and 200-day simple moving averages (SMAs); SMA150 above SMA200; SMA200 above its value 21 sessions earlier; SMA50 above SMA150 and SMA200; CtC_t above SMA50; Ct≥1.30×C_t \ge 1.30\times the 52-week low and ≥0.75×\ge 0.75\times the 52-week high.
  2. Relative strength (criterion 8, approximated): the stock's 12-month return is at or above the 70th percentile of the 50 stocks.
  3. Volatility contraction (M04 Definition 4.7, one codable version): in the last 65 sessions, swing highs are days whose high is the maximum of the 11-day window centred on them, confirmed five days later (k=5k = 5). The first swing high must be the highest high of the window. Each swing high starts a contraction whose depth is the fall to the lowest low before the next swing high (for the last one, before today). Require 2 to 6 contractions with strictly decreasing depths. The pivot is the last swing high.
  4. Volume dry-up: the 10-day average volume before today is below the 50-day average.
  5. Breakout: today's close is above the pivot and yesterday's close was not; relative volume RVOL=Vt/V‾50≥1.5\mathrm{RVOL} = V_t / \overline V_{50} \ge 1.5.
  6. Stop: 0.5% below the low of the last contraction; reject the signal if this is more than 10% below the close.
  7. Entry: buy at the next session's open.
  8. Exit: the initial stop, then a chandelier trail (M04A · 4A.7): after each close, stop =max⁡(stop,highest close since entry−3×ATR14)= \max(\text{stop}, \text{highest close since entry} - 3\times\mathrm{ATR}_{14}). Stops move only up. No target; no time stop; hold through scheduled results.

What is left out Minervini's SEPA adds fundamentals (earnings and sales acceleration) and a catalyst; those need point-in-time data the course does not have. O'Neil's market filter "M" (M04 Definition 4.8: Nifty above a rising 200-day SMA) is not part of the rules above. I ran the scan with and without it before choosing: with the filter, the scan finds two signals between June 2025 and October 2026, both in 2025, and none in 2026, because the Nifty closed below its 200-day average on 27 Feb 2026 and stayed there to the end of the data. The playbook trades the version without the filter and uses the filter's verdict in the post-mortem. That is a choice made with knowledge of the scan output, and you should discount the result accordingly.

15.1.3The scan and the episode#

Data: Yahoo daily bars for the 50 constituents from 3 Jun 2024 to 5 Nov 2026 (unadjusted prices; the adjusted close was used only to check for dividends inside the trade). Window: 1 Jan 2026 to 31 Oct 2026, chosen as "this calendar year". The scan (rules 1–6) returns this first signal:

Field Value
Stock, date Bharat Electronics (BEL), Monday 2 Mar 2026
Base swing highs 3 Feb (₹460.00) and 18 Feb (₹453.50)
Contractions 7.5% (₹460.00 to ₹425.55 on 6 Feb), then 5.1% (₹453.50 to ₹430.35 on 24 Feb)
Pivot ₹453.50
Breakout close ₹453.95 (previous close ₹444.70)
Volume 3.50 crore shares against a 50-day average of 1.70 crore: RVOL 2.06
RS percentile 98
Stop 0.995×430.35=₹428.200.995 \times 430.35 = \text{₹}428.20

The NSE cash-market bhavcopy for 2 Mar 2026 confirms the bar (open 442.10, high 456.70, low 441.70, close 453.95). The context matters: 2 Mar was the first session after US and Israeli strikes on Iran over the weekend of 28 Feb–1 Mar (M02 · 2.10.4). The Nifty fell 1.24% to 24,865.70 and India VIX rose from 13.70 to 17.13, while a defence-electronics stock broke out on heavy volume.

Over the whole period from June 2025 to October 2026 the same rules produce seven signals in the 50 stocks. Their outcomes are in 15.1.7.

15.1.4The plan before entry#

Thesis. A Trend-Template leader with two tightening contractions and a volume dry-up closes above its pivot on twice its average volume. If momentum continues (M04 · 4.3), the drift after entry is positive, and the trailing stop is meant to capture it (M04A Proposition 4A.11).

Entry trigger. Buy at the open of the next session. There was no session on Tuesday 3 Mar (Yahoo has no bar, and the NSE F&O bhavcopy URL for 3 Mar 2026 returns HTTP 404, consistent with a market holiday), so the order executes at the open of Wednesday 4 Mar. BEL opened at ₹460.00, 1.3% above the signal close; with 0.1% slippage the fill is Pe=₹460.46P_e = \text{₹}460.46.

Initial stop and invalidation. ₹428.20. A close back inside the base is not by itself an exit under these rules; only the stop is.

Size (M03 (3.23)). Risk per share 460.46−428.20=₹32.26460.46 - 428.20 = \text{₹}32.26, 7.0% of the entry price. Q=⌊10,000/32.26⌋=309Q = \lfloor 10{,}000/32.26 \rfloor = 309 shares; 1R=309×32.26=₹9,968.341R = 309 \times 32.26 = \text{₹}9{,}968.34; position value ₹1,42,282, 14% of capital. The gap at the open widened the risk per share from ₹25.75 (at the signal close) to ₹32.26 and cut the size accordingly.

Costs. A round trip of 309 shares bought at ₹460.46 and sold near the stop costs about ₹369 (computed in 15.1.6), c=0.037Rc = 0.037R. Slippage of 0.1% on each side adds about 0.028R0.028R.

Expected R and break-even win rate (M04 Proposition 4.5). With average winner WW and costs cc in R, the break-even win rate is p∗=(1+c)/(1+W)p^* = (1+c)/(1+W). For W=2.5W = 2.5 (the archetype of M04 · 4.2.5) and c=0.037+0.028=0.065c = 0.037 + 0.028 = 0.065, p∗=30.4%p^* = 30.4\%; for W=2W = 2, 35.5%. If the practitioners' claim of a 35–40% win rate at W=2.5W = 2.5 were true, expectancy would be 0.35×2.5−0.65−0.065=0.16R0.35 \times 2.5 - 0.65 - 0.065 = 0.16R to 0.40×2.5−0.60−0.065=0.34R0.40 \times 2.5 - 0.60 - 0.065 = 0.34R. Neither number is evidence; M04 · 4.2.5 calls them the profile of a modest real drift, if there is one.

15.1.5Day-by-day management#

RR at close is (Ct−460.46)/32.26(C_t - 460.46)/32.26 before costs. ATR is Wilder's 14-day ATR at that close.

Date (2026) Open High Low Close R at close ATR Stop in force Nifty close India VIX Decision
Wed 4 Mar 460.00 460.85 444.50 446.85 −0.42 11.52 428.20 24,480.50 21.14 Bought 309 at 460.46. Stop order placed for 09:15 each day.
Thu 5 Mar 448.80 467.90 445.85 460.00 −0.01 12.27 428.20 24,765.90 17.86 Highest close 460.00; trail 460.00−36.81=423.19460.00 - 36.81 = 423.19, below the stop. No change.
Fri 6 Mar 462.00 473.45 460.35 468.45 +0.25 12.36 428.20 24,450.45 19.88 New highest close. Trail 468.45−3×12.36=431.37468.45 - 3 \times 12.36 = 431.37: stop raised to 431.37.
Mon 9 Mar 470.00 470.00 450.00 457.35 −0.10 12.90 431.37 24,028.05 23.36 Nifty −1.7%. Nothing to do.
Tue 10 Mar 465.00 465.80 453.55 463.35 +0.09 12.85 431.37 24,261.60 18.91 Hold.
Wed 11 Mar 463.50 469.80 453.25 454.10 −0.20 13.12 431.37 23,866.85 21.06 Hold.
Thu 12 Mar 452.00 455.00 448.50 453.55 −0.21 12.65 431.37 23,639.15 21.52 Hold.
Fri 13 Mar 451.90 452.40 433.65 439.40 −0.65 13.16 431.37 23,151.10 22.65 Close ₹8 above the stop over a weekend. The rule says hold; the stop stays where it is.
Mon 16 Mar 431.90 437.80 422.25 429.50 — 13.45 431.37 23,408.80 21.60 Opened above the stop, traded through it: sold 309 at 430.94 (431.37×0.999431.37 \times 0.999).

There were no scheduled company events in the nine sessions (BEL's next results date in Yahoo's calendar was in May). The market events were the war and the oil price: the Nifty fell 5.9% from the signal close to the exit, India VIX was above 17 every day, and the realised daily volatility of the index roughly doubled in March (M02 · 2.10.4).

15.1.6Exit and result#

Item ₹
Gross P&L: (430.94−460.46)×309(430.94 - 460.46) \times 309 −9,121.68
Brokerage (2 orders, ₹20 cap binds) 40.00
STT (0.1% of buy and sell value) 275.44
NSE transaction charges 8.46
SEBI fee 0.28
Stamp duty (0.015% of buy value) 21.34
GST (18% of brokerage + transaction + SEBI) 8.77
Depository charge (illustrative) 15.00
Total costs 369.29
Net P&L −9,490.97
Result in R −0.952R (−0.95% of capital)

Tax (M01 · 1.8, M00 · 0.7). Shares held for 12 days give a short-term capital loss. STT is not deductible in computing capital gains; brokerage and other transfer expenses are. The capital loss is therefore about 9,121.68+(369.29−275.44)=₹9,215.539{,}121.68 + (369.29 - 275.44) = \text{₹}9{,}215.53. Set off against short-term gains elsewhere in the same year, it reduces tax by 0.20×9,215.53=₹1,843.110.20 \times 9{,}215.53 = \text{₹}1{,}843.11; if unused, it carries forward eight years. The after-tax loss is not "−₹9,491"; it depends on the rest of your year.

15.1.7Post-mortem#

What went right. The plan was executed as written. The stop was placed where the base would be broken, the size followed from it, and the loss was 0.95R, not more. After the exit BEL closed the week of 27 Mar at ₹404.75, another 6% lower; a trader who had widened the stop to "give it room" would have been looking at a loss of about 1.7R at that close (M04A Proposition 4A.14). The trailing stop moved once, by ₹3, which changed the outcome by ₹980.

What went wrong, and which rules were weak.

  • The market filter. The trade was a breakout against a falling market on the first day of a geopolitical shock. M04 Definition 4.8 would have kept you out. The filter did its job here, but one trade cannot show that it adds value in general; in 2025 it would also have removed nothing (both 2025 signals pass it).
  • The base was defined by one print. The base's first swing high, ₹460.00 on 3 Feb, was that day's open, and the stock closed at ₹438.95. Depth 1 and the 52-week-high test both rest on a single auction print. A rule that uses closes, or requires the swing high to be confirmed by a close near it, would have drawn a different base.
  • The breakout was marginal. The close was ₹0.45 above the pivot, 0.1%. A filter such as "close at least 0.5 ATR above the pivot" would have rejected it. Adding that filter now, after seeing the loss, would be fitting the rules to one trade; the honest response is to test it across many signals (M04 · 4.6).
  • The gap at entry. Buying at the next open meant buying ₹6.05 higher than the signal close. A buy-stop at the pivot during the signal session would have filled near ₹454, with a smaller risk per share and a larger position. Neither is right in general; it is a design decision to test.

What the statistics say. The same rules, without the market filter, produced seven signals in the 50 stocks from June 2025 to October 2026:

Signal Stock Exit Net R
20 Jun 2025 BHARTIARTL trailing stop +0.018
12 Sep 2025 BEL trailing stop +0.011
2 Mar 2026 BEL trailing stop −0.952
5 Mar 2026 HINDALCO gapped through the stop −1.156
28 Apr 2026 ONGC initial stop −1.005
30 Apr 2026 BAJAJ-AUTO trailing stop −0.242
13 Jul 2026 BAJAJ-AUTO trailing stop +1.871

The mean is −0.21R-0.21R, the standard deviation 1.04R1.04R, and the tt-statistic −0.53-0.53. Note the HINDALCO trade: a gap through the stop produced −1.16R-1.16R, the left tail that M03 · 3.9 warns about. Seven trades cannot distinguish an edge of +0.3R+0.3R from zero or from −0.3R-0.3R. M03 Corollary 3.1.2 says that for a breakout system with E=0.30RE = 0.30R and s=1.36Rs = 1.36R you need N≥((2+0.84)×1.36/0.30)2=166N \ge ((2 + 0.84) \times 1.36 / 0.30)^2 = 166 trades for an 80% chance of reaching t=2t = 2 (82 for t=2t = 2 in expectation). At the rate this scan produces signals in the Nifty 50 (seven in 17 months), 166 trades take about 34 years. The rule set cannot be validated on 50 stocks; it needs a broader universe (the Nifty 500), point-in-time membership, and the walk-forward and multiple-testing protocol of M04 · 4.4–4.6. The external evidence for the archetype is momentum (M04 · 4.3: the IIMA momentum factor's long-run return in India), not the pattern itself; and on the Nifty itself M04A Case 1 found 20-day breakouts indistinguishable from a random walk with drift.

15.1.8Do it in the simulator#

Open Simulator → New order. Run the scan above on the latest data (the code is in the module's scripts; the rules are fully specified in 15.1.2) and write down the result before looking at any chart.

  1. If a stock qualifies, enter a buy order for the next session with the quantity from (3.23), the stop 0.5% below the last contraction low, and the thesis in one sentence. Record the market-filter state (Nifty versus its 200-day SMA) in the journal.
  2. If nothing qualifies, which is the common case, place no trade. Instead, practise the ticket: for BEL.NS, take the last close as the entry and the lowest low of the last ten sessions minus 0.5% as the stop, compute QQ, and enter it as a paper order. Then update the chandelier stop after each close for two weeks and log each change with its arithmetic.
  3. After the trade closes, record R, costs and rule breaks. Do not judge the setup on this trade; add it to a log of at least 30 before you look at the mean.

See it live: BEL's current price at https://oicharts.com/stocks/BEL and the Nifty 50 level for the market filter at https://oicharts.com/indices/nifty-50 .

Data lab

Replay: BEL volatility-contraction breakout, March 2026

Replay of Playbook 15.1 (15.1.3–15.1.6). Step through the bars from mid-January and mark the two contractions yourself before the replay reaches 2 Mar: swing high, swing low, depth. Do your depths match 7.5% and 5.1%? Then watch the base's first high: it is a single opening print on 3 Feb.

Questions

  1. Re-draw the base using closes instead of highs and lows. Where would the pivot and the stop be, and would the 2 Mar close still be a breakout?
  2. Add the Nifty (second data series) and its 200-day average. On which date did M04 Definition 4.8 switch off, and how many sessions before the signal?
  3. Recompute the chandelier stop with 2 ATR and with 4 ATR. Would the exit date or price change?
  4. The stock closed the week of 27 Mar at 404.75. What R would a trader who had moved the stop to "below the March low" have taken, and what does M04A Proposition 4A.14 say about that decision?

Create a free account

Reading is open to everyone. An account keeps your progress, answers, notes and code drafts, and gives you the study plan, the journals and the simulator. Running code needs an account approved for it.