English
preview
プライスアクション分析ツールキットの開発(第46回):MQL5におけるスマートな可視化を備えたインタラクティブフィボナッチリトレースメントEAの設計

プライスアクション分析ツールキットの開発(第46回):MQL5におけるスマートな可視化を備えたインタラクティブフィボナッチリトレースメントEAの設計

MetaTrader 5トレーディングシステム |
30 0
Christian Benjamin
Christian Benjamin

はじめに

本連載の前回の記事プライスアクション分析ツールキットの開発(第46回)」では、過去の市場の反応を確認するために価格レベルをテストし、ブレイクアウトやタッチ、経験的なブレイクアウト確率を特定する方法に焦点を当てました。このツールの機能の鍵となる特徴は、チャート上に表示される入力パネルで、ユーザーが価格レベルを入力し、[Analyze]ボタンを押すだけで分析を開始できる点でした。  

今回の記事では、チャート上で値を入力するという同じアイデアを発展させ、フィボナッチリトレースメント分析の体験をMQL5で改善します。従来の手動でフィボナッチツールを適用する方法は、新しいユーザーにとってはわかりにくい場合がありますが、このEAはより簡単でインタラクティブな代替手段を提供します。スイングハイとスイングローを特定し、パネルに値を入力して[Draw Fib]を押すだけで、EAが関連するリトレースメントおよびエクステンションレベルをすべて自動で描画し、その後もチャートを監視して価格がこれらのレベルに触れるとアラートを発します。この自動化は、手動で描画するだけでは得られない継続的な分析やリアルタイムのフィードバックを提供するため、非常に価値があります。

本記事では、このツールを設計し、MQL5で実装する手順をステップごとにご案内します。以下の目次をご覧いただいた後、各セクションの詳細を説明します。



ツールの設計

EAの設計を始める前に、まずフィボナッチリトレースメントツールとは何か、トレーダーがどのように使うのかを理解することが重要です。この概念は、13世紀のイタリアの学者レオナルド・フィボナッチによって紹介された数学的な数列に由来します。この数列から導かれる比率、例えば0.382や0.618は自然界にもよく見られ、価格の動きの比率的な挙動を説明するために市場分析で広く応用されています。MetaTrader5では、フィボナッチリトレースメントツールは[挿入]>[オブジェクト]>[フィボナッチ係数]>[フィボナッチリトレースメント]で見つけることができます。トレーダーはこれを使用して、トレンド内の潜在的なサポートおよびレジスタンスゾーンを特定します。しかし、手動でラインを描画すると、そのラインは固定され、市場が動き続けても自動的なフィードバックは提供されません。私たちの目標は、このプロセスを自動化によって改善することです。

コードを書く前に、インタラクティブフィボナッチEAがどのように動作するか、トレーダーがどのように操作するかを設計する必要があります。慎重な計画により、各機能に明確な目的が与えられ、ライブチャート上でEAが動作する際に論理的に振る舞うことが保証されます。  

このEAの目的は、フィボナッチリトレースメント分析をより簡単に、より迅速に、より適応的にすることです。静的な描画ツールとして機能するのではなく、市場の動きに合わせてリトレースメントおよびエクステンションレベルを可視化する、アクティブな分析アシスタントとして機能します。 

主要な設計目標 

  1. 操作の簡素化: ユーザーがインジケーターのハンドルをドラッグする代わりに、チャート上で直接スイングハイ(A)とスイングロー(B)の値を入力または調整できるようにします。
  2. 分析の自動化 :リトレースメントおよびエクステンションレベルを瞬時に描画し、市場の動きに応じてリアルタイムで監視します。
  3. 可視化の向上 :色、ラインスタイル、チャート上ラベルを使用してレベルをわかりやすくスタイリッシュに表示し、瞬時に認識できるようにします。
  4. フィードバックの提供 :価格がフィボナッチレベルに到達した際に、アラート、マーカー、ティッカー更新などでトレーダーに通知します。
  5. 使いやすさの向上 :複数のツール設定を1つの直感的なオンスクリーンパネルにまとめ、操作を簡略化します。

要するに、この設計により、標準の静的なフィボナッチツールが「生きて反応するアシスタント」に変わり、分析、自動化、表示を1つのユーザーフレンドリーなパッケージに統合します。

インターフェースと機能設計

ツールの目的が明確になったので、次はトレーダーがどのようにツールとやり取りするかを設計します。このEAでは、チャート上にコントロールパネルを配置し、ユーザーがスイング値を設定したり、機能を実行したり、フィードバックを確認したりできるようにします。設定ウィンドウを開く必要がないため、すべての操作がチャート上で完結します。チャート上にすべての操作を集約することで、即時性が生まれ、アクティブな市場分析時に非常に便利になります。

ユーザーインターフェースレイアウト

