English Deutsch
preview
MQL5で取引管理者パネルを作成する(第11回):最新機能通信インターフェース(I)

MQL5で取引管理者パネルを作成する(第11回):最新機能通信インターフェース(I)

MetaTrader 5 |
23 0
Clemence Benjamin
Clemence Benjamin

内容


はじめに

MetaTrader 5端末は、より効率的でコンパクトな取引作業環境へと急速に進化しています。最近のチャット機能の統合により、トレーダーは端末内でMQL5フレンドと個別にメッセージを送受信したり、グループに参加したり、チャンネルを購読したりできるようになりました。これは、MQL5 APIを通じてコミュニティを安全に繋ぐための大きな一歩です。

これらの機能を使用するには、ユーザーは端末内でMQL5アカウントにログインしており、フレンドがオンラインで、アクティブなチャンネルやグループに参加している必要があります。これらのコミュニティは、取引の洞察を得るための貴重な情報源であり、専門家がアイデア、スクリーンショット、ライブディスカッションを頻繁に共有します。しかも、すべてチャート表示を妨げずにシームレスに統合されています。

しかし、現在の制限として、コミュニケーションはMQL5エコシステム内に限定されています。外部のソーシャルプラットフォームとMetaTrader 5を橋渡しする機能はまだありません。幸いにも、端末のAPIとWebRequest機能を組み合わせることで、TelegramやWhatsAppなどの外部コミュニケーションサーバーと接続することが可能です。

取引管理者パネルは、この機能を拡張し、現代のメッセージングアプリに触発されたユーザーフレンドリーなコミュニケーションパネルを導入することを目的としています。従来の電卓のようなプロトタイプから、より直感的で洗練されたデザインへと移行しています。元の基盤は初期テストには適していましたが、今後のバージョンでは双方向通信の完全サポートが実現されます

もはや管理者が一方的にメッセージを送るだけではなく、受信者も返信できるようになります。この変更には、外部通信対象を管理するための適切な連絡先システムの実装と、ユニークなチャットIDの利用が必要です。

下の画像は、MetaTrader 5取引端末からMQL5コミュニティとチャットにアクセスする方法を示しています。ユーザーアカウントのアイコンは通常、端末画面の右上付近にあり、画像でハイライトされています。

MQL5アカウント

MetaTrader 5端末からMQL5コミュニティとチャットにアクセスする

MQL5アカウントをすでに追加している場合は、通常、端末の起動操作ログに、MQL5コミュニティアカウントとチャットがアクティブ化されていることを示す概要が表示されます。以下は2025年4月16日の端末起動ログです。

2025.04.16 08:44:10.343 Network '40538052': previous successful authorization performed from 197.221.254.8 on 2025.04.16 03:48:48
2025.04.16 08:44:10.461 Experts expert New_Admin_Panel- (Volatility 75 (1s) Index.0,M5) loaded successfully
2025.04.16 08:44:12.323 Experts expert New_Admin_Panel- (Volatility 10 (1s) Index.0,M1) loaded successfully
2025.04.16 08:44:12.324 Network '40538052': terminal synchronized with Deriv.com Limited: 0 positions, 0 orders, 150 symbols, 0 spreads
2025.04.16 08:44:12.324 Network '40538052': trading has been enabled - hedging mode
2025.04.16 08:44:14.354 Trades  use MetaTrader VPS Hosting Service to speed up the execution: 2.26 ms via 'MQL5 Frankfurt FRA8 01' instead of 212.79 ms
2025.04.16 08:44:14.776 MQL5.community  activated for 'Billionaire2024', balance: 
0.00 
2025.04.16 08:44:15.826 MQL5.chats      activated for 'Billionaire2024'

以下では、実際のデザインに踏み込み、コミュニケーションパネルの次の進化をどのように実現するかを概説します。


概要

今回のコード整理による改善のおかげで、プログラムの拡張性がより明確になってきました。これにより、大規模プロジェクトの他のコンポーネントに気を取られることなく、コミュニケーションパネルに専念できるようになっています。このモジュラー方式により、創造性と生産性を最大限に発揮できる環境が整いました。

