English Русский Deutsch
preview
MQL5入門(第34回):MQL5のAPIとWebRequest関数の習得(VIII)

MQL5入門(第34回):MQL5のAPIとWebRequest関数の習得(VIII)

MetaTrader 5統合 |
21 0
ALGOYIN LTD
Israel Pelumi Abioye

はじめに

連載「MQL5入門」の第34回へようこそ。前回の記事では、MetaTrader 5からGoogle Generative AIへAPIリクエストを送信する際の基本について解説しました。具体的には、リクエストの構造、レスポンスの受信方法、そしてWebRequest関数の動作について確認しました。この時点では、チャートと直接やり取りすることはなく、AIとの通信はすべてコード上でおこなわれていました。 

本記事では、MetaTrader 5のチャート上に直接インタラクティブなコントロールパネルを作成します。これは実用面での大きな進歩と言えるでしょう。このパネルを使うことで、ユーザーはクエリを入力し、それをAIに送信し、結果をターミナル内で確認できるようになります。本連載ではまだMQL5のグラフィカルパネルについて扱っていないため、今回はパネルの作成と管理に必要な基本的な概念に焦点を当てます。ただし、グラフィカルインターフェース開発全体を深く掘り下げることはしません。本記事の主目的はMQL5のAPIおよびWebRequest関数にあるため、このプロジェクトに必要な範囲に限定してパネル機能を説明します。

今回はプロジェクトベースで進めます。個々のパネル要素を単独で学ぶのではなく、それぞれの機能が実際の目的の中でどのように実装されるのかを理解していきます。ボタン、入力フィールド、そして基本的なパネルの作成方法について説明します。次回の記事ではバックエンドロジックに焦点を当てます。具体的には、チャートイベントによる送信ボタンの処理方法、ユーザー入力の保存方法、そしてサーバーからの応答を処理・表示する方法について詳しく解説します。

図1:APIコントロールパネル


MQL5でコントロールパネルを作成する

このパートでは、MQL5のGUIのすべてを詳しく解説するわけではありません。本記事の目的はUI作成を極めることではなく、あくまでAPIおよびWebRequest関数に焦点を当てることにあります。ただし、本連載はプロジェクトベースで進行しており、これまでグラフィカルパネルを扱ってこなかったため、このプロジェクトを完成させるうえで必要となる基本的な考え方を明確にしておくことは非常に重要です。そのため、MQL5のグラフィカルコントロールの全範囲を扱うのではなく、シンプルで使いやすいコントロールパネルを構築するために必要な要素のみに絞って説明します。これには、チャート上にパネルを作成する方法、ボタンや入力フィールド、テキストラベルといった基本コンポーネントの配置、そしてそれらのコンポーネントがコードとどのように連携するかを理解することが含まれます。範囲を限定することで、細かすぎる部分にとらわれず、本質的な理解に集中できるようになります。

MQL5におけるコントロールパネルとは、MetaTrader 5のチャート上に直接表示されるグラフィカルユーザーインターフェースであり、ユーザーがエキスパートアドバイザー(EA)と視覚的にやり取りできるようにするものです。コントロールパネルを使うことで、入力パラメータだけに依存するのではなく、コマンドの送信、テキスト入力、リアルタイムでのフィードバック確認が可能になります。パネル上での操作はそれぞれイベントを発生させ、プログラムがそれに応じて反応することで、ツールはよりインタラクティブで使いやすいものになります。このプロジェクトでは、コントロールパネルがユーザーとAPIロジックをつなぐインターフェースとして機能します。同じパネル内でメッセージを入力し、ボタンで送信し、その結果として返される応答を確認できます。本記事の主な焦点を維持しながら、パネル設計とテキスト処理に必要な要素のみに絞って学ぶことで、この概念を今後のプロジェクトにも応用できるようになります。

例:
#include  <Controls\Dialog.mqh>
CAppDialog panel;

説明

MetaTrader 5でコントロールパネルを開発するには、まずDialogコントロールライブラリをインクルードする必要があります。これは、ダイアログ用のインクルードファイルをプログラムに追加することで実現できます。この行は、コンパイラに対してMQL5ディレクトリ内を検索し、Includeフォルダへ移動し、さらにControlsフォルダを開いてDialogファイルを読み込むよう指示する役割を果たします。このファイルには、チャート上にパネル、ウィンドウ、コンテナなどのダイアログベースのUI要素を生成するために必要な、あらかじめ定義されたクラスや関数が含まれています。このファイルが存在しない場合、プログラムはダイアログ関連のクラスを一切認識できないため、コントロールパネルを作成することはできません。

