今日のネタはORB(Opening Range Breakout)です。
先日ORBの投稿を見たのでブログネタにしようかなと。
ORBとは
簡単に言うと、市場始まり(Open)の5分~1時間の高安(Range)を抜けたら(Breakout)順張りする戦略です。おそらく本として最初に世に出したのはToby Cabelの『Day Trading With Short Term Price Patterns and Opening Range Breakout』。
昔はアホみたいに勝てたけど、当然エッジは減衰・消失するもの(そしてどこかで新たなエッジが生まれる)なので、一部銘柄では今でも通用します。それをポストしていたのが冒頭のXのポストですね。
バックテスト
NQ

NASDAQ(CFD)

📝 概要
今回紹介するのは、ORBに VWAP(当日出来高加重移動平均)フィルター を組み合わせたTradingView用のPine Script戦略です。
対象はNASDAQ先物(NQ)かCFD。米国東部時間(ET)ベースで動作します。
エントリーは1日1回ずつ(ロング・ショート各1回上限)。終値ベースで判定するので、スキャルピングというよりはデイトレのポジション管理に近いイメージ。
🎯 作成の意図
ORBは「シンプルで再現性が高い」というのが最大の魅力です。でも、ただブレイクしたら入るだけだと、フェイクブレイクや薄商いの時間帯でのノイズ をモロに食らう。
そこでXのポスト主が追加したのがVWAPとの組み合わせです。VWAPは「その日の平均コスト」を示すラインで、これを価格が上か下かで大まかな需給バランスが分かります。
ORBブレイクとVWAPの位置関係を組み合わせることで、「本物のブレイクかどうか」をひと手間フィルタリング できる、というのが設計の核心と思われる。
さらに一歩進めて、実際の裁量トレードで気になるパターン(「ORBを割った後に反発してきた」=フェイクブレイク)も取り込める設計にしました。パラメーターで3種類のエントリーパターンを切り替えられるので、バックテストで有効なモードを探しやすくなっています。
📘 コード(戦略部分)の解説
1. オープニングレンジの形成
if in_orb_window
orb_hi := na(orb_hi) ? high : math.max(orb_hi, high)
orb_lo := na(orb_lo) ? low : math.min(orb_lo, low)
in_orb_window は入力した分数(15/30/60分)に応じて自動でセッション文字列を切り替えます。
毎日セッション開始時にリセットされ、その日の最初N分間の高値・安値を蓄積していきます。
ORBが形成済み(orb_formed)かつウィンドウ終了後 = エントリー待機状態に移行。
2. VWAPとの位置関係の記録
if in_trade_hours and not orb_hi_broken and not first_long_orb_break and close > vwap_val
vwap_above_before_orb := true
ORBブレイクが起きる前の時点で、終値がVWAPの上にいたかどうかをフラグで記録しておく。
これが後で「どのパターンで入るか」の判断に使います。
3. 3種類のエントリーパターン
| パターン | 名前 | 条件 |
|---|---|---|
| A | ORB First | ORBブレイク後、VWAPを越えたタイミングで入る |
| B | Simultaneous | ORBブレイクと同時にVWAPも超えている(VWAPへの先行はなし) |
| C | VWAP First | 先にVWAPを越えてから、ORBブレイクで入る |
long_orb_first = can_long and orb_hi_broken and not first_long_orb_break
and close > orb_hi
and close > vwap_val and close[1] <= vwap_val[1]
and fake_long_ok
パターンAは「ORBを抜けた後、まだORBの外にいる状態でVWAPを越えた瞬間」。
「ブレイクが本物だと確認できてから乗る」という遅め・安全寄りのアプローチ。
long_simul = can_long and first_long_orb_break
and close > vwap_val and not vwap_above_before_orb
and fake_long_ok
パターンBは「ORBブレイクと同時にVWAPも突き抜けた瞬間」を狙う。レンジ形成中にVWAPが上にいなかった(勢いがフレッシュ)ことも条件。
long_vwap_first = can_long and first_long_orb_break
and close > vwap_val and vwap_above_before_orb
and fake_long_ok
パターンCは「先にVWAPを越えて上昇バイアスが出ていた状態で、ORBもブレイクされた瞬間」。最も強い確証を求めるパターン。
入力の Entry Mode を "All" にすると3パターン全てのシグナルをORで合成します。
4. 逆方向ブレイクブロック & フェイクブレイク
long_blocked = i_opposite_block and not i_fake_break and orb_lo_broken
short_blocked = i_opposite_block and not i_fake_break and orb_hi_broken
逆方向ブレイクブロック をONにすると、「ショート方向にORBを割った後はロングエントリーをしない」という制御が入ります。
一方、Fake Break をONにすると、逆に「一度逆側を割ってから反転してきたケース」を拾える。両方ONにすると、フェイクブレイクシグナルのみが有効になる。
5. エグジットロジック
if strategy.position_size > 0
if is_eod
strategy.close("Long", comment="EOD")
else if close < vwap_val
strategy.close("Long", comment="<VWAP")
else if close < orb_hi
strategy.close("Long", comment="<ORB")
優先順位は以下の3段階:
- EOD(15:50 ET) — 問答無用でクローズ。オーバーナイトしない
- VWAP割れ — モメンタム喪失のサイン
- ORBレンジ内に戻る — ブレイクが無効化されたと判断
TP/SLはオプションで追加でき、上記のクローズロジックと並列で動作します。
🚀 ワン モア ステップ
戦略の骨格はシンプルだが、実運用に向けてもう一歩踏み込みたいところが3点ある。
① エントリーモードの最適化
3パターン(ORB First / Simultaneous / VWAP First)のうち、どれが最も有効かは銘柄、時期・時間足・相場環境によって変わる。バックテストでは Entry Mode を切り替えながら比較し、過学習に注意しつつ有効なパターンを絞り込むのが良き。
② ORBレンジ幅によるフィルタリング
レンジが極端に狭い(= ボラが低い)日はブレイクの値幅も小さく、コスト負けしやすい。orb_hi - orb_lo をATRや固定ポイントと比較して、最低限のレンジ幅がある日だけトレードするフィルターを追加すると精度が上がりやすい(はず)。
コアメンバー向けソース
こちらからどうぞ。

コメント