本日は、コミュニケーションパネルのさらなる進化に向けて重要な一歩を踏み出します。これは、以前管理者ホームインターフェースの改善と簡素化をおこなったときと同じ方向性の進展です。現在のコミュニケーションパネルは、視覚的な魅力に欠け、ユーザーフレンドリーとは言い難いため、改善と強化の作業が必要です。

今回のバージョンでもMQL5標準ライブラリを活用しますが、同時に私たちの要件に合わせた新しいカスタムクラスも導入します。進め方としては、まずインターフェースの概念設計をおこない、コアコンポーネントを特定し、それぞれの役割を明確にします。その後、実際のコーディングと実装フェーズに移行します。


人気のメッセージングアプリに基づくインターフェースの特徴

自分たちのインターフェース設計に入る前に、まず今日の人気メッセージングアプリで使われている一般的なインターフェースの特徴を確認してみましょう。これらの共通デザインパターンを分析することで、インスピレーションを得て、自分たちの目標に沿った機能の追加、削除、調整に役立てることができます。

以下に、私がまとめた10の主要な特徴を挙げます。これらを確認した後、実際のアプリでこれらの要素がどのように組み合わさっているかを示す参考画像を見ていきます。

1. クリーンでミニマリストなデザイン

  • フラットUIとモダンなカラースキーム(ライト/ダークモード)
  • 一貫した余白と整列
  • 丸みを帯びたメッセージバブル、スムーズなトランジション
  • シンプルなアイコン(クリップ、絵文字、マイクなど)と直感的な配置

2. メッセージスレッドエリア(メインチャットウィンドウ)

  • メッセージ履歴をスクロール表示
  • メッセージのタイムスタンプ
  • 送信者ごとのメッセージグループ化
  • 配信済み、既読、編集済み、ピン留めなどの視覚フィードバック
  • 画像、動画、音声、ファイルなどのマルチメディア対応

 3. サイドバー:連絡先またはチャンネル

  • ユーザー、グループ、チャンネルのリスト
  • オンラインステータス表示(緑点、最終アクセス時間)
  • 最近のメッセージのプレビュー
  • 検索・フィルター機能

4. 上部ナビゲーションバー

  • チャットタイトルや連絡先名
  • ユーザーアバターやグループアイコン
  • 設定/オプションのドロップダウン(ミュート、アーカイブ、削除など)
  • ユーザーやグループのプロフィール確認ボタン

 5. メッセージ入力エリア(下部パネル)

  • プレースホルダー付きテキスト入力ボックス(「メッセージを入力…」)
  • ボタン:
  • 送信(紙飛行機アイコン)
  • ファイル添付(クリップアイコン)
  • 絵文字選択(ニコニコマーク)
  • 音声入力(マイクアイコン)
  • キーボードショートカット(Enterで送信、Shift+Enterで改行)

6. メディア・添付ファイルプレビュー

  • 画像、動画、ファイルのインラインプレビュー
  • 表示の展開/折りたたみ
  • ドラッグ&ドロップによるアップロード対応

 7. 通知とアラート

  • アプリ内通知およびシステム通知
  • サウンド/バイブレーションの切り替え
  • メンション時のハイライト(@ユーザー名)
  • 未読メッセージのポップアップやバッジ表示(未読数)

 8. デバイス間の同期

  • Web、モバイル、デスクトップアプリ間でリアルタイム同期
  • セッションをまたいだチャット履歴の保持
  • オフラインモード対応(オンライン復帰時に自動同期)

9. セキュリティとプライバシー

  • エンドツーエンド暗号化(例:WhatsApp)
  • メッセージタイマー/自動削除(Telegram)
  • 2FAや安全なログインセッション

10. 拡張性とボット

  • ボットや自動化のサポート
  • 他ツール(カレンダー、タスク管理、取引端末)との統合
  • 豊富なAPIとWebSocketのサポート
