在MQL5语言中,多货币指标和专家顾问(EA)的使用是一个显著的优势。您可以查看 多货币OnTickMarketWatch事件处理器,它提供了MQL5的相关示例。
不过,现有脚本中提出的概念使用起来并不是很方便。在处理多个事件时,可能会导致事件队列溢出。
以下是MQL5参考文献的说明:
客户端终端会将出现的事件添加到事件队列中。因此,事件会按照接收顺序一个接一个地进行处理。对于新Tick事件有个例外:如果队列中已经存在此事件或该事件正在处理,新产生的Tick事件将不会被加入队列。
事件队列的大小是有限的。当队列溢出时,旧事件将被移除而不处理,以便允许新事件的接收。因此,建议编写高效的事件处理程序,而不建议使用无限循环(对仅处理Start事件的脚本有例外)。
此外,有时需要在新K线出现时才对指标的值进行重新计算。您可能还需要在多货币EA中“实时”禁用某个符号的交易,或者更改某个符号的时间框架等操作。
这里的“其他操作”可能涉及外部数据,而我们的MCM(多货币模式)控制面板就是基于这个理念设计的。
顺便提一下,它也可以用于单一货币交易。
MCM控制面板(竞赛版)的特点:
它具有使用多货币模式所需的最少功能,具体包括:
- 添加/移除交易和分析的符号。
- 跟踪任何符号和周期的“新Tick”和“新K线”事件。
- 所有设置都可以在不重启EA或指标的情况下“实时”更改。
- 该面板可以与我们的EA和指标一起使用。
- 也可以包含在您的代码中,它将与代码一起加载。
- 它是透明的。您无需将MCM控制面板的代码添加到您的EA或指标中。
使用“MCM控制面板”,您可以添加自己的功能。具体详情请见下文。
此版本不支持控制面板设置的保存/恢复。
启动“MCM控制面板”的方法有几种:
- 将“iControl panel MCM”附加到图表。
- 启动“scControl panel MCM”脚本,该脚本加载“iControl panel MCM”指标。
- 从您的EA或指标中加载面板。有关详细信息,请查看“exControl panel MCM”。
在第三种情况下,面板将与我们的EA或指标一起加载并附加到图表。
您的EA应该具有OnChartEvent()事件处理程序,以处理MCM控制面板的事件。
界面
用户界面非常简单,以菜单形式实现。菜单的大小和颜色可以通过输入参数进行配置。
它的外观如下:

设计
该面板用于配置多货币EA和指标的事件。
面板的大小和位置取决于图表大小和字体大小(在输入参数中定义)。为了释放工作空间,面板可以最小化。

通过更改输入参数中的字体大小(默认字体大小为10),可以改变面板的大小:

您可以设置任何您想要的颜色。
例如,粉色方案:

EMO方案:

易于使用
该菜单直观易用。
按钮“MCM控制面板”包含额外功能(在此版本中未包含):

使用“图表”按钮,您可以轻松更改当前符号和时间框架,只需选择即可:

“事件”允许您对某个符号实时启用/禁用事件(无需重启EA或指标),并指定所需的事件。这些事件可以在EA或指标的OnChartEvent()函数中处理。符号菜单仅包含从“市场观察”中选择的符号。您可以组合任何事件,所有事件都将被处理。
例如,您无需担心在时间框架上出现新Tick/K线,面板引擎将发送事件:

这里是“帮助”:

知识与其实现
我的解决方案已发布在 多货币OnTickMarketWatch事件处理器中,但此面板具有一些额外功能:
- “MCM控制面板MCM”提供了客户端终端中未直接实现的接口。它允许您通过OnChartEvent()事件处理程序使用多货币模式。另一个特点是可以“实时”更改设置。
- 为了生成OnChartEvent()事件处理程序的事件,MCM控制面板使用自己的“代理”(由MCM控制面板在某些符号上启动的指标),为多货币交易提供事件。
- 该面板可以包含在EA或指标中。
- MCM控制面板为MQL5开发者提供了新的可能性。
- 在我看来,该面板是EA和指标新结构的示例。稍后我会提供一些示例。
事件和警报信息
该面板有一个状态栏来显示事件。
MCM控制面板的安装
将压缩文件mcm_control_panel.zip解压到客户端终端的文件夹中。之后,将出现以下文件:
- /mql5/experts/exControl panel MCM.mq5 - EA示例;
- /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控制面板”类和函数。
接下来,编译指标、脚本和EA。
启动MCM控制面板
启动MCM控制面板,请将iControl panel MCM.mq5指标附加到任何图表上。
面板可以从EA中启动,只需将“exControl panel MCM”EA附加到图表上:

作为多货币的一个例子,我编写了MultiTrend专家顾问。该指标根据对4个货币对的分析绘制美元趋势:
以下是代码:
//+------------------------------------------------------------------+ //| 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 - 某个时间框架上的Tick价格或新K线的开盘价。
- sparam - 符号名称
支持MCM控制面板的事件列表
使用lparam参数,控制面板可以发送多达64个不同的自定义事件。在此版本中支持以下事件:
- “初始化”事件(Initialization);
- “新Tick”事件(tick);
- “新K线”事件在M1图表(M1);
- “新K线”事件在M2图表(M2);
- “新K线”事件在M3图表(M3);
- “新K线”事件在M4图表(M4);
- “新K线”事件在M5图表(M5);
- “新K线”事件在M6图表(M6);
- “新K线”事件在M10图表(M10);
- “新K线”事件在M12图表(M12);
- “新K线”事件在M15图表(M15);
- “新K线”事件在M20图表(M20);
- “新K线”事件在M30图表(M30);
- “新K线”事件在H1图表(H1);
- “新K线”事件在H2图表(H2);
- “新K线”事件在H3图表 (H3);
- “新K线”事件在H4图表(H4);
- “新K线”事件在H6图表(H6);
- “新K线”事件在H8图表(H8);
- “新K线”事件在H12图表(H12);
- “新K线”事件在日线图(D1);
- “新K线”事件在周线图(W1);
- “新K线”事件在月线图(MN1);
EventDescription()返回的事件描述以括号形式表示(Initialization, tick, Mxx等)。EventDescription函数可以在Control panel MCM.mqh中找到(遵循ENUM_CHART_EVENT_SYMBOL枚举)。
当prev_calculated=0时,会生成“初始化”事件,可用于准备数据,例如重新计算指标值。
设置事件
要设置所需的事件,请点击“事件”按钮,选择符号和事件类型。所选事件将显示为黄色(或指标输入参数中的选中颜色)。您可以选择一个或多个事件,所有这些事件都可以由我们的多货币EA处理。要应用更改,请点击“启用/禁用事件”按钮。
同样的过程可以对所有必要的符号进行。

以下是来自“专家”选项卡的日志:
