MetaTrader 5 Build 1730: MetaEditor项目和合成金融工具

MetaTrader 5新功能

20 十二月 2017

停止对旧版程序端的支持

新版平台发布后,将停止对旧版本的桌面版和移动版的支持:

  • 客户端:2012年11月23日发布的730之前的版本
  • iPhone移动版:2015年11月11日发布的1171之前的版本
  • Android移动版:2016年8月5日发布的1334之前的版本
不再提供支持的程序端版本将不能继续连接新的服务器版本。我们强烈建议您提前更新您的程序端。

MQL5 存储操作协议发生变更

为了支持新的共享项目,我们更新了MQL5存储的操作协议。因此,平台更新后,您将需要检查核对来自存储的所有数据。更新过程中,MQL5存储中的所有数据都不会丢失或受到影响。

更新到新版平台之前,我们建议您执行提交操作,将所有本地更改发送到MQL5存储。

程序端

  1. 现在,交易平台允许创建合成金融工具,即基于一个或多个现有工具的交易品种。用户可以设置计算报价的公式,之后平台将会实时生成合成工具的报价并创建分钟历史记录。

    如何工作

    • 您创建合成工具并设置价格计算公式。
    • 如果公式中使用的工具至少有一个的价格发生变化,那么平台会以每秒10次的频率计算报价。
    • 平台还可以根据公式中使用的工具一分钟柱来计算一分钟柱的历史记录(最近两个月)。根据生成的合成工具报价,所有新柱都将实时绘制(当前柱和后面的柱)。

    例如,您可以创建一个工具显示美元指数(USDX)。它使用下面的公式:

    50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)

    注意:USDEUR和USDGBP货币对在源美元指数公式中使用。因为平台中仅可以使用反向货币对,因此合成交易品种公式中使用的是负能量和买价,而不是卖价。

    平台将根据您交易商提供的其他六个交易品种报价来计算新工具的实时价格。价格变化将在市场报价窗口和图表上显示:




    若要创建一个新的自定义交易品种,请打开其规格窗口并指定公式:




    出于方便考虑,公式编辑器在键入交易品种和函数名称时显示了可能的选项列表。

    当合成工具添加到市场报价时,开始计算这个工具的报价和1分钟柱。同时,所有需要计算合成价格的交易品种都会自动添加到市场报价。有关开始计算的条目也将被添加到平台的日志:合成交易品种USDX:处理已开始。
    • 合成工具从市场报价移除后,计算停止。
    • 当前用于计算合成交易品种价格的交易品种不可以在市场报价中隐藏。

    实时计算报价
    每100毫秒检查一次计算中使用的交易品种价格(即每秒10次)。如果至少一次发生变化,那么就会计算合成交易品种的价格并且生成新报价。计算在三个线程中并行执行:卖价,买价和最后价。例如,如果计算公式是EURUSD*GBPUSD,那么合成交易品种的价格将按照以下规则计算:

    • Bid = bid(EURUSD)*bid(GBPUSD)
    • Ask = ask(EURUSD)*ask(GBPUSD)
    • Last = last(EURUSD)*last(GBPUSD)

    并分别针对每个价格检查更改的有效性。例如,如果源工具只更改了卖价,那么也只会计算合成工具相应的价格。

    创建分钟柱的历史记录
    除了收集实时报价之外,这个平台还会创建合成工具的1分钟历史记录。使交易者能够查看与正常图表类似的合成交易品种图表,并使用对象和指标进行技术分析。

    当交易者向市场报价添加合成工具时,平台将检查计算的分钟历史记录是否存在。如果不存在,那么将会创建最近60天的历史记录,其中包含50, 000个柱形图。如果平台设置中图表允许最多柱参数指定的值较低,那么将会应用相应的限制。

    如果这个周期内一些柱形图创建的时间较早,那么该平台将会额外生成新柱形图。如果用户想要查看图表上较早时期的记录(向后滚动或从MQL5程序访问),更进一步的历史记录就会被创建。

    合成工具的一分钟柱历史记录还可以根据公式中使用工具的一分钟柱(不是报价)进行计算。例如,若要计算合成交易品种1分钟柱的开盘价,平台会使用其公式中使用的交易品种的开盘价。最高价,最低价和收盘价也是以相同的方式进行计算。

    如果所需的柱形图不适用于任何工具,那么平台将使用之前柱形图的收盘价。例如,EURUSD,USDJPY和GBPUSD这三个工具被使用。如果计算12:00对应的柱形图时USDJPY所需的柱形图不能使用,那么下面的价格将会用于计算:

    • Open: EURUSD Open 12:00, USDJPY Close 11:59, GBPUSD Open 12:00
    • High: EURUSD High 12:00, USDJPY Close 11:59, GBPUSD High 12:00
    • Low: EURUSD Low 12:00, USDJPY Close 11:59, GBPUSD Low 12:00
    • Close: EURUSD Close 12:00, USDJPY Close 11:59, GBPUSD Close 12:00

    如果分钟柱不能用于公式中使用的所有工具,那么合成工具对应的分钟柱也不会被计算。

    绘制新的分钟柱形图
    所有合成工具的新柱都将根据生成的报价进行创建(当前柱和后面的柱)。用于创建柱形图的价格取决于规格中的“图表模式”参数:




    交易品种公式中可以使用哪些操作
    价格数据和交易商提供的现有交易品种的一些属性可以用于计算合成价格。指定下面信息:

    • 交易品种名称 — 取决于要被计算的合成价格,要使用的指定工具的卖价,买价或最后价。例如,如果工具指定EURUSD*GBPUSD,那么卖价计算为bid(EURUSD)*bid(GBPUSD),买价= ask(EURUSD)*ask(GBPUSD)。
    • 卖价(交易品种名称)— 指定交易品种的卖价将被强制用于计算合成工具的卖价。这个选项与之前选项类似(在之前没有指定价格类型)。
    • 买价(交易品种名称)— 指定交易品种的买价将被用于计算合成工具的买价。指定工具的卖价将被用于计算买价。指定交易品种的最后价将被用于计算最后价。如果ask(EURUSD)*GBPUSD被指定,那么下面计算将被使用:
      • Вid = ask(EURUSD)*bid(GBPUSD)
      • Ask = bid(EURUSD)*ask(GBPUSD)
      • Last = last(EURUSD)*last(GBPUSD)
    • 最后价(交易品种名称) — 指定交易品种的最后价将被用于合成工具所有价格的计算(卖价,买价和最后价)。如果last(EURUSD)*GBPUSD被指定,那么下面计算将被使用:
      • Вid = last(EURUSD)*bid(GBPUSD)
      • Ask = last(EURUSD)*ask(GBPUSD)
      • Last = last(EURUSD)*last(GBPUSD)
    • 交易量(交易品种名称) — 公式中将要使用的指定工具的报价交易量。请确保交易量信息与交易商提供的该交易品种相符。
    • 点差(交易品种名称)— 计算时将会使用的指定工具的最小价格变化。
    • 小数位(交易品种名称) — 公式中将要使用的指定交易品种价格的小数位数。

    如果交易品种名称复杂(包含连字符,点等等),请一定要以引号标记。例如:“RTS-6.17”。
    下面的算术运算可以在公式中使用:加法 (+),减法 (-),乘法(*),除法(/) 和除法余数 (%)。例如,EURUSD+GBPUSD意味着这个价格的计算是EURUSD 和GBPUSD价格总和。您也可以使用减号来改变符号,例如:-10*EURUSD。

    请注意数学运算的优先规则:

    • 首先执行的是乘法运算,除法运算和余数运算,然后执行加法运算和减法运算。
    • 运算顺序为自左向右。如果这个公式使用了多个且优先级相同的运算符号(例如,乘法和除法),那么将先从左边开始执行运算。
    • 您可以使用括号来改变运算的优先规则。括号内的运算是数学运算的最高级别。同样也是按照自左向右的顺序来执行:左侧括号内的运算优先执行。

    您可以在公式中使用常数:

    • 数字类型(整型和浮点型)。例如:EURUSD*2+GBPUSD*0.7。
    • 交易品种属性 _Digits 和 _Point。它们在公式中加入了来自规格的自定义交易品种的适当属性。_Digits意味着工具价格的小数位数;_Point 意味着交易品种价格的最小变化。

    您还可以在公式中使用除了MathSrand,MathRand和MathIsValidNumber以外,MQL5中支持的所有其他数学函数:所有函数仅使用短名称,例如fabs(),acos(),asin()等等。

  2. 已经实施允许实时添加自定义工具报价的新选项。现在,开发为指定自定义交易品种提供报价的MQL5 EA交易已经成为可能。为此可以使用CustomTicksAdd函数。
    int  CustomTicksAdd(
       const string           symbol,       // 交易品种名称
       const MqlTick&         ticks[]       // 可以用于自定义交易品种的报价数据数组
       );
    CustomTicksAdd函数允许提供报价,如同从交易商服务器接收这些报价。数据被发送至市场报价窗口,而不是直接写入报价数据库。然后,程序端将报价从市场报价窗口保存至数据库。如果在一次调用中传递了大量的数据,那么函数行为就会发生变化来节省资源。如果传送的报价数超过256个,那么数据会被分成两个部分。较大的部分直接记录到报价数据库(类似CustomTicksReplace)。第二部分由最近的128个报价组成,被发送到市场报价,程序端从这里将报价保存到数据库。

  3. 市场报价窗口现在还提供了最高价和最低价。这两个价格列默认是隐藏状态。可以通过快捷菜单来启用显示这两列:




    如果交易品种图表使用卖价来构建(依据规格设置),则会显示这个交易品种的最高卖价和最低卖价。如果交易品种图表使用最后价来构建,则会显示这个交易品种的最高最后价和最低最后价。

    如果市场报价至少包含一个基于最后价绘制图表的交易品种,那么除了最高价/最低价以外,最后价的列也会自动启用。

  4. 现在可以编辑自定义金融工具的报价历史记录。在市场报价快捷菜单中点击“交易品种”,选择自定义交易品种并在报价标签请求所需的数据间隔。

    • 双击来改变值。
    • 使用快捷菜单来添加或删除条目。
    • 如果您需要立刻删除多个柱形图/报价,请用鼠标选择并同时按住Shift或Ctrl+Shift。




    为了方便起见,更改的条目会按照以下规则突出显示:

    • 绿背景色表示修改后的条目
    • 灰背景色表示已删除的条目
    • 黄背景色表示已添加的条目

    若要保存更改,请在窗口底部点击“应用更改”。

  5. 在导航树中添加初步账户的显示。
    交易者可以向交易商发送请求,从桌面程序端直接开立一个真实账户。用户需要填写一份简单的请求表格和联系方式。在此之后,将为交易者创建一个特定的初步账户。然后,交易商联系交易者确定正式关系并将真实账户从初步账户转出。




  6. 在报价窗口增加毫秒时间显示。




  7. 在新账户打开对话框中扫描可用服务器的速度更快。
  8. 修正了趋势线图形对象的显示,启用了左射线和右射线的选项。
  9. 优化操作大量内部电子邮件(数十万邮件)。
  10. 优化大量交易工具的程序端操作(50,000或更多)。
  11. 在编辑历史记录之后,对自定义金融工具的报价历史添加了优化,并进行扩展。

