---
title: "新版MetaTrader 5平台build 2170：MQL5作用域，全局策略测试和内置虚拟主机更新 - 更新历史"
description: "重新设计了内置虚拟主机管理选项。关于租用程序端以及环境迁移、停止和启动功能的所有信息，现在都可以在“工具箱”窗口的单独选项卡中获得。 在早期版本中，“虚拟主机”功能可以在“导航”窗口的快捷菜单中使用。 - 更新历史"
image: "https://www.metatrader5.com/c/17/0/terminal-1__1.png"
url: "https://www.metatrader5.com/zh/releasenotes/terminal/2099"
---

# 新版MetaTrader 5平台build 2170：MQL5作用域，全局策略测试和内置虚拟主机更新

## 重新设计了内置虚拟主机管理选项。关于租用程序端以及环境迁移、停止和启动功能的所有信息，现在都可以在“工具箱”窗口的单独选项卡中获得。 在早期版本中，“虚拟主机”功能可以在“导航”窗口的快捷菜单中使用。

5 十月 2019

### 程序端

1. 重新设计了内置[虚拟主机](https://www.mql5.com/zh/vps)管理选项。关于租用程序端以及环境迁移、停止和启动功能的所有信息，现在都可以在“工具箱”窗口的单独选项卡中获得。在早期版本中，“虚拟主机”功能可以在“导航”窗口的快捷菜单中使用。现在所有必要的信息和控制命令都方便简捷地排列在“VPS”选项卡中：

   ![](https://www.metatrader5.com/c/17/0/terminal-1__1.png)

    基本订阅信息显示在左侧：

     - 连接数据：比较您主机服务器和本地计算机上的客户端运行之间的网络延迟。
     - 租用主机的交易账户和付款计划。
     - 独特的订阅标识符。点击ID打开MQL5.community用户个人资料中的“主机”部分，也可以在这里管理订阅。
     - 注册日期和当前状态。如果主机服务停止，那么相应的状态将立即出现在这里。

    使用“启动/停止”按键，虚拟程序端可以快速启动或停止。有关主机服务器硬件和CPU使用图表的数据显示在右侧窗口区。根据显示的信息，如果您的EA交易或指标使用了过多的内存或CPU时间，您将可以及时作出响应。有关最后交易的环境迁移以及迁移命令的信息也在这里提供。这些命令可以在购买订阅后加快环境迁移的速度。虚拟平台可以从“VPS”选项卡租用。租用过程不变，仍旧可以快速轻松完成租用。您只需选择一个计划和一个合适的付款方式。将会自动选择连接您交易商的最佳服务器。

   ![](https://www.metatrader5.com/c/17/0/terminal-1-2.png)
2. 添加在交易商网站快速切换到入金/出金操作的能力。无需在交易商网站的交易者室中搜索对应的功能。可在程序端中直接获得快速导航命令：“导航”和“工具箱”中的账户菜单 > 交易选项卡：

   ![](https://www.metatrader5.com/c/17/0/terminal-2__1.png)

   > - 只有在交易商对交易账户启用对应的功能，才可以进行入金/出金操作。
   >   - 交易程序端不执行任何账户入金/出金操作。集成功能将用户重新定向到对应的交易商网站页面。
3. 交易品种规格中的新字段：**分类**这个属性用于额外标记交易品种。例如，这可以是该交易品种所属的市场行业：农业、石油&天然气等。只有在交易商提供对应信息的情况下才显示分类。**交易所**进行证券交易的交易所名称。只有在交易商提供对应信息的情况下才显示分类。**手续费**有关交易商为成交交易品种所收取的手续费的信息。计算详细信息在这里显示：

     - 手续费包括单级手续费和多级手续费，即无论成交量/交易额是多少，手续费都是相同的，或者可以根据交易规模而定。对应的数据在程序端显示。
     - 手续费可以在交易完成后，或在交易日/交易月结束时立即收取。
     - 手续费可以依据成交方向进行收取：市场买入、市场卖出或两种都包括的操作类型。
     - 手续费可按照每手或每笔交易来收取。
     - 手续费能够以资金金额、百分比或点数来计算。

    例如，下面进入交易表示交易进入和退出时立即收取手续费。如果成交量为0 - 10手，那么每次操作收取1.2 USD手续费。如果成交量为11 - 20手，那么每笔交易每手收取1.1USD手续费。

    手续费 | 立即、交易量、进入/退出交易0 - 10 | 每笔交易1.2 USD11 - 20 | 每手交易1.1 USD

   ![](https://www.metatrader5.com/c/17/0/terminal-3__1.png)
4.  附加[期权](https://www.metatrader5.com/zh/terminal/help/trading/options_board)相关字段已添加到交易品种规格中：

     - 期权类型 — 买进或卖出
     - 标的 — 期权的标的交易品种
     - 执行价格 — 期权执行价格
5. 添加对期权"[Greeks](https://en.wikipedia.org/wiki/Greeks_(finance))"交付的支持：delta、gamma、vega、theta、rho。交易商可以提供与此类交易品种相关的其他信息。这些数据显示在“市场报价”窗口的“详细信息”部分并可用于高级交易分析：

   ![](https://www.metatrader5.com/c/17/0/terminal-greeks_-_Copy.png)
6. “十字光标”工具现在除了之前可用的信息之外，还表示以百分比计算的价格水平之间的距离。

   ![](https://www.metatrader5.com/c/17/0/terminal-4.png)
7. 添加显示在“市价”执行和“交易所”执行操作期间交易对话框中产生的价格，如果该价格在收到交易商的响应时可用：

   ![](https://www.metatrader5.com/c/17/0/terminal-5.png)
8. 修正由于“市场报价”窗口中的“全部显示”命令无法显示所有可用交易品种列表而产生的错误。

### MQL5

1. 作用域操作已得到修改，因此MQL5更加接近C++。这为MQL5程序员在使用第三方程序库时提供更广泛的可能性。此更新消除了修改程序库和统一标识符的需求。例如，代码包含两个同名结构的声明，即使它们属于不同的类。在早期版本中，这类声明会导致编译错误：“标识符已使用”。现在，这个代码将被成功编译并执行。要从作用域外正确地访问所需的变量/结构/函数，您应指定一个类（在本例中是CBar::Item）。

   ```
   class CFoo   { public:    struct Item { int x; };   }; //+------------------------------------------------------------------+ class CBar   { public:    struct Item { int x; };   };    CBar::Item item;  // 正确声明Bar类的Item结构 Item       item;  // 错误声明
   ```

    添加[namespace](https://www.mql5.com/zh/docs/basis/namespace)支持，它可以在MQL5应用程序使用第三方代码/程序库时提供更多的可能性。

   ```
   #define PrintFunctionName() Print(__FUNCTION__) namespace NS { void func()   {    PrintFunctionName();   } struct C   {    int               x;                      C() { PrintFunctionName(); };   }; } struct C   {    int               x;                      C() { PrintFunctionName(); };   }; //+------------------------------------------------------------------+ //|   | //+------------------------------------------------------------------+ void func()   {    PrintFunctionName();   } //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart()   {    func();    NS::func();    C c;    NS::C ac;   }
   ```

    执行时，输出以下结果：

    2019.09.18 13:39:35.947 TestScript (AUDCAD,H1) func 2019.09.18 13:39:35.949 TestScript (AUDCAD,H1) NS::func  2019.09.18 13:39:35.949 TestScript (AUDCAD,H1) C::C 2019.09.18 13:39:35.949 TestScript (AUDCAD,H1) NS::C::C
2. 新版本支持使用以下函数更快速地访问[时间序列数据](https://www.mql5.com/zh/docs/series)：iTime、 iOpen、iHigh、iLow、iClose、iVolume、iTickVolume、iSpread。
3. 添加对["=delete"属性](https://www.mql5.com/zh/docs/basis/types/classes#delete)的支持。它可以禁止使用某些类方法。

   ```
   class A   {    void              operator=(const A &)=delete;    // 禁止对象复制操作符   }; class B : public A   {   }; //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart()   {    A a1,a2;    B b1,b2;    a1=a2;    b1=b2;   }
   ```

    在这个示例中，编译器将返回错误"a1=a2"和"b1=b2"：

    试图引用已删除函数'void A::operator=(const A&)' 'void A::operator=(const A&)'函数在这里被明确删除试图引用已删除函数'void B::operator=(const B&)' 'void B::operator=(const B&)'函数被隐式删除，因为它由已删除函数'void A::operator=(const A&)'产生
4. 以下值已被添加到[ENUM_SYMBOL_INFO_STRING](https://www.mql5.com/zh/docs/constants/environment_state/marketinfoconstants#enum_symbol_info_string)枚举：

     - SYMBOL_CATEGORY — 交易品种分类。它用于额外标记交易品种。例如，这可以是该交易品种所属的市场行业：农业、石油&天然气等。
     - SYMBOL_EXCHANGE — 进行交易品种交易的交易所的名称。
5. 添加对通过FIFO规则平仓的支持。

     - ACCOUNT_FIFO_CLOSE值已被添加到[ENUM_ACCOUNT_INFO_INTEGER](https://www.mql5.com/zh/docs/constants/environment_state/accountinformation#enum_account_info_integer)。它表示只能通过FIFO规则平仓。如果属性值为true，那么每个交易品种都将按照持仓的相同顺序进行平仓：最早的持仓应最先平仓，然后以此类推。如果试图以不同的顺序进行平仓，则将返回一个错误。没有锁仓管理的账户的属性值始终为'false' (ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)。
     - 新返回代码：[MT_RET_REQUEST_CLOSE_ONLY](https://www.mql5.com/zh/docs/constants/errorswarnings/enum_trade_return_codes) — 请求被拒绝，因为交易品种已经设置“仅通过FIFO规则关闭现有持仓”规则

    主要有三种平仓方法：

     - 从客户端平仓：交易者使用EA，基于“信号”服务订阅等手动平仓。如果试图平仓，但不符合FIFO规则，那么交易者将收到一个对应的错误。
     - 在“止损”或“止盈”激活时平仓：这些订单在服务器端处理，因此不在交易者端（程序端）请求平仓，而是由服务器发起。如果一个持仓触发“止损”或“止盈”，且该持仓不符合FIFO规则（相同交易品种有一个更早的持仓），则该持仓将不会平仓。
     - 在“强平”触发时平仓：这些操作也在服务器端处理。在正常模式下（禁用基于FIFO平仓），“强平”时从亏损最大的持仓开始平仓。如果启用此选项，则将为亏损持仓额外检查开仓时间。服务器确定每个交易品种的亏损持仓，找出每个交易品种的最早持仓，然后在找到的持仓中关闭亏损最大的持仓。
6. 添加通过“输入组”进行参数分组的选项。这可以根据参数的基本逻辑实现参数的可视化分离。在以下EA交易代码中，输入参数根据其用途进行分组：

   ```
   input group           "Signal" input int             ExtBBPeriod = 20;         // 布林带周期 input double          ExtBBDeviation=2.0;       // 偏差 input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15;   // BB时间周期 input group           "Trend" input int             ExtMAPeriod = 13;         // Moving Average period input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15;    // MA 时间周期 input group           "ExitRules" input bool            ExtUseSL      = true;     // 使用“止损” input int             Ext_SL_Points = 50;       // StopLoss in points input bool            ExtUseTP      = false;    // 使用“止盈” input int             Ext_TP_Points = 100;      // TakeProfit in points input bool            ExtUseTS      = true;     // 使用“追踪止损” input int             Ext_TS_Points = 30;       // 以点数计算“追踪止损” input group           "MoneyManagement" sinput double         ExtInitialLot =0.1;       // 初始手数值 input bool            ExtUseAutoLot =true;      // 自动手数计算 input group           "Auxiliary" sinput int            ExtMagicNumber =123456;   // EA幻数 sinput bool           ExtDebugMessage=true;     // 打印调试信息
   ```

   当这种EA在“策略测试”中启动时，输入参数块可以通过双击组名来折叠或扩展，并且可以通过单个复选框选择组内的所有参数进行优化。

   ![](https://www.metatrader5.com/c/17/0/input_group.png)
7. 修正导入名称匹配MQL5函数名称的DLL函数。例如：

   ```
   #import "lib.dll" int func(); #import //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int func()   {    return(0);   } //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart()   {    Print( func() );   }
   ```

    在早期版本中，编译时会返回以下错误：

   ```
   'func' - 对具有相同参数的重载函数的模糊调用可以是2种函数之一    int func()    int func()
   ```

    现在，默认情况下将使用优先级更高的内置MQL5函数，来代替错误。导入的函数可以通过显式指定[作用域](https://www.mql5.com/zh/docs/basis/namespace)来调用：

   ```
   void OnStart()   {    Print( lib::func() );   }
   ```
8. 修正经济日历新闻中的时间规格。现在，交付事件时考虑的是程序端所连接的交易服务器的时区，而不是本地计算机的时区。
9. 修正[Copyticks](https://www.mql5.com/zh/docs/series/copyticks)和[CopyTicksRange](https://www.mql5.com/zh/docs/series/copyticksrange)函数中的过多内存消耗。

### 信号

1. 修正使用Wine（Mac OS和Linux）工作时信号图表的显示。

### Tester

1. 策略测试的大规模更新。全新开始页面、重新设计的设置页面、提高了可用性。**开始页面**现在，tester启动之后，用户看到的是一个标准任务列表，而不是多个设置，通过选择任务，用户可以快速开始测试。新设计主要是为没有经验的用户而准备的。我们选择最频繁的策略测试和优化任务，并将其添加到开始页面。此外，还可以从开始页面重新启动一个以前执行的任务。如果您运行了多个任务，且这些任务不适合开始页面，那么请使用搜索栏。您可以通过任何参数找到测试：程序名称、交易品种、时间周期、建模模式等。

   ![](https://www.metatrader5.com/c/17/0/terminal-15.png)

   **隐藏不相关的参数**选择任务之后，用户继续进一步测试参数：选择EA交易、交易品种、测试周期等。所选任务不需要的所有无关参数都将从设置页面中隐藏。例如，选择数学计算，只需要指定两个参数：选择要测试的程序和优化模式。在测试期间，将会隐藏延迟和报价生成的设置。

   ![](https://www.metatrader5.com/c/17/0/terminal-15-1.png)

   **方便测试设置**为了方便起见，设置页面上的一些参数已经重新排列。对延迟和可视化参数添加了扩展解释。此外，现在测试设置可以手动保存和加载，因此交易者可以快速返回到以前的设置。

   ![](https://www.metatrader5.com/c/17/0/terminal-15-2.png)

    使用相同的选项卡，您可以在MetaEditor中快速打开程序进行编辑。**以点数计算盈利**使用这些设置，您可以启用以点数计算盈利。这种模式加快了测试速度，同时不需要使用转化率以入金货币重新计算盈利（因此没有必要下载对应的价格历史）。在此模式下，取消库存费和手续费的计算。

   ![](https://www.metatrader5.com/c/17/0/terminal-15-3.png)

    请注意，当以点数计算盈利时，成交量并不重要。每笔交易只计算盈/亏点数。此外，在此模式下不执行预付款控制。只将其用于快速粗略的策略评估，然后使用更精确的模式检查得到的结果。**一般改进**测试启动/停止按键和进度条已经被移到选项卡栏。因此，用户可以控制任何“策略测试”部分的流程。测试启动/停止命令也被添加到设置和输入部分的快捷菜单中。

   ![](https://www.metatrader5.com/c/17/0/terminal-15-4.png)
2. 优化图表现在可以显示在程序端的主工作区，而不是显示在单独的策略测试区。这样，就可以为数据分析提供更多的空间。同时更新了3D可视化系统。

   ![](https://www.metatrader5.com/c/17/0/terminal-16__2.png)
3. 为“[市场报价中全部交易品种](https://www.metatrader5.com/zh/terminal/help/algotrading/optimization_types)”模式添加保存[优化缓存](https://www.metatrader5.com/zh/terminal/help/algotrading/strategy_optimization#cache)。
4. 添加保存测试缓存。在早期版本中，只有在优化EA交易时才会将所执行任务的结果保存到文件中。现在，单个测试期间也保存缓存文件，通过它用户可以返回到之前的计算，并随时查看统计数据、结余、净值和入金加载图。在未来的版本中，这个选项将支持测试结果的比较。要加载之前的测试结果，请使用Tester新开始页面：点击“之前的结果”并选择想要的网站：

   ![](https://www.metatrader5.com/c/17/0/terminal-18.png)
5. 明显加快了测试和优化的速度，包括使用[MQL5云网络](https://cloud.mql5.com/zh)执行的操作。
6. 修正并优化了[周期](https://www.mql5.com/zh/docs/optimization_frames)操作。

### MetaEditor

1. 添加配置代码样式(styler)的功能。MetaEditor包含一个内置[代码样式(styler)](https://www.metatrader5.com/zh/metaeditor/help/development/styler)，它可以根据所采用的标准自动格式化程序文本。现在除了常见样式外，您还可以使用其他流行的标准。为此，请打开MetaEditor设置并选择所需的样式：

   ![](https://www.metatrader5.com/c/17/0/terminal-21.png)

    可以为样式(styler)额外设置以下参数：**每个缩进空间**设置用于对齐内嵌结构的空格数：

   ```
   if(condition)   {    //---   }
   ```

   **用空格代替制表符**如果启用此选项，样式(styler)将用空格代替代码中的所有制表符。每个制表符的字符数在“一般”部分中设置。**删除空行**启用此选项后，样式(styler)将删除只有一个换行符的所有行。**在逗号和分号之后插入空格**启用此选项后，样式(styler)将使用元素枚举以可视方式分隔结构。示例：

   ```
   // 之前样式 ParameterGetRange("InpX",enable,x_cur,x_start,x_step,x_stop); // 之后样式 ParameterGetRange("InpX", enable, x_cur, x_start, x_step, x_stop);
   ```

   **在声明操作符周围插入空格**启用此选项后，样式(styler)将围绕赋值、等式、比较和其他操作符插入空格。示例：

   ```
   // 之前样式 if(x==1&y!=2)   {    int a=0;   } // 之后样式 if(x == 1 & y != 2) {   int a = 0; }
   ```
2. “在导航中显示”命令已添加到文件书签的快捷菜单。因此，用户可以轻松地在编辑器文件夹结构中找到要编辑的打开文件。

   ![](https://www.metatrader5.com/c/17/0/terminal-22.png)
3. 修正在工具提示中显示'union'关键字。

用户界面翻译又添加了18种新语言：

- 欧盟地区 — 瑞典语、立陶宛语、丹麦语、拉脱维亚语、爱沙尼亚语、塞尔维亚语、斯洛文尼亚语、斯洛伐克语、芬兰语、格鲁吉亚语
- 亚洲地区 — 爪哇语、马拉地语、孟加拉语、旁遮普语、泰米尔语、泰卢固语
- 非洲地区 — 斯瓦西里语、豪萨语

该平台界面现已支持50种语言，涵盖40多亿人使用的语言。

若要设置界面语言，请进入程序端顶部的“查看\语言”菜单。

文档已更新。

基于崩溃日志进行修复。

更新将通过实时更新系统提供。

**请参阅前面的新闻：**

- [MetaTrader 5平台build 2085：集成Python并改进策略测试](https://www.metatrader5.com/zh/releasenotes/terminal/2085)
- [MetaTrader 5平台build 2005：经济日历，MQL5应用程序服务以及R语言API](https://www.metatrader5.com/zh/releasenotes/terminal/1920)
- [新版MetaTrader 5平台build 1930：浮动窗口图表和MQL5中的.Net程序库](https://www.metatrader5.com/zh/releasenotes/terminal/1898)
- [MetaTrader 5平台build 1880：计算合成交易品种的完整历史](https://www.metatrader5.com/zh/releasenotes/terminal/1880)
- [MetaTrader 5 build 1870：通过ISIN在市场报价中添加交易品种](https://www.metatrader5.com/zh/releasenotes/terminal/1870)