ダイアログファイルを読み込んだ後、CAppDialogクラスを使ってダイアログオブジェクトを宣言します。ここで宣言されるオブジェクトが、実際のコントロールパネルになります。言い換えれば、このオブジェクトはパネルそのものであり、チャート上のメインコンテナとして機能します。ユーザーインターフェースのレイアウト、操作性、そして将来的な制御機能はすべて、この単一のオブジェクトによって管理されます。このパネルはグローバルスコープで定義されるため、初期化時に生成され、EAがチャートから削除される際に適切に破棄することで、EAのライフサイクル全体を通して利用可能な状態が維持されます。

比喩的な説明

MQL5のインクルードシステムは、巨大な図書館のようなものだと考えられます。MQL5はMetaTrader 5の中核となるライブラリであり、その中には「Include」という専用セクションがあります。このセクションには、プログラマーがすべてをゼロから作る代わりに利用できる既製のユーティリティが用意されています。「Dialog」という名前の本は、「Controls」という棚に置かれています。このControlsは、Includeセクションの中にあるさらに小さなカテゴリです。実際にダイアログのインクルード行を書くということは、プログラムに対して「MQL5ライブラリに入り、Includeセクションへ進み、Controlsの棚を探し、Dialogという本を開いてその内容を読み込め」という指示を与えているのと同じです。

チャート上にウィンドウやパネル、インタラクティブな要素を作るための詳細な手順は、このDialogという本の中に書かれています。読んだことのない本の内容を使えないのと同じように、このファイルを読み込まなければ、プログラムはダイアログパネルがどのように動作するのかを理解できません。CAppDialogオブジェクトの宣言は、空の本棚を部屋に置くようなものです。この時点ではまだ何も入っておらず、「インターフェースの要素を収納するための枠組み」を用意しているにすぎません。

この本棚は後に部屋へ設置され、サイズが決められ、入力フィールドやボタン、テキスト表示などを配置するために使われます。コントロールパネルに関するすべての要素はこのダイアログオブジェクトの中に整理・格納され、それがパネル全体の中心的なコンテナとして機能します。今回のプロジェクトでは、あらゆる種類のアイテムを本棚に詰め込むことが目的ではありません。この特定の用途に必要な要素だけを配置することが目的です。つまり、過剰な情報を与えることなく、AI応答を処理して表示できるシンプルなインタラクティブパネルを構築することに焦点を当てています。

最後に、Dialogツールが利用可能になったことで、コントロールパネルそのものの構築を開始できます。これによりプログラムは、パネル構築の仕組みがどこにあり、それがチャート上でどのように表示されるかを正しく認識できるようになります。つまり、必要なツールが揃ったことで、もはや手探りで実装する必要はなくなったということです。

例:
#include  <Controls\Dialog.mqh>
CAppDialog panel;

int panel_x = 32;
int panel_y = 82;
int panel_w = 600;
int panel_h = 200;

ulong chart_ID = ChartID();
string panel_name = "Google Generative AI";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   panel.Create(chart_ID,panel_name,0,panel_x,panel_y,panel_w,panel_h);
   panel.Run();
//---
   return(INIT_SUCCEEDED);
  }

出力

図2:パネル

説明

トレンドライン、ラベル、長方形などのグラフ要素を作成するために特化して作成された独自の関数を使用してきたことを思い出してください。基本的なグラフィック要素に関しては、この方法は非常に有効です。しかし今回扱うのは、もはや単純なグラフオブジェクトではありません。私たちが扱っているのはコントロールパネルです。MetaTrader 5では、コントロールパネルは内部的にはグラフィカルコンポーネントで構成されていますが、その扱いは通常のグラフィックオブジェクトとは異なります。インタラクティブインターフェースを構築するためのより高度なフレームワークを提供するダイアログコントロールシステムには、これらのパネルも含まれています。そのため、単純なオブジェクト生成に頼るのではなく、レイアウト、インタラクション、イベント処理を自動的に管理するよう設計された、パネルに組み込まれた構築プロセスを利用します。

MetaTrader 5では、パネルの表示方法や表示場所を決定するためにいくつかの情報が必要になります。その中でも特に重要なのがチャートIDです。この値は、どのチャート上にパネルを関連付けるかを指定します。EAは複数のチャートと連携できるため、チャートIDを明示することで、パネルは正しいチャート上に表示されます。パネル名も重要な要素です。これはパネルを識別するための一意の識別子として機能し、MetaTrader 5がチャート上のパネルを識別して制御したり、他のグラフィカルオブジェクトと区別するために使用されます。分かりやすい名前を付けることは、コードの整理や保守性の向上にもつながります。

さらに、パネルはどのチャートウィンドウに表示されるべきかを認識している必要があります。この種のインタラクティブツールでは、メインチャートウィンドウに配置するのが一般的で便利です。位置の設定も重要です。チャート上でのパネル位置は、左上隅を基準としたピクセル単位で指定され、横方向と縦方向のオフセット値によって決まります。これにより、パネルを正確に配置しつつ、価格表示などの重要な情報と干渉しないように調整できます。

パネルの幅と高さはそのサイズを決定します。これらの値によって、テキスト入力欄、ボタン、ラベルなどの各コンポーネントに割り当てられるスペースが決まります。イズは個別の変数として管理されるため、コード内で容易に調整可能です。これにより、パネル作成ロジック自体を変更することなく、後からレイアウトを調整できます。サイズ変数がスケールを決定し、位置変数が配置を決定します。パネルは作成後もアクティブな状態である必要があります。アクティブ化されると、テキスト入力、ボタンクリック、イベントトリガーなどのユーザー入力の監視を開始します。この処理をおこなわなくてもパネル自体は表示されますが、ユーザーの操作には反応しません。

比喩的な説明

チャートを、情報を表示するための掲示板やポスターを貼る部屋の壁だと想像してください。そこに何かを設置するためにおこなう手続きが、panel.Create()に相当します。実際にポスターを壁に掛ける手順が、この関数の実行と同じです。パネル名と、それを表示するチャートは最初に決める必要があります。パネル名は後から識別できるようポスターにタイトルを付けるようなもので、チャートはどの壁に貼るかを示すものです。パネル名は、後で素早く識別できるようにポスターにタイトルを書くのと似ていますが、チャートはパネルをどの壁に取り付けるかを示すものです。

次に、パネルの水平方向と垂直方向のオフセットを指定して位置を決めます。一方は左からの距離、もう一方は上からの距離を示します。これは、ポスターが見やすく、かつ適切に配置されるように、壁の上で最適な位置を選ぶことに似ています。次に、パネルの幅と高さを指定することで、そのサイズが決まります。これらのパラメータによって、パネルが占める水平および垂直方向のスペース量が決定されます。これは、壁に貼るポスターのサイズを選ぶ際に、壁のスペースを占有しすぎず、必要な情報をすべて収められるようにするのと似ています。

panel.Run()は、スマートなポスターを起動し、ボタン、入力フォーム、スクロール可能なテキスト、情報表示などを有効化することに似ています。パネルが実行されていない場合、それは壁に貼られた何の機能も持たないポスターのように、ユーザーの操作には一切反応しません。プログラムを実行すると、EAをコンパイルしたり時間足を変更したりするたびに、チャート上からパネルが消えることに気づくでしょう。場合によっては、チャート自体が閉じられることもあります。これはMetaTrader 5がEAを再コンパイルまたは再読み込みする際、以前のEAインスタンスによって作成されたすべてのオブジェクトおよびコントロールを自動的に削除するためです。これは、パネルがデフォルトでEAのライフサイクルに結び付けられているために起こります。初期化解除を正しく処理するよう明示的に指示しない限り、パネルはEAとともに事実上削除されます。 

解決策として、OnDeinitイベントハンドラを使用し、初期化解除の理由を引数としてDestroy()関数を呼び出します。これにより、EAが一時停止または再読み込みされるたびにパネルが完全にクリーンアップされ、クラッシュを防ぐことができます。MetaTrader 5は、デストラクタメソッドに解除理由を渡すことで、パネルの削除を安全に処理できます。これによりチャートの安定性が維持され、予期しない動作を防ぐことができます。

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   panel.Destroy(reason);
  }


パネルにユーザー入力を追加する

