trading-discipline
Rules that protect an Indian trader from themselves: an account-level circuit breaker (daily 2%, weekly 5%, monthly 10% loss limits plus losing-streak cooldowns) read from the trade journal, a pre-tra
Files2
View on GitHubSKILL.mdskills/trading-discipline/SKILL.md
GitHubTrading Discipline
Most retail losses come from behaviour, not analysis: the oversized trade, the revenge trade after a loss, the fifth trade on a red day. This skill turns the rules into checks that run before money moves, and turns the journal into feedback afterwards.
Commands
# Can I trade today? (status GREEN / AMBER / RED + allowed risk for the next trade)
python3 scripts/discipline.py breaker trades.csv --capital 500000 [--as-of 2026-10-29]
# Pre-trade gate (writes nothing). Add --journal to fold in the breaker.
python3 scripts/discipline.py gate --capital 500000 --entry 1450 --stop 1410 --target 1550 --qty 120 \
--plan-written yes --minutes-since-last-loss 90 --regime risk-on --fno-ban no --asm-gsm no \
--event no --circuit-locked no --journal trades.csv
python3 scripts/discipline.py gate --segment options-buy --entry 140 --stop 85 --qty 75 --expiry-day yes ...
# Coaching review, and the latest ISO-week digest (or --week 2026-W43)
python3 scripts/discipline.py review trades.csv [--recent 10]
python3 scripts/discipline.py review trades.csv --week
# Only when the user asks to keep a record: run the gate and append one row to a CSV log
python3 scripts/discipline.py log --log decisions.csv --symbol INFY --action taken <gate flags>
Every command takes --json. Dates are IST; --as-of defaults to today in IST. Bad input prints
error: ... and exits 2.
Journal: the same CSV as ../position-sizing/scripts/risk.py journal
(date,symbol,side,entry,exit,stop,qty,charges, or a pnl column), plus optional exit_date,
time (HH:MM entry time), setup (or tag), mistake (several separated by ;), segment
(equity / fno / intraday) and notes. A row with a blank exit and blank pnl is an open trade:
it is left out of realised statistics and listed separately, and its stop risk counts against the
breaker's remaining room. A zero-P&L trade is a breakeven, not a loss.
Circuit breaker: rules and why
| Rule (default, flag) | Trips | Releases | Why |
|---|---|---|---|
Daily loss 2% (--daily-pct) |
RED | Next weekday | Two full 1% losses; after that, decisions get worse |
Weekly loss 5% (--weekly-pct, Mon–Sun) |
RED | Next Monday | Stops a bad day turning into a bad month |
Monthly loss 10% (--monthly-pct) |
RED | 1st of next month | Recovering 10% needs 11%; recovering 30% needs 43% |
3 losses in a row, latest today (--stop-streak) |
RED | Next weekday | Tilt: the next trade is usually the worst one |
| 3+ streak still open from an earlier day | AMBER | A win | First trade back should be your best setup |
5 losses in a row (--reduce-streak) |
AMBER, size ×0.5 | After 5 more trades (--reduce-trades) |
Shrink until the edge reappears |
| Any period ≥ 50% of its limit | AMBER | — | Early warning |
Limits use net realised P&L for the IST day, ISO week and calendar month. Breakevens neither
extend nor break a streak. Allowed risk for the next trade = normal risk (--risk-pct, 1%) × the
size multiplier, capped so that a stop-out (plus stop risk on open trades) cannot breach any limit.
Holidays are not modelled; "next weekday" may be an NSE holiday (see indian-market-structure).
Pre-trade gate
Any BLOCK → BLOCK; otherwise any WARN → PASS-WITH-WARNINGS; else PASS. Unsupplied yes/no flags are skipped, except where noted.
| Check | BLOCK when | WARN when |
|---|---|---|
| Stop-loss | Missing, or on the wrong side | Option buy with no premium stop (full premium = risk) |
| Rupee risk | Unknown (no qty/capital), or > --risk-pct-limit (1%) |
— |
| Target | Wrong side, or R:R < 1 | Missing, or R:R < 1.5 |
| Written plan | --plan-written no |
Not stated |
| Revenge window | < 30 min since last loss (--revenge-minutes) |
Not stated but today's last journal trade was a loss |
Regime (label from market-regime) |
crash / panic / no-trade, for longs | Trading against risk-off or risk-on; sideways / volatile; unknown label |
| F&O ban | Fresh F&O position in a ban-period stock | Cash trade in a ban stock; F&O with ban status unknown |
ASM / GSM / T2T (--asm-gsm) |
Intraday (T2T/GSM can't be squared off) | Delivery |
Results / board meeting in window (--event) |
— | Gap risk; IV crush for options |
Circuit-locked (--circuit-locked) |
Always | — |
| Expiry day (Tue NIFTY, Thu SENSEX) | — | Option buy on expiry; option sell (extra ELM). Auto-flagged on Tue/Thu if not stated |
MIS cut-off (--segment intraday, --time) |
At or after 15:00 IST (auto square-off ~15:15–15:20) | Before 09:15 |
Circuit breaker (--journal) |
RED, or trade risk > breaker's allowed risk | AMBER |
--segment is equity, intraday, futures, options-buy or options-sell. --qty is the total quantity
(lots × lot size). Add --charges (₹) from trading-costs to include costs in the risk.
How other skills use the gate
india-market-analyst: when a trade idea reaches a concrete entry/stop/target, run the gate and show its verdict with the plan. Fetch ban list, ASM/GSM status and results dates first where a data source allows; otherwise ask the user rather than assuming "no".broker-integration: the gate runs before step 3 of the order protocol (the ticket). BLOCK → do not draft a ticket; explain the blocks. PASS-WITH-WARNINGS → list each warning on the ticket and still wait for an explicit "yes". PASS → the normal ticket and confirmation still apply. The gate never places, modifies or cancels orders.- Logging is opt-in: use
logonly when the user asks to keep a decision record. It appends one row and refuses a file whose header is not a decision log.
Not the same as position-sizing
position-sizing answers how many shares for a given risk. This skill answers whether to trade
at all, and how much risk is allowed right now, given today's losses, streaks and the checklist.
Use the breaker's allowed risk as the --risk-pct input to risk.py size, then gate the result.
Review and weekly digest
review reports win rate, average win/loss, profit factor, expectancy (₹ and R), max drawdown and
longest losing streak, then breaks results down by setup, entry weekday, entry hour, segment, F&O
vs cash, mistakes ranked by ₹ lost, clean vs mistake trades, winner vs loser holding days (needs
exit_date), and the last N trades vs the N before. Coach notes name the best and worst setup, the
costliest mistake and any trend. --week summarises one ISO week: trades closed, best and worst,
mistakes, setup mix and the previous week's net.
F&O context: SEBI's FY25 study found about 91% of individual F&O traders lost money; the FY26 update (press release 50/2026) put it near 88%. If a user's own F&O rows are net negative while cash trades are positive, say so plainly and suggest pausing F&O until the cash edge is proven.
Output
Circuit breaker: AMBER (as of Tue 27 Oct 2026 IST, capital ₹5,00,000)
Allowed risk on next trade: ₹2,500 (0.50%) • After a 5+ loss streak, risk is cut to 50% for 3 more trades
Pre-trade gate: BLOCK [BLOCK] revenge-window Only 10 min since the last loss ...
Limits: every India flag is supplied by the user or a data tool, so the gate is only as good as those answers. Regime labels are matched by keyword. Fewer than 30 trades make review numbers noisy.
Educational discipline tool, not investment advice. The rules are defaults; the decision stays yours.