下の画像では、先ほど挙げたポイントの一部を視覚的に確認できます。以前、二要素認証の概念を紹介した際に、専用のTelegramボットを通して認証コードを受け取った例を覚えているでしょう。チャット履歴の一部はまだ利用可能ですが、今回の画像ではメッセージングインターフェースの主要コンポーネントに焦点を当てています。私の観察とTelegramのレイアウトに基づいて、注目すべきセクションをいくつかマークしました。
  • メッセージ入力エリアは赤枠で囲まれている
  • チャット履歴セクションは青枠で囲まれている
  • 上部部分は緑枠で囲まれ、連絡先名、検索ボタン、三点メニューを含む
下の画像を参照して、視覚的に確認してください。

Telegramチャットからの参考画像

もうひとつの参考例として、MQL5メッセージングインターフェースがあります。これは、以前私が作成したMQL5チャンネルからキャプチャしたものです。下のレイアウトをご覧ください。先ほどのTelegramの画像と比較すると、デザインにいくつかの共通点や微妙な差異が見られます。この一般的なメッセージングインターフェースのレイアウトからも、有益なインサイトを得ることができます。

MQL5メッセージングリファレンス

参考として利用できる例は、ほぼ無限に存在します。メールの返信ボタンや追加機能を備えたメッセージングシステム、チャットボットのインターフェースなど、多くの例は似たようなレイアウトを採用しています。これらはすべて、通信インターフェースに必要な要素を理解する上で貴重な参考になります。これらのリファレンスを踏まえ、次に進む段階では、取引向けコミュニケーションパネルに最も適したデザインを検討します。その際には、パネルの制約条件や、扱う通信の種類も考慮に入れる必要があります。


設計とコード実装

ここから、新しいパネルへの移行が始まります。しかしその前に、取引管理者が他のトレーダーとやり取りする際の主要なコミュニケーションニーズを整理する必要があります。主なニーズは以下の通りです。

1. トレーダーへの特別指示

メッセージ作成から送信までの時間を短縮するため、クイックメッセージボタンのアイデアは既に実装済みです。これにより、重要な情報をトレーダーが迅速に受け取れるようになっています。 しかし、管理者はカスタムメッセージを送信する必要もあるため、メッセージ入力エリアはその用途に対応する設計になっています。今回、クイックメッセージのアクセス方法も改善予定です。

2. 一方向通信と双方向通信の比較

従来は、管理者のみがメッセージを送信できる一方向通信が基本でした。しかし、取引コミュニティからの返信が有用なケースもあります。新しいパネル設計では、このような双方向通信に対応できる仕組みを検討する必要があります。

3. スクリーンショットの共有と視覚的分析

画像の共有、特に注釈付きチャートやスクリーンショットの活用はますます重要になっています。MQL5端末には、スクリーンショットを直接MQL5コミュニティのチャートにアップロードするツールが既に用意されています。私たちは、スクリーンショットを撮影し、メッセージに添付して迅速に共有できるボタンを組み込みたいと考えています。これにより、管理者は取引の洞察をより効果的に視覚的に伝えることができます。

4. 連絡先管理

Telegramのように、1対1チャット、チャンネル、グループなど複数の通信モードがある場合、ユニークなチャットIDを使用して連絡先を割り当て、個別およびグループのカテゴリに整理できます。これに伴い、アプリ内で連絡先の保存と取得方法を適切に管理する仕組みも必要です。

以下は、概念設計の例です。ここからコード実装に進むことができます。

新デザインコミュニケーションパネル

新デザイン:コミュニケーションパネル

現在の優先事項は、インターフェースデザインの洗練です。この記事の次のセクションでは、この基盤をもとに新機能の追加やユーザー体験のさらなる向上を進めていきます。

MQL5標準ライブラリには、インターフェース設計に活用できる複数の#includeディレクティブが用意されています。以下の表では、関連するヘッダファイルと、プロジェクト内での想定用途を示します。

ヘッダファイル 用途
Dialog.mqh ダイアログウィンドウの基本クラスを提供し、UIコンポーネントの管理、イベント処理、描画をおこないます。
Panel.mqh コントロールを視覚的にグループ化・配置するために使用されます。メインエリアや作成パネルなどのレイアウトセクションを作成可能です。
Label.mqh 入力フィールドのラベルや「Username」「Chat ID」などのセクションヘッダーなど、編集不可のテキストを表示します。
Edit.mqh メッセージ作成やTelegram認証情報入力など、ユーザー入力用の編集可能なテキストボックスを提供します。
Button.mqh 送信、ファイル添付、スクリーンショット、テーマ切替など、ユーザー操作用のクリック可能なボタンを作成します。
VirtualKeys.mqh メッセージ入力フィールドでEnterキーの押下を検出するなど、キーボード入力イベントを処理する定数を定義します。
Telegram.mqh Telegram Bot APIを通じたメッセージ送信のロジックを管理。URLリクエストやHTTP通信を扱います。

