---
title: "Forex market structure research · Oxarus Quant"
description: "Studies on support and resistance levels, weekend gaps and how price behaves at levels, built on millions of minutes of data."
url: https://oxarus.com/en/quant/research
key: quant-research
route: /quant/research
unit: quant
locale: en
status: live
alternates:
  tr: https://oxarus.com/tr/quant/research
  en: https://oxarus.com/en/quant/research
documents:
  json: https://oxarus.com/machine/en/quant/research.json
  jsonld: https://oxarus.com/machine/en/quant/research.jsonld
  txt: https://oxarus.com/machine/en/quant/research.txt
schema: oxarus.machine/2.0
---

# Forex market structure research · Oxarus Quant

> Studies on support and resistance levels, weekend gaps and how price behaves at levels, built on millions of minutes of data.

Breadcrumbs: [Oxarus home](https://oxarus.com/en) › [Oxarus Quant](https://oxarus.com/en/quant) › [Research](https://oxarus.com/en/quant/research)

## Notices

- Interface data marked as representative is illustrative; it is not a real client, result or measurement.
- Not investment advice. Trading in financial markets carries a risk of losing capital.

## Sections

- [we measure first.](#hero)
- [two published studies.](#studies)
- [how long at the level?](#dwell)
- [when do they close?](#gaps)
- [how we avoid fooling ourselves.](#method)
- [let data answer your question.](#cta)

<a id="hero"></a>
<!-- section:hero component:ResearchHero kind:hero sources:messages:quantResearch.hero -->

## we measure first.

_QUANT · RESEARCH_

We test widely held but rarely measured market ideas against data: seven years of minute prices, a matched control group for every idea and a repeat on a second pair. We publish the ideas that don't hold up, too.

<https://oxarus.com/en/quant/research>

- [Institutional research](https://oxarus.com/en/quant/research#cta-heading) → `open_page(path="/quant/research", anchor="cta-heading")`
- [Findings](https://oxarus.com/en/quant/research#studies) → `open_page(path="/quant/research", anchor="studies")`

- Minute data, 2020–2026
- A matched control group in every test
- Replicated on EURUSD and GBPUSD

1. Level
2. Control
3. Result

<!-- demo:start messages:quantResearch.hero.demo -->
_Representative interface data_ · Representative chart. Findings are for research purposes only and are not investment advice.

- **file:** level\_study.ipynb
- **dataset:** EURUSD · M1 · 2020–2026 · 40,658 touches
- **tag:** Representative chart

Count touches · Build control lines · Compare rates

- **done:** done
- **level:** Previous day high (PDH)
- **band:** band = 0.05 × ATR
- **levelTag:** PDH

**Matched control**

- **tag:** ctl

- **body:** For every real level, a line at the same distance that means nothing. Taken from another day's real offset, shifted by 7 days.

- **Real level:** 9–25 / day
- **Control line:** ~25 / day
- **Distance distribution:** identical

**Three touches on one level**
- 0
  - **n:** #1
  - **minutes:** 4
  - **dwell:** 4 min
  - **out:** REJECT
- 1
  - **n:** #2
  - **minutes:** 9
  - **dwell:** 9 min
  - **out:** REJECT
- 2
  - **n:** #3
  - **minutes:** 31
  - **dwell:** 31 min
  - **out:** BREAK

> The touch that stayed longest in the band broke the level. One representative day; the rates are in the third cell.

- **resultTitle:** Break rate · by level family

|  |  |  |
| --- | --- | --- |
| PIVOT | 41 | 40 |
| PDHLC | 41 | 40 |
| ROUND | 41 | 40 |
| SWING | 41 | 40 |
| FIB | 39 | 39 |

**Same result every year**
- 2020
- 2021
- 2022
- 2023
- 2024
- 2025
- 2026

- **verdict:** No difference: a level's name doesn't change the odds of a break.

> Representative chart; rates are from the published study.

<!-- demo:end -->

<a id="studies"></a>
<!-- section:studies component:StudyShelf kind:features anchor:#studies sources:messages:quantResearch.studies -->

## two published studies.

_STUDIES_

Each study states its sample, period and control method. Pick a finding to bring its panel forward in the figure.

<https://oxarus.com/en/quant/research#studies>

> From the published study. For research purposes only, not investment advice.

- **Do levels really hold?** · _EURUSD and GBPUSD · 2020–2026_
  At pivots, previous-day levels, round numbers, swing and Fibonacci levels, we checked whether price broke through, and compared the results with meaningless control lines that share the same distance distribution.
  - **sample:** 83,527
  - **sample unit:** touches
  **STUDY FACTS**
  - **Sample:** 83,527 touches
  - **Period:** 2020–2026
  - **Pairs:** EURUSD · GBPUSD
  - **Resolution:** M1 (minute bars)
  - **Control:** Distance-matched lines
  - **Replication:** Replicated on GBPUSD
  **FINDINGS**
  - Every level family broke about 41% of the time; matched control lines, 40%. The same held in each of the seven years.
  - Which touch it was made no difference: from the 1st touch to the 5th, 41%, 40%, 39%, 42%, 44%.
  - The only thing that changed the outcome was how long price stayed near the level on that touch. The same result replicated point for point on GBPUSD.
  - Break rate by level family
  - Break rate by touch number
  - Break probability by time in the band
  - **Go to the dwell-time chart**
    - [Go to the dwell-time chart](https://oxarus.com/en/#dwell)
- **Do weekend gaps close?** · _EURUSD · weekend and holiday breaks_
  We measured when the Monday opening gap made it back to Friday's close, and how far price traveled before it did.
  - **sample:** 345
  - **sample unit:** breaks
  **STUDY FACTS**
  - **Sample:** 345 breaks
  - **Period:** 2020–2026
  - **Pair:** EURUSD
  - **Resolution:** M1 (minute bars)
  - **Reference:** Friday close
  - **Horizon:** 60 days
  **FINDINGS**
  - 65% of gaps closed during the opening session; among those, the median time to close was 11 minutes.
  - 95% closed within five trading days, and 98% within sixty days.
  - The small tail that never closed lined up exactly with geopolitical shock days. For gaps larger than 5 pips, the median excursion before closing was 21 pips, and 120 pips in the worst decile.
  - Closed in the opening session
  - Share closed over time
  - Excursion before the close
  - **Go to the gap chart**
    - [Go to the gap chart](https://oxarus.com/en/#gaps)

|  |  |  |
| --- | --- | --- |
| PIVOT | 41 | 40 |
| PDHLC | 41 | 40 |
| ROUND | 41 | 40 |
| SWING | 41 | 40 |
| FIB | 39 | 39 |

- **matched control:** 40

**touch number**
41 · 40 · 39 · 42 · 44

- 20
- 21
- 22
- 23
- 24
- 25
- 26

**stops**
0 · 10 · 30 · 60

**eurusd**
41 · 51 · 55 · 56

**gbpusd**
40 · – · 54 · –

- **all:** 65
- **big:** 10
- **median time to close:** 11 min

- **open**
  - **all:** 0
  - **big:** 0
- **session**
  - **all:** 65
  - **big:** 10
- **5 days**
  - **all:** 95
  - **big:** 85
- **60 days**
  - **all:** 98

- **p50:** 21
- **p90:** 120
- **max:** 470
- **still open after 60 days:** 2

_Interface labels:_ Research note · Published · Figure {n} · level · 2020–2026: same every year · {value} pts · min · pips · all gaps · over 20 pips · log scale

<a id="dwell"></a>
<!-- section:dwell component:DwellExplorer kind:content anchor:#dwell-heading sources:messages:quantResearch.dwell -->

## how long at the level?

_TIME AT THE LEVEL_

The longer price stays in a level's band, the more likely it is to break the level, until the effect levels off. Pick a duration; the chart and the ranges update together.

<https://oxarus.com/en/quant/research#dwell-heading>

- **stop option:** ≥{minutes} min
- **replication:** GBPUSD replication
- **probability:** break probability
- **base:** base
- **lift:** vs base
- **lift unit:** pts
- **not measured:** not measured
- **pair eur:** EURUSD
- **pair gbp:** GBPUSD

> Break probability by time spent in the level band. A research finding, not a trade recommendation.

#### By session: base → 30 minutes

#### Time in the band

- **rejects:** Rejections
- **breaks:** Breaks
- **median:** median
- **selected:** selected

**Robustness to band width**

With the band varied between 0.03 and 0.08 × ATR, the 30-minute lift stayed between +12 and +14 points.

- **plateau:** plateau

- **dataset:** EURUSD · GBPUSD · M1 · 2020–2026 · n=83,527

**Time already in the band**
0 · 10 · 30 · 60

**eurusd**
41 · 51 · 55 · 56

**gbpusd**
40 · – · 54 · –

- **control:** 40
- **control short:** control

**plateau**
56 · 57

- **minute unit:** min
- **break query:** P(break | dwell ≥ {minutes} min)
- **chart sample:** EURUSD n=40,658 · GBPUSD n=42,869

**By session: base → 30 minutes**
- **ASIA**
  - **base:** 43
  - **at30:** 55
- **LDN**
  - **base:** 40
  - **at30:** 56
- **NY**
  - **base:** 40
  - **at30:** 55

- **By session: base → 30 minutes:** 30 min

**rejects**
9 · 10

**breaks**
28 · 31

- 0.03
- 0.05
- 0.08

- **Robustness to band width:** × ATR

**Robustness to band width**
12 · 14

- **Robustness to band width:** 30 min

<a id="gaps"></a>
<!-- section:gaps component:GapExplorer kind:content anchor:#gaps-heading sources:messages:quantResearch.gapchart -->

## when do they close?

_WEEKEND GAPS_

Across 345 weekend and holiday breaks, how long the opening gap took to get back to Friday's close. Pick a horizon.

<https://oxarus.com/en/quant/research#gaps-heading>

**Horizon**
- **Session**
- **5 days**
- **60 days**

The remaining 2%: gaps still open after sixty days. Every one of them coincides with a major geopolitical shock.

#### Cumulative share of gaps closed

#### By gap size

- **all gaps:** All gaps
- **big gaps:** Over 20 pips
- **same session:** Closed in the same session
- **within week:** Within 5 trading days

**Excursion before closing (≥5 pips)**

Before the gap closed, price moved the other way by a median of 21 pips, 120 pips in the worst decile, and 470 pips at most.

- **median fill:** median fill
- **axis open:** open
- **axis session:** session
- **axis day:** 1 day
- **axis week:** 5 days
- **axis two months:** 60 days
- **unfilled:** unfilled
- **not measured:** not measured
- **pips unit:** pips

> EURUSD, 345 weekend and holiday breaks. A research finding, not investment advice.

- **n:** 345
- **median fill:** 11 min
- **Horizon:** 60 days
- **chart sample:** EURUSD n=345

**points**
0 · 65 · – · 95 · 98

- 0
  - **at:** 1
  - **value:** 10
- 1
  - **at:** 3
  - **value:** 85

- **unfilled:** 2

- **all:** 65
- **big:** 10

- **all:** 95
- **big:** 85

- **all:** 98

**Excursion before closing (≥5 pips)**
- **p50:** 21
- **p90:** 120
- **max:** 470

- **Excursion before closing (≥5 pips):** pips · log scale

<a id="method"></a>
<!-- section:method component:CorrectionLog kind:features anchor:#method-heading sources:messages:quantResearch.method -->

## how we avoid fooling ourselves.

_METHOD_

We logged every interim result that turned out wrong. Switch any entry between how it looked at first and what it actually was.

<https://oxarus.com/en/quant/research#method-heading>

- **Random lines broke less often than levels, so levels looked like 'magnets.'** · _CONTROL BIAS_
  The random lines sat farther from price. Once the control lines were built with the same distance distribution, the difference vanished.
- **Three months of data showed a clear dip at the third touch.** · _MULTIPLE COMPARISONS_
  Across seven years of data, it evaporated. Run enough comparisons, and some differences show up by chance.
- **One measurement came out with a 100% break rate.** · _SIGN BUG_
  When a rate sticks to 0 or 1, suspect the measuring machinery first. It was a single sign error.
- **An idea seemed to hold on one pair.** · _REPLICATION_
  We rebuilt the same test from scratch on another pair. Nothing that failed to hold on both counted as a finding.

#### Correction log

- **resolved:** resolved
- **count:** {fixed} / {total} resolved
- **schematic:** schematic
- **show traps:** Show first glance
- **show fixes:** Apply corrections

- **random:** random lines
- **matched:** matched lines
- **levels:** levels
- **distance:** distance to price

**touch rates**
41 · 40 · 39 · 42 · 44

- **3 months of data**
  7 years of data

- **bug: sign(dist):** 100
- **fixed:** 41
- **matched control:** 40
- **eur:** EUR 55
- **gbp:** GBP 54
- **start:** 0m
- **end:** 30m

_Interface labels:_ At first glance · Actually · open

<a id="cta"></a>
<!-- section:cta component:StudioCta kind:cta anchor:#cta sources:messages:quantResearch.cta -->

## let data answer your question.

_RESEARCH_

If you'd like us to run measurements or hypothesis tests on market data for your organization, or build its research infrastructure, get in touch.

<https://oxarus.com/en/quant/research#cta>

- [Send a research request](https://oxarus.com/en/contact?start=quant) → `start_project_brief(topic="quant")`
- [info@oxarus.com](mailto:info@oxarus.com?subject=Research%20request) → `contact(subject="Research request")`

## Actions

- [Institutional research](https://oxarus.com/en/quant/research#cta-heading) → `open_page(path="/quant/research", anchor="cta-heading")`
- [Findings](https://oxarus.com/en/quant/research#studies) → `open_page(path="/quant/research", anchor="studies")`
- [Send a research request](https://oxarus.com/en/contact?start=quant) → `start_project_brief(topic="quant")`
- [info@oxarus.com](mailto:info@oxarus.com?subject=Research%20request) → `contact(subject="Research request")`
- [Türkçe](https://oxarus.com/tr/quant/research) → `switch_locale(locale="tr", path="/quant/research")`

## Related pages

- [Oxarus Quant](https://oxarus.com/en/quant)
