Article contents

Evidence and scope

Qullamaggie attributes tens of millions of dollars to EP trading and supplies chart examples, including stopped trades. The page reviewed supplies no audit or trade CSV verifying that profit. This article has not backtested its OR15 specification.

Data and marketsUS equities with historical news and earnings releases, corporate-action-aware prices and volume, and intraday records. The session-based definition does not automatically transfer to continuously traded crypto.
Research timeframesDaily data establish context; the first fifteen minutes define the proposed opening range. The research variant holds for no more than 20 sessions.
The stock gaps from 50 to 56, establishes its fifteen-minute range, breaks above 57, and later exits through a scheduled trailing stop.Open full-size illustration
Synthetic event sequence combining the opening range with later sessions. Horizontal intervals are not uniform in clock time. Volume bars illustrate the idea and do not reproduce a real EP.

Practical workflow

Workflow for Episodic Pivots: Catalyst, Gap, and Opening Volume
The full steps appear below. At each stage, missing data or failed conditions require a recorded rejection reason.
  1. Capture the catalystRetain the release and receipt timestamps plus the document available before the open.
  2. Measure gap and OR15Wait until the actual opening window finishes before freezing its prices and volume.
  3. Check volume and planned riskUse ADV and ATR from preceding completed sessions.
  4. Place the order and retain fillsProcess active stop orders through gaps before evaluating later cancellation decisions.
  5. Trail on a fixed scheduleCompute after the close and apply the update from the following session.

Public rules and this article’s research choices

In his November 2, 2021 article, Qullamaggie describes EPs through gaps of at least 10%, exceptional activity near the open, an entry above an opening-range high, and a stop near the day's low. He credits Stockbee for the idea [1]. The examples include stopped AFRM entries: an attractive catalyst does not make every entry successful.

The source offers multiple opening-range intervals and leaves room for judgment in management. A backtest needs one frozen version before its results are inspected. This article chooses OR15, opening-fifteen-minute volume divided by ADV 50 of at least 0.5, and a scheduled trailing policy. Those are proposed research parameters, not numbers endorsed as a complete system by the source author.

The hypothesis is that new information coincides with exceptional participation and sustained repricing. A split-related price discontinuity is not a news response. A gap driven by the whole market differs from company-specific earnings. Label these circumstances explicitly rather than combining every sharply rising stock into one apparently homogeneous sample.

Use the catalyst available at decision time

Store the original headline, publisher, published_at, received_at, event_type, and document version that a trader could actually access. SEC submissions and XBRL APIs provide filing data [2], but a corrected dataset downloaded today is not automatically a point-in-time snapshot of an earnings release. Record corrections as subsequent information.

The baseline accepts only catalysts publicly available before that session opens. Earnings growth or surprise can be added in a separately named variant, but analyst consensus must predate the release. Missing small-cap estimates are unavailable observations, not zero estimates that manufacture an infinite surprise. A release received after the opening decision cannot qualify retrospectively.

Compute ADV 50 and daily ATR14 from completed sessions preceding today, with consistent split treatment across prices and volume. Use the securities actually available on each historical date, including later delistings. Define regular trading hours with the exchange calendar and America/New_York timezone [3]; 09:30 is not a constant UTC offset across daylight-saving changes.

A causal OR15 order and trailing policy

After the official open, require gap=(official_open/previous_close−1)≥10%. Wait until the 09:30–09:45 window is complete, then freeze ORH, ORL, and volume 15. If volume 15/ADV 50≥0.5, submit a buy-stop at ORH+b after 09:45, where b=max(2 ticks,0.1×previous daily ATR14). The planned entry minus ORL−b must not exceed that prior daily ATR. The order expires at 11:00.

A range finalized at 09:45 cannot support a simulated entry at 09:37. Its completed volume is also unavailable then. Testing the one- or five-minute ranges mentioned by the author requires volume conditions observable at those earlier times. A live resting stop remains eligible to fill until a cancellation is effective; a later bar summary cannot erase an earlier trigger.

After a fill, the initial stop is ORL−b. Following three completed sessions, calculate next_stop=max(current_stop,SMA10 through the current close) at each close, effective from the following session. If the current close is already at or below next_stop, schedule an exit at the next executable opening quote. Retain the initial hard stop while waiting and exit after at most 20 sessions. This proposed policy uses no fixed two-R target.

For reproducible holding-time accounting, count the entry session as holding session one and exit at the executable event at the close of session twenty. The three full sessions before trailing are complete sessions after the fill, excluding the remainder of the entry session. Attach protection to the entry and activate it according to the broker model when a fill occurs; model activation latency instead of assuming protection existed before the order arrived. Existing protection remains live while an exit or stop replacement is pending.

after_OR15_data_received:
  if now>=11:00 or not complete_catalyst_ADV_ATR_OR_history: return
  if catalyst_known_before_open and gap>=0.10 and volume15/ADV50>=0.5:
    entry_trigger=ORH+b; initial_stop=ORL-b
    if 0<entry_trigger-initial_stop<=ATR_day_previous:
      place_buy_stop_after_now(expiry=11:00,attached_protection=initial_stop)
on_fill(fill):
  record_actual_fill_and_risk(fill,initial_stop)
  activate_protection_as_execution_model_allows(initial_stop)
  freeze_deadline_at_close_of_20th_session_including_entry_session()
