English
preview
プライスアクション分析ツールキットの開発(第51回):ローソク足パターン発見のための革新的なチャート検索技術

プライスアクション分析ツールキットの開発(第51回):ローソク足パターン発見のための革新的なチャート検索技術

MetaTrader 5 |
30 0
Christian Benjamin
Christian Benjamin

はじめに

ローソク足パターンは、最も視覚的に直感的なテクニカル分析ツールのひとつとして、長年にわたり活用されてきました。これらは買い手と売り手の力関係を明確に映し出し、市場心理や勢いの動きを分かりやすく記録します。トレーダーも開発者も、このテーマに何度も立ち返ります。それは、ローソク足が多くの点で、プライスアクションの「真の足跡」であるからです。ローソク足は、市場がどこに向かっているのかを示す手がかりとなることが多く、過去に市場で何が起こったのかを反映します。各ローソク足の形成は、特定の価格帯と時間における出来事を物語っており、長年にわたり研究、命名、分類されてきました。それぞれのパターンには独自の予測的な意味があり、たとえば「陽の包み足」は、買いの勢いが再び強まる初期のサインとしてよく知られています。  

MQL5開発におけるローソク足分析への関心が持続しているのは、市場での実践的な経験が背景にあります。リアルタイムで価格の動きを観察すればするほど、多くの課題が明らかになり、それに伴いスマートな解決策を生み出す機会も増えていきます。MQL5は、このような創造性を形にするための非常に豊かな環境です。その柔軟性により、テクニカルなアイデアを、チャートを自動で解析し視覚的に表示する完全なツールへと進化させることができます。

本記事では、従来のローソク足パターン分析を自動化かつインタラクティブに拡張するエキスパートアドバイザー(EA)、CandlePatternSearch.mq5を紹介します。このシステムは、一般的なパターンを幅広くスキャンおよび検出し、特定のパターンをチャート上で直接検索することが可能です。検出されたパターンは視覚的にマークされるため、異なる銘柄や時間軸において、各パターンが価格にどのような影響を与えたかを簡単に確認できます。この機能を長期的に活用することで、トレーダーは市場で繰り返し現れる行動パターンを認識でき、特定のパターンが出現した際に予想される結果をより自信を持って判断できるようになります。 

  

次のセクションでは、「機能の概要」「技術アーキテクチャ」「テストと結果」、そして「結論」を順に詳しく解説します。以下の目次は、記事全体の構成を示したものです。


機能の概要

CandlePatternSearch.mq5は、MetaTrader 5のチャート上で古典的なローソク足パターンを検出、表示、モニタリングするための完全なフレームワークとして設計されています。このツールは、詳細なパターン認識アルゴリズムとレスポンシブなグラフィカルコントロールパネルを組み合わせており、トレーダーがチャート上で直接操作し、迅速な視覚分析と判断に基づく意思決定をサポートできるようになっています。

以下の主要な機能が、このツールの能力を特徴付けています。

1. 豊富なパターンライブラリ

EAは、単体、2本組、3本組の幅広いローソク足パターンに対応しています。対象には、十字線(ドージ)、ハンマー、陽/陰の包み足、明けの明星、宵の明星、赤三兵、三羽烏(黒三兵)などが含まれます。これにより、個別のインジケーターを使用せずとも、多様なプライスアクションのシナリオをカバーできます。

2. インタラクティブなチャート上コントロールパネル

内蔵GUIにより、MetaTrader 5のメニューを操作せずに必要な機能に直接アクセスできます。トレーダーは、パターン名で検索したり、指定した期間内の全対応パターンをスキャンしたり、マークをクリアしたり、リアルタイム監視を切り替えたりと、専用ボタンや入力欄から簡単に操作できます。

3. パターン検索機能

チャートを手動でスクロールして形成を探す代わりに、指定した条件に一致するパターンのみを自動で検出および強調表示します。このターゲットを絞った検索は、戦略テストや特定のローソク足セットアップの過去のパフォーマンス確認に最適です。

4. 包括的なスキャン機能

フルスキャンモードでは、指定した期間内のすべてのバーを解析し、EAのパターンライブラリにあるすべての一致をマークします。これは、より広範な統計分析や、市場状況の全体的な把握に特に有用です。

5. リアルタイム監視モード

有効にすると、このモードは新しいバーが形成されるたびに継続的に監視し、最新のローソク足で新しいパターンをチェックします。監視システムには、同一パターンでの繰り返しアラートを防ぐクールダウン処理が組み込まれています。

6. マルチチャンネルアラートシステム

検出されたパターンは、チャートポップアップ、サウンド通知、MetaTrader 5モバイルアプリへのプッシュ通知、さらにはメール送信などをトリガーできます。すべて取引のワークフローに合わせて柔軟に設定可能です。

7. 視覚的なパターンの強調表示