この記事で開発しているプロジェクトでは、ユーザーがプロンプトを入力し、その内容がパネルから直接AIへ送信されることを思い出してください。ユーザーがこの部分にメッセージを入力できるようにするため、パネル内に入力ボックスを作成する手順を説明します。これにより、パネルはテキスト入力を受け取って記録できるようになり、そのテキストを用いてMQL5プログラムがAIと対話できるようになります。ただし、本記事の主な焦点は依然としてAPIリクエストおよびWebRequest関数の機能にあるため、MQL5における入力コントロールのすべてを網羅的に扱うことはしません。代わりに、ユーザー入力を効果的に取得し、それをパネルに統合するために必要な要素のみに絞って解説します。

例:
#include  <Controls\Dialog.mqh>
#include  <Controls\Edit.mqh>

CAppDialog panel;
CEdit input_box;

int panel_x = 32;
int panel_y = 82;
int panel_w = 600;
int panel_h = 200;

ulong chart_ID = ChartID();
string panel_name = "Google Generative AI";
string input_box_name = "INPUT BOX";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   panel.Create(chart_ID,panel_name,0,panel_x,panel_y,panel_w,panel_h);

   input_box.Create(chart_ID,input_box_name,0,5,55,0,0);
   input_box.Width(500);
   input_box.Height(30);
   panel.Add(input_box);

   panel.Run();

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   panel.Destroy(reason);
  }

出力

図3:テキスト入力


説明

最初の行は、MQL5に対してまずIncludeフォルダへ移動し、次にControlsサブディレクトリへ移動することで、パネル内の編集可能なテキストフィールドに関するすべての定義を含むファイルを読み込むよう指示しています。このファイルに含まれるコードがなければ、プログラムは入力ボックスをどのように扱うべきかを認識できません。これは、テキスト入力ボックスの作成および管理方法をアプリケーションに教えるのと同じです。

編集可能なテキストフィールドの変数は2行目で宣言されます。このテキストフィールドは変数名によって識別され、そのデータ型によって、「編集可能な入力コントロールとして扱う」ことがプログラムに示されます。この時点では入力ボックスはコード内で定義されているだけであり、まだパネルには追加されていないため、チャート上には表示されません。変数を宣言することは、input_boxという名前のコンテナを一つ作り、それを棚に置いて使用準備をしておくことに相当します。一方でインクルードファイルを読み込むことは、特定の種類のコンテナを作るための設計図を得るために図書館へ行くことに似ています。

入力ボックスの名前を表す文字列変数を定義することで、テキストフィールドにプログラム内部で使用できる識別情報を付与します。これは、1つのパネルに複数の操作ボタンや要素が存在する場合に特に重要であり、混乱を避ける役割を果たします。これは、収納ボックスにラベルを付けるのと同じようなもので、それぞれの箱に名前が付いていることで、適切な箱を簡単に識別し操作できるようになります。その後、入力ボックスを生成するコードによって、パネル上に実際の編集可能なテキストフィールドが表示されます。作成時には、表示対象のチャート、先ほど定義した名前、親オブジェクト(通常はパネル)、および初期のX座標とY座標などのパラメータを指定します。作成関数では、幅と高さは最初はゼロに設定されますが、その後さまざまなコマンドによって入力ボックスの視覚的なサイズを指定し、ユーザーが快適に入力できる十分な高さと幅に調整されます。

最後に、入力ボックスがパネルに追加されます。これはコンテナをより大きな表示領域に配置するのと同じです。入力ボックスはメモリ上には存在していますが、パネルに追加されるまでは表示されず、使用することもできません。これは、コンテナに名前を付け、サイズを定義し、それをテーブルの上に置いて初めて誰でも中に物を入れられるようになるのと同じです。

比喩的な説明

最初の行は、アプリケーションに対して大きなライブラリへアクセスし、「Include」という特別な棚を開き、「Controls」というセクションにある編集可能なコンテナ作成用の指示書を取得するよう命令していると考えられます。この指示書には入力ボックスの設計方法と処理方法が詳細に記載されています。この指示書がなければ、アプリケーションはテキストフィールドをどのように扱えばよいかを理解できません。2行目は、その指示書を使って新しいコンテナを作成することを司書に依頼しているようなものです。型を指定することで、そのコンテナがテキストを格納できる編集可能なボックスとして動作することが保証されます。また識別用の名前も与えられます。この時点では、それはまだ空の設計図に過ぎず、棚に置かれているだけで、メモリ上には存在するものの誰からも見えない状態です。

