MetaTrader 5新功能

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

6 七月 2018
MetaTrader 5平台build 1880:计算合成交易品种的完整历史

程序端

  1. 程序端:为整个可用的数据深度添加了合成交易品种价格历史的计算。

    平台根据公式中使用的工具的一分钟柱来计算一分钟柱的历史记录。以前,只能计算最近两个月的历史记录。根据一个明确的请求可以创建更深入的历史(当将图表滚动到左侧或调用Copy函数时)。现在,可以无条件使用所有可用数据来计算历史。




    在合成公式中使用的每一个交易品种都可以有不同深度的价格历史。合成历史计算是对最短的可用周期来执行。例如,公式使用三个交易品种:

    • EURUSD 历史最早可以追溯回2009.01.01
    • USDJPY历史最早可以追溯回2012.06.01
    • EURJPY历史最早可以追溯回2014.06.01

    这种情况下,合成交易品种历史的计算周期将从2014.06.01到现在。从这个日期开始将额外排除100分钟,来确保计算的完整性(如果有任何分钟柱不可用在历史中,那么计算中会使用前一分钟柱)。

    如果所用交易品种的深度历史可以使用,那么合成交易品种历史计算可能需要相当长的时间。为了确保合成交易品种图表即时查看,则首先计算最近两个月的历史(类似于之前版本的计算)。然后再开始计算较早期的历史。

MQL5

  1. ACCOUNT_CURRENCY_DIGITS新属性 — 在账户入金货币中的小数位数。使用AccountInfoInteger函数来获得属性。您可以在自己计算利润的时候使用这个属性,使所获得的值标准化。
  2. 修正周时间周期操作期间执行Copy函数i-函数的延迟。
  3. 修正WebRequest函数的操作。

Tester

  1. 添加了下载缓存文件的优化结果之后执行单独EA交易测试的功能。
  2. 新版本提供了通过本地代理加快价格历史初步下载的功能。

文档已更新。

26 六月 2018
MetaTrader 5 build 1870:通过ISIN在市场报价中添加交易品种

程序端

  1. 在市场报价窗口中添加了通过ISIN(国际证券识别码)搜索交易品种。现在,您可以使用三种方式搜索并添加交易品种:名称、描述和ISIN。



  2. 修正更改交易账户密码时用户界面反应迟缓的问题。
  3. 修正由客户端导致的偶尔CPU负载增加的问题。

MQL5

  1. 修正在WebRequest函数中自定义HTTP标题的传递。
  2. 修正在开始和结束日期范围相同的情况下,Bars函数的行为。现在,如果有一个柱形图,则函数返回1。在早期版本中,函数无条件返回0。

Tester

  1. 修正在前测优化之后开始在可视模式下单点测试
  2. 修正排序优化结果。现在,排序过程会考虑到错误输入参数(INIT_INCORRECT_PARAMETERS)和没有利润因子的传递。
  3. 修正在改变优化准则后,对遗传优化图形进行重新计算。

文档已更新。

15 六月 2018
MetaTrader 5平台build 1860:改进MQL5柱形图操作和策略测试功能

