Experiments
We write down every test, including the ones that didn't work. Each one says what was tested, on what data, and what we did about it. Nothing here is a promise of future returns.
Paper portfolio replay: buy on 1 Jul instead of 21 Sep (3 Oct 2026)
Question: were the HINDZINC and OFSS picks bad, or was the timing bad?
Test: a separate test book bought both names at the 1 Jul 2026 close with the same −8% trailing stop, then compared the result with the Nifty. The live paper book was left untouched.
| Bought | Peak | Stop exit | Result | |
|---|---|---|---|---|
| OFSS | ₹10,863 | ₹11,771 | 24 Jul at ₹10,652 | −1.9% |
| HINDZINC | ₹524.40 | ₹626.50 | 15 Sep at ₹560.90 | +7.0% |
| Book | +2.5%, against the Nifty's −5.4% |
Holding both without stops would have made only +1.6%, so the stop helped by cutting OFSS early.
Takeaway: the picks were fine. The real damage came from buying late, after HINDZINC had already run up and after OFSS had broken down. This supports the trend gate added on 29 Sep: buy only when the close is above a rising 50-day average.
Caveats: only two names could be backdated, so this isn't a real 1 Jul screen. It assumes we sold at the close on each stop day and ignores costs.
Intraday backtest, 58 sessions (3 Oct 2026)
Question: do common long-only intraday setups make money after costs at our size (₹150 risk, at most ₹15,000 notional)?
Data: Yahoo Finance 5-minute bars for 13 Jul to 1 Oct 2026 (58 sessions) on 68 Nifty 100 names priced ₹100–₹3,000 with at least ₹100 crore median daily turnover. Costs used Zerodha's published intraday charges. Stops were assumed to fill ₹1 worse than the stop price.
| Setup (2R target) | Trades | Net ₹ per trade | 90% range (bootstrap) |
|---|---|---|---|
| Opening-range breakout, 15 min | 1,569 | −₹20.55 | −₹23.88 to −₹17.10 |
| Opening-range breakout, 30 min | 1,243 | −₹18.24 | −₹21.95 to −₹14.47 |
| VWAP pullback | 344 | −₹27.11 | −₹31.93 to −₹22.25 |
| Previous-day-high breakout | 1,311 | −₹20.48 | −₹24.72 to −₹16.10 |
| Gap-and-go (1–3% gap up) | 112 | −₹10.51 | −₹26.15 to +₹4.89 |
| Our picker's rules, mechanised | 14 | −₹36.87 | −₹65.69 to −₹4.85 |
What we learned: - No setup showed a positive edge after costs. Most lost money even before charges, because about half the trades drifted to the 3:05 PM exit without reaching the target or the stop. - Gap-and-go was closest to breakeven. With the Nifty above its 50-day average it was about flat (+₹0.63 per trade over 55 trades), which is a hypothesis to test, not an edge. - At our size, charges plus slippage cost about 0.1–0.6R per trade, so tight stops are expensive. - Our own picker has only 3 real trades and a 14-trade mechanical replay. That's too few to judge.
Caveats: 58 sessions cover one up-leg and one down-leg. The universe is today's Nifty 100, which adds survivorship bias (and that flatters long-only results, which were negative anyway). The path inside each 5-minute bar is unknown, so when a stop and a target fell in the same bar, the trade was counted as a stop.
Next: get one to two years of intraday history before changing anything big. Forward-test gap-and-go only in an up-trending market. Compare our post-1R trailing stop with no trail.
Stop-width study (3 Oct 2026)
Question: would a wider stop (1.5% or 2% instead of 1%) fix the problem?
Test: 96 combinations of setup, stop type, width, target and sizing buffer, on the same 58 sessions.
Result: none of them had a 90% range of net ₹ per trade above zero. Wider stops lost less. For example, the 15-minute opening-range breakout went from −₹17.96 per trade at a 1% stop to −₹9.60 at 2%. But at a 2% stop, about 95% of those trades just ran to the 3:05 PM exit, so a wide stop mostly turns the trade into "hold until the close", which still lost after costs.
Opening noise against the stop (30 Sep 2026)
Trigger: EMCURE was stopped out 27 minutes after entry. Its median first-30-minute high-to-low range over the previous 20 sessions was 26.1 points, against a 20-point stop (1.31×). Normal opening wobble alone was likely to hit the stop.
Change: every candidate now carries or30_vs_stop, its median opening range divided by the stop distance. Above 1.0 the name is dropped or flagged. Daily ATR above 2.5% of price is a backup flag. See the code.