CommunicationsDialogクラスヘッダ(CommunicationsDialog.mqh)

このセクションでは、コードの動作を分解して説明し、集中度の高い再利用可能な部品へと整理する利点を強調します。各パネルのロジックを個別のヘッダファイルに切り出し(マクロ定義、列挙体、クラス宣言、メソッド実装を含む)ことで、メインプログラムはシンプルかつ保守しやすくなり、複数のEA間で共有しやすくなります。これらのヘッダをインクルードすれば、GUIの内部的な詳細を気にする必要はなく、公開されたインターフェースを呼び出すだけで十分です。それでは、コミュニケーションパネルの改善点をステップごとに見ていきましょう。

クラスヘッダ構造

ファイルの一番上では、複数のインクルードを防ぎ、必要な依存関係をすべて取り込みます。 

  • インクルード:MQL5標準のUIコントロール(Dialog、Panel、Edit、Button、Label)に加え、キーコード用のVirtualKeys、そしてカスタムのTelegram.mqhを含みます。

  • 定数と列挙型:パネルのジオメトリ用マクロ、UIパディング、さらにメッセージ種別(OUTGOING、INCOMING、SYSTEM)とステータス(SENT、FAILED)の2つの列挙体を定義します。

  • クラス定義:CCommunicationDialogはCAppDialogを継承し、以下を宣言します。

    1. privateメンバー:パネル、ボタン、ラベル、エディット、ダークモードフラグ
    2. publicメソッド:コンストラクタ、InitCredentials、CreatePanel、イベント処理(OnEvent)、アクションハンドラ(OnSendMessageなど)
    3. privateヘルパー:各UI領域の構築、テーマ適用、履歴の入出力、メッセージ整形

#ifndef COMMUNICATIONS_MQH
#define COMMUNICATIONS_MQH

#include <Controls\Dialog.mqh>
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <VirtualKeys.mqh>
#include "Telegram.mqh"

#define COMM_PANEL_LEFT    80enum ENUM_UI_CONSTANTS { UI_INDENT=10, UI_GAP=5, … };
enum ENUM_MESSAGE_TYPE   { MSG_OUTGOING, MSG_INCOMING, MSG_SYSTEM };
enum ENUM_MESSAGE_STATUS { STATUS_SENT,   STATUS_FAILED };

class CCommunicationDialog : public CAppDialog
{
private:
   CPanel  m_mainPanel, m_composePanel;
   CButton m_toggleSidebar, m_sendButton, m_attachButton, m_screenshotButton;
   CLabel  m_usernameLabel, m_chatIdLabel, m_tokenLabel, m_mainUserLabel;
   CEdit   m_usernameInput, m_chatIdInput, m_tokenInput, m_messageThread, m_messageInput;
   bool    m_isDarkMode;

public:
   CCommunicationDialog():m_isDarkMode(false){}
   bool CreatePanel(...);
   virtual bool OnEvent(...);
   void OnSendMessage();
   …  
private:
   bool CreateSidebar();
   bool CreateMainContent();
   bool CreateComposeArea();
   void ApplyTheme();
   void LoadChatHistory(string);
   void SaveMessageToHistory(...);
   string FormatMessage(...);
   void AddMessageToHistory(...);
};
#endif // COMMUNICATIONS_MQH

1. CreatePanel:ダイアログの組み立て

このメソッドはダイアログ全体のセットアップを統括します。最初に基本的なダイアログ作成を呼び出し、その後、サイドバー、メインメッセージ表示領域、作成エリアを順番に構築します。各ステップで成功を確認し、いずれかが失敗した場合は直ちにダイアログを破棄します。すべての領域が正しく配置されたら、現在のテーマを適用し、保存された履歴を読み込み、チャートを再描画して完全なインターフェースを提示します。