程序端

  1. 重新设计了开户对话框。现在,您可以从列表中选择一个交易商,然后选择想要的账户类型。这一更新使交易商列表更加集中,因为现在它只显示公司名,而不会显示所有可用的服务器。

    公司logo也在列表中显示,使搜索更加轻松,更有效率。如果想要的交易商没有显示在列表中,请在搜索框中输入公司名或服务器地址,然后点击“查找交易商”。




    在对话框中还添加了账户类型的描述,帮助初级投资者选择正确的账户。此外,为了与一般数据保护条例(GDPR)保持一致,更新后的对话框可能包含交易商协议和数据保护政策的链接:




    明显提高了开设真实账户的可能性。之前只存在于移动端的上传ID和地址确认文档的功能,现在也可以在桌面版中使用了。现在,MiFID监管的交易商可以要求所需的任何客户身份识别数据,包括关于就业、收入、交易经验等信息。新功能将帮助交易者更快更容易地开设真实账户,而无需不必要的繁琐程序。




  2. 交易历史现在显示了止损值和止盈值。根据发起这些交易的订单的止损和止盈来设置进入和逆转交易的止损值和止盈值。平仓时对应持仓的止损值和止盈值被用于退出交易。后者可以保存和显示平仓时持仓的止损和止盈信息。这个信息并没有存储在早期版本中,因为平仓之后持仓会消失,而程序端的持仓历史则根据交易产生。




  3. 持仓历史现在显示了止损值和止盈值。打开和关闭相应持仓的交易的止损值和止盈值是为这种持仓指定的。




  4. 现在,图表上显示挂单的当前交易量,而不是最初请求的交易量。




  5. 更新后的程序端优化并快速渲染了扩展模式下的市场深度特性,并启用了点差显示。
  6. 对交易请求执行结果进行了优化。这种优化在某些情况下可以实现更快处理。
  7. 修正追踪止损操作中的错误,该错误偶尔可能导致对同一持仓发送多个止损更改的请求。
  8. 修正最小和最大交易量的设置,以及自定义交易品种设置中的交易量步骤。
  9. 修正了在将模板应用到交易品种图表时,忽略“修正比例”选项可能导致的错误。
  10. 修正了报价历史的偶尔错误积累。

MQL5

  1. 由于在编译过程中实行的额外的源代码优化,MQL5应用程序的速度也得到了大幅度提升。在新版MetaEditor重新编译您的程序,使其运行得更快。
    遗憾的是,由于这个额外的优化功能,新程序将无法与以前的程序端版本兼容。使用MetaEditor 1860版本编译的程序,之后无法在低于1860版本的程序端中启用。使用早期的MetaEditor版本编译的程序则可以在新版程序端中运行。

  2. 新函数:iTime、iOpen、iHigh、iLow、iClose、iVolume、iBars、iBarShift、iLowest、iHighest、iRealVolume、iTickVolume、iSpread等。这些函数类似于MQL4中使用的函数。这些函数提供了更轻松地将交易应用程序代码传输到第五代交易平台。

    在此之前,通过这些函数执行的大部分任务都可以使用Copy*函数实行。但是,用户不得不执行他们自己的函数以便在图表上找到最高/最低值,和根据他们的时间搜索柱形图。现在,这些任何可以使用iHighest、iLowest和iBarShift函数来轻松执行。

    iTime
    返回对应的图表上柱形图的开盘时间(通过'shift'参数表示)。
    datetime  iTime(
       string       symbol,    //交易品种
       ENUM_TIMEFRAMES  timeframe,  // 周期
       int         shift     //转移
       );

    iOpen
    返回对应的图表上柱形图的开盘价(通过'shift'参数表示)。
    double  iOpen(
       string       symbol,    // 交易品种
       ENUM_TIMEFRAMES  timeframe,  // 周期
       int         shift     // 转移
       );

    iHigh
    返回对应的图表上柱形图的最高价(通过'shift'参数表示)。
    double  iHigh(
       string       symbol,    // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       int         shift     // 转移
       );

    iLow
    返回对应的图表上柱形图的最低价(通过'shift'参数表示)。
    double  iLow(
       string       symbol,    // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       int         shift     // 转移
       );

    iClose
    返回对应的图表上柱形图的收盘价(通过'shift'参数表示)。
    double  iClose(
       string       symbol,    // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       int         shift     // 转移
       );

    iVolume
    返回对应的图表上柱形图的报价量(通过'shift'参数表示)。
    long  iVolume(
       string       symbol,     // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       int         shift      // 转移
       );

    iBars
    返回在历史记录中可用的对应交易品种和周期的柱形图数量。
    int  iBars(
       string       symbol,     // 交易品种
       ENUM_TIMEFRAMES  timeframe    // 周期
       );

    iBarShift
    根据时间搜索柱形图。这个函数返回与指定时间对应的柱形图指数。
    int  iBarShift(
       string       symbol,     // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       datetime      time,      // 时间
       bool        exact=false   // 模式
       );

    iLowest
    返回在对应图表上找到的最小值的指数(相对于当前柱形图的转移)。
    int  iLowest(
       string       symbol,     // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       int         type,      // 时间序列标识符
       int         count,     // 元素数量
       int         start      // 指数
      );

    iHighest
    返回在对应图表上找到的最大值的指数(相对于当前柱形图的转移)。
    int  iHighest(
       string       symbol,     // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       int         type,      // 时间序列标识符
       int         count,     // 元素数量
       int         start      // 指数
      );

    iRealVolume
    返回对应的图表上柱形图的真实交易量(通过'shift'参数表示)。
    long  iRealVolume(
       string       symbol,     // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       int         shift      // 转移
       );

    iTickVolume
    返回对应的图表上柱形图的报价量(通过'shift'参数表示)。
    long  iTickVolume(
       string       symbol,     // 交易品种
       ENUM_TIMEFRAMES  timeframe,   // 周期
       int         shift      // 转移
       );

    iSpread
    返回对应的图表上柱形图的点差值(通过'shift'参数表示)。
    long  iSpread(
       string       symbol,     // 交易品种
       ENUM_TIMEFRAMES  timeframe,    // 周期
       int        shift      // 转移
       );


  3. 添加了新的TesterHideIndicators函数。该函数设置了EA交易中使用的指标的显示/隐藏模式。这个函数仅用于在测试期间管理已用指标的可见性。如果您需要隐藏已创建的指标,请设置为true。否则,使用false。
    void  TesterHideIndicators(
       bool      hide         //标识
       );
  4. 添加了在图表上单击交易价位时生成CHARTEVENT_CLICK事件。
  5. 修正和优化CopyTicks函数的操作。
  6. 修正SYMBOL_PROP_LIQUIDITY_RATE属性,SymbolInfoDouble函数返回的值。
  7. 复制带有叠加内存的字符串数组。
  8. 修正在FileReadArray数组中分配字符串数组。
  9. 修正MQL5标准程序库中的错误。

Tester

  1. 已经更新用于处理优化缓存的系统。这个缓存存储了关于以前计算的优化传递的数据。策略测试存储了暂停之后恢复优化和避免重新计算已经计算的测试传递的数据。

    优化缓存存储格式的更改
    在早期版本中,优化缓存存储为XML文件。包含指定测试设置的所有EA交易优化传递都被添加到这个文件中。因此,相同的文件也存储了不同输入参数的优化结果。

    现在,优化缓存为每组优化参数存储为单独的二进制文件。由于使用了新格式及更小的文件大小,优化缓存的策略测试操作变得更快。当您恢复暂停的优化传递时,加速情况会更加明显。

    查看早期优化的结果
    现在,早期优化的结果可以在策略测试中直接查看,所以不再需要使用第三方软件来分析巨大的XML文件。打开“优化结果”选项卡,选择一个EA交易和带有优化缓存的文件:



    列表中包含了磁盘上现有的可供被选择的EA使用的所有优化缓存文件。每个文件都显示了优化日期、测试设置(交易品种、时间周期、间隔)和输入参数。您还可以通过获得结果的交易服务器过滤优化结果。

    动态重新计算优化准则
    优化准则是一个特定的变量参数,其值决定了输入测试组的质量。优化准则的值越高,所考虑的给定参数集就越好。

    在此之前,优化期间只计算在优化开始之前选择的一个准则。现在,您可以在查看结果时动态改变优化准则,并且策略测试将自动重新计算所有值。




    手动使用优化缓存
    在早期版本中,优化缓存存储为需要使用第三方软件打开和分析的XML文件。现在,它存储在封闭的二进制文件中。若要获得XML格式的数据,请使用“优化结果”选项卡的快捷菜单将其导出。

  2. 添加了手动设置入金货币和测试与优化杠杆的可能性。在早期版本中,货币是根据连接的账户进行设置的。因此,必须切换到其他账户才能改变这个货币。杠杆大小只能从预定义列表中选定,而现在则可以指定任何值。

    请注意,将利润和预付款转换为指定入金货币的汇率必须在账户上可用,以确保适当的测试。




  3. 移除在测试代理中禁止使用OpenCL的禁令。早些时候,只有在对本地代理进行测试时才允许使用OpenCL设备。现在,当在本地网络和MQL5云网络工作时,代理可以使用所有可用的OpenCL设备(例如处理器、视频卡)。

MetaEditor

  1. 优化和加速MQL5存储
  2. 修正在MQH文件暂停之后修复调试过程。
  3. 修正editor中突出显示的源代码。
  4. 修正通过搜索结果的导航。
  5. 修正大量文本替换功能。在某些情况下,只有第一次出现的情况被替换,而不是全部情况。

文档已更新。

18 一月 2018
MetaTrader 5平台Build 1755

程序端

  1. 修正导致程序端和MetaEditor阻止Windows关机和重新启动的错误。
  2. 修正应用模板时的图表切换。

MQL5

  1. 修正在某些情况下减慢编译速度的错误。

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

12 一月 2018
MetaTrader 5平台Build 1745

MetaTrader 5 build 1745将是最后一个支持Microsoft Windows XP/2003/Vista操作系统的平台版本。

几个月以前,我们曾经发布未来将停止对旧版本操作系统的支持的公告。Windows 2003,Windows Vista,尤其是Microsoft Windows XP都已经是过时的操作系统。微软在三年前就已经停止对Windows XP的支持,因为由于技术上的限制,在这个操作系统上可能无法实现硬件的潜在性能。

MetaTrader 5 build 1745和之前的版本将可以继续在以上操作系统上运行,但是却不能再接收任何更新。此外,安装程序也将无法在这些操作系统上运行。

现在运行MetaTrader 5所需的最低操作系统版本为Windows 7。然而,我们仍强烈建议您使用64位版本的Windows 10。

程序端

  1. /auto键已经添加到安装包,可以在自动模式下安装程序而无需用户的额外操作。当通过这个键启动安装包时,安装设置不会显示给用户,程序端将安装在标准开始菜单的标准路径下,以程序名命名的文件夹中。这种启动示例为:
    C:\mt5setup.exe /auto
  2. 修正操作系统用户没有适当权限时的安装包操作。
  3. 修正在程序端不执行任何操作时(没有打开的图表,用户不执行任何操作),对CPU资源的过度消耗。
  4. 新版本还具有自动压缩文件系统级别*.log文件的特点。这项新功能可以减少日志对磁盘空间的占用率。

