MetaTrader 5新功能

桌面版,移动版和网页平台的更新历史

20 十二月 2017
MetaTrader 5 Build 1730: MetaEditor项目和合成金融工具

停止对旧版程序端的支持

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

  • 客户端: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. 修正显示交易所工具的测试结果(交易所风险管理模式)。现在,图表只能显示净值,而结余和入金负载无法显示。这种账户的交易状况是基于净值水平来进行评估。结余仅显示了账户上的金额而忽略了交易者的资产和负债。入金负债(预付款/净值)不显示,因为在交易所计算模式,预付款等于资产/负债的当前贴现值,它是随着净值的改变而改变。

  • 用户界面现已支持荷兰语。
  • 更新文档。
  • 23 八月 2017
    MetaTrader 5 iOS build 1649:支持查看金融工具市场统计信息

    新版本中可以查看交易所执行模式下进行交易的金融工具市场统计信息。打开市场报价(Market Watch)中任何交易品种的菜单,选择“统计”,来查看市场统计信息。


    此外,新版本中交易标签的持仓操作也更加便捷。现在,单击持仓或订单将会显示详细信息和可用操作,例如平仓,更改或增加持仓交易量,以及打开持仓交易品种的图表。

    2 八月 2017
    MetaTrader 5 Android build 1642:简化真实账户申请流程

    MetaTrader 5 Android版,现在能够轻松创建初始真实交易账户。从菜单选择“开立真实账户”并在服务器列表中找到您的交易商。您只需附加两份文件,包括您的身份证明文件和银行账户账单。然后您的请求将被转发至交易商,同时开立账户时您可能会被要求提供其他信息。


    21 七月 2017
    MetaTrader 5 Build 1640:创建和测试自定义交易品种

    程序端

    1. 现在可以在程序端创建自定义的金融品种。使用该新选项,您可以创建任何交易品种,配置其设置,导入您的价格数据到交易品种并查看其图表。

      创建自定义交易品种
      通过“市场报价”窗口的快捷菜单打开交易品种管理窗口并点击“创建自定义交易品种”:



      大量的交易品种参数可以被配置。完整的参数列表及其描述在文档中可以查询。您可以通过复制任何类似品种的参数并修改它们来配置您的自定义交易品种。在“复制自”字段选择现有的交易品种。
      自定义交易品种的名称不可与交易商提供的交易品种名称相同。如果您连接到存在同名交易品种的服务器,那么自定义交易品种将被删除。
      这里还提供了导入和导出参数的命令。您可以在您的程序端之间轻松地分享自定义交易品种或转移交易品种。设置会被导出到JSON文本文件。

      管理自定义交易品种
      所有交易品种都显示在独立的自定义组。如果您需要更改或删除一个交易品种,请使用列表的快捷菜单:




      导入价格历史
      您可以从任何文本文件以及MetaTrader 历史文件HST和HCC导入价格数据到您的自定义交易品种。选择一个交易品种并转到“柱形图”标签。


      在导入对话框,指定到文件的路径并设置所需的参数:

      • 分隔符 — 文本文件中的元素分隔符。
      • 跳过列和行 — 导入过程中将要跳过的列数(从左向右)和行数(从上到下)。
      • 迁移 — 时间迁移小时数。导入不同时区保存的数据时使用的选项。
      • 仅使用选定 — 仅导入在行查看区域突出显示的行。您可以按住 Ctrl 或 Shift 并用您的鼠标突出标记行。

      1分钟柱文件有以下格式:日期 时间 开盘价 最高价 最低价 收盘价 报价量 交易量 点差。例如;
      2016.06.27    00:01:00    1.10024    1.10136    1.10024    1.10070    18    54000000    44
      2016.06.27    00:02:00    1.10070    1.10165    1.10070    1.10165    32    55575000    46
      2016.06.27    00:03:00    1.10166    1.10166    1.10136    1.10163    13    13000000    46
      2016.06.27    00:04:00    1.10163    1.10204    1.10155    1.10160    23    51000000    41
      您可以使用任何现有品种的数据应用于您的自定义交易品种。导出数据(该选项已添加到之前的平台版本),必要情况下进行修改再将其导回。
      价格历史以一分钟柱的形式存储在MetaTrader 5中。其他所有时间周期都基于这些柱来创建。您也可以导入较高时间周期的数据,但这种情况下较低周期的图表将会出现差别。例如,如果您导入一小时数据,按小时显示的柱形图将会出现在M1图表上。
      自定义交易品种的价格数据保存在独立的自定义目录中(不在交易服务器数据存储的目录中):
      C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

      使用自定义交易品种
      自定义交易品种的用法类似于使用交易商提供的品种。自定义交易品种显示在市场报价窗口;您可以打开这种交易品种的图表并在这里使用指标和分析对象。自定义交易品种不可以进行交易。

      测试自定义交易品种的策略
      自定义交易品种可以在策略测试中测试自动交易和指标。以此来优化交易策略,甚至包括交易商目前尚未提供的金融品种。您只需要正确导入历史数据并配置自定义交易品种的属性。





      当计算预付款和利润时,策略测试会自动使用可用的交叉汇率。假设我们在外汇预付款计算类型创建AUDCAD.custom交易品种而我们账户的货币为美元。那么,测试器会根据外汇交易品种名称按照下面顺序搜索所需的交易品种:
      1.     首先,会搜索AUDUSD.custom(计算预付款)和USDCAD.custom(计算交易利润)格式的交易品种
      2.     如果其中一些交易品种不存在,那么会搜索第一个与所需货币对名称(AUDUSD和USDCAD分别进行)相对应的交易品种。例如,找到了AUDUSD.b 和 NZDUSD.b 交易品种。这意味着可以使用它们的汇率计算预付款和利润。

      其他预付款计算类型的工具(期货和 股票交易)则需要一种货币对把工具货币兑换成入金货币。假设我们创建了一个利润和预付款货币为GBP的自定义交易品种而入金货币是CHF。这种情况下,会依照以下顺序搜索测试交易品种:
      1. 检查是否存在GBPCHF (GBP vs CHF) 对应的交易品种。
      2. 如果这种交易品种不存在,那么会搜索第一个与GBPCHF名称相对应的交易品种,例如GBPCHF.b或GBPCHF.def。

      当通过自定义工具测试应用程序时,要确保交易账户包含全部所需的货币对。否则,测试期间将无法计算金融结果和预付款需求。

      在MetaTrader 5平台未来的版本中将会提供更多的可能性
      自定义交易品种的开发尚未完成,在接下来的平台版本中将会添加更多的功能。您将可以从EA交易直接导入历史记录到自定义交易品种,以及实时放送该交易品种的数据(添加报价)。

    2. 添加通过交易量过滤成交时间&交易量功能。

      少于指定交易量的实际交易量可以从成交时间&交易量表格中隐藏。如果使用这个过滤器,那么将只有大额交易才会显示在成交时间&交易量窗口。

      双击成交时间&交易量窗口的第一行,指定最小交易量手数,然后点击市场深度的任何其他区域。交易将被过滤,而当前过滤值将会出现在交易量列的标题。



      您还可以使用成交时间&交易量的快捷菜单指定最小交易量。

    3. 添加绑定市场深度和活动图表的选项。每次您切换到金融品种的图表时,在市场深度窗口都会自动启用相同品种。所以,您无需为每个新交易品种打开市场深度窗口。





    4. 修正程序端窗口最小化和最大化后的工具栏刷新。
    5. 修正交易单和持仓单重复情况下生成的持仓交易历史。

    MQL5

    1. 添加在价格历史分析MQL5程序的选项。该选项无需等候新报价就可以检查程序性能。

      当基于真实数据进行分析时,可以在程序端标准图表中启用程序。许多程序,尤其是指标,只有在收到新报价(OnTickOnCalculate)时才会执行计算。因此,若要评估程序表现,您必须等候实时新报价。如果您使用历史数据测试程序,您可以立即提供所需的负载。分析在策略测试中以可视化模式启动,您可以一次性接收许多新报价事件。



    2. 添加支持union。Union是一种特殊的数据类型,由几个共享相同内存区的变量组成。因此,union提供了以两种(或更多)不同的方式讲解相同位序列的能力。Union声明从'union'关键字开始。
      union LongDouble
      {
        long   long_value;
        double double_value;
      };
      与结构不同,不同的union成员属于同一个内存区。在该示例中,LongDouble函数的union是通过共享同一个内存区的long和double类型值来声明。请注意,由于long_value 和 double_value 变量重复(在内存中),所以union不可以同时存储long整型值和double真实型值(不同于结构)。 换句话说,MQL5程序随时都可以将union的数据处理为整型(long)或真实型(double)值。因此,union允许接收表示相同数据序列的两种(或更多种)选项。

      union声明期间,编译器会自动分配足够的内存区以便在变量union存储最大的类型(交易量)。同样的语法也用于访问关于结构的union元素,例如,点操作符
      union LongDouble
      {
        long   long_value;
        double double_value;
      };
      //+------------------------------------------------------------------+
      //| 脚本程序起始函数                                                        |
      //+------------------------------------------------------------------+
      void OnStart()
        {
      //---
         LongDouble lb;
      //--- 获得并显示无效 -nan(ind) 数字
         lb.double_value=MathArcsin(2.0);
         printf("1.  double=%f                integer=%I64X",lb.double_value,lb.long_value);
      //--- 最大的标准化数值 (DBL_MAX)
         lb.long_value=0x7FEFFFFFFFFFFFFF;
         printf("2.  double=%.16e  integer=%I64X",lb.double_value,lb.long_value);
      //--- 最小的正标准化 (DBL_MIN)
         lb.long_value=0x0010000000000000;    
         printf("3.  double=%.16e  integer=%.16I64X",lb.double_value,lb.long_value);
        }
      /*  Execution result
          1.  double=-nan(ind)                integer=FFF8000000000000
          2.  double=1.7976931348623157e+308  integer=7FEFFFFFFFFFFFFF
          3.  double=2.2250738585072014e-308  integer=0010000000000000
      */

    3. 为结构和类对象添加自动生成隐式复制操作符。现在,编译器可以自动创建复制操作符,它可以为对象编写简单的条目,例如b=a:
      class Foo
        {
         int               value;
      public:
         string Description(void){return IntegerToString(value);};
         //--- 默认构造函数
                           Foo(void){value=-1;};
         //--- 参数化构造函数   
                           Foo(int v){value=v;};
        };
      //+------------------------------------------------------------------+
      //|  包括 Foo 类型对象的结构                           |
      //+------------------------------------------------------------------+
      struct MyStruct
        {
         string            s;
         Foo               foo;
        };
      //+------------------------------------------------------------------+
      //| 脚本程序起始函数                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
      //---
         MyStruct a,b;
         Foo an_foo(5);
         a.s="test";
         a.foo=an_foo;
         Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
         Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
      //---
         Print("b=a");
         b=a;
      //---
         Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
         Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
      /*
         Execution result;
         a.s=test a.foo.Description()=5
         b.s= b.foo.Description()=-1
         b=a
         a.s=test a.foo.Description()=5
         b.s=test b.foo.Description()=5
      */
        }
      在隐式操作符中执行对象的成员逐一复制。

      • 如果成员是一个对象,那么该对象对应的复制操作符将会被调用。
      • 如果成员是一个对象数组,那么调用每个元素对应的复制操作符之前就会使用ArrayResize增加或减少接收数组到所需的大小。
      • 如果成员是简单类型数组,ArrayCopy函数将用于复制。
      • 如果成员是一个对象指针,那么将会复制指针而不是它指向的对象。

      必要的情况下,您可以使用重载覆盖这个行为然后创建您自己的选项来替代隐式复制操作符。

    4. 当使用Copy* 函数访问来自EA交易的价格历史时,优化内存使用。当处理大量数据将会大幅降低内存消耗。

    5. 现在,TimeToStruct函数返回一个布尔值,允许检查datetime到MqlDateTime转换的成功率。
    6. 添加禁止在结构使用FileWriteStructFileReadStruct函数的禁令,包括字符串,动态数组,对象和指针。
    7. 已添加以下返回代码:

      • TRADE_RETCODE_REJECT_CANCEL — 激活挂单的请求被拒绝,订单被取消
      • TRADE_RETCODE_LONG_ONLY — 由于交易品种设置了“仅允许买入持仓”的规则,所以请求被拒绝
      • TRADE_RETCODE_SHORT_ONLY — 由于交易品种设置了“仅允许卖出持仓”的规则,所以请求被拒绝
      • TRADE_RETCODE_CLOSE_ONLY — 由于交易品种设置了“仅允许关闭现有持仓”的规则,所以请求被拒绝

    8. 通过SYMBOL_ORDER_MODE参数添加SymbolInfoInteger函数的新返回值。SYMBOL_ORDER_CLOSEBY — Close By操作的权限,例如,通过反向持仓来平仓。
    9. SYMBOL_CUSTOM布尔属性已添加到ENUM_SYMBOL_INFO_INTEGER枚举。该属性可以了解交易品种是否为自定义。使用SymbolInfoInteger函数来获得属性。
    10. 现在有可能获得创建一个订单,交易或持仓的原因。

      新属性


      订单,交易和持仓的创建原因
      已添加三个变量用来获得创建交易操作的原因:

      ENUM_POSITION_REASON ENUM_DEAL_REASON ENUM_ORDER_REASON 原因描述
      POSITION_REASON_CLIENT DEAL_REASON_CLIENT ORDER_REASON_CLIENT 激活从桌面程序端下单的订单而执行该操作
      POSITION_REASON_MOBILE DEAL_REASON_MOBILE ORDER_REASON_MOBILE 激活从手机应用下单的订单而执行该操作
      POSITION_REASON_WEB DEAL_REASON_WEB ORDER_REASON_WEB 激活从网页平台下单的订单而执行该操作
      POSITION_REASON_EXPERT DEAL_REASON_EXPERT ORDER_REASON_EXPERT 激活从MQL5程序下单的订单而执行该操作,例如EA交易或脚本
      - DEAL_REASON_SL ORDER_REASON_SL 激活止损而执行该操作
      - DEAL_REASON_TP ORDER_REASON_TP 激活止赢而执行该操作
      - DEAL_REASON_SO ORDER_REASON_SO 由于Stop out 事件而执行该操作
      - DEAL_REASON_ROLLOVER - 由于展期交割而执行交易
      - DEAL_REASON_VMARGIN - 收取变动预付款后执行交易
      - DEAL_REASON_SPLIT - 股票或其他资产分割(价格减少)后执行交易,宣布分割期间拥有持仓

    11. 优化同步和访问报价历史。
    12. CopyTicksRange函数中,修正返回报价到统计数组。在早期版本中,这种情况下经常返回0报价。
    13. 模糊逻辑库完成了多种修正。

    信号

    1. 修正无交易账户连接的情况下从网站打开的信号。

    Tester

    1. 优化并加速处理订单和交易历史。当处理大量数据时(数万条历史条目)将大幅度提高操作速度。
    2. 修正测试报告中计算的持仓时间。

    MetaEditor

    1. 修正了调试程序中静态类成员数组的显示内容。
    2. 在调试程序中添加了一个断点列表。该列表可以使用Debug标签的快捷菜单来打开:



      若要跳转到断点,请双击它。
    更新文档。
    22 六月 2017
    MetaTrader 5 iOS build 1605:开立初始交易账户
    新版MetaTrader 5 iOS build 1605提供了轻松开立初始交易账户的可能性。请从菜单选择“开立真实账户”并在服务器列表寻找您的交易商。填写您的个人详细资料,附加两份可以确认您身份和地址的文档并提交请求。您的交易商将会为您开立一个真实账户,必要情况下您还需要提供其他信息。


    新版MetaTrader 5 iOS还具有优化和重新设计邮箱版块的特性:

    • 现在相关邮件都绑定在一起并在邮件列表中显示为一项。
    • 添加预览邮件附件。
    • 现在一封邮件最多可以发送五个附件(文件大小不能超过8Mb)。
    26 四月 2017
    MetaTrader 5 Build 1596:访问价格历史

    程序端

    1. 添加访问柱形图和报价历史的功能。现在,不仅仅使用MQL5语言,还可以通过交易平台界面从服务器直接下载完整的1分钟柱形图和报价历史。访问价格历史已经扩展成为推出定制数据源功能准备工作的一部分。不久的将来,平台将提供可以基于用户价格数据建立图表,以及创建综合交易品种和使用离线图表。
      若要下载数据,请通过“市场报价”窗口的快捷菜单打开交易品种管理对话框:


      对话框显示两个新标签:“柱形图”和“报价”。选择交易品种,想要的时间间隔并点击“请求”。平台将从服务器请求全部可用数据,如果已被下载则将会立即显示数据。已保存的价格数据可以导出为CSV文件。

    2. 添加持仓,交易和订单时间的毫秒精确显示。




    3. 在交易对话框,修正拒绝执行Close By请求的通知。

    MQL5

    1. 修正PositionSelect函数。该函数可以偶尔选择不同于最低单号的持仓。
    2. 修正请求深度报价历史数据时的CopyTicksCopyTicksRange函数的操作。

    信号

    1. 修正复制增加现有持仓大小的操作。单边账户可能偶尔出现这个错误。

    Tester

    1. 修正处理交易所模式的限价单。优于市价单(买价低于市场价或卖价高于市场价)的限价单可以无滑点的执行。不如市价单的限价单以下单时的市场价立即执行。

    更新文档。


    8 四月 2017
    MetaTrader 5 Android build 1576:以持仓的形式显示交易历史

    MetaTrader 5 Android的交易历史现在能够以持仓的形式显示。在此之前,历史标签仅仅包含订单和交易信息,然而现在,可以根据持仓信息来分析交易。持仓相关的全部交易数据都集中显示在一条记录,显示如下:

    • 持仓和平仓时间(取决于第一笔交易和最后一笔交易)
    • 持仓交易量(如果部分平仓,记录会包括已平仓交易量和初始交易量)
    • 加权平均持仓开盘价和收盘价
    • 与持仓相关的全部金融交易结果

    30 三月 2017
    新版MetaTrader 5 iOS build 1547显示持仓历史记录

    现在交易历史能够以持仓的形式显示。在此之前,历史标签仅仅包含订单和交易数据。现在,它还包括了持仓数据。交易平台收集持仓相关的交易数据,然后将数据合并为一个记录。该记录包括:

    • 由第一笔交易和最后一笔交易决定的持仓和平仓时间
    • 持仓交易量。部分平仓情况下,记录包括平仓和初始交易量
    • 加权平均持仓开盘价和收盘价
    • 与持仓相关的金融交易的全部结果

    24 三月 2017
    MetaTrader 5 Build 1570:改进市场展示,扩展MQL5模板函数

    程序端

    1. 更新MetaTrader 市场商店的应用程序展示。现在,您可以更加方便的浏览EA交易和技术指标。我们更新了界面设计并添加了产品选择:

      • 现在,主界面可以显示最受欢迎的EA交易,指标,新的市场产品以及热门的免费应用程序。
      • EA交易,指标和实用工具版块还有其分版块:网格和锁仓EA交易,趋势和多货币指标以及更多内容。




    2. 修正当使用有权限限制的Windows账户时的客户端更新和市场、信号及虚拟主机的内置购买。
    3. 修正偶然发生的持仓历史的错误分类。
    4. 优化和修正展示标签的显示。

    MQL5:

    1. 添加支持使用参数重载模板函数。例如,我们有一个通过类型转换将第二个参数的值写入第一个参数的模板函数。MQL5不允许string到bool的类型转换。但是,我们可以自己完成。让我们创建一个模板函数的重载:
      //+------------------------------------------------------------------+
      //| 模板函数                                     |
      //+------------------------------------------------------------------+
      template<typename T1,typename T2>
      string Assign(T1 &var1,T2 var2)
        {
         var1=(T1)var2;
         return(__FUNCSIG__);
        }
      //+------------------------------------------------------------------+
      //|  bool+string的特殊重载                            |
      //+------------------------------------------------------------------+
      string Assign(bool &var1,string var2)
        {
         var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
         return(__FUNCSIG__);
        }
      //+------------------------------------------------------------------+
      //| 脚本起始函数                                        |
      //+------------------------------------------------------------------+
      void OnStart()
        {
         int i;
         bool b;
         Print(Assign(i,"test"));
         Print(Assign(b,"test"));
        }
      代码执行后,我们可以看到Assign() 模板函数已被用于int+string组,而重载版也已在第二次调用时用于bool+string组。
      string Assign<int,string>(int&,string)
      string Assign(bool&,string)

    2. 新增模板函数的显式规范。因此,在调用函数列表之前,请先指定代表参数:
      template<typename T>
      T Func() { return (T)0; }
        
        
      void OnInit()
        {
         Func<double>();   // 模板函数显式规范
        }
      因此,类型的显式规范将会执行代表参数而非调用参数。

    3. 优化DRAW_ZIGZAG 绘制类型的自定义指标的显示。
    4. 添加新值到ENUM_DEAL_TYPE交易类型枚举:

      • DEAL_DIVIDEND — 股息操作。
      • DEAL_DIVIDEND_FRANKED — 税务减免(免税)股息操作(公司缴纳税费,而非客户)。
      • DEAL_TAX — 收税。

    5. 修正DRAW_FILLING绘制类型的自定义指标的显示。如果上下线坐标一致,绘制细线。
    6. 修正CHART_SHOW参数设置为'false'时计算位图标签对象坐标。参数通过ChartSetInteger函数来设置并允许隐藏全部价格图表元素来创建一个自定义程序界面。
    7. 修正将24位图像置于MQL5应用程序资源时的重新编码。
    8. 修正使用ArrayPrint函数的印刷结构。
    9. 更新MQL5标准程序库。

    MetaEditor

    1. 新增马来语的用户界面翻译。

    信号

    1. 修正在MQL5.community网站移动但没有连接交易账户时打开程序端的信号页面的问题。

    Tester

    1. 修正策略测试中的CopyTicks函数操作。
    2. 修正生成报告时排序出金交易。
    3. 修正更改挂单。

    主机

    1. 修正超高清屏幕(4К)上虚拟主机向导的显示。

    更新文档。

    17 二月 2017
    MetaTrader 5 平台Build 1545:通过鼠标滚动快速切换窗口和改变价格

    程序端

    1. 在'工具箱'和'策略测试'窗口之间快速切换。



    2. 提供了可以通过鼠标滚动编辑价格和订单交易量的新选项:




    3. 现在,当您切换到下载移动程序端时,将会记录您的交易服务器列表。然后,当您在iPhone或Android设备上安装MetaTrader时,将会向您显示一份准备好的服务器列表。 您就可以迅速连接您现有的交易账户。而当前连接账户的服务器将会第一时间显示在移动程序端。




    4. 显著降低隐形(最小化)图表和对象产生的程序端负载。
    5. 修正偶尔错误触发追踪止损水平。
    6. 修正在账户交易历史中通过交易品种筛选交易。
    7. 修正持仓历史中'类型'字段的显示。
    8. 修正以持仓形式展示交易历史。
    9. CLR_NONE用于颜色的情况下,修正绘制类型为DRAW_COLOR_LINE,DRAW_COLOR_ZIGZAG和DRAW_COLOR_SECTION的自定义指标的显示。

    MQL5

    1. 修正使用常量指针打印模板。
    2. 修正管理访问私有和受保护的类成员。

    Tester

    1. 当订单触发价格不如当前市场价时(买价高于或卖价低于市场价),修正激活交易所品种的限价订单。
    2. 移除具有64种输入参数的自定义指标测试的连接限制。
    3. 添加印地语的UI 翻译。

    更新文档。

    9 二月 2017
    MetaTrader 5 iOS build 1509:通过Facebook登录MQL5.com
    • 添加通过Facebook注册和登录您的MQL5.com账户的功能。如果您拥有该群组网络的账户,只需几次点击您就可以访问聊天功能及全套的MetaTrader 5服务。

    • 进一步改进及修正。
    27 一月 2017
    MetaTrader 5 build 1525: 以持仓形式展示交易历史并改进测试器

    程序端

    1. 现在可以按照持仓的形式展示交易历史。程序端收集持仓相关交易的数据(开仓,额外交易量,部分和全部平仓),然后将数据组合为一个包含以下细节的记录:

      • 分别由第一笔和最后一笔交易决定的开仓和平仓的时间
      • 持仓交易量。如果部分平仓,该记录会包含平仓交易量和源交易量
      • 加权平均持仓价及其平仓价
      • 持仓相关交易的总财务结果




      有关锁仓账户,其新的历史记录显示形式类似于MetaTrader 4中使用的账户历史形式。




    2. 添加允许在交易品种图表显示交易的新命令。

      • 如果您需要显示选定持仓/交易品种的交易,请点击"添加 [交易品种名称] 交易"。相应的交易将会显示在选定交易品种当前全部打开的图表上。如果该交易品种没有打开的图表,那么将会打开一个新图表。
      • 点击"添加全部交易",显示来自账户历史的全部交易品种的交易。相关交易品种的交易将被添加到全部打开的图表。




    3. 添加在合约规范中交易品种的国际名称显示,以及在交易品种管理对话框搜索国际名称。




    4. 添加设置程序端窗口分辨率的命令。该功能非常有助于制作视频。菜单提供了不同视频服务所使用的最流行的分辨率选项,例如YouTube



    5. 图表模板和概况已从[Terminal Data Folder\Profiles]迁移到[Terminal Data Folder\MQL5\Profiles]。现在您可以轻松添加模板到MQL5 存储并通过任何一台PC机进行访问。

    MQL5

    1. 添加支持资源变量。使用这种变量可以显著推进一些程序的开发。例如,您可以在独立的CL文件中编写一个OpenCL程序的代码,然后将其作为字符串加入到您的MQL5程序资源。更新之前,这种代码需要描述为一个大型字符串变量。

      资源变量声明
      #resource path_to_resource_file as type_of_resource_variable name_of_resource_variable

      特性
      • 基于BOM(标题)自动确定字符串文件的编码。如果BOM不存在,那么编码将由文件内容定义。支持ANSI,UTF-8 和 UTF-16。全部字符串都转换为Unicode。
      • 这种资源的数据只能通过变量来处理。不可使用"::<resource name>"自动解决。
      • 特殊的位图资源变量类型表明资源为图像的编译器。在这种情况下,资源变量为单位类型。
      • 当使用24位图像时,阿尔法通道组件对全部图像像素设置为255。
      • 当使用没有阿尔法通道的32位图像时,阿尔法通道组件对全部图像像素也设置为255。
      • 当加载包含阿尔法通道的32位图像时,不以任何方式处理像素。
      • 位图类型数组资源变量可能有两种维度。在这种情况下,数组大小定义为[image_height ][ image_width ]。
      • 如果指定了一维数组,元素数量等同于image_height*image_width。
      • 如果资源文件大小不是数组元素大小的乘积,将会剪切剩余数据。例如,如果文件大小为14个字节,对于整型数组,元素数量将等于3而其他两个字节(14 - sizeof(int)*3)将会舍弃。

      使用示例
      #resource "data.bin" as int ExtData[]             // 声明包含data.bin文件数据的数值数组
      #resource "data.bin" as MqlRates ExtData[]        // 声明包括data.bin文件数据的简单结构数组
      
      #resource "data.txt" as string ExtCode            // 声明包含data.txt文件数据的字符串
      #resource "data.txt" as string ExtCode[]          // 声明包含data.txt文件数据的字符串
      
      #resource "image.bmp" as bitmap ExtBitmap[]       // 声明包含BMP文件位图文件的一维数组,数组大小 = width * height
      #resource "image.bmp" as bitmap ExtBitmap2[][]    // 声明包含BMP文件位图文件的二维数组,数组大小[hight][width]
      

    2. 新属性CHART_SHOW可以禁用图表显示。函数ChartGetIntegerChartSetInteger 用于获得和设置属性。

      false的情况下,禁止绘制任何价格图表属性,消除图表边界全部缩进,包括时间价格比,快速导航条,日历活动标签,交易标签,指标和工具提示条,指标子窗口,交易量直方图等。

      禁止使用图形资源为创建自定义程序界面绘制完美解决方案。

      无论CHART_SHOW属性值是多少都可随时绘制图形对象

    3. 新CHART_KEYBOARD_CONTROL属性可以通过键盘("Home","End","PageUp","+","-","Up arrow"等)启用/禁用图表控制。设置CHART_KEYBOARD_CONTROL为false在保留接收OnChartEvent()事件按键的完整能力时禁止图表滚动和缩放。

      函数ChartGetIntegerChartSetInteger允许获得和设置属性。

    4. 添加使用OpenCL的新函数。

      处理内存的新属性
      通过CLGetInfoIntegrer可以获得4个新属性:
      • CL_DEVICE_MAX_WORK_GROUP_SIZE — 可用于OpenCL设备的本地工作组总数。
      • CL_KERNEL_WORK_GROUP_SIZE — 可用于OpenCL程序的本地工作组总数。
      • CL_KERNEL_LOCAL_MEM_SIZE — OpenCL程序使用的,用于解决一组中全部平行任务的本地内存字节大小。使用CL_DEVICE_LOCAL_MEM_SIZE 接收可用最大值。
      • CL_KERNEL_PRIVATE_MEM_SIZE — OpenCL程序内核中,每个任务可用的最低私有内存大小(以字节为单位)。

      bool CLExecutionStatus(int kernel)
      返回OpenCL程序执行状态。OpenCL程序内核处理作为参数传递。

      bool CLSetKernelArgMemLocal(int kernel_handle,int arg_index,ulong local_mem_size)
      设置本地缓冲作为内核函数参数。OpenCL程序内核处理,OpenCL函数参数数量和缓冲大小都作为参数传递。

    5. 添加TRADE_RETCODE_LIMIT_POSITIONS新资源代码。同时显示在账户上的持仓数可以通过服务器设置进行限制。到达限制后,若再尝试下单,服务器会返回TRADE_RETCODE_LIMIT_POSITIONS错误。限制的操作根据持仓账户类型而有所不同:

      • 单边账户类型 — 考虑持仓数量。到达限制后,平台会禁止生成可能增加持仓数量的新订单。实际上,平台仅允许为已有持仓的交易品种下单。不会考虑当前挂单,因为挂单的执行可能会改变当前持仓但不会增加持仓数量。
      • 锁仓账户类型 — 会同时考虑挂单和持仓,因为激活挂单也会导致生成新的持仓。到达限制时,平台禁止生成持仓的新市价单和挂单。

    6. 修正可能偶尔引起报价历史跳价的错误。
    7. 修正间接的模板打字错误。
    8. 更新数学统计函数的程序库。

    市场

    1. 修正下载模拟版时打开产品页面。

    Tester

    1. 完成优化后,结果会按照"结果"列自动排序。
    2. 优化结果标签的快捷菜单中的新命令"切换到优化结果"可以在优化完成时自动打开结果。
    3. 开始单次测试后,策略测试现在仍停留在优化模式。在早期版本中,如果从优化结果标签启动一次测试,策略测试会切换到单次测试模式。优化模式需要在设置中启用以便执行进一步优化。
    4. 除了traditional .set文件以外,现在输入参数的设置可以保存为本地策略测试设置,以便于从快捷菜单访问。




    5. 添加蒙古语,匈牙利语,罗马尼亚语和乌尔都语的UI翻译。

    MetaEditor

    1. 添加在调试窗口更改已读表达式顺序的功能。可以使用鼠标拖拽表达式到所需位置。




    2. 修正确定源文件编码。
    3. 修正在UTF-8编码中搜索文件。
    4. 修正如果文本包含标签,通过鼠标选择文本。
    5. 添加匈牙利语和罗马尼亚语的UI翻译。

    更新文档。


    18 一月 2017
    MetaTrader 5 Android build 1506:交易筛选和排序
    • 交易和历史标签现在提供排序的功能,可以帮助您按照交易品种(金融工具),订单和持仓/平仓时间对全部交易进行排序。除了排序功能以外,历史标签还可以根据不同的交易品种筛选交易。

    • 同时优化了多窗口模式下的图表工作。经过改进的菜单不但可以打开新窗口,删除旧窗口,还可以将其重新排列并选择想要的布局(垂直布局,水平布局或拼图布局)。

    9 十二月 2016
    MetaTrader 5 Build 1495:改善MQL5处理自定义图形的功能

    MQL5:

    1. 添加CopyTicksRange函数。
    2. 添加改善的抗锯齿函数到CCanvas类:
    3. 在MQL5参考文档中添加图形程序库的描述。该程序库可以直接在价格图表上创建直方图,分布图和线性图。
    4. 添加系统键状态标识符到客户端属性常量列表。调用TerminalInfoInteger(TERMINAL_KEYSTATE_XXX)返回GetKeyState()函数在MSDN相同键的状态代码。
    5. 禁用支持分配字符串类型到bool。检查字符串之前,需要使用明确的条件。例如,在新版本中,编译以下代码将会出现错误:
      string str;
      ...
      if(str)                        // 将会导致"不能转换'string'类型到'bool'"编译错误(在之前版本不会出现错误)
         Print("str is true");
      应该使用明确的条件:
      string str;
      ...
      
      //--- 检查字符串是否被初始化
      if(str!=NULL)
         Print("str is true");
      
      or
      
      //--- 检查字符串值是否为"true"
      if(StringCompare(str,"true",false))
         Print("str is true");
      
      or
      
      //--- 检查字符串是否为不等于零的整数
      if((int)str!=0)
         Print("str is true");

    修正崩溃日志中报告的错误。

    2 十二月 2016
    MetaTrader 5 网页平台:双重认证及更改密码
    • 我们已经添加了使用动态密码的双重认证选项,从而提高账户保护性能,防止未经授权的账户访问。启用双重认证功能之前,请先启动MetaTrader 5移动应用程序。登录并在设置窗口选择动态密码(OTP)生成选项。OTP生成器可以绑定您的全部交易账户并为每个账户自动生成一个唯一的六位动态密码。登录网页平台时输入该动态密码。





    • 另一个新选项就是可以改变主密码和只读密码。赶快抓住这个机遇,创建一个好记的个人ID吧。
    • 同时,更新的网页平台可以自动生成模拟账户。现在,您可以使用任何浏览器启动MetaTrader 5网页平台,即刻开始外汇、股票、期货或等金融交易品种的交易。
    24 十一月 2016
    MetaTrader 5 Build 1485: 附加测试模式和标准程序库的图形

    程序端

    1. 更改了程序端和MetaEditor日志中的条目顺序。更新之前,首先突出最新的日志条目。现在,日志会最先显示之前的条目。更传统的逆向排列顺序使得阅读日志更加轻松。




      此外,现在使用日志快捷菜单还可以隐藏'时间'和'源'所在列。

    2. 在锁仓模式,平仓的单号现在会显示在交易历史记录的订单和交易。这可以更轻松的查找相关的打开和关闭操作。




    3. 修正相同工具下导致从现有持仓到新持仓复制SL/TP的错误。当在锁仓模式使用一键交易功能(例如,从图表或从市场报价窗口)时可能发生该错误。
    4. 修正超高清屏幕(4K)下箭头对象的显示。

    MQL5

    1. 添加新的打印简单类型和结构到数组日志的ArrayPrint功能。
      void  ArrayPrint(
         const void&   array[],             // 输出数组
         uint          digits=_Digits,      // 小数位数
         const string  separator=NULL,      // 结构字段值之间的分隔符
         ulong         start=0,             // 最先显示元素的指数
         ulong         count=WHOLE_ARRAY,   // 显示的元素数
         ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN    
         );
      
      ArrayPrint无法打印全部结构数组字段到日志 – 跳过对象的数组字段和指针字段。如果您想打印全部结构字段,您应该使用所需格式批量打印的定制功能。
      //--- 显示最近的10个柱形图值
         MqlRates rates[];
         if(CopyRates(_Symbol,_Period,1,10,rates))
           {
            ArrayPrint(rates);
            Print("Проверка\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
            for(int i=0;i<10;i++)
              {
               PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
               TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
               rates[i].open,rates[i].high,rates[i].low,rates[i].close,
               rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
              }
           }
         else
            PrintFormat("CopyRates failed, error code=%d",GetLastError());
      //--- 日志示例
      /*
                          [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
         [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295         18110       10   17300175000
         [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747         17829        9   15632176000
         [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744         13458       10    9593492000
         [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194         15362        9   12352245000
         [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172         16833        9   12961333000
         [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052         15933        8   10720384000
         [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528         11888        9    8084811000
         [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915          7284       10    5087113000
         [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904          8710        9    6769629000
         [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263          8956        7    7192138000
         Check
         [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
         [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 
         [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 
         [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 
         [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 
         [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 
         [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 
         [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 
         [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 
         [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 
         [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 
      */
      

    2. 修正添加字符串类型S1=S2+S1的错误
    3. 更改ArrayResize函数的行为。如果 -1作为reserve_size参数传递,如果函数没有增加数组大小,函数仅释放未使用(保留)的内存。 以reserve_size=-1设置新数组大小为0相当于ArrayFree调用。新行为可以优化MQL5程序的内存使用率。
      void OnStart()
        {
         int arr[];
      //--- 最初使用的内存数量 
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      //--- 用于数组大小1的内存数量,保留
         ArrayResize(arr,1,1024*1024);
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      //--- 增加数组以后,使用的内存数量因保留而无法更改
         ArrayResize(arr,1024*512,1024*1024);
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      //--- 减少数组以后,内存大小也不会改变
         ArrayResize(arr,1);
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      //--- 移除储备内存后将释放未使用的内存
         ArrayResize(arr,1,-1);
         Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
        }
      

    4. 图表绘制函数已经添加到标准程序库。若要使用新功能,请将 MQL5\Include\Graphics\Graphic.mqh 加入到您的项目。

      基于三个数据系列使用GraphPlot绘制图表:
      #include <Graphics/Graphic.mqh>
      
      double Func1(double x) { return MathPow(x,2); }
      double Func2(double x) { return MathPow(x,3); }
      double Func3(double x) { return MathPow(x,4); }
      
      void OnStart()
        {
         GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
        }
      
      
      结果:


      基于数据数组使用GraphPlot绘制图表:
      #include <Math/Stat/Binomial.mqh>
      #include <Graphics/Graphic.mqh>
      
      void OnStart(void)
        {
         double    vars[101];
         double    results[101];
         const int N=2000;
      //---  
         MathSequence(0,N,20,vars);
         MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
         ArrayPrint(results,4);
         GraphPlot(results);
      //---
        }
      
      结果:



    5. 更新标准程序库中处理数学统计的函数。我们已经彻底检查了MQL5版和源R语言所有函数的质量和准确性。若要控制准确度和性能速度,单元测试可以沿着静态库进行分布。它们可以在\MQL5\Scripts\UnitTests\Stat目录取得。

      • TestStat.mq5 — 是测试计算结果的主要测试脚本
      • TestPrecision.mq5 — 计算精度的测试
      • TestBenchmark.mq5 — 测试包括计算测量性能

    Tester

    1. 该更新强调了测试期间配置执行延迟的高级设置。现在您可以在多种交易条件下测试您的EA交易,包括无延迟的理想情况和任何自定义设置的延迟。



      在早期版本只提供随机延迟模式

    2. 修正在'基于高开低收的M1'模式生成柱形图的报价量。
    3. 修正锁仓模式交易时订单和持仓建立时间说明提高到毫秒。
    4. 修正'真实报价'模式下多货币或多时间周期模式期间可能出现的'旧报价'错误。
    5. 改进从位于磁盘的数据库阅读请求报价时的CopyTicks性能速度。

    MetaEditor

    1. 导航条和工具箱中的文件快捷菜单现在突出了处理源代码版本库MQL5存储的命令。




    2. 修正处理存储中超过1024文件时可能偶尔破坏本地MQL5存储库完整性的错误。
    3. 修正MQL5存储文件树的显示。
    4. 修正批量文本替换的显示。

    更新文档。

    24 十一月 2016
    MetaTrader 5 iOS build 1425
    • 改进图表上的一键交易面板:现在也可用在纵向模式;通过从列表选择意向值快速改变交易量。 

    • 图表交易品种现在可以通过在窗口标题点击交易品种名称进行更改。
    • app设置版块的改进:现在可以突出当前账户信息,合理安排单元和改进设计。
    • 多项改进和修正。
    14 十月 2016
    MetaTrader 5平台Build 1455:MQL5 的数学函数库

    程序端

    1. 在交易对话框添加买入,卖出和关闭按键的工具提示。工具提示包括操作期间买入或卖出安全性的信息,以帮助新手了解交易的过程。




    2. 在“交易”和“历史”标签添加订单,交易和持仓的新图标。




    3. 更新的程序端提供了优化及更快(最高加速4-5倍)的市场深度,市场深度报价图表以及成交时间&交易量数据的展示和更新。
    4. 修正非交易时间报价历史的同步。这一过程在某些情况下可能会消耗过多的网络流量。

    MQL5

    1. 标准程序库中加入了MQL5版的ALGLIB数值分析库

      程序库特点

      • 线性代数
      • 线性和非线性方程组
      • 插值
      • 优化
      • 快速傅里叶变换
      • 数值积分
      • 线性和非线性最小平方拟合
      • 常微分方程
      • 特殊函数
      • 描述性统计和假设测试
      • 数据分析 - 分类,回归
      • 多种精确算法中的线性代数,插值等的实施算法(使用MPFR)

      如何使用

      ALGLIB 文件位于\MQL5\Include\Math\Alglib。若要使用这些函数,请将主程序文件添加到您的程序:

       #include <Math\Alglib\alglib.mqh> 

    2. 标准程序库包含了数理统计函数。MQL5 现在提供R语言的功能,这是最好的统计数据处理和分析工具之一。

      程序库特点

      统计程序库包含计算数据统计特征的函数以及统计分布操作的函数:

      • 计算数组元素统计特征的函数
      • 统计分布操作的选项:常态分布,对数常态分布,贝塔分布等。

      如何使用

      统计程序库文件位于 \MQL5\Include\Math\Stat。若要使用该程序库,请将所需函数的文件添加到您的程序,例如:

      #include <Math\Stat\Binomal.mqh>
      #include <Math\Stat\Cauchy.mqh>
      
      
      

      程序库函数的详细描述可在文章MQL5统计分布 - 使用最好的R中得到。


    3. 标准程序库中加入了MQL5版的Fuzzy程序库。Fuzzy程序库实现了Mamdani和Sugeno模糊推理系统。

      程序库特点

      • 13 个成员函数
      • 灵活的开发模糊系统规则的形式
      • Mamdani模糊推理系统
      • Sugeno模糊推理系统
      • Mamdani - 类型系统的5种去模糊化方式
      • 无限数量的输入输出变量

      如何使用

      Fuzzy程序库文件位于\MQL5\Include\Math\Fuzzy。若要使用该程序库,请将所需函数的文件添加到您的程序,例如:

      #include <Math\Fuzzy\mamdanifuzzysystem.mqh>
      #include <Math\Fuzzy\sugenofuzzysystem.mqh>
      
      
      

      程序库的详细描述可在代码库:Fuzzy - 开发模糊模型的程序库中得到


    4. CHART_QUICK_NAVIGATION新属性允许在图表中启用/禁用快速导航栏。如果您需要更改和访问属性状态,请使用ChartSetInteger和ChartGetInteger函数。




      导航栏可以通过按下回车或空格键来打开。它允许您快速转到图表上的指定日期,以及切换到交易品种和时间周期。如果您的MQL5程序会处理按下回车或空格键,请禁用CHART_QUICK_NAVIGATION属性,以避免程序库拦截这些事件。快速导航栏仍然可以通过双击打开。

    5. 添加了FileLoad和FileSave新函数。它们提供了一种简单的阅读和数组保存到文件的方式。不同于FileRead*和FileWrite*,这些函数不需要指标处理程序。FileLoad和FileSave操作数值类型的数组,以及没有字符串,动态数组或类对象的简单结构。
      long  FileLoad(
         const string filename,      // [in] 文件名
         void         &buffer[],     // [out] 阅读文件的数组
         uint         common_flag=0  // [in] 0 - 搜索程序端Files文件夹中的文件,FILE_COMMON - 在程序端普通目录中搜索
         );
      
      bool  FileSave(
         const string filename,      // [in] 文件名
         const void   &buffer[],     // [in] 保存文件的数组
         uint         common_flag=0  // [in] 0 - 创建程序端Files文件夹中的文件,FILE_COMMON - 在程序端普通目录中创建
         );
      
      
      如何将报价写入文件然后阅读的示例:
      //--- 输入参数
      input int      ticks_to_save=1000; // 报价数
      //+------------------------------------------------------------------+
      //| 脚本程序起始函数                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
         string  filename=_Symbol+"_ticks.bin";
         MqlTick ticks[];
      //---
         int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
         if(copied!=-1)
           {
            PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
            //--- 如果报价历史被同步,错误代码等于零
            if(!GetLastError()==0)
               PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError);
            //---  写入报价到文件
            if(!FileSave(filename,ticks,FILE_COMMON))
               PrintFormat("FileSave() failed, error=%d",GetLastError());
           }
         else
            PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError());
      //--- 现在阅读返回到文件的报价
         ArrayFree(ticks);
         long count=FileLoad(filename,ticks,FILE_COMMON);
         if(count!=-1)
           {
            Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags");
            for(int i=0;i<count;i++)
              {
               PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x",
               TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000,
               ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags);
              }
           }
        }
      
      

    6. 通过DRAW_CANDLES 绘制模式更改自定义指标的展示。现在该模式可以设置1-3种颜色。蜡烛图的显示取决于设定的颜色数量。

      如果指定一种颜色,图表上的所有蜡烛图都将绘制这种颜色。
      //--- 绘制相同颜色的蜡烛图 
      #property indicator_label1  "One color candles"
      #property indicator_type1   DRAW_CANDLES
      //--- 仅指定一种颜色,所以所有蜡烛图都是相同的颜色
      #property indicator_color1  clrGreen  
      
      
      如果指定两种颜色,一种颜色用于蜡烛图的边框,另一种用于主体。
      //--- 蜡烛图的颜色不同于阴影颜色
      #property indicator_label1  "Two color candles"
      #property indicator_type1   DRAW_CANDLES
      //--- 蜡烛图边框和阴影为绿色,主体为白色
      #property indicator_color1  clrGreen,clrWhite 
      
      
      如果指定三种颜色,一种颜色用于蜡烛图的边框,其他两种颜色用于牛市蜡烛图和熊市蜡烛图的主体。
      //--- 蜡烛图的颜色不同于阴影颜色
      #property indicator_label1  "One color candles"
      #property indicator_type1   DRAW_CANDLES
      //--- 蜡烛图边框和阴影为绿色,牛市蜡烛图主体为白色,熊市蜡烛图主体为红色
      #property indicator_color1  clrGreen,clrWhite,clrRed
      
      
      DRAW_CANDLES 风格允许设置自定义颜色的蜡烛图。使用PlotIndexSetInteger函数运行指标期间还可以动态更改所有颜色(drawing_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_number, color),在这里modifier_number 可能是以下的值:
      • 0 – 边框和阴影的颜色
      • 1 – 牛市蜡烛图主体颜色
      • 2 – 熊市蜡烛图主体颜色
      //--- 设置边框和阴影的颜色
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
      //--- 设置牛市蜡烛图主体颜色
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
      //--- 设置熊市蜡烛图主体颜色
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
      
      
    7. 修正漏洞并改进使用CopyTicks函数的报价历史操作。
    8. 从新版开始,操作符可用于接口(之前是不允许的)。

    市场

    1. 修正从市场买入产品时可能导致重复请求登录MQL5.community的错误。

    Tester

    1. 添加希腊语,马来语和希伯来语的UI 翻译。

    更新文档。

    29 九月 2016
    MetaTrader 5 网页平台更加快速便捷
    • 添加调整网页应用程序模块大小的能力,包括市场报价和价格图表窗口。
    • 添加工具箱窗口的交易和历史标签按列排序的能力。列宽可以更改。
    • 添加详情标签和快速添加交易品种的功能。
    • 由于代码优化,提高了网页程序端的整体操作速度。账户初始化,添加交易品种以及交易本身,现在都可以更快速的执行。

    26 九月 2016
    MetaTrader 5 iOS build 1403
    • 改变交易选项展示 -现在交易数据表示取决于交易账户上的风险管理系统:零售外汇,期货或交易所模式。

    • 常规设置中移动界面语言选择到一个单独的菜单。
    • 其他修正和改进。
    123456789101112131415