bool CCommunicationDialog::CreatePanel(const long chart,const string name,const int subwin,
                                       const int x1,const int y1,const int x2,const int y2)
{
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) return(false);
   if(!CreateSidebar())     { Destroy(); return(false); }
   if(!CreateMainContent()) { Destroy(); return(false); }

   Add(m_mainPanel);
   Add(m_messageThread);
   Add(m_mainUserLabel);

   if(!CreateComposeArea()){ Destroy(); return(false); }
   Add(m_composePanel);
   Add(m_messageInput);
   Add(m_screenshotButton);
   Add(m_attachButton);
   Add(m_sendButton);

   ApplyTheme();
   LoadChatHistory(m_chatIdInput.Text());
   ChartRedraw();
   return(true);
}

2. CreateSidebar:認証情報とテーマの切り替え

サイドバーには、最上部にテーマ切り替えボタンを配置し、その下に3つのラベル付き入力フィールド(ユーザー名、チャットID、ボットトークン)を設置します。これらの入力欄により、Telegramの認証情報を手動で入力できます。現時点では手動入力ですが、このパネルは将来的にコンタクト管理システムへと発展させる基盤となり、ユーザーがチャットIDを毎回入力するのではなく、保存済みのIDから選択できるようにすることを目指しています。

bool CCommunicationDialog::CreateSidebar()
{
   int x=UI_INDENT, y=UI_INDENT, w=UI_SIDEBAR_WIDTH-2*UI_INDENT, h=16;

   m_toggleSidebar.Create(m_chart_id,m_name+"_Toggle",m_subwin,x,y,x+h,y+h);
   m_toggleSidebar.Text("🌙"); Add(m_toggleSidebar);
   y+=h+UI_GAP;

   m_usernameLabel.Create(...); m_usernameLabel.Text("Username:");
   m_usernameInput.Create(...); Add(m_usernameLabel); Add(m_usernameInput);
   y+=h+UI_GAP;

   m_chatIdLabel.Create(...); m_chatIdLabel.Text("Chat ID:");
   m_chatIdInput.Create(...); Add(m_chatIdLabel); Add(m_chatIdInput);
   y+=h+UI_GAP;

   m_tokenLabel.Create(...); m_tokenLabel.Text("Bot Token:");
   m_tokenInput.Create(...); Add(m_tokenLabel); Add(m_tokenInput);

   return(true);
}

3. CreateMainContent:メッセージ履歴表示

このセクションでは、中央パネルとその読み取り専用の編集コントロールを初期化します。ここには会話スレッドが表示されます。上部には現在のユーザー名を示すラベルが配置されます。ユーザーは過去のメッセージを直接編集することはできず、新しいメッセージはプログラム的に追記されます。そのため、チャット履歴が1行ごとに整理されたクリーンなビューが提供されます。

bool CCommunicationDialog::CreateMainContent()
{
   int x1=UI_SIDEBAR_WIDTH, y1=0;
   int x2=ClientAreaWidth(), y2=ClientAreaHeight()-UI_COMPOSE_HEIGHT;

   m_mainPanel.Create(...);
   m_messageThread.Create(...);
   m_messageThread.ReadOnly(true);
   m_messageThread.FontSize(9);
   m_messageThread.TextAlign(ALIGN_LEFT);

   m_mainUserLabel.Create(...);
   m_mainUserLabel.Text(m_usernameInput.Text());
   return(true);
}

4. CreateComposeArea:入力とアクションボタン

ここでは、ユーザーが新しいメッセージを入力するための下部作成エリアを構築します。プレースホルダー付きのテキスト入力フィールドと、スクリーンショット、ファイル添付、送信の3つのアクションボタンが含まれます。入力フィールドにはヒントテキストと控えめな色が初期設定されており、ユーザーがアクションボタンを実行する前にメッセージを入力するよう促します。