Tester

  1. 增加了在单个测试运行期间的缓存量。这可以为64位操作系统提供更快的测试。
  2. 通过MQL5云网络修正了EA交易的优化。这种优化可能体现在从MetaTrader市场上购买的产品中。
  3. 修正在“每个报价”测试模式下生成的柱的点差计算。
  4. 修正策略测试下OpenCL设备的选择。可见的测试器现在可以访问所有可用的OpenCL设备。
  5. 新版本还具有自动压缩文件系统级别*.log文件的特点。这项新功能可以减少日志对磁盘空间的占用率。
  6. MQL5:使用CustomRatesDelete类函数,修正自定义交易品种柱的删除。

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

  • 用户界面现已支持荷兰语。
  • 更新文档。
  • 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标签的快捷菜单来打开:



      若要跳转到断点,请双击它。
    更新文档。
    26 四月 2017
    MetaTrader 5 Build 1596:访问价格历史

    程序端

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


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

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




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

    MQL5

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

    信号

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

    Tester

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

    更新文档。


    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 翻译。

    更新文档。

    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翻译。

    更新文档。


    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. 修正批量文本替换的显示。

    更新文档。

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

    16 九月 2016
    MetaTrader 5 Build 1430:更新展示标签

    程序端



    1. 实现为交易所市场形成展示标签的新算法。现在,平台根据应用于交易账户的风险管理系统来适应资产显示:零售外汇,期货或交易所模式。

      资产部分有助于在交易所交易外汇或期货 显示它们当前的市场状态。相同货币可以在不同的交易品种种类中找到:作为货币组中的一个,作为基础货币,等等。例如,您可以反向持仓 GBPUSD,USDJPY和GBPJY。在这种情况下,了解您有多少货币以及您需要多少货币是非常困难的。持有超过3个持仓会使这个任务进一步复杂化。 如今在此种情况下,账户的所有状态都可以轻松地在资产标签查看。
      让我们使用3种相同的持仓举例说明:

      以134.027 的价位买入1手 GBPJPY— 收到 100 000 GBP,给出134 027 000 JPY
      以102.320 的价位卖出1手 USDJPY— 给出 100 000 USD,收到102 320 000 JPY
      以1.30923 的价位卖出1手 GBPUSD— 给出100 000 GBP,收到 103 920 USD

      我们同时买入卖出100 000GBP。我们有0GBP,资产标签不会显示这个货币。而USD,我们在一种情况下给出货币而在另一种情况下接收它。由于入金货币也是USD,资产标签会计算最终结果并将其添加到当前结余。参与两个交易的JPY意味着该标签显示其总值。




      使用交易所模式的人们 可以使用这个部分了解他们资金的使用情况。与之前模式不同,资金是在交易执行的时候直接出金/加入。例如,如果您买入EURRUB,您马上会收到EUR而 相应的RUB总值会从结余取出。在交易过程中,账户结余甚至可能是负数:当您使用借款时而购买的资产则用作抵押。在这种情况下,资产标签可以使您轻松地了 解交易账户状态。

      此外,在这里您还可以看到清算值 — 账户的金额和以市价平掉当前所有持仓的价格(结果)。





    2. 修正交易操作历史记录中显示的交易类型。
    3. 修正重新连接交易账户时重复显示的风险提示窗口。
    4. 优化和修正大量交易品种情况下交易品种选择对话框的使用情况(几千甚至更多)。
    5. 修正基于Moving Average(Bollinger Bands,Adaptive Moving Average等)计算的内置指标的展示水平。在此之前,当在独立子窗口绘制指标时会产生错误。
    6. 修正如果订单价格与合约上限或下限价格一致的情况下偶尔出现的干扰下期货合约订单的错误。

    MQL5

    1. 优化和加快MQL5应用程序的编译速度。
    2. 为类,结构和函数添加支持'final' 和'override'修饰符。

      类和结构的'final'修饰符
      'final'修饰符在声明一个结构或类的时候禁止进一步继承它。 如果在这个类(结构)中无需做出任何进一步变化或这种变化出于安全原因无法接受,则以'final'修饰符声明那个类(结构)。在这种情况下,所有类的类函数也默认为 'final'。
      class CFoo final
        {
        //--- 类主体
        };
       
      class CBar : public CFoo
        {
        //--- 类主体
        };
      当如上面显示的一样试图以'final'修饰符从一个类继承时,编译器显示一个错误:
      不能像其被声明为'final'一样从'CFoo' 继承
      参照 'CFoo' 声明

      函数的'override'修饰符
      'override' 修饰符表示声明的函数应该始终重写父类的类函数。使用修饰符可以使您避免重写时的错误,例如意外修改类函数的签名。例如,接受 'int' 类型变量的 'func' 类函数定义在基本类中:
      class CFoo
        {
         void virtual func(int x) const { }
        };
      类函数重写在继承类:
      class CBar : public CFoo
        {
         void func(short x) { }
        };
      但是自变量类型错误的从'int' 变为'short'。实际上,替代重写的重载类函数在这种情况下执行。根据重载函数定义算法进行操作时,编译器在有些情况下可能会选择基本类中定义的类函数而不是重写的类函数。

      为了避免这种错误,'override' 修饰符应该明确添加到重写的类函数。
      class CBar : public CFoo
        {
         void func(short x) override { }
        };
      如果在重写过程中更改了类函数签名,编译器将无法在发布编译错误的父类中找到相同签名的类函数:
      'CBar::func' 类函数是通过'override'标识符声明但不会重写任何基本类的类函数

      函数的'final'修饰符

      'final' 修饰符操作是相反的 — 它禁止在衍生类中重写类函数。如果类函数的实现非常充分并得到完全完成,则以 'final' 修饰符声明它以确保其以后不被修改。
      class CFoo
        {
         void virtual func(int x) final { }
        };
       
      class CBar : public CFoo
        {
         void func(int) { }
        };
       
      当如上面显示的一样试图以'final'修饰符重写一个类函数,编译器显示一个错误:
      声明为'final'的'CFoo::func' 类函数不能通过 'CBar::func'重写
      请见 'CFoo::func' 声明
    3. 以默认参数修正编译的模板函数。

    市场

    1. 修正分类市场产品的几个错误。

    Tester

    1. 修正为可视测试模式的打开订单和持仓订单更新当前市场价格。
    2. 移除使用交易所交易品种进行测试时买入限价和卖出限价订单执行的滑移。
    3. 修正"开盘价"测试模式下意外生成的错误价格。
    4. 修正测试时生成OnTrade交易事件。
    5. 当基于真实报价测试时,不匹配的报价数据(取决于用于生成柱形图的价格的卖价或最后价)和现有分钟柱形图的最低值或最高值会出现在tester日志中。

    MetaEditor

    1. 修正源代码文件中配置的数据展示。

    更新文档。

    19 八月 2016
    MetaTrader 5 build 1395:更快的交易操作,视觉测试得到改进

    程序端

    1. 客户端现在提供更快速地发送交易命令。
    2. 修正阻止在32位Windows 10,build 1607运行的程序端中执行MQL5应用程序的错误。
    3. 现在导航显示交易账户是否在锁仓模式亦或单边模式操作。
    4. 新快捷菜单命令已经添加到导航,它允许使用选定的账户连接网页程序端。
    5. 菜单的帮助部分已经更新,现在它能够链接到视频指南
    6. 修复在高分辨率显示器(4K)上连接操作的错误。
    7. 修复用户界面波斯语翻译的错误。

    MQL5

    1. 添加新'void *'指针,以使用户创建抽象对象归集。任何类对象的指针都可以保存至这个变量类型。
      建议使用操作符dynamic_cast<class name *>(void * pointer) 来转换。如果无法转换,则结果为NULL。
      class CFoo { };
      class CBar { };
      //+------------------------------------------------------------------+
      //| 脚本程序起始函数                                      |
      //+------------------------------------------------------------------+
      void OnStart()
        {
         void *vptr[2];
         vptr[0]=new CFoo();
         vptr[1]=new CBar();
      //---
         for(int i=0;i<ArraySize(vptr);i++)
           {
            if(dynamic_cast<CFoo *>(vptr[i])!=NULL)
               Print("CFoo * object at index ",i);
            if(dynamic_cast<CBar *>(vptr[i])!=NULL)
               Print("CBar * object at index ",i);
           }
         CFoo *fptr=vptr[1];  // 将返回类型转换指针错误,vptr[1] 并不是CFoo对象
        }
      //+------------------------------------------------------------------+
    2. 添加支持字符串操作符[ ] 。该操作符可以使用户根据索引获得一个字符串符号。如果指定的索引超出了字符串,则结果为0。
      string text="Hello";
      ushort symb=text[0];  // 将返回符号'H'代码
      
    3. 新增具备int OnTesterInit(void)签名的另一个版本的TesterInit 事件处理程序,它可以返回INIT_SUCCEEDED (0) 或 INIT_FAILED (或任何非零值)。如果OnTesterInit 返回一个非零值,则优化不会开始。
    4. 修正一个可能导致不同ChartGetString重载函数返回不同结果的错误。

    Tester

    1. 为视觉测试添加额外的命令和热键。现在可以像在程序端一样在视觉测试配置图表:改变颜色,配置各种元素的可视性,应用模板等等。




    2. 修正在"开盘价"测试模式中Sleep函数的操作。
    3. 修正W1和MN1时间周期上形成的不正确的柱形图状态。

    MetaEditor

    1. 添加繁体中文的UI翻译。

    更新文档。

    15 七月 2016
    MetaTrader 5 Build 1375:时间&销售和访问测试期间的报价

    程序端

    1. 时间&销售功能已添加到市场深度。




      时间&销售是什么?
      时间&销售功能就是提供金融市场上执行的每一笔交易的价格和时间。每笔交易的信息包括 交易执行时间,交易方向(买或卖)以及交易价格和交易量。为了方便视觉分析,使用不同的颜色指示不同的交易方向:蓝色用于买入交易,粉色用于卖出交易,绿 色表示未定义方向。交易量另外显示在直方图。

      时间&销售可以如何帮您了解市场
      时间&销售功能提供了更详细的市场分析工具。交易方向表示谁发起的交易:买家还是卖家。交易的成交量允许交易者了解市场参与者的行为:交易是由大型市场玩家还是小型市场玩家来执行以及评估玩家的行为。交易执行速度和各个价位的交易量有助于交易者评估级别的重要性。

      如何使用时间&销售数据
      除了视觉分析表格,您还可以保存交易详情为CSV文件。另外,它们还可以使用任何其他软件进行分析,例如MS Excel。文件包括逗号分隔数据:
      时间,卖价,买价,最后价,交易量,类型
      2016.07.06 16:05:04.305,89360,89370,89370,4,Buy
      2016.07.06 16:05:04.422,89360,89370,89370,2,Buy
      2016.07.06 16:05:04.422,89360,89370,89370,10,Buy
      2016.07.06 16:05:04.669,89360,89370,89370,1,Buy
      2016.07.06 16:05:05.968,89360,89370,89360,7,Sell
      如果您想保存数据到一个文件,请打开快捷菜单:



      交易商平台应该升级到1375版,以启用合适的交易方向检测。
    2. 到达新报价/市场深度改变与调用OnTick和OnCalculate之间的时间已经明显减少。同时交易状况改变和调用OnTick和OnCalculate之间的时间也已经减少。现在MQL5程序提供更快速的反应市场事件。
    3. 使用SSL证书扩大权限时,现在发送交易请求更加快速。
    4. 更新了波斯语的用户界面翻译。
    5. 修正了锁仓模式工作时图表快捷菜单止损/止盈设置命令的展示。

    Tester

    1. 新tester允许在使用CopyTicks函数测试时请求报价历史记录。在早期版本中,策略测试不可访问报价。

      • 在“每个报价”模式中,函数返回生成报价的历史记录。最多可以请求128,000个最近报价。
      • 在“基于真实报价的每个报价”模式中,函数将返回真实报价的历史记录。请求数据的深度取决于可用的历史数据。然而,请注意最近的128,000个报价缓存在策略测试,请求将会快速执行。硬盘会请求更深层次的历史记录,所以请求执行可能会需要更多的时间。
      • 该函数不会在“只开盘价”和“1分钟OHLC”模式下工作,因为报价历史没有在该模式中被创建。

    2. 添加支持毫秒。在之前版本中,策略测试的时间段等于1秒。

      • 现在EventSetMillisecondTimer 和 Sleep 函数会使Tester中的时间更准确。
      • 多 货币EA测试期间报价源的准确性得到提高。早期版本,如果1秒包含多个报价(例如1分钟柱形图的跳动量超过60),那么会为这些报价设置相同的时间。无所 谓是否测试单货币EA交易,因为报价会按顺序传递到EA交易。但是,当您在多个货币对上测试EA交易时,了解这个报价首先到达的货币对非常重要。早期版 本,每个交易品种的报价都会按顺序传递到EA交易:首先,一个交易品种一秒内的所有报价,然后是另一个交易品种的所有报价。现在可以通过毫秒发送它们了。

        当真实报价用于测试时,从原报价数据就会考虑毫秒。报价生成时,会根据跳动量设置毫秒。例如,如果一秒内对应3个报价,它们的毫秒将等于000,333和666。

    3. 在“只开盘价”和“1分钟OHLC”模式下,挂单和止损/止盈订单现在在请求价格执行,而不是执行时的当前价。以精 确模式(每个报价和真实报价)使用的市场价格执行的算法不适合不太准确的模式。在一些模式下不会生成中间报价,因此请求订单价和当前价(开盘价或 OHLC)之间的差异非常明显。“只开盘价”和“1分钟OHLC”请求价格的执行订单提供了更加准确的测试结果。

    4. 添加可视模式下支持前测。现在可以为后测和前测打开两个独立的窗口,允许用户在不同的时间间隔对比EA交易的性能。




      前测窗口只在主要周期测试完成后打开。

    5. 入金加载替代预付款水平显示在主测试图表。加载情况根据预付款/净值比率进行计算。


    6. 修正测试期间每年按百分比计算手续费。

    7. 修正测试进行中生成的图表上的结余计算和展示。

    MQL5

    1. 已经改变OrderSend函数在下单,更改和取消期间的行为。这些变化仅应用于发送到外部交易系统的订单。早期版本中,在交易商服务器成功下单(处理) 后返回OrderSend 函数管理。现在,这种管理仅在交易商服务器收到外部交易系统通知后返回,通知系统已经成功下单。

      下图显示了函数之前(红箭头)和当前的行为:




    2. MqlTradeResult结构的新字段:retcode_external - 外部交易系统的错误代码。这些错误的使用和类型取决于交易操作发送的交易商和外部交易系统。例如,通过莫斯科交易所成交的 retcode_external 值不同于DGCX返回的值。

    3. ENUM_CHART_PROPERTY_STRING 枚举的新属性:CHART_EXPERT_NAME 和 CHART_SCRIPT_NAME。现在,ChartGetString函数允许用户找出附在chart_id参数定义的图表上的EA交易和/或脚本的 名称。

    信号

    1. 修正由于复制'close by '操作失败而偶尔产生的错误。
    2. 改进自动匹配货币组,包括RUB和RUR。

    市场

    1. 修正通过产品类别排序。

    MetaEditor

    1. 修正打开替换对话框时在替换文本字段设置焦点。
    2. 修正从当前持仓开始向上搜索时替换出现的多个文本。
    更新文档。
    5 七月 2016
    MetaTrader 5 网页平台:官方发布

    公开测试两个月后,多元化MetaTrader 5 平台网页版 现已官方对外发布。它允许从任何浏览器和任何操作系统进行外汇和金融市场交易。仅需网络连接即可,无需安装任何软件。

    该应用将桌面版的主要优势(高速,支持多元化市场和扩展的交易功能)与网页程序端的便利性和跨平台特性相结合。该发布版的主要功能在于测试版中所没有的市场深度。

    网页平台允许交易者执行技术分析和交易操作,就像在桌面版一样。网页平台提供以下特性:

    • 净额和锁仓持仓账户系统
    • 31 种技术指标
    • 23 种分析对象
    • 一键交易和一整套的交易订单
    • 41 种界面语言
    12345678910111213