検出された各パターンは、パターン全体を覆う色付きの矩形としてチャート上に表示されます。これにより、標準的なチャート要素を妨げることなく、パターンの識別や視覚的な検証を素早くおこなうことができます。

8. カスタマイズ可能なパラメータ

ルックバック期間、アラート動作、強調表示の色、表示する最大パターン数など、すべての動作要素はユーザーの取引スタイルに合わせて調整できます。これにより、個々の取引スタイルに最適化した設定や、チャートの視認性の向上が可能になります。

これらの機能を統合することで、CandlePatternSearch.mq5は単なる静的インジケーター以上の存在となります。リアルな市場状況で能動的に機能し、任意の時間軸や通貨ペアで利用可能であり、裁量取引にもシステムトレードにも柔軟に適応できるツールです。



技術アーキテクチャ

このEAは、迅速なスキャン、パターン検出、アラート通知、リアルタイム監視を実現するために、いくつかの主要コンポーネントで構成されています。それぞれの設計セグメントは、ユーザー入力設定の管理、ローソク足データの解析、グラフィカルコントロールの描画、通知の実行など、特定の目的に応じて機能します。  

このアーキテクチャは大きく以下の機能領域に分けられます。  

  1. 入力パラメータと設定
  2. 対応パターンおよび検出ロジック
  3. リアルタイム監視
  4. アラート機構
  5. グラフィカルユーザーインターフェース(GUI)
  6. チャート上でのパターン強調表示
  7. パターン検索と全パターンスキャン

以下では、各機能領域について詳しく説明します。

1. 入力パラメータ

このEAの強みのひとつは、適応性の高さにあります。スキャン範囲から視覚スタイル、アラートルールに至るまで、すべての基本動作は簡単に調整可能な入力パラメータで制御されています。これらの入力により、トレーダーはパフォーマンス、シグナルの頻度、視認性を細かく調整できます。

パラメータ 型  デフォルト値 詳細
LookbackPeriod
int 1000 初期スキャン時に解析する過去のバーの本数を決定します。値を大きくするとより多くのデータをカバーできますが、計算時間がわずかに増加する可能性があります。
PatternColor color clrDodgerBlue
チャート上で検出されたローソク足形成をマークする際の強調表示の色を定義します。
MaxDisplayPatterns
int 100 チャートの視認性とパフォーマンスを維持するため、同時に表示される強調表示パターンの最大数を制限します。
EnableAlerts bool true すべてのアラートチャネルの有効/無効を切り替えるグローバルスイッチです。無効にすると通知やサウンドは発生しません。
SoundAlerts bool true 新しいパターンが検出された際に音声通知を有効または無効にします。
PushNotifications bool false 検出メッセージをMetaTrader 5モバイルアプリに送信します。リモート監視に利用可能で、MetaTraderターミナルのプッシュ通知設定が必要です。
EmailAlerts bool false ターミナルのメール設定を使用して、検出内容を指定メールアドレスに送信します。
AlertCooldown int 60 同じパターンが再度アラートを発生させるまでの待機時間(秒単位)です。活発な市場でも通知の繰り返しを防ぎます。

これらの設定を組み合わせることで、本EAは軽量タスクから高負荷タスクまで柔軟に調整可能です。たとえば、バックテストをおこなうトレーダーは、ルックバック期間を長く設定しつつライブアラートを無効にできます。一方で、デイトレーダーは短いスキャン期間を設定し、プッシュ通知を有効にしてリアルタイムのチャンスを捉えることができます。内部では、すべてのパラメータは標準的な入力宣言を用いて管理されており、MetaTraderの[入力]タブで直接変更可能です。この設計により、ソースコードを編集したり再コンパイルしたりすることなく即座に設定を調整でき、特にチャートや銘柄間で設定を移行する際に便利です。

//+------------------------------------------------------------------+
//| Input Parameters                                                 |
//+------------------------------------------------------------------+
input int      LookbackPeriod      = 1000;         // Number of bars to scan
input color    PatternColor        = clrDodgerBlue;// Highlight colour for detected patterns
input int      MaxDisplayPatterns  = 100;          // Limit to avoid chart clutter

// Alert settings
input bool     EnableAlerts        = true;         // Master switch for all alerts
input bool     SoundAlerts         = true;         // Play sound for new detection
input bool     PushNotifications   = false;        // Send push message to MT5 mobile
input bool     EmailAlerts         = false;        // Send detection details via email
input int      AlertCooldown       = 60;           // Seconds before same pattern alerts again

次に、「対応パターンおよび検出ロジック」に進みます。ここでは、過去の価格データからローソク足の形成を識別するために使用される内部アルゴリズムについて説明します。

2. 対応パターンおよび検出ロジック

