MQL5言語の利点の一つは、マルチカレンシーインディケーターやエキスパートアドバイザー(EA)を使用できることです。詳細は、MQL5のマルチカレンシーOnTickMarketWatchイベントハンドラを参照してください。
提案されたスクリプトの概念は便利ではありません。特に、多くのイベントが発生する場合、イベントキューがオーバーフローする可能性があります。
以下は、MQL5リファレンスからの注意点です:
クライアントターミナルは、発生したイベントをイベントキューに追加します。したがって、イベントは受信した順に処理されます。ただし、新しいティックイベントには例外があります。このイベントがすでにキューに存在するか、処理中の場合、新しい新しいティックイベントはキューに追加されません。
イベントキューはサイズに制限があります。キューがオーバーフローした場合、古いイベントは処理されることなく削除され、新しいイベントの受信を許可します。したがって、効率的なイベントハンドラを書くことが推奨され、無限ループを使用しないことが推奨されます(Startイベントのみを処理するスクリプトには例外があります)。
さらに、新しいバーが表示されたときのみインディケーターの値を再計算する必要がある場合もあります。マルチカレンシーエキスパートアドバイザーで特定のシンボルの取引を「その場で」無効にしたり、特定のシンボルの時間枠を変更したりする必要がある場合もあります。
この「何か別のもの」は外部データである可能性があります。MCM(MultiCurrency Mode)コントロールパネルはこのアイデアに基づいています。
ちなみに、単一通貨の取引にも使用できます。
MCMコントロールパネル(コンテストバージョン)の特徴:
マルチカレンシーモードでEAやインディケーターを使用するために必要な最小限の機能を備えています:
- 取引と分析のためにシンボルを追加/削除できます。
- 任意のシンボルと期間の「新しいティック」および「新しいバー」イベントを追跡できます。
- すべての設定は、EAやインディケーターを再起動せずに「その場で」変更できます。
- このパネルは、私たちのEAやインディケーターと一緒に使用できます。
- また、コードに組み込むこともでき、一緒に読み込まれます。
- 透明性があります。MCMコントロールパネルのコードをEAやインディケーターに追加する必要はありません。
「MCMコントロールパネル」を使用すると、自分自身の機能を追加できます。詳細は以下をご覧ください。
このバージョンでは、コントロールパネル設定の保存/復元はサポートされていません。
「MCMコントロールパネル」は、次のようにして起動できます:
- チャートに「iControlパネルMCM」を添付します。
- スクリプト「scControlパネルMCM」を実行します。このスクリプトは「iControlパネルMCM」インディケーターを読み込みます。
- EAやインディケーターからパネルを読み込みます。詳細は「exControlパネルMCM」を参照してください。
3番目のケースでは、パネルは私たちのEAやインディケーターと一緒に読み込まれ、チャートに添付されます。
あなたのEAは、MCMコントロールパネルイベントを処理するためにOnChartEvent()イベントハンドラを持っている必要があります。
インターフェース
ユーザーインターフェースはシンプルで、メニュー形式で実装されています。メニューのサイズや色は入力パラメータで設定できます。
見た目は次のようになります:

デザイン
このパネルは、マルチカレンシーのEAやインディケーターのイベントを設定するために使用されます。
パネルのサイズと位置は、チャートのサイズとフォントサイズ(入力パラメータで定義)によって異なります。作業スペースを空けるために、パネルを最小化することもできます。

パネルのサイズは、入力パラメータのフォントサイズを変更することで変更できます(デフォルトのフォントサイズは10です):

任意の色を設定できます。
たとえば、ピンクのスキーム:

EMOスキーム:

使いやすさ
メニューは直感的で使いやすいです。
「MCMコントロールパネル」ボタンには、追加機能(このバージョンには含まれていません)が含まれています:

「チャート」ボタンを使用すると、現在のシンボルと時間枠を簡単に変更できます。選択するだけです:

「イベント」ボタンを使用すると、特定のシンボルのイベントを「その場で」有効または無効にできます。これらのイベントは、EAやインディケーターのOnChartEvent()関数内で処理できます。「シンボル」メニューには、「マーケットウォッチ」から選択されたシンボルのみが含まれています。任意のイベントを組み合わせることができ、すべて処理されます。
たとえば、時間枠のシンボルに対して新しいティック/バーが表示されることを心配する必要はありません。パネルエンジンがイベントを送信します:

こちらが「ヘルプ」です:

ノウハウとその実装
私のソリューションはマルチカレンシーOnTickMarketWatchイベントハンドラに掲載されていますが、このパネルにはいくつかの追加機能があります:
- 「MCMコントロールパネルMCM」は、クライアントターミナルに直接実装されていないインターフェースを提供します。OnChartEvent()イベントハンドラを介してマルチカレンシーモードを使用できるようにします。他の機能は、設定を「その場で」変更できることです。
- OnChartEvent()イベントハンドラ用のイベントを生成するために、MCMコントロールパネルは独自の「エージェント」(特定のシンボルでMCMコントロールパネルによって起動されるインディケーター)を使用して、マルチカレンシー取引のためのイベントを提供します。
- このパネルは、EAやインディケーターに組み込むことができます。
- MCMコントロールパネルはMQL5開発者に新しい可能性を提供します。
- 私見ですが、このパネルは新しい構造のEAやインディケーターの例です。後でいくつかの例を提供します。
イベントとアラートに関する情報
このパネルには、イベントを表示するためのステータスバーがあります。
MCMコントロールパネルのインストール
クライアントターミナルのフォルダーにmcm_control_panel.zipアーカイブファイルを展開します。その後、以下のファイルが表示されます:
- /mql5/experts/exControl panel MCM.mq5 - エキスパートアドバイザーの例;
- /mql5/scripts/scControl panel MCM.mq5 - スクリプトの例;
- /mql5/indicators/iControl panel MCM.mq5 - メインの「MCMコントロールパネル」エンジンであるインディケーター;
- /mql5/indicators/Spy Control panel MCM.mq5 - インディケーター、「MCMコントロールパネル」エージェント
- /mql5/include/Control panel MCM.mqh - 「MCMコントロールパネル」のクラスと関数のセット。
次に、インディケーター、スクリプト、エキスパートアドバイザーをコンパイルします。
MCMコントロールパネルの起動
MCMコントロールパネルを起動するには、iControl panel MCM.mq5インディケーターを任意のチャートに追加します。
パネルはエキスパートアドバイザーから起動できます。「exControl panel MCM」エキスパートアドバイザーをチャートに追加してください:

マルチカレンシーの例として、MultiTrendエキスパートアドバイザーを書きました。このインディケーターは、4つの通貨ペアの分析に基づいてUSDトレンドをプロットします:
以下がコードです:
//+------------------------------------------------------------------+ //| MultiTrend.mq5 | //| Copyright 2010, Lizar | //| https://www.mql5.com/ru/users/Lizar | //+------------------------------------------------------------------+ #define VERSION "1.00 Build 2 (09 Dec 2010)" #property copyright "Copyright 2010, Lizar" #property link "https://www.mql5.com/ru/users/Lizar" #property version VERSION #property description "このエキスパートアドバイザーはMCMコントロールパネルを使用しています" input color bg_color=Gray; // メニューの色 input color font_color=Gainsboro; // テキストの色 input color select_color=Yellow; // 選択されたテキストの色 input int font_size=10; // フォントサイズ #include <Control panel MCM.mqh> //<--- インクルードファイル //+------------------------------------------------------------------+ //| エキスパート初期化関数 | //+------------------------------------------------------------------+ int OnInit() { //--- MCMコントロールパネルの初期化 //--- 必要に応じて色を設定する必要はありません。指定しない場合は、デフォルトの色が使用されます。 InitControlPanelMCM(bg_color,font_color,select_color,font_size); //--- return(0); } //+------------------------------------------------------------------+ //| エキスパート非初期化関数 | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { DeinitControlPanelMCM(); //<--- MCMコントロールパネルの非初期化 } //+------------------------------------------------------------------+ //| OnChartEventイベントハンドラ。 | //| 詳細についてはMQL5リファレンスを参照してください。 | //| MCMコントロールパネルと使用可能なマルチカレンシー取引のためのものです | //+------------------------------------------------------------------+ void OnChartEvent(const int id, // イベント識別子: // id-CHARTEVENT_CUSTOM==0 - 初期化イベント(prev_calculated==0のとき) const long& lparam, // 時間枠 const double& dparam, // 価格 const string& sparam // シンボル ) { if(id>=CHARTEVENT_CUSTOM) { Print(TimeToString(TimeCurrent(),TIME_SECONDS)," -> id=", id-CHARTEVENT_CUSTOM, ": ",sparam," ",EventDescription(lparam)," price=",dparam); } } //+------------------------------------------------------------------+
OnChartEvent()のパラメータ。
コントロールパネルはカスタムイベントを生成します。これらのイベントは、EAやインディケーターでOnChartEvent()イベントハンドラを使用して処理できます。
入力パラメータ:
- id - イベントID:
id-CHARTEVENT_CUSTOM !=0 - 「マーケットウォッチ」ウィンドウ内のシンボルインデックスに等しい; - lparam - イベントフラグ。Control panel MCM.mqhのENUM_CHART_EVENT_SYMBOL列挙型を参照してください。
- dparam - 特定の時間枠でのティック価格または新しいバーの始値。
- sparam - シンボル名
MCMコントロールパネルでサポートされているイベントのリスト
lparamパラメータを使用して、コントロールパネルはシンボルに対して最大64の異なるカスタムイベントを送信できます。このバージョンでサポートされているイベントは次のとおりです:
- 「初期化」イベント(Initialization);
- 「新しいティック」イベント(tick);
- M1チャートの「新しいバー」イベント(M1);
- M2チャートの「新しいバー」イベント(M2);
- M3チャートの「新しいバー」イベント(M3);
- M4チャートの「新しいバー」イベント(M4);
- M5チャートの「新しいバー」イベント(M5);
- M6チャートの「新しいバー」イベント(M6);
- M10チャートの「新しいバー」イベント(M10);
- M12チャートの「新しいバー」イベント(M12);
- M15チャートの「新しいバー」イベント(M15);
- M20チャートの「新しいバー」イベント(M20);
- M30チャートの「新しいバー」イベント(M30);
- H1チャートの「新しいバー」イベント(H1);
- H2チャートの「新しいバー」イベント(H2);
- H3チャートの「新しいバー」イベント(H3);
- H4チャートの「新しいバー」イベント(H4);
- H6チャートの「新しいバー」イベント(H6);
- H8チャートの「新しいバー」イベント(H8);
- H12チャートの「新しいバー」イベント(H12);
- 日足チャートの「新しいバー」イベント(D1);
- 週足チャートの「新しいバー」イベント(W1);
- 月足チャートの「新しいバー」イベント(MN1);
EventDescription()によって返されるイベント説明は、括弧内に表示されます(Initialization、tick、Mxxなど)。EventDescription関数は、Control panel MCM.mqhにあります(ENUM_CHART_EVENT_SYMBOL列挙型に従って)。
「初期化」イベントはprev_calculated=0のときに生成され、データを準備するために使用できます。たとえば、インディケーターの値を再計算できます。
イベントの設定
必要なイベントを設定するには、「イベント」ボタンをクリックし、シンボルとイベントタイプを選択します。選択したイベントは黄色(またはインディケーターの入力パラメータで選択された色)で表示されます。1つまたは複数のイベントを選択でき、すべてのイベントは私たちのマルチカレンシーエキスパートアドバイザーによって処理されます。変更を適用するには、「イベントを有効/無効」にクリックしてください。
同じプロセスをすべての必要なシンボルに対して行うことができます。

こちらが「専門家」タブからのログです:
