Article contents

Evidence and scope

Original implementations offer different block definitions and body/full-range options. The following versioned proposal has not been shown to generate profitable returns.

Data and marketsOHLCV from a consistent feed. A chart-derived block is not a substitute for exchange resting-order data.
Research timeframesAn hourly zone with a five-minute entry is a research example. The hourly structure and block must be confirmed before the lower timeframe can use them.
The 100–101 anchor zone precedes an impulse, is published when price breaks 103, and is retested afterward.Open full-size illustration
Synthetic event path. The anchor becomes an order block only after BOS; no institutional orders or real backtest are represented.

Practical workflow

Workflow for Order block: specifying a pre-impulse candle zone after a structure break
The full steps appear below. At each stage, missing data or failed conditions require a recorded rejection reason.
  1. Confirm BOS or MSSA structural event must already be known.
  2. Specify the impulseUse the fixed run and displacement definition.
  3. Select the anchorApply W and the body/full-range convention.
  4. Publish and auditRecord the timestamp and earlier retests.
  5. Trade or invalidateUse a separate entry model without moving the anchor.

Define the impulse before choosing its anchor

The phrase last bearish candle before a strong rally leaves two questions unresolved: how strong must the rally be, and when is it considered complete? Looking at the entire future move and then choosing the prettiest candle on its left creates an attractive zone without a feasible publication time.

The Order Blocks & Breaker Blocks tool offers body or full-candle zones [1], and the SMC implementation contains several structure and block types [2]. This article uses the full wick range of one anchor candle and publishes only after BOS or MSS is known. It does not infer the identity of traders from the candle’s location.

Wider zones make more returns count as successful touches but usually require wider protection. Narrow zones can appear attractive in reward/risk terms while becoming more sensitive to the spread. Neither touch rate nor bounce rate alone establishes which boundary convention is economically preferable.

A reproducible anchor-selection algorithm

At a confirmed bullish BOS/MSS close t, find the final consecutive run of bullish candles ending at t, limited to a proposed M=3 bars. A doji terminates the run. Let s be its start and require (C[t]−O[s])/A_ref≥1, where A_ref=ATR14[s−1]. Then select the last bearish candle within a proposed W=4 bars immediately before s. Without such a candle, do not create a block.

For anchor j, set zone=[L[j],H[j]], published_at=t and eligible_from=t+1. occurred_at=j records history only. Preserve the zone and A_ref. The bearish version reverses direction and searches for a bullish anchor before a bearish run. M, W and the one-ATR displacement are proposed research choices, not parameters attributed to the source author.

Freshness begins when price leaves the zone, including the interval before BOS publication. If a return occurred between departure and publication, store prepublication_retest=true. A first-touch version may exclude it. A newly drawn block is not automatically untouched.

Define a deterministic response when the bullish run is longer than M. This baseline evaluates the final M candles rather than extending the run indefinitely until it meets the displacement requirement. Store the chosen s and j, so a later replay can reproduce the selection instead of searching the full future impulse again.

on_confirmed_bullish_structure_break(t):
  s = start_of_final_bullish_run(t,max_bars=3)
  if s is None or not valid_history_before(s,lookback=4): return
  A = ATR14[s-1]
  if not finite_positive(A): return
  if (C[t]-O[s])/A < 1: return
  j = last_bearish_bar(s-4,s-1)
  if j is None: return
  zone = [L[j],H[j]]
  publish(zone,original_bar=j,known_at=received_close_time(t),
          eligible=t+1,A_ref=A,
          prior_retests=count_since_departure(zone,j,t))

Use volume as distinct, testable features

Measure anchor volume, impulse volume and return volume separately. Heavy anchor volume does not automatically create a better block: the candle may reflect distribution or two-way trading. Compare otherwise identical BOS-confirmed blocks with and without an RVOL filter.

If return volume is lower than impulse volume, control for duration and time of day. Comparing a three-bar impulse with a one-bar retracement using raw totals mechanically favors the smaller window. Also measure the spread when price revisits the zone; a narrow block may leave too little room to pay transaction costs.

