NIFTY 108-point + ADX (15-minute)
Read this first
Unit: index points at 1 unit (not option premiums)
Trades behind the rows below: 4 to 113 closed trades, over 245 sessions
Buying and holding the index over the same bars: -3,164.1 points
As pasted, this strategy barely trades. 15 signals in 245 sessions, 8 of them past the ADX gate, and 4 trades closed for -208.0 points. The anchor only moves when the trend flips, so in a trending market it parks at a pre-move level and never fires again; a signal blocked by ADX is still consumed, because the state machine advances before the ADX test.
How this was measured
- Source:
data/fyers/index/NIFTY50_1m.csvresampled to 15-minute bars (09:15-15:30, 25 bars/day). This is the entire intraday NIFTY history on disk. - Signals on bar close, fills at the next bar's open (rule 3 of this repo's AGENTS.md).
- Slippage 2 ticks (0.05 x 2), commission 0.03% of notional as in the script's header.
- The sample is 10 months of a single falling market. No result here is statistically distinguishable from noise, and none should be described as profitable.
Inputs: the index candles are real market data - data/fyers/index/NIFTY50_1m.csv, the intraday NIFTY index candles these runs use. Only the traded instrument is synthetic: index points, not an option premium, so these numbers carry no premium, theta, IV or expiry.
Signal trace (as pasted)
| Bar close | Signal | Close | Anchor | ADX | ADX > 25? |
|---|---|---|---|---|---|
| 2025-10-23 14:15 | SELL | 25,943.0 | 25,943.0 | nan | blocked |
| 2025-10-29 12:00 | BUY | 26,054.8 | 26,054.8 | 29.8 | passes |
| 2025-10-30 09:30 | SELL | 25,921.5 | 25,921.5 | 25.5 | passes |
| 2025-11-19 14:00 | BUY | 26,033.0 | 26,033.0 | 19.2 | blocked |
| 2025-11-25 14:45 | SELL | 25,899.8 | 25,899.8 | 22.2 | blocked |
| 2025-11-26 09:30 | BUY | 26,024.1 | 26,024.1 | 23.9 | blocked |
| 2025-12-03 10:30 | SELL | 25,904.4 | 25,904.4 | 45.5 | passes |
| 2025-12-04 09:30 | BUY | 26,028.2 | 26,028.2 | 25.5 | passes |
| 2025-12-08 14:00 | SELL | 25,914.4 | 25,914.4 | 46.7 | passes |
| 2025-12-12 09:30 | BUY | 26,024.8 | 26,024.8 | 29.6 | passes |
| 2025-12-16 09:45 | SELL | 25,906.1 | 25,906.1 | 19.7 | blocked |
| 2025-12-22 09:15 | BUY | 26,125.5 | 26,125.5 | 21.4 | blocked |
| 2025-12-26 14:30 | SELL | 26,017.3 | 26,017.3 | 49.8 | passes |
| 2025-12-31 12:45 | BUY | 26,147.2 | 26,147.2 | 49.6 | passes |
| 2026-01-08 10:30 | SELL | 26,031.6 | 26,031.6 | 23.1 | blocked |
As pasted vs the variants
| Variant | Trades closed | Trades that won (%) | Net points (after costs) | Biggest drop (pts) |
|---|---|---|---|---|
| as pasted | 4 | 25.0% | -208.0 | -131.4 |
| trailing anchor + ADX + 50-pt stop | 61 | 36.1% | +1,811.0 | -871.4 |
| trailing, no ADX | 113 | 38.9% | +1,843.5 | -1,029.3 |
| trailing, no ADX, no stop | 113 | 54.0% | +3,676.5 | -1,375.7 |
| trailing + ADX, EOD filled same bar | 61 | 39.3% | -191.7 | -935.0 |
A trade is one that finished: it entered and it exited. "Trades that won" counts the finished trades whose price move was positive — slippage already deducted, commission not yet — while "net points" is the same trades after commission as well. The two columns can disagree. "Biggest drop" is the deepest fall from the running peak of the money curve, in the same points as the net column and after the same costs. It is a size, not a percentage.
Why the last row matters
The script sets process_orders_on_close=false, so the 15:20 "end-of-day" close does not fill on that bar — it fills at the next bar's open, i.e. the next session's 09:15. The position is therefore held overnight, despite the input being called "Close at End of Day". Modelling that faithfully moves the 61-trade variant from -191.7 points to +1,811.0 points — a swing of 2,003 points. The exit price moved +32.8 points per trade on average over 61 matched trades (t-stat 1.44), which is not distinguishable from zero. That is noise, not an edge, and it is why neither number should be read as a result.