on_every_market_event(event):
  process_live_entry_and_protective_order_fills_before_later_cancellations(event)
  if entry_expired_and_still_unfilled: cancel_entry_effective_from_now()
  if holding_deadline_reached and position_open: exit_next_executable_quote()
after_each_received_session_close:
  if position_open and at_least_3_full_sessions_completed_after_fill:
    next_stop=max(current_stop,SMA10_through_today)
    if close<=next_stop: schedule_exit_next_session_quote()
    else: schedule_stop_replacement_for_next_session(next_stop)
# Existing protection stays live until an exit or effective stop replacement.
# Gap-through fills and order-activation latency remain in realized results.

Opening activity is not buyer identity

A volume 15/ADV 50 ratio of 0.5 means that fifteen minutes have traded half an average day's shares. It differs from same-time relative volume, which compares those fifteen minutes with equivalent historical windows. Record both under distinct names if needed. The proposed 0.5 threshold is below the source's ideal description and must remain labeled as a variant.

An illiquid stock can exceed this ratio while carrying a wide spread and shallow quotes. Predetermined notional-liquidity and spread-to-stop limits belong to execution eligibility. Evaluate them using information available when the order is considered. A large volume bar does not show that the intended position could be bought near the displayed reference price.

Opening auctions, block prints, and trading halts can dominate short windows. State whether auction trades are included and use the same convention in current observations and historical baselines. High volume measures reported activity; it does not identify a fund accumulating shares over several months. Aggregate prints alone cannot establish that narrative.

A trailing winner and a gap-through-stop loss

Use synthetic prices: the previous close is 50, the official open is 56, and the gap is 12%. Previous daily ATR is 2 and tick size is 0.01, so b=0.2. ORH is 57, ORL is 55.5, opening volume is 500,000 shares, and ADV 50 is 1,000,000. The planned trigger is 57.2 and the stop is 55.3. Planned risk of 1.9 passes the ATR limit. An actual fill of 57.25 raises initial risk to 1.95.

On a successful synthetic path, several sessions later the trailing calculation based on completed closes reaches 64.5. During the following session it triggers and fills at 64.45. Gross profit is 7.20 per share, approximately 3.69R measured against the original 1.95 risk. Many qualifying events will not trend long enough for this trailing policy to help.

On a losing path, the next session opens at 54.4, below the 55.3 stop. Exiting at 54.4 loses 2.85, or approximately 1.46R before costs. Separately, an already resting buy-stop at 57.2 may fill at 59 after a discontinuous rise. Do not delete that fill because its actual risk exceeds the ATR cap. Apply a predeclared risk response at the next feasible event and record its cost.

Build the sample from every eligible catalyst

Begin with historical releases and observable gappers, not a list of stocks that eventually doubled. Candidates must include earnings sold down, instruments that could not be filled, and companies that later disappeared. Winner charts help formulate a hypothesis but provide no denominator for estimating its success rate.

Compare gap-only, gap-plus-volume, and gap-plus-volume-plus-catalyst labels on the same eligible universe. Separate news type, gap size, liquidity, and prior trend. Select the trailing policy using development and validation data, then lock it for the test set. Log every opening-range interval, volume threshold, and exit family tried so the apparent best result can be interpreted in light of that search.

Report net expectancy, overnight exposure, gap losses, turnover, fees, no-fill events, MAE/MFE, and the contribution of the largest winners. If two extraordinary stocks produce most of the profit, that concentration is part of the result. Compare against a benchmark holding similarly selected catalyst stocks to identify what the entry rule itself contributes.

Common pitfalls

Researching only exceptional winners

Starting from stocks that later surged removes failed EPs from the denominator.

Replacing the original release with revised data

Historical consensus and release versions determine whether a decision was possible at the time.

Capping every stop loss at one R

Overnight gaps and halts can make the execution loss exceed the nominal stop distance.

Checklist before using this method

Check each item after verifying it on your data. Progress is saved in this browser; it does not certify a profitable strategy.

0/7 items

Frequently asked questions

Is OR15 Qullamaggie’s original fixed rule?

No. It is a standardized variant here. His public discussion describes other opening-range choices and discretionary considerations.

Are strong earnings sufficient for an EP trade?

No. This specification also requires a qualifying gap, volume, and a subsequent price trigger. Missing activity or an untriggered order produces no trade.

Research sources

Each source supports the definition or evidence described beside it. The pseudocode, synthetic examples and proposed parameters require separate validation.

  1. How to master a setup: Episodic PivotsKristjan Kullamägi / Qullamaggie. The November 2, 2021 article, public rules, and examples including stopped AFRM entries were reviewed. Profit remains self-reported. Checked: .
  2. EDGAR Application Programming InterfacesU.S. SEC. Official submissions and XBRL data documentation. Current API data are not assumed to preserve every historical snapshot. Checked: .
  3. Holidays & Trading HoursNYSE. Official session calendar and early-close information used to define opening windows and holding periods. Checked: .

Related methods

Risk note

This content supports education and research design, not financial advice. Backtest is historical simulation, does not guarantee future performance and does not place real trades. Methods in this library are not automatically features available in the app. See methodology and learning center.

Validate rules before risking real capital

Check app support, data and individual simulated trades; advanced detectors may require a separate implementation.

Download Backtest on the App Store