このセクションでは、ローソク足形成を正確に識別するツールの能力について説明します。このEAの検出システムは、構造化されたパターンライブラリを中心に設計されており、各パターンは定義されたバー本数を解析する専用関数にマッピングされています。

パターンは、必要とされるローソク足の本数ごとに分類されます。

単一ローソク足パターン

これらは、1本のローソク足の特性(実体の大きさ、ヒゲの長さ、レンジ内での相対位置など)を基に識別されます。

  • 十字線: 始値と終値が非常に近く、市場の迷いを示唆します。
  • ハンマーと逆ハンマー: 実体が小さく、上ヒゲまたは下ヒゲが長いローソク足で、反転の可能性を示します。
  • 首吊り線: ハンマーに似た形状ですが上昇トレンドの後に出現し、弱気圧力を示す可能性があります。
  • 流れ星: 実体が小さく上ヒゲが長いローソク足で、上値での拒絶を示します。
  • コマ足: 中程度のヒゲと小さな実体を持ち、市場の均衡を反映することが多いです。
  • 丸坊主: ヒゲがほとんどないローソク足で、強い方向性の勢いを示します。

2本ローソク足パターン

これらは、連続する2本のローソク足の相互作用に基づきます。たとえば、あるローソク足の実体が前のローソク足を包み込む場合などです。

  • 陽の包み足/陰の包み足: 前のローソク足を包み込む実体を持ち、方向転換の兆しを示します。
  • 切り込み線とかぶせ線: 2本目のローソク足が前の動きを部分的に逆転させ、トレンド転換を示唆します。
  • はらみ線(陽はらみ/陰はらみ): 1本目の実体が2本目を内包し、勢いの衰えを示唆します。
  • 毛抜き天井/毛抜き底: 連続するバーで高値または安値が一致し、強いサポートやレジスタンスの拒絶を示します。
3本ローソク足パターン

これらの形成は連続する3本のローソク足を使用し、持続的な市場心理の変化を示すことが多いです。

  • 明けの明星/宵の明星 :強い陽線/強い陰線の後に小さく迷いのあるローソク足が続き、その後に逆方向に強い陰線/強い陽線が出現します。
  • 赤三兵: 連続する3本の陽線で、上昇勢いの強さを示します。
  • 三羽烏(黒三兵):連続する3本の陰線で、下落圧力の強さを示すことが多いです。

アルゴリズムによる検出手法

このEAは、履歴データ(rates配列)の特定インデックスでパターンが存在するかを判断するために、以下の共通ステップを用います。

1. データの取得:CopyRatesを使って、過去の価格(始値、高値、安値、終値、出来高)のセグメントをMqlRates配列に読み込みます。

2. ローソク足本数条件の確認:各検出関数は、解析に十分なバーが存在するかをまず確認します(例:3本パターンでは、選択したインデックスの後に3本未満の場合は実行されません)。

3. 比率/相対位置のチェック:

計算には以下が含まれます。

    • 実体サイズとローソク足全体レンジの比率
    • 上ヒゲ/下ヒゲの長さ
    • 前バーとの相対位置
    • 始値と終値の関係

4. パターン一致の確認:すべての論理条件がライブラリに定義された基準に一致すれば(例:十字線の場合、実体サイズが定義された閾値未満)、関数はパターン名の文字列を返します。

5. マーキングおよび次ステップ:検出された後、EAはパターンマーキング関数を呼び出して、チャート上に形成を可視化し、結果表示に記録します。

この方法により、各パターンのルールは独立した関数として実装されており、ライブラリの拡張が容易です。新しいパターンを追加する場合も、認識関数を書き、スキャン用配列を更新するだけで済み、主要なコード構造を変更する必要はありません。

