Article contents
- Evidence and scope
- Illustration
- Process
- Public rules and this article’s research choices
- Use the catalyst available at decision time
- A causal OR15 order and trailing policy
- Opening activity is not buyer identity
- A trailing winner and a gap-through-stop loss
- Build the sample from every eligible catalyst
- Common pitfalls
- Practical checklist
- Frequently asked questions
- Research sources
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.
Practical workflow
- Capture the catalystRetain the release and receipt timestamps plus the document available before the open.
- Measure gap and OR15Wait until the actual opening window finishes before freezing its prices and volume.
- Check volume and planned riskUse ADV and ATR from preceding completed sessions.
- Place the order and retain fillsProcess active stop orders through gaps before evaluating later cancellation decisions.
- 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.
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.
- 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: .
- EDGAR Application Programming InterfacesU.S. SEC. Official submissions and XBRL data documentation. Current API data are not assumed to preserve every historical snapshot. Checked: .
- 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