プライスアクション分析ツールキットの開発(第56回):CPIを用いたセッションの受容と拒否の解読
内容
はじめに
取引セッションは、市場に長期的な構造的痕跡を残します。セッション内で価格が形成されるにつれて、その高値と安値は、将来の価格行動が参照しなければならない基準的な境界となります。これらの過去のレベルに価格が接触した際のローソク足の動きは、市場が新しいレンジの極値を受容しているのか、それとも拒否しているのかを明らかにします。以前、単なるローソク足の色以上に、内在する買いと売りの圧力を定量化するためにCandle Pressure Index (CPI)を紹介しました。価格が過去のセッション境界へ戻るときの重要な問いは「受容か拒否か」であり、CPIはその判断を客観的に支援します。
本記事では、この考え方をセッションに基づいた文脈へと拡張します。目的は、確立されたセッションの境界に接触したローソク足が、強気または弱気の圧力を帯びているかどうかをCPIによって検証することです。これにより、セッションレベルはチャート上の静的なラインとしてではなく、内在する価格圧力によって市場がより高い価格を受容しているのか、それとも拒否しているのかが決定される領域として扱われます。その結果、真の受容と拒否の挙動が可視化され、裁量取引判断に対してより客観的な文脈が提供されます。
前の記事の振り返り
前回の記事では、Candle Pressure Index (CPI)を紹介しました。CPIは簡単に言えば、各確定足に内在する買い圧力または売り圧力を定量化したものです。この圧力は、ローソク足の形成過程における価格の動きを反映しており、単なるローソク足の色だけでは捉えられない情報を示します。本記事での議論を整理し直すために、内容を2つの部分に分けて整理します。第一にCPIそのものの概念の振り返り、第二にCPIインジケーターのテスト結果から得られた成果の再確認です。これらを簡潔に整理した上で、本記事ではさらに分析を拡張します。
CPIのコンセプトサッカーの試合を見たことがあるなら、試合に勝ったチームが必ずしも内容的に優れているとは限らないことに気づくはずです。チームがボール支配率で優位に立ち、多くのチャンスを作り、継続的に圧力をかけていたとしても、最終的に試合に敗れることがあります。多くの人が覚えているのは最終スコアで、試合展開の全体像はしばしば見えにくくなります。ローソク足も同様です。多くのトレーダーはローソク足の色だけを見て判断を終えてしまいますが、CPIはその内部に存在する圧力を可視化し、価格の色だけでは表現できない情報を明らかにします。
CPIは、ローソク足の高値、安値、終値から計算され、以下の式で定義されます。

テスト結果
インジケーターの開発が完了した後にテストをおこない、以下の結果が得られました。

戦略コンセプト
市場の記憶としてのセッション構造
取引セッションが終了することは、市場参加の一定の段階が完結したということです。その期間中、価格はレンジを探索し、流動性をテストし、最終的には買い手と売り手が一時的な合意に達した水準でクローズします。セッションの高値と安値は単なる極値ではなく、その意思決定プロセスの外側の境界を表しています。
一度確立されると、これらの境界は市場に記憶として残ります。価格が過去のセッション高値または安値に再び接近する際、それはランダムな水準に触れているのではなく、過去に不均衡、吸収、そして解決が生じたゾーンに戻っているということです。その結果、セッションの高値と安値は持続的なサポートおよびレジスタンスとして機能し、市場が過去の合意を再評価する基準点となります。
セッションレベルでの受容と拒否
価格が過去のセッション境界に戻ると、市場は「受容」または「拒否」の2つの結果のいずれかに直面します。受容とは、価格がそのレベルを超えて推移し、その上または下で保たれる状態を指し、参加者が前回のセッションレンジ外でも取引する意思を持っていることを示します。一方、拒否とは、価格がそのレベルをテストするものの、その外側で圧力を維持できず、再び以前のレンジ内へ回帰する状態を指します。
例えば、過去のセッション高値が1.1000にあるとします。価格がこの水準に戻った場合、
- 受容:強いポジティブなCPIを伴い、終値で上方に保たれる場合
- 拒否:一時的に上抜けするが、CPIがネガティブへ転換し、終値がレンジ内へ戻る場合
これらは単なるヒゲやローソク足の色ではなく、ローソク足のレンジ内での終値の位置によって判断されます。以下の図は、価格が過去のセッション境界に到達した際に生じる意思決定プロセスを示しており、受容または拒否は初動の試しではなく、その水準における挙動によって決定されることを強調しています。