//+------------------------------------------------------------------+
//| Detect Bullish Engulfing pattern                                 |
//+------------------------------------------------------------------+
bool isBullishEngulfing(int index, const MqlRates &rates[])
{
   // Make sure we have at least 2 bars from 'index'
   if(index+1 >= ArraySize(rates))
      return false;

   double prevOpen  = rates[index+1].open;
   double prevClose = rates[index+1].close;
   double currOpen  = rates[index].open;
   double currClose = rates[index].close;

   // Check if current candle bullish and fully engulfs previous body
   if(currClose > currOpen &&       // Current bullish
      prevClose < prevOpen &&       // Previous bearish
      currOpen < prevClose &&       // Current's open below previous close
      currClose > prevOpen)         // Current's close above previous open
   {
      return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| Detect Doji pattern                                              |
//+------------------------------------------------------------------+
bool isDoji(int index, const MqlRates &rates[])
{
   if(index >= ArraySize(rates))
      return false;

   double open  = rates[index].open;
   double close = rates[index].close;
   double high  = rates[index].high;
   double low   = rates[index].low;

   double body  = MathAbs(close - open);
   double range = high - low;

   // Define the ratio threshold for Doji
   double dojiRatio = 0.1; // 10% of total range

   if(body <= (range * dojiRatio))
      return true;

   return false;
}

3. リアルタイム監視ロジック

CandlePatternSearch.mq5の際立った機能のひとつは、リアルタイムモードで動作できる点です。履歴データのスキャンだけでなく、本EAはチャート上で新しく形成される各ローソク足を能動的に監視し、市場の動きと同時に、対応しているパターンが出現していないかを即座に確認します。この機能は、新しい市場シグナルにすぐ反応したいトレーダーにとって特に有用であり、履歴データの分析結果のみに依存する必要がありません。このシステムは、MetaTrader 5のOnTickイベントに連動することで、価格が更新されるたびに条件を評価します。同時に、アラートのクールダウン状態も管理し、同じ通知が過剰に繰り返されることを防ぎます。

処理の流れ

  1. トリガーポイント:各ティックは、OnTickイベントハンドラを通じて監視ルーチンを起動します。
  2. バー完了チェック:EAは、直近のバー(インデックス0)がすでに確定しているか、または新しいバーが開始されたかを確認します。これにより、形成途中のローソク足による誤検出を防ぎます。
  3. パターンスキャン:最新のローソク足(通常は直近3〜5本)を、ライブラリ内のすべての検出関数と照合して評価します。
  4. クールダウンの強制:同じパターンが直前に検出されていた場合、設定されたAlertCooldown期間内では再度アラートが発生しないようタイマーが適用されます。
  5. マーキングおよび通知:有効なパターンが検出されると、チャート上に視覚的なマークが表示され、設定された通知方法(サウンド、ポップアップ、プッシュ通知、メール)が実行されます。

利点

  • 即時フィードバック:新しいセットアップが出現した瞬間にトレーダーへ通知されます。
  • スキャン負荷の軽減:ライブ監視では最新のローソク足のみを解析するため、過去のバーを数百本スキャンする場合と比べてCPU使用量を抑えられます。
  • 柔軟な対応:EAを再起動することなくアラートの有効/無効を切り替えられるため、市場のボラティリティが高い局面でも柔軟に対応できます。

// Store last alert times for each pattern
datetime lastAlertTime[50]; // assuming 50 possible patterns indexed

//+------------------------------------------------------------------+
//| Tick handler for real-time monitoring                            |
//+------------------------------------------------------------------+
void OnTick()
{
   static datetime lastBarTime = 0;

   // Get latest bar time
   datetime currentBarTime = iTime(_Symbol, _Period, 0);

   // Check if a new bar has formed
   if(currentBarTime != lastBarTime)
   {
      lastBarTime = currentBarTime;

      // Copy recent candle data (last 5 bars)
      MqlRates rates[];
      if(CopyRates(_Symbol, _Period, 0, 5, rates) < 5)
         return;

      // Scan patterns for last completed candle (index 1)
      for(int p = 0; p < totalPatterns; p++)
      {
         bool detected = patterns[p].function(1, rates);

         // Check cooldown before alerting
         if(detected && (TimeCurrent() - lastAlertTime[p] > AlertCooldown))
         {
            markPatternOnChart(p, 1, rates);
            sendAlerts(p, rates[1]);

            lastAlertTime[p] = TimeCurrent();
         }
      }
   }
}

ローソク足が新しく確定したときのみスキャンが実行されるように、lastBarTimeを追跡しています。EAは直近の5本のバーをコピーし、その後、最後に確定したバー(インデックス1)に対して各検出関数を実行します。lastAlertTime[]は各パターンが最後に検出された時刻を記録しており、市場が激しく動く局面でもアラートが過剰に発生することを防ぎます。

4. アラート機構

アラートシステムは、選択されたローソク足パターンが確認された時点で、トレーダーに通知するよう設計されています。これは履歴データのスキャン時でもリアルタイムモードでも機能します。その柔軟性は、複数の通知チャネルをサポートしている点にあり、トレーダーの好みに応じて個別に、または同時に利用することができます。  

対応アラートタイプ

  • チャートポップアップ:Alert()を使用してターミナル内にメッセージを表示します。チャートを監視しているときにすぐ気付くためのシンプルな方法です。
  • サウンドアラート:パターンが検出された際に音声ファイルを再生します。画面から少し離れていても作業環境の近くにいるトレーダーにとって便利です。
  • プッシュ通知:MetaTrader 5 モバイルアプリへメッセージを送信し、リアルタイムでセットアップを遠隔監視できます。この機能を使用するには、MetaTrader 5ターミナル設定でプッシュ通知の設定が必要です。
  • メールアラート:銘柄、時間足、パターン名、検出時刻を含むフォーマットされたメールを送信します。MetaTrader 5をVPS上で稼働させている場合や、長時間プラットフォームから離れるトレーダーにとって有用です。

内部処理の流れ

パターンが検出されると、アラート要求はmarkPatternOnChartまたは検出関数から発生します。まずEAはグローバル設定のEnableAlertsフラグを確認します。その後、有効になっている各チャネルに対して対応する関数が実行されます。

  • チャートポップアップ:Alert()
  • サウンド通知:PlaySound()
  • プッシュ通知:SendNotification()
  • メール通知:SendMail()

また、同一パターンでアラートが繰り返し発生しないよう、パターンごとのクールダウン時間が適用されます。

//+------------------------------------------------------------------+
//| Send Alerts for a detected pattern                               |
//+------------------------------------------------------------------+
void sendAlerts(int patternIndex, MqlRates candle)
{
   // Retrieve pattern name
   string name = patterns[patternIndex].name;

   // Build common message
   string msg = StringFormat("Pattern Detected: %s on %s M%d\nOpen: %.5f | Close: %.5f | Time: %s",
                              name, _Symbol, _Period,
                              candle.open, candle.close,
                              TimeToString(candle.time, TIME_DATE|TIME_MINUTES));

   // Chart pop-up
   if(EnableAlerts)
      Alert(msg);

   // Sound alert
   if(SoundAlerts)
      PlaySound("alert.wav"); // Make sure file exists in Sounds folder

   // Push notification
   if(PushNotifications)
      SendNotification(msg);

   // Email alert
   if(EmailAlerts)
      SendMail("CandlePattern Alert", msg);
}

すべてのアラートメッセージは、一貫性を保つために同じ基本テキスト(msg)を共有します。各チャネルは実行前に対応するブールパラメータを確認します。新しいチャネル(例:ファイルへのログ記録や外部APIへの送信)を追加する場合も、条件分岐ブロックを追加するだけで対応できます。技術アーキテクチャの次の論理的なステップは、グラフィカルユーザーインターフェース(GUI)です。ここでは、チャート上のインタラクティブなコントロールパネルについて説明し、ボタンのクリック処理がどのようにおこなわれるか(OnChartEvent)を示す便利なコード例も紹介します。

5. グラフィカルユーザーインターフェース(GUI)の実装

CandlePatternSearch.mq5を実用的なツールにしている特徴のひとつが、チャート上に組み込まれたコントロールパネルです。トレーダーが毎回MetaTrader 5のプロパティウィンドウで入力設定を変更する必要はありません。その代わりに、EAはインタラクティブなインターフェースを提供し、パターン検索の開始、全パターンのスキャン、強調表示のクリア、リアルタイム監視の切り替えといった操作を、ワンクリックで即座に実行できます。GUIは、MetaTrader 5のチャートオブジェクト(主にOBJ_BUTTON, OBJ_LABEL、およびレイアウト用のシンプルな図形)を使用して構築されています。これにより、追加ライブラリを必要とせず軽量な設計を維持できます。各ボタンはイベントハンドラに接続されており、クリック操作(OnChartEvent)を解釈してEA内部の適切な関数を実行します。

主要なGUI要素

  • 検索フィールド:ユーザーが特定のパターン名を入力して検索できる編集入力欄です。
  • [Search]ボタン:入力されたパターンに対して履歴スキャンを実行し、見つかったすべての箇所を強調表示します。
  • [Scan All]ボタン:指定されたルックバック期間内で、すべてのパターンを対象にしたフルスキャンを実行します。
  • [Clear]ボタン:チャート上のすべての強調表示を削除し、作業スペースをクリアにします。
  • モニター切り替え:リアルタイム監視モードを有効または無効に切り替えます。
  • ステータス表示:現在のモード、検出数、または最後に検出されたパターンなどを表示する小さなラベルです。

利点

  • EAを再起動せずに直接操作可能:設定や操作の変更が即座に反映されます。
  • 高速なワークフロー:入力タブを開いて操作するよりも手間が少なくなります。
  • 視覚的フィードバック:チャート上の要素を通じて、操作結果をすぐに確認できます。

GUIボタンの作成

//+------------------------------------------------------------------+
//| Create basic GUI buttons on initialization                       |
//+------------------------------------------------------------------+
void createGUI()
{
   // Search Button
   ObjectCreate(0, "btnSearch", OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, "btnSearch", OBJPROP_XDISTANCE, 20);
   ObjectSetInteger(0, "btnSearch", OBJPROP_YDISTANCE, 20);
   ObjectSetInteger(0, "btnSearch", OBJPROP_XSIZE, 80);
   ObjectSetInteger(0, "btnSearch", OBJPROP_YSIZE, 20);
   ObjectSetString(0, "btnSearch", OBJPROP_TEXT, "Search");

   // Scan All Button
   ObjectCreate(0, "btnScanAll", OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, "btnScanAll", OBJPROP_XDISTANCE, 110);
   ObjectSetInteger(0, "btnScanAll", OBJPROP_YDISTANCE, 20);
   ObjectSetInteger(0, "btnScanAll", OBJPROP_XSIZE, 80);
   ObjectSetInteger(0, "btnScanAll", OBJPROP_YSIZE, 20);
   ObjectSetString(0, "btnScanAll", OBJPROP_TEXT, "Scan All");

   // Clear Button
   ObjectCreate(0, "btnClear", OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, "btnClear", OBJPROP_XDISTANCE, 200);
   ObjectSetInteger(0, "btnClear", OBJPROP_YDISTANCE, 20);
   ObjectSetInteger(0, "btnClear", OBJPROP_XSIZE, 80);
   ObjectSetInteger(0, "btnClear", OBJPROP_YSIZE, 20);
   ObjectSetString(0, "btnClear", OBJPROP_TEXT, "Clear");
}

ボタンクリックの処理

//+------------------------------------------------------------------+
//| Handle chart events such as button clicks                        |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   // Check if the event is an object click
   if(id == CHARTEVENT_OBJECT_CLICK)
   {
      if(sparam == "btnSearch")
      {
         searchPattern(patternNameInput); // custom function
      }
      else if(sparam == "btnScanAll")
      {
         scanAllPatterns();
      }
      else if(sparam == "btnClear")
      {
         clearHighlights();
      }
   }
}

  • createGUI ()は、ボタンのサイズ、位置、キャプションを設定してGUIを構築します。
  • OnChartEvent ()はクリックイベントを監視し、sparamにクリックされたオブジェクト名が渡されます。

各ボタン名は、EA内の特定の関数(検索、スキャン、クリアなど)に対応付けられています。 技術アーキテクチャの次のサブセクションでは、チャート上でのパターン強調表示について説明します。ここでは、検出結果がどのように視覚的に表示されるのか(矩形、ラベル、色分けなど)、そしてそれが分析にとってなぜ重要なのかを解説します。

6. チャート上のパターン強調表示

視覚的な表現は、CandlePatternSearch.mq5において最も重要な要素のひとつです。ローソク足パターンが検出されると(対象検索、フルスキャン、またはリアルタイム監視のいずれの場合でも)、EAはそのパターンをチャート上に直接マークし、即座に認識できるようにします。

強調表示方法

このツールは、パターンを構成するローソク足を覆う矩形チャートオブジェクト(OBJ_RECTANGLE)を使用します。各矩形はローソク足の高値から安値までをカバーし、水平方向にはパターンの最初のローソク足から最後のローソク足までを跨ぐ形で描画されます。この方法により、複数のローソク足で構成されるパターンでも、視覚的に明確に区別して表示できます。

パターンタイプを区別するために、次の仕組みが使われます。

  • 各パターンタイプには固有の色が割り当てられる(PatternColor入力またはパターンごとの設定でカスタマイズ可能)
  • 透明度を設定することで、下にあるチャートのローソク足が隠れないようにする
  • 必要に応じて、矩形の上または下にテキストラベルを配置し、パターン名を表示できる

視覚的強調表示の利点

視覚的強調表示機能にはいくつかの利点があります。まず、即時認識が可能になります。トレーダーはログを確認したりアラートだけに頼ったりすることなく、チャート上で直接ローソク足パターンを識別できます。また、履歴データの研究にも役立ちます。ユーザーは過去のチャートをスクロールし、同様のセットアップが出現した後に価格がどのように反応したかを観察できます。さらに、体系的な学習ツールとしても機能します。ローソク足分析を習得中のトレーダーにとって、実際の市場環境の中でパターンが表示されることで認識力が強化され、分析への理解と自信を高める助けになります。 

//+------------------------------------------------------------------+
//| Mark detected pattern on chart                                   |
//+------------------------------------------------------------------+
void markPatternOnChart(int patternIndex, int startIndex, const MqlRates &rates[])
{
   string name = patterns[patternIndex].name;
   string objName = StringFormat("%s_%d", name, startIndex);

   // Determine high and low for the pattern
   double highPrice = rates[startIndex].high;
   double lowPrice  = rates[startIndex].low;

   int candleCount = patterns[patternIndex].barsRequired;
   for(int i = 0; i < candleCount; i++)
   {
      if(rates[startIndex+i].high > highPrice) highPrice = rates[startIndex+i].high;
      if(rates[startIndex+i].low < lowPrice)  lowPrice  = rates[startIndex+i].low;
   }

   datetime startTime = rates[startIndex + candleCount - 1].time;
   datetime endTime   = rates[startIndex].time;

   // Create rectangle object
   ObjectCreate(0, objName, OBJ_RECTANGLE, 0, endTime, highPrice, startTime, lowPrice);
   ObjectSetInteger(0, objName, OBJPROP_COLOR, PatternColor);
   ObjectSetInteger(0, objName, OBJPROP_STYLE, STYLE_SOLID);
   ObjectSetInteger(0, objName, OBJPROP_WIDTH, 1);
   ObjectSetInteger(0, objName, OBJPROP_FILL, true);
   ObjectSetInteger(0, objName, OBJPROP_ZORDER, 0);
}

markPatternOnChart ()は、検出されたパターンを構成するローソク足の範囲にわたって矩形を描画します。この関数は、パターン範囲内の最高値と最安値を計算し、矩形の縦方向の範囲が正確になるようにします。また、barsRequiredプロパティによって、複数ローソク足で構成されるパターンも完全にカバーされるようになっています。

7. パターン検索と全パターンスキャン

CandlePatternSearch.mq5には、同じパターン認識ロジックを基盤としながら、異なる目的に対応する2つの検出モードが用意されています。

パターン検索モード

パターン検索モードでは、ユーザーが特定のローソク足形成を指定して検索します。これは、チャート上の検索フィールドにパターン名を入力する方法、または検索関数に引数として渡す方法で指定できます。その後、EAは設定されたLookbackPeriodの範囲内で履歴データを処理し、指定されたパターンに一致する箇所のみをチャート上にマークします。このターゲット型のアプローチは、特定のセットアップの過去のパフォーマンスの検証、その形成に関連するエントリーやエグジットの挙動の研究、特定のシグナルを中心とした取引戦略の開発に適しています。

フルスキャンモード

フルスキャンモードでは、EAはより広範なアプローチを取ります。パターン名によるフィルターを無視し、内部ライブラリに登録されているすべてのパターンをチャートデータに対して評価します。その結果、ルックバック範囲内で見つかったすべての一致パターンが、種類に関係なく強調表示されます。このモードは、市場センチメントの統計的な概観の作成、複数セットアップの出現頻度や相互作用の分析、特定のシグナルに偏らない取引機会の素早い発見に有効です。  

パフォーマンスの観点から見ると、パターン検索モードは通常より高速に実行されます。これは、各ローソク足インデックスに対して1つの検出関数のみが実行されるためです。一方、フルスキャンモードでは解析対象となるすべてのバーに対して、すべての検出関数を実行する必要があります。そのため、パターンライブラリが大きい場合には処理負荷が高くなる可能性があります。ただし、EAは最適化された構造を採用しているため、長い履歴範囲に対しても効率的に動作します。  

// Search for a specific pattern
void searchPattern(string patternName)
{
   MqlRates rates[];
   if(CopyRates(_Symbol, _Period, 0, LookbackPeriod, rates) <= 0)
      return;

   for(int i = LookbackPeriod-1; i >= 0; i--)
   {
      if(matchPatternByName(patternName, i, rates))
         markPatternOnChart(getPatternIndex(patternName), i, rates);
   }
}

// Scan all patterns in the library
void scanAllPatterns()
{
   MqlRates rates[];
   if(CopyRates(_Symbol, _Period, 0, LookbackPeriod, rates) <= 0)
      return;

   for(int i = LookbackPeriod-1; i >= 0; i--)
   {
      for(int p = 0; p < totalPatterns; p++)
      {
         if(patterns[p].function(i, rates))
            markPatternOnChart(p, i, rates);
      }
   }
}
  • searchPattern ()関数は、過去のバーをループ処理し、指定されたパターンの一致判定関数のみを呼び出します。
  • scanAllPatterns ()関数は、各ローソク足インデックスごとにすべてのパターンを順番にチェックします。
  • どちらの関数も、検出されたパターンを視覚的に強調表示するためにmarkPatternOnChart ()を呼び出します。


テストと結果

CandlePatternSearch.mq5の精度と実用性を評価するため、高ボラティリティの合成銘柄と一般的なFX通貨ペアを使用して複数のテストが実施されました。ここに示されているスクリーンショットは、Volatility 75 (1s) IndexのM5時間足上でEAを実行した例であり、高頻度観測のためティック単位データを使用しています。

陽の包み足のテストでは、EAは設定されたLookbackPeriod内の過去の1,000本のバーをスキャンし、定義されたパターンロジックに一致する52件の発生を正しく識別しました。各検出箇所は、チャート上で青色の長方形オーバーレイによって直接強調表示されました。それぞれのボックスは、包み足を構成する2本のローソク足の範囲を覆っています。この即時の視覚表示により、ログデータを確認する必要なくパターンを素早く認識できました。

チャート上のGUIコントロールパネルは、テスト作業において非常に効率的であることが確認されました。検索フィールドにパターン名を入力して[Search]をクリックするだけで、 Volatility Indexの高頻度ティックデータ環境でも1秒未満でスキャンが完了しました。また、このツールは検出されたパターンの総数と最終スキャンのタイムスタンプもステータスパネルに更新表示します。これにより、繰り返しテストのタイミング確認や検証が容易になりました。

異なる銘柄(例:EURUSD、USDJPY、NZDUSD)での繰り返しテストでも、EAは安定した精度を維持しました。定義されたローソク足比率の閾値を超える誤検出は確認されませんでした。フルスキャンモードでは、ローソク足パターンライブラリ全体を評価し、複数種類のパターンを一度の操作で検出することができました。ただし、Volatility 75 Indexのような極端に高いボラティリティ環境では、パターンの発生頻度が大幅に増加します。そのため、チャートの視覚的な混雑を避けるためにMaxDisplayPatterns入力パラメータによる制限が必要になる場合があります。

主な結果のまとめ

  • 精度:検出ロジックは、目視および手動確認によるチェックにおいて、教科書的な定義と一致しました。
  • スピード:標準的なFXデータではほぼ瞬時にスキャンが完了し、負荷の高い合成指数でも許容範囲の処理時間を維持しました。
  • 使いやすさ:GUIにより、EAを停止または再コンパイルすることなく、ターゲット検索とフルスキャンを素早く切り替えることができました。
  • 学習用途:初心者トレーダーにとって、チャート上の視覚表示はリアルタイムおよび履歴データにおけるローソク足パターンの認識力向上に役立ちました。

これらの結果は、CandlePatternSearch.mq5が特定パターンの詳細研究と広範な市場観察の両方において信頼性の高いツールであることを示しています。その高速性と視覚的な明瞭さにより、リアルタイムの取引環境だけでなく、事後分析や学習用途にも有用です。



結論

CandlePatternSearch.mq5の開発およびテストを通じて、ローソク足パターン認識に対して構造化されたモジュール型アプローチを採用することで、MetaTrader 5環境において高い精度と運用効率の両立が可能であることが示されました。幅広いパターンライブラリ、応答性の高いチャート上コントロールパネル、リアルタイム監視機能、そして複数チャネルのアラート機能を組み合わせることで、このツールはローソク足パターンの理論的定義と、実際の市場における実用的な活用とのギャップを埋めています。

合成指数および従来のFX通貨ペアの両方で実施したテストでは、検出結果が教科書的な基準と一貫して一致することが確認されました。また、視覚的強調表示システムにより、パターンの即時認識が可能になり、同時に過去の市場状況を分析するための有益なコンテキストも提供されました。さらに、ターゲット検索モードとフルスキャンモードを、EAの動作を中断することなくシームレスに切り替えられる点は、探索的な分析や実際のトレードセッションの双方において、使いやすさを大きく向上させました。裁量トレーダーにとって、このEAはローソク足パターンの認識力を高め、それを意思決定プロセスへ自然に組み込むための直感的な手段を提供します。一方で、システムトレーダーや開発者にとっては、モジュール化された検出ロジックと柔軟に設定可能な入力パラメータが、自動または半自動戦略へ拡張するための強固な基盤となります。

要するに、CandlePatternSearch.mq5は単なるパターン表示ツールではありません。 それは、規律ある取引実践、より深い統計的研究、そしてリアルタイムの市場認識を支えることができる柔軟な分析フレームワークです。その設計は、ローソク足パターンという複雑になりがちな市場言語をより明確に理解したいと考えるすべてのトレーダーにとって、有益な資産となるでしょう。

他の記事もぜひご覧ください。

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20313

添付されたファイル |
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
機械学習の限界を克服する(第8回):ノンパラメトリックな戦略選択 機械学習の限界を克服する(第8回):ノンパラメトリックな戦略選択
データ駆動型アプローチを用いて強力な取引戦略を自動的に発見するために、ブラックボックスモデルをどのように設定するかを解説します。相互情報量を利用して学習しやすいシグナルを優先的に選択することで、従来の手法よりも優れた、よりスマートで適応的なモデルを構築することができます。また読者は、表面的な指標に過度に依存するという一般的な落とし穴を避け、意味のある統計的洞察に基づいた戦略を開発する方法についても学ぶことができます。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
ブラック–ショールズのギリシャ指標の自動化:高度なスキャルピングとマイクロストラクチャ取引 ブラック–ショールズのギリシャ指標の自動化:高度なスキャルピングとマイクロストラクチャ取引
ガンマ(Γ)とデルタ(Δ)はもともとオプションのエクスポージャーをヘッジするためのリスク管理ツールとして開発されましたが、時間の経過とともに、高度なスキャルピング、オーダーフローモデリング、マイクロストラクチャ取引における強力なツールへと進化しました。現在では、価格感応度や流動性行動のリアルタイム指標として機能し、トレーダーが短期的なボラティリティを驚くほど正確に予測できるようにしています。