入力ボックス名用の文字列を別途生成することは、コンテナにラベルを貼るのと同じです。複数の箱がある場合でも、「どれがどれか」を明確に識別できるようになります。このラベルは、プログラムがコンテナとやり取りする際の識別手段として機能します。最終的にコンテナを棚に配置する段階が、入力ボックスが作成される段階です。どのチャートに属するかを指定し、ラベルを付け、パネルというメインの棚に配置し、必要に応じてX・Y位置を調整します。さらに、最初は小さくてもテキスト入力に十分なサイズへと調整されます。これは、本が問題なく収まるようにコンテナの形状を調整することに似ています。

最後に入力ボックスをパネルに追加することは、ラベル付きのコンテナを図書館のテーブル上の指定された棚に置くことに相当します。理論上存在していても、この操作を行うまではアクセスできません。棚に置かれた瞬間、それはユーザーが実際に中へ入力できる機能的なコンテナになります。

 

パネルにアクションボタンを追加する

次の段階は、コントロールパネル用のアクションボタンを作成することです。この場合、そのボタンは送信ボタンとして機能し、テキストフィールドに入力されたユーザーの内容をAPIへ転送します。アクションボタンは、ユーザーが処理の開始を明示的に行えるようにするという点で非常に重要です。このケースでは、送信ボタンを押すことで、ユーザーはAIが入力内容を処理する準備ができていることをソフトウェアに伝えることになります。

例:
#include  <Controls\Dialog.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Button.mqh>

CAppDialog panel;
CEdit input_box;
CButton send_button;
string send_button_name = "SEND BUTTON";

int panel_x = 32;
int panel_y = 82;
int panel_w = 600;
int panel_h = 200;

ulong chart_ID = ChartID();
string panel_name = "Google Generative AI";
string input_box_name = "INPUT BOX";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   panel.Create(chart_ID,panel_name,0,panel_x,panel_y,panel_w,panel_h);

   input_box.Create(chart_ID,input_box_name,0,5,55,0,0);
   input_box.Width(500);
   input_box.Height(30);
   panel.Add(input_box);

   send_button.Create(chart_ID,send_button_name,0,510,55,556,85);
   send_button.Text("Send");
   panel.Add(send_button);

   panel.Run();

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   panel.Destroy(reason);
  }

出力

図4:送信ボタン

説明

この最初のセクションでは、MetaTrader 5がパネル内のボタンを操作するために必要なすべての情報を含むファイルを読み込みます。このファイルを追加することで、クリック可能なボタンを作成するために必要な定義と動作(クリック処理、テキスト表示、ユーザー操作への応答など)へのアクセスがプログラムに与えられます。この手順がなければ、プログラムはボタンが何であり、どのように動作すべきかを理解することができません。続いて、ボタン用の変数が宣言されます。

この宣言は、ボタンコントロールを扱う準備ができていることを示し、そのボタンを識別し操作するための名前を付与します。この時点ではボタンはまだチャート上に表示されておらず、まだ実体のないコントロールにすぎません。ボタンの名前は文字列として定義されます。MetaTrader 5では、この名前が内部識別子として使用され、同じパネルやチャート上に存在する他のコントロールとボタンを区別する役割を果たします。これは単なる視覚的なラベルではなく、プラットフォームがバックグラウンドでボタンを個別に追跡し、管理するための重要な識別情報です。

ボタンが実際にチャート上に表示されるのは、作成処理の段階です。このとき、ボタンをどのチャートに配置するか、先ほど定義した名前、そしてパネル内での配置位置(座標)を指定します。これらの座標は、パネルの左上隅を基準としてボタンの位置を決定し、また全体のサイズ調整にも関係します。ボタンは入力ボックスの隣やパネル内の任意の位置に、レイアウトに応じて適切に配置できます。

ボタンには作成時にラベル(表示テキスト)が設定されます。このテキストが、ユーザーに対してボタンの機能を示します。この場合「送信」というラベルは、ボタンを押すと入力内容が送信されることをユーザーに示しています。テキストが設定された後、ボタンはパネルのインターフェースに追加されます。この時点でボタンはメモリ上には存在していますが、パネルに追加されるまでは表示も機能も持ちません。パネルに追加された後、ユーザーはボタンをクリックしてアクションを実行できるようになり、初めてインタラクティブな要素として機能します。

比喩的な説明