bool CCommunicationDialog::CreateComposeArea()
{
   int caW=ClientAreaWidth(), caH=ClientAreaHeight();
   int y1=caH-UI_COMPOSE_HEIGHT, y2=caH;
   int x1=UI_SIDEBAR_WIDTH, x2=caW;

   m_composePanel.Create(...);

   m_screenshotButton.Create(...); m_screenshotButton.Text(StringFormat("%c",58));
   m_attachButton.    Create(...); m_attachButton.   Text(StringFormat("%c",49));
   m_sendButton.      Create(...); m_sendButton.     Text(StringFormat("%c",216));

   m_messageInput.Create(...);
   m_messageInput.Text("Type here...");
   m_messageInput.Color(clrGray);

   return(true);
}

5. OnCaptureScreenshot:GIFスナップショット

スクリーンショットボタンがクリックされると、このメソッドは現在のチャートをタイムスタンプ付きのGIFファイルとしてキャプチャし、MQL5のFilesフォルダに保存します。その後、成功または失敗を示すシステム風メッセージをログに出力します。これにより、トレーダーはチャートのスナップショットを迅速に取得し、Telegramを通じて直接共有できるようになります。

void CCommunicationDialog::OnCaptureScreenshot()
{
   datetime ts=TimeCurrent();
   string tstr=TimeToString(ts, TIME_DATE|TIME_MINUTES|TIME_SECONDS);
   StringReplace(tstr,":","");  

   string path=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\";
   string fn=path+"shot_"+tstr+".gif";

   bool ok=ChartScreenShot(m_chart_id,fn,0,0);
   m_messageThread.Text(
      FormatMessage(ok ? "Screenshot saved: "+fn : "Screenshot failed",
                    MSG_SYSTEM, ok ? STATUS_SENT : STATUS_FAILED, ts));
   ChartRedraw();
}

6. OnSendMessage:送信と履歴

このハンドラは、メッセージ入力が空でないこと、および認証情報が提供されていることを検証します。その後、Telegram送信関数を呼び出し、結果を履歴ファイルに記録し、新しいメッセージをチェックマークまたはバツ印のアイコン付きでスレッド表示に追加します。最後に、入力フィールドをプレースホルダー状態にリセットし、再描画をトリガーします。

void CCommunicationDialog::OnSendMessage()
{
   string txt=m_messageInput.Text();
   if(txt==""||txt=="Type here...") { /* show error */ return; }

   string chatId=m_chatIdInput.Text(), token=m_tokenInput.Text();
   if(chatId==""||token=="")        { /* show error */ return; }

   datetime ts=TimeCurrent();
   bool sent = SendMessageToTelegram(txt, chatId, token);
   SaveMessageToHistory(chatId, ts, MSG_OUTGOING,
                        sent ? STATUS_SENT : STATUS_FAILED, txt);

   m_messageThread.Text(FormatMessage(txt, MSG_OUTGOING,
                                     sent ? STATUS_SENT : STATUS_FAILED, ts));

   m_messageInput.Text("Type here...");
   m_messageInput.Color(clrGray);
   ChartRedraw();
}

7. テーマと書式設定ヘルパー

補助メソッドは、動的なテーマ変更やメッセージの整形を処理します。ApplyThemeはダークモード/ライトモードに応じて背景色とテキスト色を切り替えます。FormatMessageはユーザーまたはシステムのプレフィックスと送信/失敗アイコンを付与し、タイムスタンプ付きの行を生成します。履歴の入出力メソッドは、チャットごとのデータファイルに会話を保存および読み込みし、セッションをまたいだ永続性を確保します。

void CCommunicationDialog::ApplyTheme()
{
   color bg = m_isDarkMode ? (color)0x2E2E35 : clrWhite;
   color txt= m_isDarkMode ? clrWhite       : clrBlack;
   m_mainPanel.ColorBackground(bg);
   m_composePanel.ColorBackground(bg);
   m_messageThread.Color(txt);
   m_messageInput.Color(txt);
   …
}

string CCommunicationDialog::FormatMessage(const string message,
                                           ENUM_MESSAGE_TYPE type,
                                           ENUM_MESSAGE_STATUS status,
                                           datetime ts)
{
   string user = (type==MSG_OUTGOING ? m_mainUserLabel.Text()
                                     : type==MSG_INCOMING ? "Them" : "System");
   string ico = (status==STATUS_SENT ? ShortToString(0x2713)
                                     : ShortToString(0x2717));
   return StringFormat("[%s] %s: %s %s",
                       TimeToString(ts,TIME_MINUTES), user, message,
                       (type==MSG_SYSTEM ? "" : ico));
}

