MQL5におけるタイムギャップ分析(第2回):時間経過に伴う流動性分布のヒートマップ作成
第1回では、タイムギャップの概念と、それが機関投資家の取引活動とどのように関係しているかを考察しました。しかし、こうしたギャップを検出することは課題の半分に過ぎません。実際のトレードでは、価格がどこに長く滞在し、どこを素早く通過し、それらの領域がどのように相互作用しているかという、全体像を把握することが重要です。
そこで登場するのが、本記事で紹介するインジケータです。このツールは、目には見えない時間的なパターンを、直感的に理解できるヒートマップへと変換します。第1回では「異常(ギャップ)」の検出に焦点を当てましたが、今回は市場における通常の価格挙動全体の地図を構築します。
基本的な考え方は非常にシンプルです。価格帯全体を多数の細かなゾーン(マイクロゾーン)に分割し、それぞれのゾーンに価格がどれだけ長く滞在したかを集計します。滞在時間が長いほど、そのゾーンはより「熱く」なり、市場にとって重要度が高いと見なされます。最終的な結果は、低密度を示す赤から高密度を示す青までのカラーグラデーションで表示されます。
数学的基礎:カオスから秩序へ
市場は、需要と供給が絶えず競り合う場として捉えることができます。この攻防が最も激しい価格帯ほど、価格は長時間その周辺に留まる傾向があります。これを数学的に表現したものが、時間密度関数です。
T(p) = Σt_i, where the price is in the range [p-δ, p+δ]
ここで、pは解析対象となる価格レベル、δは解析ゾーンの幅、t_iは価格がこのゾーン内にある各期間の長さです。
しかし、生の滞在時間データだけでは比較が困難です。そのため、正規化によって、絶対値を相対的な割合へ変換します。これには、以下の式を使用します。
P(p) = ((T(p) - T_min) / (T_max - T_min)) × 99% + 1%
この計算式により、最も滞在時間が短い「冷たい」ゾーンは1%、最も滞在時間が長い「熱い」ゾーンは100%として表現されます。その他の価格帯は、それらの間に重要度に応じて比例配分されます。
ソリューションアーキテクチャ:信頼性を支えるモジュール設計
このようなインジケータを実装するには、堅牢なアーキテクチャ設計が欠かせません。中核となるのはPriceLevel構造体であり、各価格レベルに関する情報を一元管理します。
struct PriceLevel { double price; // Central price level double price_high; // Zone upper boundary double price_low; // Zone lower boundary long time_spent; // Accumulated time in bars double presence_percent; // Presence percentage color level_color; // Dynamic color string object_name; // Unique ID };
各価格レベルは独立した存在として振る舞い、滞在時間を累積する、滞在率を再計算する、表示色を更新するという一連のライフサイクルを持っています。つまり、単なるデータ構造ではなく、市場の生きた本質を表す存在なのです。
本インジケータの重要な工夫の一つが、スライディング分析ウィンドウの採用です。利用可能な全履歴を毎回解析すると、処理に数秒を要する場合があります。そこで、最新のMaxHistory本のバーのみを対象とし、その中をAnalysisPeriodのサイズで解析することで、常に最新の市場状況を反映できる、十分な処理速度を維持できるという二つの利点を実現しています。
アルゴリズム:数学を現実へ
処理の第一段階では、解析対象となる価格レンジを決定します。アルゴリズムは対象期間内の最高値と最安値を自動的に検出するため、どの銘柄であっても、そのボラティリティに応じた価格範囲を解析できます。
次に、この価格レンジを均等な価格ゾーンへ分割します。価格レベル数は動的に決定され、ティックサイズが指定されている場合はそれを使用し、指定されていない場合は銘柄の最小価格単位(Point)を使用します。同時に、システムは詳細度(最低50レベル)とパフォーマンス(最大1000レベル)のバランスを取ります。
最もリソースを消費する部分は、各レベルで費やされた時間をカウントする処理です。単純な方法では、各バーを各レベルと照合する必要があり、計算量はO(n²)になります。これをO(n×k)に最適化しました。ここで、kは1つのバーが影響を与える平均レベル数です。
// Optimization: find only relevant levels for each bar int startLevel = MathMax(0, (int)((lowPrice - minPrice) / realTickSize)); int endLevel = MathMin(totalPriceLevels - 1, (int)((highPrice - minPrice) / realTickSize) + 1); for(int levelIdx = startLevel; levelIdx <= endLevel; levelIdx++) { if(DoesBarTouchLevel(highPrice, lowPrice, levels[levelIdx])) { levels[levelIdx].time_spent++; } }
DoesBarTouchLevel関数は、バーのHigh-Low範囲と価格レベルの境界との交差を確認します。ロジックは単純です。バーの最大値がレベルの下限より上にあり、最小値がレベルの上限より下にある場合、重なりが存在します。
色の錬金術:数値を画像に変換する
時間の計算が完了すると、最も創造的な部分が始まります。それは、生データをカラースキームへ変換する処理です。ここでは、赤(1%)、オレンジ(25%)、黄(50%)、水色(75%)、青(100%)の5段階システムを採用しています。
主要なポイント間では滑らかな補間がおこなわれます。たとえば、存在率37%のレベルには、オレンジと黄色の中間色が割り当てられます。補間はRGB空間で実行されます。
color InterpolateColor(color color1, color color2, double factor) { // Decomposition into RGB components int r1 = (color1 >> 16) & 0xFF; int g1 = (color1 >> 8) & 0xFF; int b1 = color1 & 0xFF; // Linear interpolation of each channel int r = (int)(r1 + (r2 - r1) * factor); int g = (int)(g1 + (g2 - g1) * factor); int b = (int)(b1 + (b2 - b1) * factor); return (r << 16) | (g << 8) | b; }
その結果、市場の自然なヒートマップを形成する滑らかな色の変化が得られます。
可視化:アルゴリズムからチャートへ
各価格レベルは、チャート上の長方形として表示されます。数千個ものグラフィックオブジェクトを作成することは技術的に難しい処理であり、最適化が必要です。
長方形は分析開始時刻から現在時刻まで配置され、対象となる価格領域全体を覆います。各オブジェクトはバックグラウンドで動作するよう設定されています。つまり、チャート分析の邪魔をせず、クリックしても選択状態にならず、ズームレベルが変更された場合には自動的に再描画されます。
オブジェクト管理システムには、新しい描画をおこなう前に以前の結果を削除する仕組みが含まれています。これにより、チャート上に「ゴミ」が蓄積することを防ぎ、正確な可視化更新を保証します。
リアルタイム処理では、パフォーマンスが非常に重要です。このインジケータでは、複数段階の最適化がおこなわれています。
- 第1段階 - 遅延計算:再計算は新しいバーが出現した場合にのみ実行されます。システムは最後の更新時刻を追跡し、変化が発生した場合のみ計算を開始します。
- 第2段階 - メモリ最適化:データ配列は一度だけ確保され、その後再利用されます。データ構造は最小限のメモリ使用量になるよう設計されています。たとえば、カウンターにはdouble型ではなくlong型を使用し、不要なstring変数は避けています。
- 第3段階 - アルゴリズム最適化:スライディング分析ウィンドウによって処理対象データ量を制限します。また、適応型レベルグリッドによって、過剰な数のゾーンが作成されることを防ぎます。
結果の読み解き方:色が示すもの
赤色ゾーン(存在率1~25%)は、価格が素早く通過する領域を示します。これらは前回の記事で説明した潜在的なタイムギャップゾーンです。赤色ゾーンでは反発やフェイクブレイクが頻繁に発生するため、慎重なアプローチが必要です。
オレンジ色および黄色ゾーン(存在率25~75%)は、中程度の活動領域を表します。ここでは価格が一定時間滞在しますが、明確な優位性はありません。これらは移行ゾーンであり、市場状況によってサポートやレジスタンスになる可能性があります。トレンドフォロー型の取引が効果を発揮しやすいゾーンでもあります。
青色および水色ゾーン(存在率75~100%)は、この分析の中心となる領域です。ここでは価格が大部分の時間を過ごしており、高い取引活動を示しています。これらのレベルには強い磁力があります。価格は頻繁にここへ戻り、動きの下支えや突破すべき障壁として利用します。
最も効果的な戦略の1つは、青色ゾーンでの反発を狙うトレードです。価格が最大滞在領域へ近づくと、反転する可能性は平均より大幅に高くなります。これは特にレンジ相場で有効であり、青色ゾーンがチャネルの境界を明確に示します。
黄色のゾーンを突破する動きは、継続的な値動きを示すことが多くあります。価格が十分な出来高を伴って中程度の存在感を持つエリアを容易に通過する場合、前方に大きな抵抗が存在しないことを示しています。
反転セットアップは、赤色のゾーンで特に有効になることが多いです。
出来高分析と組み合わせることで、シグナルの精度は大きく向上します。青色のゾーンと出来高プロファイル上の高出来高エリアが時間的に一致すると、最大級の重要性を持つゾーンが形成されます。
異なる市場へのカスタマイズ:適応による汎用性
高い流動性を持つFX市場では、より大きなAnalysisPeriod(300~500バー)およびMaxHistory(5000~8000バー)の値が必要になります。FXの値動きは比較的滑らかであるため、重要なエリアを特定するには、より深い分析期間が求められます。
株式市場では、中程度の設定が効果的に機能する傾向があります。AnalysisPeriodは200~300バー、MaxHistoryは3000~5000バーが適しています。セッション構造によって自然な休止局面が生まれ、それらがヒートマップ上によく反映されます。
TickSize(ティックサイズ)は、正しく動作させるために非常に重要です。この値を低く設定しすぎると、実用性のない過剰な細部が表示されます。一方、高く設定しすぎると重要なニュアンスを見逃すことになります。通常は0(自動モード)が最適です。システムが金融商品の特性に基づいて、自動的に適切なサイズを選択します。
Transparency(透明度)は、視覚的な見やすさだけでなく、パフォーマンスにも影響します。高い値(70~90%)に設定すると、ローソク足分析を邪魔しない半透明のマップになりますが、その分、描画処理に多くのリソースを必要とします。
1000レベルという上限は、理由なく設定されているものではありません。MetaTrader 5にはグラフィックオブジェクト数に制限があり、必要以上に増やすと分析品質を大きく向上させることなく、インターフェースの動作速度低下につながります。
他のツールとの統合:手法同士の相乗効果
ヒートマップインジケータは、ボリュームプロファイルとの組み合わせで特に高い効果を発揮します。青色の時間ゾーンと出来高ピークが一致すると、非常に重要度の高いエリアが形成されます。このようなゾーンは、長期的な価格変動における重要なポイントになることが多いです。
フィボナッチレベルとの組み合わせでも興味深い結果が得られます。重要なフィボナッチレベルがヒートマップの青色ゾーン内に存在する場合、その重要性は何倍にも高まります。これは自然な現象です。数学的なレベルが、実際の市場参加者の価格行動によって裏付けられるためです。
ボリンジャーバンドなどのボラティリティ指標も、ヒートマップとの相性が良いです。赤色ゾーンでのバンド拡大は強い値動きの前兆となることが多く、青色ゾーンでのバンド収縮は、将来的なブレイクアウトに向けたエネルギー蓄積を示します。
次期バージョンのインジケータでは、特定の金融商品に対してパラメータを自動最適化するための機械学習機能の導入が予定されています。アルゴリズムはレベルの有効性に関する統計を分析し、最大効率を得るために設定を調整します。
アラートシステムとの統合により、価格が重要ゾーンへ接近した際に通知を受け取ることが可能になります。これは、常時チャートを見ていられないスイングトレーダーにとって特に有用です。
データを外部システムへエクスポートする機能により、ヒートマップを利用した自動売買ロボットの開発が可能になります。ロボットは、レベルの強さをポジションエントリーの追加フィルターとして利用できます。
手法の哲学:時間は市場の通貨である
このインジケータは、「時間こそが市場の通貨である」という深い考え方に基づいています。トレーダーは、お金を使うのと同じように時間を使っています。ある価格レベルに長く滞在するほど、そこにはより多くの感情、意思決定、そして資金が関係しています。

この感情的な結びつきが、市場記憶を形成します。価格が重要なレベルから離れたとしても、その記憶は市場参加者の潜在意識に残ります。そのレベルへ再び戻ってきたとき、過去の記憶が呼び起こされます。ある人にとっては利益の記憶であり、別の人にとっては損失の記憶です。これらの記憶が、新たなトレード判断に影響を与えます。
時間のヒートマップは、この目に見えない市場記憶を可視化します。市場心理を数学へ、感情をアルゴリズムへ、直感をデータへ変換するのです。
結論:古くからある真実への新しい視点
このインジケータは、新しい原理を発見するものではありません。古くから存在する原則を、より明確にするものです。サポートとレジスタンスのレベルは、これまでも常に存在していました。しかし現在では、それらを重要度によって測定し、順位付けすることが可能になりました。ヒートマップは、市場がどこで時間を費やしているのかを示します。そして、そこに市場の本当の強さが存在します。時間ギャップインジケータと組み合わせることで、主要参加者の行動を包括的に理解できます。どこで素早く行動し、どこで長く滞在しているのかを把握できます。これら2つのツールを組み合わせることで、市場構造をより深く理解し、直感ではなく論理に基づいた判断を下すことが可能になります。
次回は、これらすべてを1つのトレードシステムとして統合する方法について解説します。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/18661
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
市場シミュレーション:MQL5におけるSQL入門(IV)
時間帯別・曜日別・月の日付別の季節性インジケータ
初級から中級まで:オブジェクトイベント(I)
初級から中級まで:オブジェクト(IV)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
ふと思い出した:ずいぶん昔、こんなことをやったことがあった。
私の見解では、あなたのものはほんの少しだけ未完成です――規則的な構造を明らかにする(あるいはそれが存在しないことを示す)ことが残っています。
もちろんこれはヒートマップではありません。単に、このような温度分布図の規則的な部分における極値を出力しただけです。
ちなみに、このマップは最も手間がかかり、ミスが生じやすい方法で計算されています。
もっと簡単に作成できます。各ローソク足について、コレクションに2組の{price,weight}を格納します:{ price=high, weight=-1; } { price=low, weight=+1; }。コレクションを price でソートし、weight による累積和がヒートマップ となります。その後は、お好みの方法で量子化を行ってください。