要素種類用途
ラベルAOBJ_LABEL
最初の入力ボックスの前に表示される固定テキスト「A:」
編集ボックスAOBJ_EDIT
ユーザーがスイングロー値(動きの開始点)を入力するフィールド
ラベルBOBJ_LABEL
2番目の入力ボックスの前に表示される固定テキスト「B:」
編集ボックスBOBJ_EDIT
スイングハイ値(動きの終了点)を入力するフィールド
フィボナッチ描画ボタンOBJ_BUTTON
計算を実行し、すべてのフィボナッチレベルを描画
クリアボタンOBJ_BUTTON
チャート上の既存のオブジェクトを削除
ティッカーヘッドラインOBJ_LABEL
アップデートやアラートを表示する小さなスクロールバー

これらのオブジェクトは、チャートの左上隅に常に表示されるコンパクトなインターフェースを形成します。ObjectCreate()で作成し、ObjectSetInteger()ObjectSetString()で調整することで、チャートのズームやサイズ変更時にも視認性を保ちます。目標は、パネルを軽量で直感的にし、取引エリアを邪魔せず、常にアクセス可能にすることです。

機能要件

インターフェースの各要素は、EA内で明確に定義された役割を果たします。AおよびBの入力ボックスは、分析するレンジを表すユーザー定義のスイング値を受け付けます。これらのフィールドが空の場合、EAはチャートデータから直近の高値と安値を推定することも可能です。[Draw Fib]ボタンを押すと、以前に描画した線が削除され、標準のフィボナッチリトレースメント比率とエクステンション比率が計算され、色分けされたマーカーとラベルが付いた水平線としてチャート上にプロットされます。[Clear]ボタンは、EAに関連するすべてのオブジェクトを削除するだけで、チャートを素早くリセットできます。すべてのユーザー操作はOnChartEvent()関数を通じて処理され、入力の編集やボタンクリックに即座に反応します。この設計により、市場が急速に動いている場合でもツールは応答性が高く、操作が簡単です。トレーダーはスイングレンジを変更したり、レベルを即座に更新したりしても、EAを再起動する必要はありません。

ビジュアルデザイン

チャート上に複数のラインが表示される場合、一貫性があり読みやすいビジュアルスタイルが不可欠です。EAでは明確なカラースキームを使用しており、強気のリトレースメントはライトグリーン、弱気のリトレースメントはトマトレッドで描画されます。最も重要なレベルである0%、50%、100%は、ゴールドで太めのライン幅にして強調表示されます。ラベルにはArial Blackフォントのサイズ10を使用しており、どのチャートテーマでも文字が鮮明に見えるようにしています。各ラベルにはパーセンテージ比率と正確な価格値の両方が含まれており、トレーダーは一目でレベルを把握できます。チャート下部にはスクロールするティッカーヘッドラインが表示され、「Monitoring Fibonacci levels 1.2000 → 1.2500」や「Price touched 61.8% level」などのアラートや更新情報を知らせます。このティッカーの色はTickerColor入力設定で制御でき、ユーザーは好みのチャート配色に合わせることが可能です。これらのデザイン上の工夫により、すっきりとしたモダンなビジュアル表現が実現され、明瞭さを保ちながらも注意を散らすことがありません。

コアロジックのコンセプト

裏側では、システムはシンプルなロジックに従って動作します。トレーダーがスイング値を入力し[Draw Fib]を押すと、EAは各比率を計算し、対応するラインとラベルを描画します。価格の新しいティックが入るたびに、EAは現在のBidまたはAskがいずれかのフィボナッチレベルの小さな範囲内にあるかをチェックします。一致が確認されると、EAはアラートを発し、チャート上にイベントをマークし、ヘッドラインに更新情報を表示します。このプロセスは自律的に継続され、静的なフィボナッチツールを、トレーダーが意思決定に集中している間も動作する応答型の分析アシスタントに変換します。

以下は、ユーザー入力、EAの処理、リアルタイムフィードバックの順序を示す、インタラクティブフィボナッチツールのフローチャートです。


インターフェースの構築

設計フェーズが完了したら、次のステップはコンセプトをチャート上の実際のオブジェクトに変換することです。MetaTrader5はグラフィカルオブジェクトシステムを提供しており、これを可能にします。ボタン、ラベル、入力ボックスなど、各オブジェクトはObjectCreate()関数を使用して作成され、その後ObjectSetInteger()やObjectSetString()などのプロパティ設定関数でカスタマイズされます。これらのグラフィカル要素を組み合わせることで、フィボナッチツールの主要な操作センターとして機能するオンスクリーンパネルを設計できます。

パネル要素の作成

以下の例では、パネルの基本要素をどのように作成するかを示しています。ユーザーがスイングロー値とスイングハイ値を入力できる2つのラベル付き入力ボックスに加え、フィボナッチレベルを描画するボタンとクリアするボタンの2つのコマンドボタンを含みます。

