I used to trade on vibes. A chart looked good, a mate mentioned a ticker, the market was green — good enough. I’d buy, it’d drop, I’d hold hoping it’d recover, and eventually I’d sell at a loss that could’ve been half the size if I’d had a plan.

The 15 Percent Protocol is the plan I wish I’d had from the start. It’s a rules-based swing trading system for Australian equities (ASX) that removes emotion from every decision point: when to buy, how much to buy, and exactly when to sell.

Market Regime: The Traffic Light

Before looking at any individual stock, the system checks the market regime. This is the single most important filter in the entire protocol.

The benchmark is the ASX 200 index (XJO). The system compares XJO’s current price against its 50-day simple moving average (SMA-50) and checks the trend direction:

  • GREEN: XJO is above SMA-50 and trending up. Buys are allowed.
  • YELLOW: XJO is near SMA-50 or trend is uncertain. Caution — reduce position sizes, tighten criteria.
  • RED: XJO is below SMA-50 and trending down. No new buys. Period.

This sounds simplistic, and it is. That’s the point. When the broad market is falling, most stocks fall with it. You can find the best technical setup in the world, but if the tide is going out, your boat is going down too. The regime filter keeps me out of the market when the odds are against me.

I run get_technicals.py daily against XJO to update the regime. It’s the first thing I check every morning.

The 5 Buy Criteria

When the regime is GREEN, individual stocks must pass all five criteria to generate a buy signal:

  1. Green regime — Already covered. Non-negotiable gate.
  2. Above SMA-50 — The stock’s price must be above its own 50-day simple moving average. This confirms the stock is in an uptrend. Stocks below their SMA-50 are falling; I don’t try to catch knives.
  3. Within EMA band — The stock must be trading near its exponential moving average band (EMA-20). This is the “not too extended” check. A stock that’s 30% above its EMA has probably already made its move. I want to buy pullbacks to the mean, not blow-off tops.
  4. Relative Strength > 1.0 — The stock must be outperforming the benchmark (XJO). If the market is up 5% and the stock is up 3%, it’s lagging. I want leaders, not laggards. RS is calculated as the ratio of the stock’s performance to the index over a trailing period.
  5. Volume surge — Recent volume must be notably above average. Volume confirms conviction. A price move on thin volume is a rumour; a price move on heavy volume is a statement.

All five. Not four. Not “close enough on criterion 3 but everything else looks great.” All five or no trade.

This is where discipline matters. The protocol has kept me out of trades that my gut was screaming to take. Sometimes those trades would have worked. More often, they wouldn’t have. Over a large enough sample, the filter is positive expectancy. That’s what matters.

Position Sizing: calculate_ticket.py

Once a stock passes all five criteria, the next question is: how much do I buy?

The position sizing script takes four inputs:

hawk-python scripts/calculate_ticket.py AGE.AX 0.045 0.038 100000

That’s: ticker, entry price, stop price, and portfolio value. It calculates position size based on a fixed risk per trade — I risk a set percentage of portfolio value on each position. The distance between entry and stop determines how many shares that translates to.

This means volatile stocks (wide stop distance) get smaller positions, and steady stocks (tight stop distance) get larger positions. Risk stays constant regardless of the stock’s personality.

No mental maths. No “I’ll just buy a round lot.” The script tells me exactly how many shares to buy and what my dollar risk is. I execute that number.

The Two-Phase Stop System

This is probably the most important part of the protocol. Entries get all the attention, but exits are where money is made or lost.

Phase 1: SMA-50 Trailing Stop

From entry until the position is up 12% or more, the stop is tied to the stock’s 50-day simple moving average. If the stock closes below its SMA-50, I’m out.

Why SMA-50? It gives the trade room to breathe. Swing trades need days or weeks to develop. A tighter stop (like the 20-day) would shake me out of perfectly good trades on normal pullbacks. The SMA-50 says: “the trend is still intact as long as we’re above this line.”

The 12% threshold for phase transition isn’t arbitrary — it’s roughly the point where a trade has moved enough to warrant protecting more of the gain.

Phase 2: EMA-20 Trailing Ratchet

Once a position reaches +12% unrealised P&L, the stop tightens to the 20-day exponential moving average. This is the trailing ratchet.

The EMA-20 is faster than the SMA-50, so it follows price more closely. As the stock rises, the EMA-20 rises with it, locking in more profit. The stop only moves up, never down — that’s the ratchet mechanism.

This creates the asymmetry that makes the system work: losses are capped early (Phase 1 stop) but winners are allowed to run until the trend actually breaks (Phase 2 trailing). You don’t need to guess where the top is. The EMA-20 will tell you when the party’s over.

DougBoard: The Dashboard

All of this data flows into DougBoard, a custom dashboard I built with a Bloomberg Terminal-inspired theme (black background, electric blue and amber accents). It shows:

  • Current holdings with real-time P&L, stop levels, and phase status
  • Watchlist candidates with their criteria scores
  • Market regime status front and centre
  • Action pipeline: what needs attention today
  • Triple-lock alerts when a holding is near its stop, below EMA, and showing rising ADX (trend strength) — the trifecta of “this is about to get stopped out”

The data pipeline is simple: get_technicals.py pulls daily data, generate_chart.py creates technical charts, and update_board.py packages everything into a JSON file that DougBoard’s frontend consumes. The whole refresh runs via run_protocol.sh.

I also run sector_scan.py weekly to find sector leaders — stocks with the strongest relative strength within their GICS sector. This feeds the watchlist with candidates that are likely to pass the 5 criteria soon.

Why Rules-Based Matters

The entire point of the 15 Percent Protocol is to remove me from the decision. Not because I’m stupid — because I’m human. I feel fear when a stock drops. I feel greed when it’s running. I feel FOMO when something I passed on doubles.

The rules don’t feel anything. They say: “Regime is green, stock passes all five criteria, position size is X shares, stop is at Y.” Or they say: “Regime is red, no trades.” There’s nothing to argue with.

The hardest part isn’t building the system. It’s following it when every instinct is telling you to override it. The stock is obviously going higher, just look at the chart! The regime just turned red but this one’s different, it’s got earnings next week!

No. The rules are the rules. If I start making exceptions, I don’t have a system anymore. I have a set of suggestions that I follow when they agree with my gut, which is the same as having no system at all.

The Numbers

I’ve been running this protocol for several months now. I won’t share exact returns because that’s not the point and past performance means nothing for anyone else’s situation. What I will say:

  • Win rate is around 45%. Most trades lose money. That’s fine.
  • Average winner is roughly 2.5x the average loser. That’s the asymmetry from the two-phase stop system.
  • The regime filter has kept me out of two significant market pullbacks where I would’ve been buying into falling prices.
  • I sleep better. That’s not a metric, but it matters.

The 15 Percent Protocol isn’t clever. It’s not a quant strategy or a machine learning model. It’s a set of rules that a disciplined trader can follow every day without second-guessing. And for a solo developer who trades on the side, that’s exactly what I need.