これらの結果は単一のティックやヒゲによって定義されるものではありません。終値に至るまでの価格の振る舞いが重要です。終値は参加の強さを示します。セッションレベルを超えた動きが終値まで維持されない場合、十分な確認とは言えません。一方、その水準を超えたまま終値が保たれる場合は、持続的な参加を示します。
セッション境界におけるローソク足の色の限界
重要なセッションレベルでは、ローソク足の色だけに依存すると、不完全または誤解を招くシグナルとなる場合があります。たとえば、あるローソク足が始値より上でクローズし、一見強気に見えたとしても、高値から押し戻されてレンジ内の弱い位置で終わっていることがあります。この場合、色は強さを示唆しますが、内部の挙動は躊躇や吸収を示しています。
逆に、陰線であっても終値が高値付近に位置する場合、売り圧力が優勢であったのではなく、吸収された可能性があります。このような矛盾は、流動性が集中し、対抗注文がぶつかるセッション高値や安値付近で特に多く見られます。そのため、これらの水準においてローソク足の色だけに依存することは、市場の意図を誤って解釈する原因となります。
セッション検証レイヤーとしてのCPI
CPIは、この問題に対処するために、単なる色ではなく、ローソク足のレンジ内での終値の位置を評価します。内在する買いと売りの圧力を測定することで、どちらの側が主導権を持っていたのか、あるいは均衡状態だったのかを示します。
セッションの高値と安値は構造的な文脈を提供し、CPIはその構造に対する価格の反応の質を評価します。セッション高値を上抜けし、かつ強いポジティブCPIを伴う場合、それは受容を示します。すなわち、買い圧力が終値まで維持されたことを意味します。対照的に、CPIが弱いまたはマイナスの状態でのブレイクは、十分な確信が伴っておらず、反発される可能性が高いことを示します。同様のロジックはセッション安値にも適用されます。
圧力の解釈
このフレームワークは、セッションレベルにおける価格の挙動を観察し、その反応を内部圧力の指標で評価します。 分析は反応的かつ観察可能な事実に基づいたものとなり、推測的な前提に依存することを避けます。
CPIは、現在の相互作用の質を分類します。その結果、意味のある受容と表面的なブレイク、真の拒否と一時的な停滞を区別することが可能になります。
アプローチの範囲と意図
本手法はセッションレベルを解釈するためのフレームワークです。セッション構造とCPIを組み合わせることで、価格がそのレベルを受容しているのか拒否しているのかを、ローソク足のレンジ内での終値の挙動に基づいて評価します。次のセクションでは、このロジックをMQL5でどのように実装するか、確定足の評価とセッション単位の計算を通じて示します。