MetaEditor

  1. 功能全面的项目现在已可以在MetaEditor中使用。程序开发过程已变得更加方便。

    现在主要的MQL5程序文件不会呈现为项目文件。项目是独立的"MQPROJ"文件,它可以存储程序设置,编译所有已用文件的参数和信息。主要的项目设置可以从独立的对话框访问,所以,现在无需通过#property在源代码中指定项目设置。

    为了便于进行项目工作,还提供了独立的导航标签。全部文件,例如包含文件,资源文件,标题文件和其他文件都被安排到这个标签类别中。所有文件都会自动添加到项目导航中。例如,如果您包括了一个新的MQH文件,那么它将自动出现在导航的“相关性”部分。

    在更新的MQL5存储在线库中也实现了对新项目的支持。现在,通过与MQL5.community其他成员的协作,开发大型项目变得更加方便。

    为组项目提供了新的共享项目部分。在这部分创建的项目会即时发送到存储中:您可以授予其他用户的权限并立即开始协作。




    当您在共享项目中编译一个项目时,根据程序类型,可执行文件EX5会自动复制到本地专家,指标或脚本目录。您可以轻松地在图表上启动程序,而无需手动复制文件。


    MQL5存储操作中的新功能

    为了实现对新共享项目的支持,我们已经更改了MQL5存储的操作协议。因此,平台更新后,您将需要检查核对来自存储的所有数据。更新过程中,MQL5存储中的所有数据都不会丢失或受到影响。

    更新到新版平台之前,我们建议您执行提交操作,将所有本地更改发送到MQL5存储。

    “检查存储”命令现在已经不可用。而是使用“激活MQL5存储”和“更新存储文件”命令来接收数据:

    • 如果在当前MetaEditor实例中您没有使用MQL5存储,那么请在导航窗口的快捷菜单中点击“激活MQL5存储”。您的存储中所有可用的类别和文件将被上传至您的本地电脑。
    • 如果您已经使用存储服务,请在某个项目或导航窗口中MQL5元素根目录的快捷菜单中单击“更新存储文件”,以便接收存储中的数据。

    新项目:创建和操作细节的示例

    新项目版块已被添加到MetaEditor。项目是一个mqproj文件,可以存储普通程序属性和有关所有已用文件的信息。现在,程序属性可以通过独立的MetaEditor对话框方便地管理,不必在源代码中手动更改属性(使用#property指令)。

    如果您有可用代码,您可以通过使用“来自源代码的新项目”命令来轻松地测试新项目。




    在已选文件所在的目录中,将会创建一个具有相同名称和mqproj为扩展名的新项目文件。通过#property在源代码中指定的主要程序属性将被自动添加到项目,包括名称,版权,版本,链接到开发者网站和程序描述。

    项目文件中程序属性会被设置高于程序代码中指定属性的优先级。如果项目和源文件中都指定了属性,那么项目属性将被使用。




    编译MQL5程序的两个新选项已被添加到项目属性:

    • 启用额外优化:禁用优化的应用程序编译速度更快,但执行速度较慢。
    • 检查浮点分隔:检查禁用的应用程序速度稍快,因为在执行代码过程中,不检查除数为零的错误。

    若要使用项目服务,请使用导航窗口独立的项目标签。项目服务中使用的所有文件都以方便的形式展示在这个标签。当项目从源文件生成时,所有使用的包含文件(在主MQ5文件及其包含文件中通过#include目录指定)都会自动添加到相关性部分。

    当新的包含文件添加到源代码时,它也出现在项目导航中。已用的标题文件添加到标题版块;在项目中用作资源的图片,声音和其他MQL5程序也被添加到资源版块。带有源代码的MQ5文件显示在资源版块。在“设置和文件”版块,您可以添加其他文件,例如用于测试的set文件和图表模板。

    使用快捷菜单命令向项目添加现有文件或从项目中删除文件。删除文件时请注意,因为您不但可以从项目中移除文件(解除绑定)还可以从硬盘中彻底删除文件:




    创建一个新项目犹如创建普通MQL5程序一样简单。单击“新项目”,选择新程序类型并指定MQL5向导中的属性(例如名称,事件处理程序)。

    若要获得可执行文件EX5,您可以打开这个项目并按下F7(编译命令)或打开程序的主MQ5文件并编译它。

    MQL5存储中的共享项目:操作细节

    共享项目是由一个单独的共享项目版块来管理。如果您还没有连接存储库,请在所需文件夹的快捷菜单执行“激活MQL5存储”命令。MetaEditor将检查您的存储库是否包含任何保存数据以及是否有任何共享项目可供您使用。所有可用的数据都将从存储库中恢复并上传到您的电脑(检验操作)。可用的组项目出现在共享项目版块。若要恢复项目,请在快捷菜单中执行“在存储库检查”。

    若要创建新组项目,请选择共享项目文件夹并点击“新项目”:




    然后完成标准的MQL5步骤:设置所需程序的类型,名称和属性。对于组项目,您应该使用清晰易懂的名称,以便其他参与者能够轻松地找到它们。项目名称中只可以使用没有空格的拉丁字符和数字。

    创建的对象会立刻添加到MQL5存储库中。项目中使用的标准程序库文件不会添加到存储库中,您可以手动添加它们。

    若要允许其他参与者使用项目,请打开项目属性。在这里,您可以通过指定MQL5.community登录名,以及为组工作设定公共参数,来向选定用户授予权限:

    • 私人项目
    • 免费加入项目
    • 通过请求项目加入




    当您编译一个组项目时,根据程序类型,可执行文件EX5会自动复制到本地专家,指标或脚本目录。它允许您在程序端立即运行程序而不必手动复制到适当的目录。


    MQL5存储中的公共项目:参与开发

    如上所述,MQL5存储中的每个组项目都有公共设置:项目可以是私人的,也可以是对其他人公开的。现在,您可以免费加入的所有项目都显示在单独的“公共项目”标签。

    每个人都可以找到心仪的项目并加入其开发过程。仅需单击加入,接收存储项目。




    每个加入的用户都获得了只读权限。联系项目作者,提交您的更改。若要了解他或她的登录名,请通过快捷菜单打开项目属性。

  2. 添加了能够轻松插入属性和资源到程序代码的能力。例如,您可以迅速地将包含文件加入代码。使用命令“插入—MQH 为 #incude”,并选择所需的包含文件。对所选文件正确路径的#include指令将被插入到程序代码。




    相同菜单允许以二进制或文本数组的形式添加到程序代码文件。另外,您还可以使用EA交易或指标转移图表模板:将您的模板插入到程序代码作为数组,然后使用FileSave函数将其保存到磁盘。然后,可以使用ChartApplyTemplate函数将模板从EA交易直接应用到所需的图表上。
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                          |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //--- 作为二进制数组的模板文件
       unsigned char my_template[]=
         {
          0xFF,0xFE,0x3C, ... ,0x00 // 本例中数据数组被缩短
         };
    //--- 保存和应用模板
       if(FileSave("my_template.tpl",my_template))
         {
          Print("Custom template saved in \\MQL5\\Files");
          if(ChartApplyTemplate(0,"\\Files\\my_template.tpl"))
             Print("Custom template applied to the current chart");
          else
             Print("Failed to apply custom template");
         }
       else
          Print("Failed to save custom template");
      }

  3. 添加了在ASCII,HEX和Base64格式之间转换字符串的选项。在源代码中选择一行并在编辑——转换菜单中单击所需的命令:




  4. 修正文件搜索不区分大小写。
  5. 修正计算类似x.y[0][1].z表达式时可能发生的调试错误。
  6. 使用前进和后退按键修正代码导航。

MQL5

  1. 添加了新的线上服务——MQL5云保护,用于为MQL5程序提供额外保护。这种保护类似于MetaTrader市场——最大的交易应用程序商店所使用的选项,另外,卖家提交的EX5产品文件也被编译为本地代码。

    现在,平台所有用户都可以使用这种类型的保护。若要保护您的文件,请在MetaEditor中执行以下命令:工具—MQL5云保护。MQL5云保护与市场中使用的机制的唯一不同点在于该文件与用户的电脑没有关联。通过MQL5云保护服务的保护,文件可以在任何电脑上运行,类似于普通的EX5文件。
    MQL5云保护是一种安全服务。额外保护只应用于已编译的文件。源代码没有传递到该服务。第一步,程序被编译到用户电脑上的EX5文件;然后,编译后的文件通过一个加密通道发送到服务,在该服务中,文件得到保护并返回给用户。



  2. 添加使用自定义金融工具的新函数。

    函数 行为
    CustomSymbolCreate 在指定组以指定名称创建一个自定义交易品种
    CustomSymbolDelete 删除指定名称的自定义交易品种
    CustomSymbolSetInteger 为自定义交易品种设置整型属性值
    CustomSymbolSetDouble 为自定义交易品种设置真实型属性值
    CustomSymbolSetString 为自定义交易品种设置字符串类型属性值
    CustomSymbolSetMarginRate 根据订单类型和方向为自定义交易品种设置预付款比例
    CustomSymbolSetSessionQuote 为指定交易品种和工作日设置指定报价期的起止时间
    CustomSymbolSetSessionTrade 为指定交易品种和工作日设置指定交易时期的起止时间
    CustomRatesDelete 在指定时间间隔内从自定义交易品种的价格历史记录中删除所有柱形图
    CustomRatesReplace 在指定时间间隔内用MqlRates类型数组的数据完全替换自定义交易品种的价格历史记录
    CustomRatesUpdate 将缺失的柱形图添加到自定义交易品种的历史记录并用MqlRates类型数组的数据替换现有的数据
    CustomTicksAdd 将MqlTick类型的数组数据添加到自定义交易品种的价格历史记录。自定义交易品种必须在市场报价窗口中选择。
    CustomTicksDelete 在指定时间间隔内从自定义交易品种的价格历史记录中删除所有报价
    CustomTicksReplace 在指定时间间隔内用MqlTick类型数组的数据完全替换自定义交易品种的价格历史记录

  3. 通用数据集合 添加到标准程序库。它们包含基于模板定义数据集合的类和接口。这种新型数据集合提供了更加方便的应用程序开发和高速的数据处理表现。

    程序库位于程序端工作目录的Include\Generic文件夹。

  4. 添加了对union数据类型模板的支持。
  5. SYMBOL_VISIBLE 交易工具属性已被添加。如果指定交易品种在市场报价中不可见,那么调用SymbolInfoInteger(交易品种,SYMBOL_VISIBLE)返回false。
  6. 添加新的CHARTEVENT_MOUSE_WHEEL属性。当鼠标滚轮被滚动或在图表上按下时调用该事件(如果图表CHART_EVENT_MOUSE_WHEEL=true)。
  7. 以下图表属性已被添加:

    • CHART_EVENT_MOUSE_WHEEL — 启用/禁用生成CHARTEVENT_MOUSE_WHEEL(在图表上滚动鼠标并点击事件)。可能值:0 和 1。
    • CHART_CROSSHAIR_TOOL — 启用/禁用单击中键将光标切换到十字光标的可能性。可能值:0 和 1。
    • CHART_CONTEXT_MENU — 启用/禁用右击显示图表快捷菜单。可能值:0 和 1。

  8. 现在,在计算指标窗口比例时不必考虑绘制DRAW_NONE 类型缓冲区。
  9. 在为图表设置CHART_SCALEFIX (固定比例)属性时添加CHARTEVENT_CHART_CHANGE事件生成。
  10. ArraySwap函数已被添加,允许快速交换动态数组的内容。
    bool  ArraySwap(
       void&  array1[],      // 第一数组
       void&  array2[]       // 第二数组
       );
    这个函数接受相同类型和相同维度的动态数组。对于多维数组,除了第一元素以外,所有维度中的元素数量都应该匹配。

  11. 新增新属性TERMINAL_RETRANSMISSION — 对于所有在指定计算机上运行应用程序和服务的TCP/IP协议 中的现有网络数据包的百分比(重新传输)。即使在最快且配置正确的网络中也可能发生数据包的丢失。这种情况下,在接收方与发送方之间没有确认数据包的交付。因此,丢失的数据包会重新发送。

    程序端并不会计算该值。而是每分钟从操作系统请求一次。并不表示特定程序端和交易服务器之间的连接质量,因为这个百分比是为整个网络活动而计算,包括系统和后台活动。

    TERMINAL_RETRANSMISSION属性添加到ENUM_TERMINAL_INFO_DOUBLE枚举,使用TerminalInfoDouble函数来获得它。
  12. 通过交易历史记录优化工作。

信号

  1. 修正了在强制关闭一个根据信号持仓的情况下的订单成交类型的指示。信号复制选项中提供了“账户低于XXX美元时止损”的选项:如果净值跌落了指定水平,交易信号复制将自动终止,所有持仓关闭。以前,如遇强制平仓的情况,平仓订单可能会设置一个不正确的成交类型。现在程序端会检查交易品种设置中允许的成交类型并指示适当的选项。

Tester

  1. 策略测试中HistoryOrderSelect函数的行为现在对应客户端中相同的函数。
  2. 策略测试中CopyTicksCopyTicksRange函数的行为现在对应客户端中相同的函数。
  3. 在视觉测试过程中优化显示图形对象。
  4. 修正显示交易所工具的测试结果(交易所风险管理模式)。现在,图表只能显示净值,而结余和入金负载无法显示。这种账户的交易状况是基于净值水平来进行评估。结余仅显示了账户上的金额而忽略了交易者的资产和负债。入金负债(预付款/净值)不显示,因为在交易所计算模式,预付款等于资产/负债的当前贴现值,它是随着净值的改变而改变。

  • 用户界面现已支持荷兰语。
  • 更新文档。