このプロセスは、図書館に専用の受付カウンターを設置することに似ています。まず、ボタン制御ファイルを追加することは、図書館の参考資料コーナーで「ボタンがどのように動作し、どのように見え、どのように操作されるか」を説明したマニュアルを手に入れることに相当します。このマニュアルがなければ、ボタンの作り方も動作も理解できません。「机の上にボタンを置く準備をする」というのは、ボタン変数を宣言することに似ています。この時点ではまだ実際に設置されておらず、単に「ここに置く予定がある」という準備段階です。

ボタンに名前を付けることは、図書館の引き出しにラベルを貼ることに似ています。そのラベルは利用者には直接見えないかもしれませんが、司書(プログラム)が必要なときに正しい引き出しを素早く識別するために重要です。同様に、ボタン名は複数のコントロールが存在する場合でも、それらを区別するための識別子になります。

ボタンを作成することは、ラベル付きのコンテナを棚に配置することに似ています。その配置場所、座標、サイズはすべて明確に決められ、必要な位置に正確に設置されます。このおかげで、ボタンは入力フィールドの隣など、適切な場所に整然と配置されます。ボタンを押すという操作は、ラベル付きのコンテナをテーブル上の指定された場所に配置し、ユーザーがそれにアクセスできるようにすることに似ています。設置場所や必要なスペースなどは、すべて自由に決められます。ボタンは、適切な位置に配置されていれば、ユーザーが簡単に操作できる理想的な場所にあります。


コントロールパネルにテキストを表示する

このセクションでは、コントロールパネル内でのテキスト表示、特にAIサーバーから返される応答の表示に焦点を当てます。ここではテキスト表示の基本的な動作のみを扱う点に注意してください。MetaTrader 5のコントロールパネルは「\n」のような改行コードを正しく解釈できないため、長い応答の処理やスクロール表示については次の記事で扱います。パネル内でテキストを表示するには、ラベルオブジェクトを使用します。このラベルは、サーバーからの応答を表示するためのコンテナとして機能します。ラベルの名前、パネル内での位置、幅、高さ、そして属するチャートは、ラベル変数を最初に宣言する段階で指定されます。サーバーからの応答は、ラベルが作成された後、そのラベルのテキスト属性に割り当てられ、その後パネルに追加することで画面上に表示されます。

この構成により、AIの応答をパネル内に直接表示でき、ユーザーに即時の視覚的フィードバックを提供できます。このステップは重要です。現時点では長い応答は途中で切り詰められてしまいますが、パネル内に動的なコンテンツを表示するという基本的な考え方を導入しているからです。情報の欠落を防ぐため、サーバーからの応答が長くなりすぎる場合の対処方法、すなわちテキストを自動的にスクロールさせる仕組みについては次の記事で説明します。

例:

#include  <Controls\Dialog.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>

CAppDialog panel;
CEdit input_box;
CButton send_button;
string send_button_name = "SEND BUTTON";

CLabel  response_display;
string response_text_name = "AI RESPONSE";

int panel_x = 32;
int panel_y = 82;
int panel_w = 600;
int panel_h = 200;

ulong chart_ID = ChartID();
string panel_name = "Google Generative AI";
string input_box_name = "INPUT BOX";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   panel.Create(chart_ID,panel_name,0,panel_x,panel_y,panel_w,panel_h);

   input_box.Create(chart_ID,input_box_name,0,5,55,0,0);
   input_box.Width(500);
   input_box.Height(30);
   panel.Add(input_box);
   
   send_button.Create(chart_ID,send_button_name,0,510,55,556,85);
   send_button.Text("Send");
   panel.Add(send_button);
   
   response_display.Create(0, "PanelText", 0, 0, 0, 0, 0);
   response_display.Text("THIS WILL BE THE SERVER RESPONSE......");
   panel.Add(response_display);   
   
   panel.Run();

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   panel.Destroy(reason);
  }

出力

図5:ラベル

説明

ラベルの定義は、まずインクルード行によってコントロールフォルダから読み込まれるファイルを通じておこなわれます。このファイルを使用することで、パネル内にテキストを表示するために用いるラベルオブジェクトを生成し、管理するために必要なすべてのコードへプログラムがアクセスできるようになります。このファイルが存在しない場合、プログラムはラベルを扱うことができません。これは、テキストを保存するためだけに設計された特殊なコンテナの設計図を手に入れるようなものだと言えます。