この例は、セッション構造が文脈を提供し、境界におけるローソク足の挙動が、その水準が受容されたのか拒否されたのかを決定することを改めて示しています。
MQL5での実装
MQL5での実装は、CPIのセッション概念を、確定足に基づく分析ツールとして具体化したものです。東京、ロンドン、ニューヨークの各セッションを矩形で描画し、セッション境界におけるブレイクアウトの受容および拒否をCPIデータを用いて分類します。目的は一貫性にあり、過去データの再構築とライブ運用の両方において同一のロジックが適用されるよう設計されています。すべての分類は、確定足のみに基づいて実行されます。
内部的には、この実装は主に3つのタスクで構成されています。すなわち、ブローカー(サーバー)時間でのセッションウィンドウの構築、確定足からのセッションレンジのサンプリング、そしてセッション境界における2本のローソク足モデルを用いたCPI確認付きの相互作用の評価です。
セッション設定と状態管理
セッションは、ブローカー(サーバー)時間に基づくHH:MM形式の入力文字列で設定されます。この方法により、ローカルマシンの時間に依存することなく、ブローカー間での移植性が確保されます。各セッションはSessionState構造体によって表現され、セッション名、設定された時間ウィンドウ、正しい取引日に紐づけられたstartDTおよびendDT、セッション矩形描画のための高値・安値、そして同一境界での重複分類を防ぐための2つの制御フラグ(doneHighSide、doneLowSide)を保持します。3つのインスタンス(g_sess[3])が生成され、東京、ロンドン、ニューヨークが共通ロジックのもとで同様に動作するよう更新されます。
struct SessionState { string name; string startHHMM; string endHHMM; color rectColor; datetime anchorMidnight; datetime startDT; datetime endDT; bool active; double high; double low; bool doneHighSide; bool doneLowSide; }; SessionState g_sess[3];
セッション境界と日付またぎの処理
セッション境界はBuildSessionBounds()関数によって構築されます。この関数はHH:MM入力を解析し、anchorMidnightを基準としてstartDTおよびendDTを算出します。開始時刻が終了時刻より後になる、いわゆる日付またぎのセッションについても明示的に処理され、セッションウィンドウが複数日にまたがる場合でも正しく維持されます。
void BuildSessionBounds(const string startHHMM, const string endHHMM, datetime now, datetime &sessStart, datetime &sessEnd, datetime &anchorMidnight) { // Parses HH:MM, anchors to midnight, // handles sessions that cross midnight }
さらに、この関数は現在時刻に対して最も適切なセッションを選択し、単なる暦日ではなく、意図された取引日に基づいた整合性を確保します。
セッション所属ロジック(Datetimeフィルタリング)
実装では、セッションウィンドウをバーインデックス範囲にマッピングする方法は採用していません。代わりに、セッション境界はdatetime値(startDT、endDT)として保持され、各ローソク足の開始時刻(iTime)をセッションウィンドウと比較することで所属が判定されます。
datetime t1 = iTime(_Symbol, _Period, 1); if(t1 >= s.startDT && t1 <= s.endDT) { double h1 = iHigh(_Symbol, _Period, 1); double l1 = iLow(_Symbol, _Period, 1); if(h1 > s.high) s.high = h1; if(l1 < s.low) s.low = l1; }
ライブ運用では、UpdateOneSessionLive()が直近で確定したローソク足(bar[1])を確認し、そのタイムスタンプが[startDT, endDT]内にある場合のみセッションレンジを更新します。履歴再構築では、UpdateOneSessionAtShift()が任意のバーシフトを用いて同様の処理をおこないます。すべてのローソク足は絶対的なタイムスタンプを持つため、このdatetimeに基づいた手法はすべての時間足において一貫した挙動を示します。
視覚用レンジと分析用レンジ
実装では、セッションレンジを2種類に分けて管理します。
ObjectCreate(0, name, OBJ_RECTANGLE, 0, s.startDT, s.high, s.endDT, s.low); ObjectSetInteger(0, name, OBJPROP_FILL, true); ObjectSetInteger(0, name, OBJPROP_COLOR, ColorToARGB(s.rectColor, InpRectTransparency));
- 矩形レンジ(s.high、s.low)はローソク足処理に応じて逐次更新され、OBJ_RECTANGLEによる視覚的なセッション描画のみに使用されます。これらの矩形はチャート上に保持され、名前にはanchorMidnightが含まれますが、完了済みセッションレンジを別途保存するデータ構造は存在しません。
- 一方、分析用レンジはSessionRangeFromShift()によって必要時に計算されます。この関数は指定されたstartShift以降のローソク足を走査し、タイムスタンプがセッションウィンドウ内にあるもののみを対象とします。この分離により、評価対象のローソク足が比較対象のセッションレベルに影響を与えないように設計されています。
CPI計算とノイズゲート
CPIはCalcCPI(high, low, close)によって計算され、-1から+1の範囲に正規化されます。また、一定の最小値(InpMinRangePoints)未満の値幅しか持たないローソク足は除外され、低ボラティリティによる誤判定を防ぎます。
bool SessionRangeFromShift(const SessionState &s, int startShift, double &outHigh, double &outLow) { for(int sh = startShift; sh < Bars(_Symbol,_Period); sh++) { datetime tt = iTime(_Symbol,_Period, sh); if(tt < s.startDT) break; if(tt > s.endDT) continue; outHigh = MathMax(outHigh, iHigh(_Symbol,_Period, sh)); outLow = MathMin(outLow, iLow(_Symbol,_Period, sh)); } return true; }
CPIは確定足のみに適用され、評価には2本のローソク足が使用されます。sh1が新しい確認用ローソク足、sh2 (sh1+1)が文脈を提供する古いローソク足です。
シグナル評価モデル(2本ローソク足)
すべての分類はEvaluateSignalsCore()内で、統一された2本ローソク足モデルを用いて実行されます。古いローソク足(sh2)はブレイク条件の確立やCPIの前提状態を提供し、新しいローソク足(sh1)はリテストや戻りによる確認を担います。
int sh1 = 1; // confirmation candle int sh2 = sh1 + 1; // context / break candle double cpi1 = CalcCPI(h1, l1, c1); double cpi2 = CalcCPI(h2, l2, c2);
このモデルは、実運用(sh1 = bar[1]の場合)と履歴再構築(sh1が任意の過去シフトに設定される場合)の両方で使用されており、両モードにおいて同一のロジックが適用されることにより、一貫した挙動が保証されます。
ブレイクアウト受容の条件
ブレイクアウトの受容は2本のローソク足の連続によって確認されます。ブレイク用ローソク足(sh2)は、該当するセッション境界を超えて確定し、かつ一定以上のCPI強度を持つ必要があります。その後、確認用ローソク足(sh1)は境界付近を再テストし、再びその外側で確定する必要があります。
double hiBrk, loBrk; SessionRangeFromShift(s, sh1 + 2, hiBrk, loBrk); bool bullBreak = (c2 > hiBrk + tol) && (cpi2 >= InpStrongThreshold) && RetestTouchesFromAbove(l1, hiBrk, touchTol) && (c1 > hiBrk);
ブレイク基準レベル(hiBrkまたはloBrk)はstartShift = sh1 + 2を使用してSessionRangeFromShift()により算出され、ブレイクおよび確認ローソク足が計算に含まれないよう設計されています。これで、ブレイクおよび確認の両ローソク足は、そのレベルを定義するために使用されるレンジから除外されます。これによって、ブレイクアウトのシーケンス自体が、そのブレイク対象である境界に影響を与えないことが保証されます。
拒否条件と閾値ロジック
拒否は、確認用ローソク足(sh1)がセッション境界の外側に到達した後、再び内側で確定する場合に分類されます。セッション高値では上抜け後に下で確定する(弱気の拒否)必要があり、セッション安値では下抜け後に上で確定する(強気の拒否)必要があります。
bool bearRejAtHigh =
(h1 > hiRev + tol) &&
(c1 < hiRev) &&
(cpi1 <= -InpStrongThreshold) &&
(cpi2 >= -InpNeutralBand) &&
PassWickHigh(o1,h1,l1,c1);
CPIの判定には「閾値反転モデル」が用いられます。たとえば弱気拒否では、sh1が強いネガティブCPIを示し、sh2は強いネガティブであってはなりません。強気拒否の場合はその逆です。必要に応じてヒゲ長フィルターを有効化し、曖昧なブレイクを除外することも可能です。ヒゲフィルターは任意で有効化することができ、一定の最小ヒゲ長を要求することで、浅いブレイクや曖昧なプローブによる誤検出を減らします。
拒否の参照レベル(hiRev / loRev)は、startShift = sh1 + 1を用いて算出され、確認用ローソク足は除外されますが、確立されたセッション構造は維持されます。
セッションごとの分類制限
同一の境界に対して重複したマーキングを防ぐために、片側につき一度のみ分類をおこなうルールをInpOncePerSessionPerSideによって有効化できます。有効な場合、doneHighSideはセッション高値での再分類を抑制し、doneLowSideはセッション安値での再分類を抑制します。これらのフラグは、セッションが新しいアンカーウィンドウへ移行すると自動的にリセットされます。
if(InpOncePerSessionPerSide) { if(s.doneHighSide) bearRejAtHigh = false; if(s.doneLowSide) bullRejAtLow = false; }
ビジュアル出力レイヤー
ビジュアルレイヤーは、実行のためではなく解釈のために設計されています。セッション矩形はOBJ_RECTANGLEを用いて描画され、色および透明度は設定可能です。ブレイクアウトまたは拒否が確定した場合、シグナルの矢印は確認用ローソク足(sh1)上に配置されます。また、CPIのミニマーカーもsh1上に描画され、圧力の大きさと方向を可視化します。マーカーの高さは強度を表し、色は強気/弱気の強さを示します。
DrawArrow(t1, h1 + 10*_Point, false, s.name+"_REJH"); DrawCPIMarkerOnBar(t1, h1, l1, cpi1, s.name+"_CPI");
すべての視覚要素は確定足のみに基づいて生成され、ティックごとに再計算されることはありません。その結果、決定論的な描画が保証されます。
履歴再構築 vs 実運用
チャートに適用された場合、このツールはEvaluateHistoryLookback()を用いて制限付きで履歴を再構築できます。これは古いバーから新しいバーへと遡って処理し、セッション矩形の再構築とイベント分類をアラートなしで実施します。
if(bar0 != g_lastBarTime) { g_lastBarTime = bar0; for(int i=0;i<3;i++) EvaluateSignalsForSessionLive(g_sess[i]); }
実運用では、セッションの追跡は最新の確定ローソク足を用いて更新され、シグナルの分類は新しいバーが形成されたときのみ実行されます。これによって、評価ロジックは履歴上の挙動と完全に一致し、すべてのモードにおいて「確定足あたり一回の評価」という一貫性が維持されます。
EvaluateHistoryLookback(); // no alerts
テストと結果
テストは、構造的正確性、タイミングの厳密性、および分類ロジックの挙動が完全に一致していることを評価する目的で、MetaTrader 5のストラテジーテスターのビジュアルモードを用いて実施されました。テストの目的は取引成果の評価ではなく、分析的な検証にあります。同一の実装、パラメータ、およびセッション定義が一切変更されることなく使用されました。
異なる市場環境における堅牢性を検証するため、比較的安定したFX環境であるEURUSDと、より高ボラティリティでセッション駆動の値動きが顕著なXAUUSD(ゴールド)でテストが実施されました。
セッション構築と安定性
両銘柄において、東京、ロンドン、ニューヨークの各セッションウィンドウは順次形成され、ブローカー時間に正しく整合しました。セッション矩形は各セッションが有効な間のみ拡張され、セッションが進行した後は安定した状態で維持されました。ローソク足が確定した後に境界が変更されることはありませんでした。この挙動は履歴再構築およびライブテスター再生の両方で一貫して確認され、セッションの所属判定が絶対的なローソク足タイムスタンプに基づいておこなわれていること、またレンジ構築が確定足の制約を尊重していることが検証されました。

上図:EURUSD H1でのストラテジーテスター
セッション境界での受容と拒否
EURUSDでは、セッション境界での相互作用は比較的整然としていました。ブレイクアウトの受容は明確な2本構造に従い、CPIに支えられたブレイクローソク足の後に、境界を再テストし維持する確認ローソク足が続く形で発生しました。拒否ケースでは、セッションレベルを一時的に超えた後、レンジ内へ明確にクローズバックする動きが見られ、多くの場合CPIの閾値反転が伴っていました。
XAUUSDでは同一ロジックがより高いボラティリティ環境下でも維持されました。セッション境界はより頻繁かつ強く試されましたが、分類結果は制御されており、重複は発生しませんでした。ノイズゲートおよびCPI閾値により、小さな変動は除外され、構造的に意味のある相互作用のみがマーキングされました。
特に「セッションごと片側一回」制約は高ボラティリティ環境で有効に機能し、境界の高速なテスト中における重複分類を防止しました。

上図:XAUUSD H1のテスト
視覚的解釈と分析的価値
セッション矩形は時間軸に基づく構造的文脈を提供し、矢印はセッション境界での分類済みの相互作用を示しました。CPIミニマーカーは確認足上に圧力の情報を直接付加し、ローソク足の色に依存することなく受容と拒否を区別することを可能にしました。
EURUSDでは明確で教育的なパターンが形成されました。XAUUSDでは、同じ視覚的な分析手法によって、広い日中レンジ内での意図が明確になり、単なるボラティリティと方向性のある動きを区別できるようになりました。
結論
本記事では、セッション構造とローソク足レベルの圧力を組み合わせることで、主要な市場境界における受容と拒否をどのように解釈できるかを考察しました。各取引セッションをそれぞれ独立した進行フェーズとして扱い、その中で形成されるレンジに着目することで、セッション高値と安値は固定的なラインとしてではなく、価格の挙動と内部圧力を通じて意味が明確になる文脈的な意思決定領域として捉えられます。
CPIは、その挙動を評価するための実用的な視点を提供します。単なるローソク足の色やサイズではなく、CPIはセッション境界での相互作用が持続的な買い圧力または売り圧力に支えられているのか、それとも失敗しやすい弱い試しに過ぎないのかを明らかにします。これを確定足ロジックおよび2本ローソク足の確認モデルと組み合わせることで、裁量的ルールを導入することなく、継続と拒否を区別することが可能になります。MQL5の実装には、このフレームワークが異なる銘柄やボラティリティ環境においても安定して機能することを示しました。EURUSDおよびXAUUSDの両方におけるテストでは、確定足のみに基づく場合でも、一貫したセッション構築、CPI評価、および分類挙動が確認されました。両モードは一致した結果を示し、このアプローチの分析的信頼性を裏付けています。
このフレームワークは、単独で完結するトレーディングシステムとしてではなく、純粋に分析ツールとして提示されています。その価値は明確性にあります。時間に基づくセッション構造と圧力に基づくローソク足評価を組み合わせることで、セッションレベルにおける価格挙動を、他の市場分析手法と並行して観察、研究、文脈化するための体系的な方法を提供します。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20995
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
ラリー・ウィリアムズの『市場の秘密』(第8回):ボラティリティ、ストラクチャー、時間フィルターの組み合わせ
共和分株式による統計的裁定取引(第10回):構造変化の検出
MQL5取引ツール(第12回):相関行列ダッシュボードのインタラクティブ機能の強化
MQL5取引ツール(第11回):ヒートマップおよび標準モード対応相関行列ダッシュボード(ピアソン、スピアマン、ケンドール)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索