CommunicationsDialogクラスのEAへの統合

メインEA (New_Admin_Pane.mq5)では、Communications.mqhヘッダがHandleCommunicationsルーチン内で機能します。ユーザーが[Communications]ボタンをクリックすると、コードは既存のCCommunicationDialogインスタンスの表示/非表示を切り替えるか、初回の場合はダイアログを生成し、保存済みのチャットIDとボットトークンで初期化したうえで、CreatePanelを呼び出してUIを構築します。最後にshow()を実行して、チャート上にパネルを描画します。このパターン(初回クリック時のみ生成し、その後は表示/非表示を切り替える方式)により、リソース使用を最小限に抑えつつCommunicationsDialogインターフェースをEA本体からきれいに分離できます。

// handle showing/hiding communications panel
void HandleCommunications()
{
   if(g_commPanel)
   {
      // toggle visibility if already created
      if(g_commPanel.IsVisible()) g_commPanel.Hide();
      else                        g_commPanel.Show();
      ChartRedraw();
      return;
   }

   // first‐time creation
   g_commPanel = new CCommunicationDialog();

   // build the UI
   if(!g_commPanel.CreatePanel(g_chart_id,
                               "CommunicationsPanel",
                               g_subwin,
                               80, 100, 430, 500))
   {
      delete g_commPanel;
      g_commPanel = NULL;
      Print("CommPanel creation failed: ", GetLastError());
      return;
   }

   // pre‐fill credentials and display
   g_commPanel.InitCredentials(TwoFactorChatID, TwoFactorBotToken);
   g_commPanel.Show();
   ChartRedraw();
}


テストと結果

まず、EAをMetaTrader 5でコンパイルし、エラーや警告が出ないことを確認しました。起動すると、メインインターフェースが想定どおりに表示され、トグル、Trade、Communications、Analytics、Show All/Hide All の各ボタンが揃っていました。

1. コミュニケーションパネルの起動

[Communications]ボタンをクリックすると、CCommunicationDialogが生成されました。ダイアログは割り当てられたチャート領域に表示され、CreatePanelルーチンとそのサイドバー、メインスレッド、作成エリアが正しく構築されたことを確認できました。

2. 認証情報の入力

認証情報の入力方法を2通りテストしました。EAの入力パラメータ(TwoFactorChatIDおよびTwoFactorBotToken)に値を設定する方法と、サイドバーの[Chat ID]および[Bot Token]フィールドから直接編集する方法です。いずれの場合も、InitCredentialsがフィールドを正しく反映し、[You]ラベルが更新されました。

3. メッセージ送信

有効な認証情報を入力した状態で、作成ボックスにサンプルメッセージを入力し、Enterキーまたは[Send]ボタンを押しました。メッセージは✓アイコン付きでスレッドに表示され、Telegramチャットにも同じメッセージが届きました。これにより、WebRequestロジックとJSONエスケープ処理が意図どおりに機能していることが実証されました。

4. テーマ切り替え

月/太陽ボタンをクリックすると、ライトモードとダークモードが即座に切り替わりました。パネルの背景色と文字色が更新され、スレッドに「Dark mode enabled」または「Light mode enabled」というシステムメッセージが追記されました。

5. スクリーンショットと添付ボタン

スクリーンショットボタンを押すと、GIFファイルがMQL5\Filesに保存され、確認メッセージが出力されること、また失敗時には報告されることを確認しました。添付ボタンは現時点でプレースホルダのシステムメッセージ(「Attachment TBD」)をログに記録する仕様であり、ファイルアップロード機能は未実装であることを示しています。

コミュニケーションパネル更新のテスト


結論