void CreateInterface()
{
   long chartID = ChartID();

   // --- Label A
   ObjectCreate(chartID, "lbl_A", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(chartID, "lbl_A", OBJPROP_XDISTANCE, 10);
   ObjectSetInteger(chartID, "lbl_A", OBJPROP_YDISTANCE, 20);
   ObjectSetString(chartID,  "lbl_A", OBJPROP_TEXT, "A:");
   ObjectSetInteger(chartID, "lbl_A", OBJPROP_COLOR, clrWhite);
   ObjectSetInteger(chartID, "lbl_A", OBJPROP_FONTSIZE, 10);

   // --- Edit box for A value
   ObjectCreate(chartID, "edit_A", OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(chartID, "edit_A", OBJPROP_XDISTANCE, 25);
   ObjectSetInteger(chartID, "edit_A", OBJPROP_YDISTANCE, 15);
   ObjectSetInteger(chartID, "edit_A", OBJPROP_BGCOLOR, clrBlack);
   ObjectSetInteger(chartID, "edit_A", OBJPROP_COLOR, clrLime);
   ObjectSetString(chartID,  "edit_A", OBJPROP_TEXT, "");

   // --- Label B
   ObjectCreate(chartID, "lbl_B", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(chartID, "lbl_B", OBJPROP_XDISTANCE, 10);
   ObjectSetInteger(chartID, "lbl_B", OBJPROP_YDISTANCE, 45);
   ObjectSetString(chartID,  "lbl_B", OBJPROP_TEXT, "B:");
   ObjectSetInteger(chartID, "lbl_B", OBJPROP_COLOR, clrWhite);
   ObjectSetInteger(chartID, "lbl_B", OBJPROP_FONTSIZE, 10);

   // --- Edit box for B value
   ObjectCreate(chartID, "edit_B", OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(chartID, "edit_B", OBJPROP_XDISTANCE, 25);
   ObjectSetInteger(chartID, "edit_B", OBJPROP_YDISTANCE, 40);
   ObjectSetInteger(chartID, "edit_B", OBJPROP_BGCOLOR, clrBlack);
   ObjectSetInteger(chartID, "edit_B", OBJPROP_COLOR, clrLime);
   ObjectSetString(chartID,  "edit_B", OBJPROP_TEXT, "");

   // --- Draw Fib button
   ObjectCreate(chartID, "btn_Draw", OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(chartID, "btn_Draw", OBJPROP_XDISTANCE, 10);
   ObjectSetInteger(chartID, "btn_Draw", OBJPROP_YDISTANCE, 70);
   ObjectSetInteger(chartID, "btn_Draw", OBJPROP_BGCOLOR, clrDarkGreen);
   ObjectSetInteger(chartID, "btn_Draw", OBJPROP_COLOR, clrWhite);
   ObjectSetString(chartID,  "btn_Draw", OBJPROP_TEXT, "Draw Fib");

   // --- Clear button
   ObjectCreate(chartID, "btn_Clear", OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(chartID, "btn_Clear", OBJPROP_XDISTANCE, 100);
   ObjectSetInteger(chartID, "btn_Clear", OBJPROP_YDISTANCE, 70);
   ObjectSetInteger(chartID, "btn_Clear", OBJPROP_BGCOLOR, clrMaroon);
   ObjectSetInteger(chartID, "btn_Clear", OBJPROP_COLOR, clrWhite);
   ObjectSetString(chartID,  "btn_Clear", OBJPROP_TEXT, "Clear");
}

このCreateInterface()関数は、先ほど設計したビジュアルレイアウトを構築します。ObjectCreate()は各グラフィカル要素を定義し、後で更新や削除のために参照できる一意の名前を割り当てます。オブジェクトの位置は距離プロパティ(OBJPROP_XDISTANCEおよびOBJPROP_YDISTANCE)で管理され、すべての要素がチャートの左上隅を基準に描画されるようにします。さらに、色、テキスト内容、フォントはObjectSetInteger()やObjectSetString()の呼び出しで割り当てられます。これにより、ラベル、入力ボックス、ボタンなどのインターフェースの各項目が、チャート上で一貫した読みやすいスタイルで表示されます。

パネルの自動初期化

EAをチャートにアタッチした際に、このインターフェースが即座に表示されるよう、作成関数はOnInit()イベント内から呼び出されます。このイベントはエキスパートアドバイザー(EA)が読み込まれたときに1度だけ実行されるため、初期設定タスクを実行するのに最適な場所です。

int OnInit()
{
   CreateInterface();
   Print("Fibonacci Interface Initialized");
   return(INIT_SUCCEEDED);
}

OnInit()内にパネルの初期化を組み込むことで、EAが起動するたびに、ユーザーの操作なしでインターフェースが自動的に描画されることが保証されます。Print()文は必須ではありませんが、ターミナルログでインターフェースが正しく読み込まれたことを確認するのに便利です。

ユーザー操作の処理

インターフェースロジックの次の部分は、トレーダーの操作に応答することです。MetaTrader5では、OnChartEvent()関数を使用して、チャート上でのあらゆるアクティビティ(たとえばボタンのクリックや入力ボックスのテキスト編集)をEAに通知します。以下のコードは、これらの操作をどのように取得するかを示しています。

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id == CHARTEVENT_OBJECT_CLICK)
   {
      if(sparam == "btn_Draw")    HandleDraw();   // Draw Fibonacci levels
      if(sparam == "btn_Clear")   HandleClear();  // Clear all objects
   }
}

イベントが発生すると、プラットフォームはオブジェクト名をsparamを通じて送信します。このパラメータを確認することで、どのボタンがクリックされたかを特定し、対応する関数を呼び出すことができます。この例では、[Draw Fib]が押されると、後でHandleDraw()関数が使用され、ユーザーのAおよびBの値を取得し、リトレースメント比率を計算し、フィボナッチレベルを描画します。同様に、[Clear]ボタンはHandleDraw()を呼び出し、チャート上のすべてのフィボナッチ関連オブジェクトを削除します。この構造により、EAはイベント駆動型となり、入力に対して即座に反応するため、連続ループで処理するのではなく、GUIプログラムのように動作します。

CreateInterface()およびOnChartEvent()のロジックを実装すると、EAには完全に機能するオンスクリーンコントロールパネルが備わり、値の入力とボタンクリックに対応できるようになります。これはツールのユーザー体験の基盤となり、トレーダーの操作とアルゴリズムの応答をつなぐ橋渡しとなります。各オブジェクトは独立しており明示的に名前が付けられているため、後から色、テキスト、位置を変更しても構造に影響を与えません。この柔軟性は、ツールの拡張や、自動検出機能、レベルラベル、入力によるスタイルカスタマイズなどの機能追加の際に非常に有用です。

この段階で、グラフィカルパネルは準備完了です。ユーザーからスイングハイとスイングローを収集し、基本的な操作イベントに反応できます。次のステップである「フィボナッチレベルの描画」では、これらのユーザー入力を動的なリトレースメントおよびエクステンションラインに変換し、市場の動きに自動的に適応させる方法を示します。

パネル

このパネルには、スイングポイント用の入力フィールドAおよびB、操作用ボタン[Draw Fib]と[Clear]、およびツールの状態をリアルタイムで報告するティッカーメッセージエリアが含まれます。



フィボナッチレベルの描画

インターフェースが整い、ユーザー入力が可能になったことで、本ツールの中核となるのが、フィボナッチリトレースメントおよびエクステンションレベルをチャート上に動的に描画する機能です。この機能により、ツールは単なる入力パネルから、リアルタイムのトレーディングを支援する能動的な分析アシスタントへと進化します。ここでは、ユーザーが指定したスイングポイントを、情報量が多く直感的に理解しやすい視覚オブジェクトへ変換する方法を見ていきます。

フィボナッチ比率とその重要性の理解

フィボナッチ比率は多くのテクニカル分析手法の基盤となっており、価格はこれらの比率に関連した水準で反応しやすいと考えられています。最も広く使われるリトレースメントレベルは23.6%、38.2%、50%、61.8%、78.6%で、50%は厳密にはフィボナッチ比率ではありませんが、心理的な中間点として重視されます。一方、127.2%、161.8%、261.8%といったエクステンションレベルは、元の値動きを超えた先の目標価格を予測するために使用されます。これらのレベルを描画することで、トレーダーはサポートやレジスタンス、あるいは価格反転の可能性がある領域を事前に把握できるようになります。

ユーザー入力をレベル価格に変換する

ユーザーがスイングハイBとスイングローAを入力した後、EAは各フィボナッチ比率に対応する価格を計算する必要があります。計算の方向はトレンドによって異なります。AがBより小さい場合は上昇トレンドであり、リトレースメントレベルは下方向に測定します。AがBより大きい場合は下降トレンドとなり、レベルは上方向に測定します。エクステンションレベルは、トレンド方向にスイング終点を超えて投影されます。エクステンションレベルは、トレンドの方向にスイングエンドポイントを超えて投影されます。

たとえば、上昇トレンドにおける61.8%リトレースメントは、次の式で計算します。

  • Level_Price = B - (B - A) * 0.618

これは、BからAに向かう値動きの61.8%分を測定していることを意味します。同様に、161.8%エクステンションは次の式になります。

  • Level_Price = B + (B - A) * 0.618

これは、元のスイング幅の61.8%分をBの先に投影する計算です。

MQL5における描画ロジックの実装

これらの比率をチャート上のラインやラベルとして表示するには、MQL5のグラフィックオブジェクト関数を使用します。以下に示す関数では、各リトレースメントおよびエクステンションレベルを水平ラインとして描画し、その横に比率と正確な価格を表示するラベルを配置します。

void DrawFibonacciLevels(double A, double B)
{
   long chartID = ChartID();
   double ratios[]     = {0.0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0};
   double extensions[] = {1.272, 1.618, 2.618};
   color keyLevelColor = clrGold;

   // Draw retracement levels
   for(int i=0; i<ArraySize(ratios); i++)
   {
      double price = B - (B - A) * ratios[i];
      string levelName = StringFormat("FIB_RET_%d", int(ratios[i]*1000));
      ObjectCreate(chartID, levelName, OBJ_HLINE, 0, 0, price);
      ObjectSetInteger(chartID, levelName, OBJPROP_COLOR, (ratios[i]==0.5 || ratios[i]==0 || ratios[i]==1.0) ? keyLevelColor : clrLime);
      ObjectSetInteger(chartID, levelName, OBJPROP_WIDTH, (ratios[i]==0.5 || ratios[i]==0 || ratios[i]==1.0) ? 2 : 1);

      // Draw label for each level
      string labelName = StringFormat("FIB_LABEL_%d", int(ratios[i]*1000));
      ObjectCreate(chartID, labelName, OBJ_TEXT, 0, TimeCurrent(), price);
      ObjectSetString(chartID, labelName, OBJPROP_TEXT, StringFormat("%.1f%% (%.5f)", ratios[i]*100, price));
      ObjectSetInteger(chartID, labelName, OBJPROP_COLOR, (ratios[i]==0.5 || ratios[i]==0 || ratios[i]==1.0) ? keyLevelColor : clrWhite);
      ObjectSetInteger(chartID, labelName, OBJPROP_FONTSIZE, 10);
   }

   // Draw extension levels
   for(int i=0; i<ArraySize(extensions); i++)
   {
      double price = B + (B - A) * (extensions[i] - 1);
      string levelName = StringFormat("FIB_EXT_%d", int(extensions[i]*1000));
      ObjectCreate(chartID, levelName, OBJ_HLINE, 0, 0, price);
      ObjectSetInteger(chartID, levelName, OBJPROP_COLOR, clrTomato);
      ObjectSetInteger(chartID, levelName, OBJPROP_WIDTH, 1);

      // Draw label for each extension
      string labelName = StringFormat("FIB_EXT_LABEL_%d", int(extensions[i]*1000));
      ObjectCreate(chartID, labelName, OBJ_TEXT, 0, TimeCurrent(), price);
      ObjectSetString(chartID, labelName, OBJPROP_TEXT, StringFormat("%.1f%% (%.5f)", extensions[i]*100, price));
      ObjectSetInteger(chartID, labelName, OBJPROP_COLOR, clrTomato);
      ObjectSetInteger(chartID, labelName, OBJPROP_FONTSIZE, 10);
   }
}

この関数は各レベルを描画し、特に重要なリトレースメントライン(0%、50%、100%)が視覚的に区別されるように設計されています。これらの主要レベルには金色と太めのラインを使用します。その他のリトレースメントレベルはライム色で表示され、エクステンションレベルはトマトレッドでスタイリングされます。各ラインには比率と価格がラベル表示されるため、トレーダーはすべてのレベルの重要性を即座に把握できます。

ユーザー操作との描画処理の統合

この関数をユーザー入力に応答させるには、[Draw Fib]ボタンが押されたときに呼び出す必要があります。これは通常、HandleDraw()関数内で処理されます。EAは入力ボックスから文字列を読み取り、それを数値に変換したうえで、DrawFibonacciLevels()を呼び出します。

void HandleDraw()
{
   string strA = ObjectGetString(ChartID(), "edit_A", OBJPROP_TEXT);
   string strB = ObjectGetString(ChartID(), "edit_B", OBJPROP_TEXT);
   double A = StringToDouble(strA);
   double B = StringToDouble(strB);
   DrawFibonacciLevels(A, B);
}

この統合により、有効な入力が提供された場合にのみ描画ロジックが実行され、インターフェースは常に応答性が高く、ユーザー主導の動作を維持できます。

視覚的スタイリングが重要な理由

色の選択、ラベルのフォント、ラインの太さは単なる見た目の問題ではありません。明確なスタイリングは、重要度の高いレベルと補助的なレベルを瞬時に見分ける助けとなります。これは特に相場の動きが速い場面で重要であり、適切なタイミングでのエントリーと機会損失の分かれ目になることもあります。主要レベルに金色を使用することで、統計的に重要性の高いリトレースメントやエクステンションに自然と視線が集まるようになります。

インタラクティブ機能への準備

フィボナッチレベルをプログラムによって描画できるようになったことで、EAは次の進化段階であるインタラクティブ機能に備えることができます。次のセクションでは、この基盤を拡張し、リアルタイムの価格変動をEAが監視できるようにします。価格がフィボナッチレベルに到達した際にアラートや視覚的な通知を出すことで、本ツールは単なる静的な描画ユーティリティを超え、より強力な分析支援ツールへと進化します。



インタラクティブ化

フィボナッチレベルを描画することは強力な第一歩ですが、自動化の真の利点は、それらのレベルを相場の動きに反応させることにあります。このセクションでは、EAを拡張し、価格変動を能動的に監視して、価格がフィボナッチリトレースメントやエクステンションレベルに近づいたり到達したりした際に、リアルタイムでフィードバックを提供するようにします。これにより、ツールは受動的な視覚補助から、能動的なマーケットアシスタントへと変化します。

リアルタイムでの価格監視

価格がフィボナッチレベルと相互作用したかを検出するために、EAは市場のBid価格(またはAsk価格)を継続的に監視する必要があります。これは、新しいティックが到着するたびに呼び出されるOnTick()関数内でおこなわれます。現在価格を、描画されているすべてのレベルの価格と比較することで、重要なイベントが発生したかどうかを判断できます。

タッチの検出とアラートの発行

実用的な方法として、各フィボナッチラインの周囲に小さな許容幅、いわゆる「タッチゾーン」を定義します。Bid価格がこの範囲内に入った場合、EAはそのレベルが「タッチされた」と判断します。タッチが検出されるたびに、EAは即座にフィードバックを提供するべきです。これには、画面上のマーカー表示、音声アラート、ヘッドラインティッカーの更新などが含まれます。

以下は、この仕組みを実装する一例です。

double TouchZone = 0.00015; // Sensitivity for level touch (adjust for instrument)

void OnTick()
{
   double price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   long chartID = ChartID();

   // Check retracement levels
   double ratios[] = {0.0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0};
   for(int i=0; i<ArraySize(ratios); i++)
   {
      string levelName = StringFormat("FIB_RET_%d", int(ratios[i]*1000));
      double levelPrice = ObjectGetDouble(chartID, levelName, OBJPROP_PRICE);

      if(MathAbs(price - levelPrice) <= TouchZone)
      {
         MarkFibonacciTouch(levelName, levelPrice);
         PlaySound("alert.wav"); // Optional: play audio alert
         UpdateTicker(StringFormat("Price touched %s (%.1f%%)", levelName, ratios[i]*100));
      }
   }

   // Check extension levels
   double extensions[] = {1.272, 1.618, 2.618};
   for(int i=0; i<ArraySize(extensions); i++)
   {
      string levelName = StringFormat("FIB_EXT_%d", int(extensions[i]*1000));
      double levelPrice = ObjectGetDouble(chartID, levelName, OBJPROP_PRICE);

      if(MathAbs(price - levelPrice) <= TouchZone)
      {
         MarkFibonacciTouch(levelName, levelPrice);
         PlaySound("alert.wav");
         UpdateTicker(StringFormat("Price touched %s (%.1f%%)", levelName, extensions[i]*100));
      }
   }
}

視覚的および聴覚的なフィードバック

MarkFibonacciTouch()関数は、価格がフィボナッチレベルに到達したポイントに矢印やその他のマーカーをチャート上へ配置するために使用できます。これにより、音声アラートを聞き逃した場合でも、トレーダーはそのイベントを即座に視覚的に認識できます。UpdateTicker()関数は、チャート上のヘッドライン表示を更新し、重要な市場イベントの履歴をリアルタイムで記録します。

void MarkFibonacciTouch(string baseName, double price)
{
   long chartID = ChartID();
   string markerName = baseName + "_TOUCH";
   ObjectCreate(chartID, markerName, OBJ_ARROW, 0, TimeCurrent(), price);
   ObjectSetInteger(chartID, markerName, OBJPROP_COLOR, clrYellow);
   ObjectSetInteger(chartID, markerName, OBJPROP_WIDTH, 2);
}

ティッカーヘッドラインの更新

ティッカーヘッドラインは、EAのリアルタイムステータスフィードとして機能します。価格がフィボナッチレベルに到達するたびに、ティッカーが更新され、ユーザーへ通知がおこなわれます。この仕組みにより、トレーダーはチャート全体を常に確認し続ける必要がなく、重要な価格の動きを確実に把握できるようになります。

void UpdateTicker(string text)
{
   long chartID = ChartID();
   ObjectSetString(chartID, "Ticker_Headline", OBJPROP_TEXT, text);
}

価格を能動的に追跡し、重要なフィボナッチレベルに対してアラートやマーカーで反応することで、EAは次のような明確な利点を提供します。

  • 機会損失の削減:複数のチャートを監視している場合でも、重要な市場イベントについて即時にフィードバックを受け取れるため、見逃しを減らせます。
  • 信頼性の向上:価格が既知のテクニカルレベルで反応していることを、視覚的および音声的な通知によって確認できます。
  • 作業効率の改善:自動アラートやティッカー更新により、常に手動でチャートを監視し続ける必要がなくなります。


可視化

強力な取引ツールは、自動化やアラート機能だけを提供すればよいわけではありません。情報を明確かつ直感的に伝えることも重要です。視覚的な分かりやすさは、特にチャート上に複数のラインやラベルが表示される場合に、トレーダーがより速く、より自信を持って判断する助けとなります。このセクションでは、画面上の各要素の可読性と使いやすさに焦点を当て、フィボナッチツールの外観を洗練させていきます。

複数のフィボナッチレベルを表示すると、チャートが煩雑になりやすくなります。これを防ぐために、0%、50%、100%といった主要レベルと、比較的重要度の低いレベルを区別できる一貫したカラースキームを使用します。たとえば、主要なリトレースメントラインにはゴールドを使用し、副次的なレベルには薄いグリーンやレッドを用いることで、統計的に重要な価格帯へ瞬時に注意を向けることができます。エクステンションレベルは、リトレースメントと混同しないよう、トマトレッドなどの対照的な色でスタイリングします。

フォントの種類やサイズも同様に重要です。Arial Blackのような太くて視認性の高いフォントを、適切なサイズ(例:10pt)で使用することで、背景色やチャートのズームレベルに関係なく、ラベルの可読性を保つことができます。過度なテキストや装飾を避けることで、プロフェッショナルで整理された見た目を維持できます。

ティッカーとラベルの表示

ティッカーヘッドラインは、リアルタイム更新の中心となる機能です。その効果を最大化するため、価格の動きや重要なテクニカル領域と重なりにくい、チャートの左下または右下に配置します。チャートの配色と十分にコントラストのあるフォントカラーや背景を選び、「input color TickerColor = clrLime;」のようなEA入力変数を用いて、ユーザーがティッカーの外観をカスタマイズできるようにするのも有効です。

ラベルについては、価格バーや他のラベルと大きく重ならないように注意します。新しいラベルごとに垂直オフセットを増やしたり、OBJPROP_YDISTANCEプロパティを使用して均等に間隔を空けたりすることで、視認性を確保できます。フィボナッチリトレースメントとエクステンションの両方を描画する場合は、ラベルを種類ごとにグループ化し、エクステンション用に色を変えたり接頭辞を付けたりすると、さらに分かりやすくなります。

以下に、ティッカーおよびラベル描画ロジックの例を示します。

// Drawing the ticker with configurable color and position
void DrawTicker(string text, color textColor = clrLime, int x = 10, int y = 400)
{
   long chartID = ChartID();
   string tickerName = "Ticker_Headline";
   ObjectCreate(chartID, tickerName, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(chartID, tickerName, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(chartID, tickerName, OBJPROP_YDISTANCE, y);
   ObjectSetString(chartID, tickerName, OBJPROP_TEXT, text);
   ObjectSetInteger(chartID, tickerName, OBJPROP_COLOR, textColor);
   ObjectSetInteger(chartID, tickerName, OBJPROP_FONTSIZE, 10);
   ObjectSetInteger(chartID, tickerName, OBJPROP_CORNER, CORNER_LEFT_LOWER);
}

// Enhanced label drawing with dynamic spacing and color
void DrawLevelLabel(string name, double price, string label, color c, int y_offset)
{
   long chartID = ChartID();
   ObjectCreate(chartID, name, OBJ_TEXT, 0, TimeCurrent(), price);
   ObjectSetString(chartID, name, OBJPROP_TEXT, label);
   ObjectSetInteger(chartID, name, OBJPROP_COLOR, c);
   ObjectSetInteger(chartID, name, OBJPROP_FONTSIZE, 10);
   ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y_offset);
}

これらの調整により、ティッカーと各レベルのラベルは非常に読みやすくなり、チャート全体のデザインとも視覚的に調和します。トレーダーは、どのレベルが最も重要であるかを即座に判断でき、混乱することなくライブ更新を追跡できるようになります。



テストと結果

テストは、フィボナッチツールが実際の市場環境下で期待どおりに動作することを確認するための重要な工程です。開発段階では気付きにくいバグや操作性の問題、計算の不正確さを発見する助けとなります。適切なテストは、トレーダーの信頼性を高めるだけでなく、ツールの継続的な改善にもつながります。以下の図は、EAをチャートに適用するプロセスと、何も操作していない初期状態のインターフェースを示しています。

実際の取引環境におけるフィボナッチツールの性能を評価するため、このEAはMetaTrader5上のライブチャートおよびデモチャートの両方に適用されました。異なる市場環境への対応力を確認する目的で、複数の通貨ペアや時間足が選択されました。EAを読み込んだ後、上昇トレンドおよび下降トレンドの両方を想定し、チャート上の入力フィールドにさまざまなスイングロー(A)とスイングハイ(B)を手動で入力しました。各ケースにおいて、EAがフィボナッチリトレースメントおよびエクステンションラインを正確な価格水準に描画しているかを重点的に確認しました。また、ラベルの可読性やスタイリングの一貫性についても、設計意図どおりであるかを慎重に検証しました。価格が推移する中で、描画されたレベルが実際の相場のスイングと適切に整合しているか、さらにズームレベルや銘柄を変更しても視覚的な安定性が保たれているかを確認しました。  別のテスト例を以下に示します。

単にフィボナッチレベルを描画するだけでなく、本ツールの使いやすさは、チャート上の操作要素との円滑な連携にも大きく依存します。点AおよびBの入力フィールド、[Draw Fib]ボタン、[Clear]ボタン、そしてティッカーヘッドラインといった各インターフェース要素は、体系的にテストされました。入力フィールドの値を入力または変更した後に[Draw Fib]を押すと、描画されるフィボナッチレベルが即座に更新されることを確認しました。Clear機能については、以前に描画されたすべてのオブジェクトが確実に削除され、チャートがクリーンな状態に戻ることを検証しました。エラー処理の評価として、意図的に無効な入力や空白の入力をおこなったところ、いずれの場合もEAは適切に動作し、エラーメッセージを表示する、または有効なデータが入力されるまで次の操作を防止するなど、安定した挙動を示しました。最後に、ユーザー操作後にティッカーがどれだけ迅速にステータスメッセージを更新するかを観察し、その応答性を評価しました。

2025.10.15 12:43:12.132 Interactive Fibonacci EA (Volatility 75 (1s) Index,M15) Alert: Touch: FIB_0.000 @ 4148.78000
2025.10.15 12:43:12.132 Interactive Fibonacci EA (Volatility 75 (1s) Index,M15) Touch: FIB_0.000 @ 4148.78000

ツールのインタラクティブ性を検証するため、価格が描画されたフィボナッチレベルに近づく、または到達した際の挙動に重点を置いてテストをおこないました。リアルタイムの相場変動中に、Bid価格がリトレースメントまたはエクステンションラインに設定されたタッチゾーンへ入った瞬間を、EAが正確に検出できているかを継続的に監視しました。その結果、該当するイベントが発生するたびに、チャート上にはマーカーが表示され、音声アラートが鳴り、同時にティッカーヘッドラインが簡潔なイベントメッセージで即座に更新されることが確認されました。

これにより、アラートおよびイベント通知システムが設計どおりに機能していることが実証され、トレーダーはチャートを常に注視し続けることなく、重要なテクニカル上の接触をタイムリーに把握できることが確認されました。



結論

インタラクティブフィボナッチツールは、自動化された分析、リアルタイムアラート、そしてユーザーフレンドリーなインターフェースを組み合わせることで、MetaTrader5におけるフィボナッチベースの取引を効率化します。綿密な設計、十分なテスト、そして明確な視覚的フィードバックを通じて、本ツールはトレーダーが重要な市場レベルを効率よく把握し、価格変動に迅速に対応できるよう支援します。柔軟で直感的な機能を備えたこのEAは、あらゆるトレーダーのツールキットにとって価値ある追加要素となります。

なお、本ツールは取引の実行や新規注文をおこなうものではありません。MetaTrader5におけるプライスアクション分析を支援する自動アシスタントとして機能し、教育目的で提供されています。トレーダーは、自身の取引戦略や他の市場確認手法と併用して活用することができます。

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

添付されたファイル |
知っておくべきMQL5ウィザードのテクニック(第85回):ストキャスティクスとFrAMAのパターンを用いたβ-VAEによる推論 知っておくべきMQL5ウィザードのテクニック(第85回):ストキャスティクスとFrAMAのパターンを用いたβ-VAEによる推論
本記事は、ストキャスティクスとフラクタル適応型移動平均の組み合わせを紹介した「第84回」の続きです。今回は推論フェーズでの学習結果の活用に焦点を移し、前回の記事で取り上げた低調なパターンの成績を改善できるかどうかを検討します。ストキャスティクスとFrAMAは、モメンタムとトレンドを補完する関係にあります。推論フェーズでの学習結果の活用では、以前に考察したβ変分オートエンコーダ(β-VAE)のアルゴリズムを再度利用します。また、いつものように、MQL5ウィザードとの統合を目的として設計されたカスタムシグナルクラスの実装も継続します。
MQL標準ライブラリエクスプローラー(第2回):ライブラリコンポーネントの接続 MQL標準ライブラリエクスプローラー(第2回):ライブラリコンポーネントの接続
本記事では、MQL5標準ライブラリを用いてエキスパートアドバイザー(EA)を効率的に構築するために、クラス構造をどのように読み解くべきかを整理します。標準ライブラリは高い拡張性と機能性を備えていますが、その全体像が見えにくく、体系的な指針がないまま複雑なツールキットを渡されたように感じることも少なくありません。そこで本記事では、実際の開発現場でクラスを確実に連携させるための、簡潔かつ再現性の高い統合手順を紹介します。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
MQL5で自己最適化エキスパートアドバイザーを構築する(第15回):線形系同定 MQL5で自己最適化エキスパートアドバイザーを構築する(第15回):線形系同定
取引戦略の改善は困難な課題です。その大きな理由の一つは、戦略がどこで、なぜ誤作動しているのかを私たち自身が十分に理解できていない点にあります。本記事では、制御理論の一分野である線形系同定を紹介します。線形帰還系(フィードバックシステム)は、データから学習することでシステムの誤差を特定し、その挙動を意図した結果へと導くことができます。これらの手法は、必ずしも完全に解釈可能な説明を与えるものではありませんが、制御系が存在しない状態と比べれば、はるかに有用です。本記事では、線形系同定がどのようにアルゴリズムトレーダーを支援し、取引アプリケーションを制御下に保つことができるのかを探っていきます。