An FVG within the impulse is another feature. FVG, displacement and BOS may all be produced by the same strong candle, so assigning three arbitrary confidence points can exaggerate independent support. Keep their common event lineage and add each condition separately in the experiment.

Synthetic block creation and a losing retest

A synthetic bearish anchor j has O=100.80, H=101, L=100 and C=100.20. The following bullish run reaches a close of 103.50 and crosses a previously known swing at 103; ATR before the run is 1. The bullish block is[100,101], midpoint 100.50, and becomes available only at the BOS close.

A later retest reaches 100.40 and closes 101.20, satisfying a proposed rejection above the upper edge plus b=0.10. A buy filled at 101.25, stop 99.90 and target 103.95 has risk 1.35 and reward 2.70, or 2R before costs. A midpoint-limit entry at 100.50 is legitimate only if the order existed before the return and the fill model permits execution.

In a failure path, the return reaches 99.70 and closes 99.80. The confirmation version does not enter. The already resting midpoint limit may have filled and then exited at 99.88, losing 0.62 from 100.50. Do not replace the anchor with an older candle whose low was 99.50 to make the failed trade appear structurally valid. If j originally lay outside W=4, no block should have been created in the first place.

First retest, invalidation and zone lifetime

A proposed baseline allows 30 bars after publication and only the first eligible retest, followed by a close above zone_high+b. Cancel before entry if price closes below zone_low−b, a separately defined major structure condition fails, or the candidate expires. For an existing limit, process fills during its lifetime before any cancellation decided at the bar close.

A stop outside the zone and a stop outside the larger swing are different risk policies. Size from actual entry, the stop distance and the instrument’s value per price unit. A predetermined spread-to-risk limit can reject an entry; it cannot be chosen after inspecting which trades lost. Exchange order documentation helps define the execution layer [3].

When a block fails, preserve its FAILED record. A later breaker is a new candidate carrying parent_ob_id, not a rewrite that converts the old loss into a successful zone. Retain every touch so first- and second-touch hypotheses can be compared.

If several anchors qualify across overlapping timeframes, do not automatically stack the positions. The same impulse may have produced all of them. A portfolio rule should select one trade or share a fixed event budget, with the rejected alternatives retained for research rather than silently discarded.

Does the anchor improve on a simple pullback zone?

Useful controls include a different pre-impulse candle or a fixed-percentage retracement zone from the same move. Match width, distance, age and trend. If the apparent advantage comes only from placing the entry closer to price, that is different from evidence for a special institutional-inventory mechanism.

Prefix replay must show the zone appearing only at publication. Preserve failed blocks instead of reading only those still displayed on the final chart. Report block count, retest frequency, no-fill rate, net expectancy, drawdown and costs in R.

Test nearby M/W values, body versus wick boundaries and TTL on new data. Include prepublication-touched blocks as their own group to measure the cost of freshness selection. Searching hundreds of anchor rules and displaying one convincing chart does not validate the broader method.

Common pitfalls

Every candle becomes an order block

Without an impulse and structure-break context, the detector is insufficiently specific.

Changing the anchor after a stop

This removes losing samples and introduces zone-level survivorship bias.

Assuming newly drawn means untouched

Freshness must include the interval before publication.

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 an order block a bank’s resting limit order?

That cannot be established from candles. Here it is only a price zone selected by explicit rules.

Is the candle body better than the whole wick?

They change width, fills and protection. Compare them outside the development sample on the same opportunity set.

Research sources

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

  1. Order Blocks and Breaker BlocksLuxAlgo on TradingView. Read the original tool description, body/full-range options and polarity behavior. Checked: .
  2. Smart Money ConceptsLuxAlgo on TradingView. Read one implementation, not a universal market standard. Checked: .
  3. Futures Order TypesCME Group. Read order mechanics to distinguish detection from execution. 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