MetaTrader 5のエキスパートアドバイザー(EA)内に、最新機能を備えたメッセージングパネルを統合することは十分に可能です。ただし、現行の標準ライブラリコントロールには制約があり、特に組み込みのCEditは単一行入力と文字数制限にしか対応していない点が課題です。今回の第一段階では、認証情報入力、メッセージ作成、テーマ切り替え、Telegram連携といった基盤となるレイアウトを実装できました。また調査の結果、こうした制限を克服するコミュニティ開発の拡張コンポーネントも確認済みであり、次回のアップデートで参考資料を共有する予定です。

次回の記事に向けた主な目標は以下のとおりです。

1. 複数行のチャット履歴

  • 受信メッセージは左揃え、送信メッセージは右揃え
  • 自動改行と、内容がビュー領域を超えた際のスクロールバー対応

2. 連絡先管理システム

  • ユーザー名やチャットIDで永続的に保存、呼び出し可能な簡易アドレス帳

3. 信頼性の高いスクリーンショットと添付ファイルのサポート

  • ファイル生成とアップロードを保証するワークフロー
  • リアルタイムのチャート共有を可能にし、チームコラボレーションや取引レビューを強化 

4. キーボードショートカットの拡張

  • よく使うメッセージやコマンドを素早く送信できるショートカット

これらはロードマップの一部にすぎません。ご意見やご提案は常に歓迎しています。これは学習、協力、改善を続ける過程であり、近い将来にはMetaTrader 5内で完成度の高い外部APIメッセージング体験を実現できるでしょう。この記事が、皆さんのプログラミング思考に新たな発想を少しでも加えられたなら幸いです。

良い取引を、そして次回の記事をお楽しみに。

ファイル 説明
New_Admin_Panel.mq5 MetaTrader 5での高度な取引管理のためのマルチパネル総合EAシステム。
CommunicationsDialog.mqh コミュニケーションパネルモジュール
MetaTrader 5 EA用の最新のメッセージインターフェースパネル(Telegramベース)を定義。ターミナルのincludeフォルダに配置してください。
All Modules.zip  必要なすべてのヘッダが含まれています。MQL5/Includeフォルダに追加してください。

はじめに戻る


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

添付されたファイル |
All_Modules.zip (17.78 KB)
MQL5開発用のカスタムデバッグおよびプロファイリングツール(第1回):高度なロギング MQL5開発用のカスタムデバッグおよびプロファイリングツール(第1回):高度なロギング
MQL5で、単なるPrint文を超えた強力なカスタムロギングフレームワークを実装する方法を学びましょう。このフレームワークは、ログの重要度レベル、複数の出力ハンドラ、自動ファイルローテーションをサポートし、実行中にすべて設定可能です。シングルトン設計のCLoggerをConsoleLogHandlerとFileLogHandlerに統合することで、[エキスパート]タブと永続ファイルの両方に、文脈情報やタイムスタンプ付きのログを記録できます。明確でカスタマイズ可能なログ形式と集中管理により、エキスパートアドバイザー(EA)のデバッグとパフォーマンストレースを効率化します。
知っておくべきMQL5ウィザードのテクニック(第65回):FrAMAとForce Indexのパターンを活用する 知っておくべきMQL5ウィザードのテクニック(第65回):FrAMAとForce Indexのパターンを活用する
フラクタル適応移動平均(FrAMA)とForce Indexオシレーターは、MQL5エキスパートアドバイザー(EA)内で組み合わせて使用できるもう1つのインジケーターのペアです。FrAMAはトレンドフォロー型インジケーターですが、Force Indexはボリュームベースのオシレーターであるため、これら2つのインジケーターは互いに少し補完し合います。いつものように、MQL5ウィザードを使用して、これら2つの可能性を迅速に調査します。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
MQL5取引ツール(第2回):インタラクティブな取引アシスタントの強化:動的視覚フィードバックの導入 MQL5取引ツール(第2回):インタラクティブな取引アシスタントの強化:動的視覚フィードバックの導入
この記事では、取引アシスタントツール(Trade Assistant Tool)をアップグレードし、ドラッグ&ドロップ可能なパネル機能やホバー効果を追加して、インターフェースをより直感的で応答性の高いものにします。ツールを改良してリアルタイムの注文設定を検証し、市場価格に対して正確な取引構成が可能となるようにします。また、これらの改善をバックテストし、その信頼性を確認します。