CLabel変数の宣言によって、特定のラベルオブジェクトであるresponse_displayが生成されます。この変数はラベルとして機能し、テキストコンテンツを保存し、表示するためのコンテナを準備する意図があることをプログラムに示します。この時点ではラベルはまだチャート上には表示されていません。現時点では、メモリ上に用意された参照にすぎず、パネルに配置される準備が整っている状態です。本棚の比喩で言えば、ラベル付きの空の容器が保管場所に用意されており、特定の棚に配置されるのを待っている状態に相当します。

このラベルは、その名前を表す文字列変数によって識別されます。これは重要なポイントであり、ソフトウェアが後からこの特定のテキストコンテナを正しく参照し、利用できるようにするためのものです。これは、図書館内の特定の容器に名前を付けることで、どの容器にデータを入れるのか、あるいは取り出すのかを明確にするのと似ています。パネル上のラベルは、作成関数によって初めて具体的な形を持ちます。このとき、ラベルが属するチャート、名前、親パネル、初期サイズおよび位置が指定されます。この例では、配置とサイズは最初にゼロとして設定され、その後必要に応じて調整できます。これは本棚の例で言えば、ラベルを付けた空の容器を、まだ中身が入っていない状態のまま指定された棚に置くようなものです。

ラベルの内容は、テキスト関数によって割り当てられます。この場合、プレースホルダーメッセージで示されているように、サーバーからの応答がここに表示されることになります。これは、容器の中にサンプルメモを入れて、外から見たときに中身が何であるかを理解できるようにするのと似ています。最後に、ラベルをパネルに追加することで表示と操作が可能になります。ラベルはメモリ上には存在していたものの、表示も利用もできない状態でした。パネルに追加することで初めて可視化され、図書館でラベル付きの容器を棚に並べて利用可能にするのと同じ状態になります。

 

結論

本記事では、MetaTrader 5においてインタラクティブなコントロールパネルを作成し、それをAPIリクエストと連携させるための基礎的な知識に重点を置いて解説しました。まず、パネルの基本的な考え方や、通常のチャートオブジェクトとの違いについて理解を深めました。その上で、コントロールライブラリを用いてパネルを作成・管理する方法について確認しました。さらに、ユーザーが実際に操作できるパネルを構築するために、アクションボタンや入力ボックスといった重要なUIコンポーネントを追加する方法についても説明しました。現時点でパネルはすでに完全に構築され、動作可能な状態にありますが、まだバックエンドのロジックやAPIとの接続はおこなわれていません。次の記事では、チャートイベントの処理、ボタンクリックの検出と記録、APIクエリの送信、そしてパネル内でのサーバー応答の表示方法について詳しく解説します。

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

添付されたファイル |
初心者からエキスパートへ:市場の不規則性への対処 初心者からエキスパートへ:市場の不規則性への対処
市場のルールは常に変化しており、かつて有効だった原則も、時間の経過とともにその効力を徐々に失っていきます。過去に機能していたものが、現在では一貫して機能しなくなることがあります。本記事では、このような市場の不確実性に対応するために、「確率レンジ(ゾーン)」という考え方に焦点を当てます。さらに、MQL5を用いて、特に値動きが不安定な相場環境でも機能するアルゴリズムの構築方法を解説していきます。ディスカッションにぜひご参加ください。
MQL5でカスタムインジケーターを作成する(第4回):デュアルオシレーター搭載Smart WaveTrend Crossover MQL5でカスタムインジケーターを作成する(第4回):デュアルオシレーター搭載Smart WaveTrend Crossover
本記事では、MQL5で「Smart WaveTrend Crossover」と呼ばれるカスタムインジケーターを開発します。このインジケーターは、2つのWaveTrendオシレーターを活用しており、1つはクロスオーバーシグナルの生成、もう1つはトレンドフィルタリングを目的としています。チャネル長、平均期間、移動平均期間といった各種パラメータはカスタマイズ可能です。また、トレンド方向に応じてローソク足を色分け表示し、クロスオーバー時には買いや売りの矢印シグナルを表示します。さらに、トレンド確認の有効化オプションや、色やオフセットなどのビジュアル要素も調整可能です。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
MQL5入門(第33回):MQL5のAPIとWebRequest関数の習得(VII) MQL5入門(第33回):MQL5のAPIとWebRequest関数の習得(VII)
本記事では、MQL5を使用してGoogle Generative AI APIをMetaTrader 5に統合する方法を解説します。APIリクエストの構築、サーバー応答の処理、AI生成コンテンツの抽出、レート制限の管理、そして結果をテキストファイルに保存して簡単に参照できるようにする方法を学びます。