MetaTrader 5新功能

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

26 二月 2021
MetaTrader 5 build 2815: 从Python访问市场深度,改进调试器和分析工具

程序端

  1. 添加通过Python API访问市场深度数据的功能。
    三项新功能可以快速获取用于统计计算和机器学习任务的数据,这可以使用大量即用型Python程序库来实现。

    • market_book_add — 订阅MetaTrader 5 程序端,接收与指定交易品种市场深度更改相关的事件。
    • market_book_get — 从BookInfo返回一个元组,其中包含指定交易品种的市场深度记录。
    • market_book_release — 取消MetaTrader 5 程序端订阅与指定交易品种市场深度更改相关的事件。

  2. 推送通知的最大长度从256个字符增加到1024个字符。现在,您可以从移动设备上的MQL5程序发送更多信息。
  3. 添加任务管理器的初始版本,它可以通过按F2键来调用。

    任务管理器可以监视平台消耗的资源。您可以查看图表消耗的内存量,EA交易以及其他性能指标使用的CPU资源。如果平台性能下降,则可以轻松检测并解决问题



  4. 加强订阅服务。为有延迟报价的交易品种添加特殊指示:
    • 市场报价中的交易品种标记为时钟图标,并且延迟值显示在工具提示中
    • 数据延迟通知显示在图表上



  5. 修正没有交易账户连接时的订阅列表显示。
  6. 修正电子邮件和时事通讯中的链接。现在,所有链接都在默认浏览器中打开。以前,链接仅在IE中打开。
  7. 修正从WebRequest函数到包含IPv6地址和Cloudflare保护的主机的连接。
  8. 改进VPS服务的功能和响应能力。
  9. 改进WineMacOS/Crossover下的操作,包括带有M1处理器的macOS Big Sur版本。

MQL5

  1. 修正ArrayPrint函数中的错误。该函数有时可能无法打印数组。
  2. 优化通过File*函数执行的文件操作。现在,文件读取和写入操作运行得更快。
  3. 取消当动态数组用作函数参数时要求指定动态数组第二,第三和第四维度大小的限制。这增加了代码的重用性和灵活性。
    void func(int &arr[ ][ ][ ][ ])
      {
      }
  4. 修正ArrayBsearch函数的操作。该函数可能会在二进制搜索过程中返回找到的元素的错误索引。

MetaEditor

  1. 经过改进的调试器中提供了更多新功能。
    • 现在,数组将根据ArraySetAsSeries设置的排序显示在观察窗口中。
    • 添加对局部静态变量的支持。
    • 修正指定数组元素值的显示。
    • 修正处理“静态”类字段。
    • 为更准确而可靠的调试而进行的其他改进。

  2. 添加“在分析中启用优化”的选项。
    可以禁用代码优化模式,以便在性能分析报告中包含更多详细信息。没有优化的代码速度可能会慢几倍,但是此模式可提供更广泛的代码覆盖范围。请注意,通过优化的代码瓶颈可能不准确。
    可以通过禁用“在分析中启用内联”来设置较温和的分析模式。


    优化管理选项也已添加到项目设置
    • 如果在项目中禁用优化,则新选项将被忽略,因此,性能分析将始终禁用优化(包括内联操作)。
    • 如果在项目中启用优化,则在性能分析编译期间将考虑新选项。

  3. 添加用于调试和分析过程的日志记录。在操作开始时记录环境设置;在操作停止时记录收集的数据统计信息。
    MQL5 profiler    starting 'ExpertMACD.ex5' on history with parameters:
    MQL5 profiler       symbol: 'EURUSD'
    MQL5 profiler       period: 'H1'
    MQL5 profiler       date from: '2021.01.01'
    MQL5 profiler       date to: '2021.02.22'
    MQL5 profiler       ticks mode: 'every tick'
    MQL5 profiler       execution delay: 0 ms
    MQL5 profiler       deposit: 10000
    MQL5 profiler       currency: 'USD'
    MQL5 profiler       leverage: 1:100
    MQL5 profiler       profit in pips: NO
    MQL5 profiler    profile data received (4640 bytes)
    MQL5 profiler    758 total measurements, 0/0 errors, 470 kb of stack memory analyzed
    MQL5 profiler    7782 total function frames found (1929 mql5 code, 342 built-in, 1403 other, 4108 system)

Tester

  1. 修正高级测试设置中的非交易时间的规范。

更新文档。
15 一月 2021
MetaTrader 5 build 2755:弹出价格窗口和改善调试器

程序端

  1. 修改弹出价格窗口,可以在任何尺寸的屏幕上查看交易品种价格。

    该窗口现在支持多列显示,从而可以有效利用屏幕空间。要切换显示模式,请使用窗口属性对话框。

    在“弹出价格”窗口中支持多列显示

    该窗口的进一步改进如下:
    • 添加列的选择菜单。该菜单提供“市场报价”中可用的相同的交易品种属性。
    • 优化大量交易品种的操作。现在,窗口对于10个和1000个交易品种具有同样高的性能。
    • 在工具提示中添加显示交易品种的简要信息。
    • 修正应用颜色设置显示价格上涨和下跌的问题。

  2. 添加在合成“市场深度”的报价图表上显示交易。

    合成“市场深度”用于不提供2级价格的交易品种。在这种情况下,将从最佳卖价和最佳买价开始,以价格变动幅度的差额自动构建级别。现在,如果为交易品种提供的是最后交易价格和交易量数据,则相关数据将显示在报价图表上。该信息以圆圈的形式显示:

    • 红色圆圈显示卖出交易。
    • 蓝色圆圈显示买入交易。
    • 当未定义交易方向时,会出现绿色圆圈。

    圆圈越大,进行交易的交易量越多。


    现在,合成“市场深度”显示的是有关最后交易价格和交易量的信息


  3. 修正期权看板的Greeks计算。如果期权标的资产的最后交易价格为零,可能会发生错误。
  4. 我们将继续实施新“订阅”服务,该服务可提供其他交易服务。最近,我们已修正相关订阅的显示。此类订阅用于捆绑服务。
  5. 改进Wine下的平台操作。

MQL5

  1. 添加在释放鼠标右键和鼠标中键时,ChartEvent事件的生成。该事件可在创建图形面板时使用。要启用此事件,请通过CHART_CONTEXT_MENU属性禁用图表快捷菜单。
  2. 修正在Sleep函数等待时间导致严重错误的问题。

MetaEditor

  1. 我们已经启动调试器的全局更新。观察表达式的窗口得到显着改善。现在,它能够以下拉列表的形式查看数组和对象的内容以及指针值。


    调试时查看数组和对象的内容


    要查看数组或对象,请在观察窗口进行双击。

  2. 修复打开某些项目时的冻结问题。

文档已更新
26 十一月 2020
MetaTrader 5 build 2715: 功能改进

程序端

  1. 修正在使用期权看板时平台冻结的问题。平台冻结可能是由于在交易品种设置中指定零报价大小而引起的。
  2. 修正在HiDPI显示器上UI显示的错误。

MQL5

  1. 修正通过StringToTime函数,字符串到时间的转换。在将时间指定为"yyyymmdd [hhmiss]"时可能会发生此错误。
  2. 修正对包含动态数组的对象的隐式复制运算符的操作。现在,该操作将目标对象大小减小为复制的对象大小。
    struct MyStruct
    {
      string Array[];
    };
    
    void OnStart()
    {
      MyStruct a1,a2;
      ArrayResize(a1.Array,3);
      ArrayResize(a2.Array,1);
      a1=a2;
    }
    之前,"a1"数组大小在函数调用后等于3。现在,这个数组大小将为1。

MetaTester

  1. 更新MQL5云网络测试代理的评级计算算法。现在,确定评级更加准确,更改的频率也更低。

文档已更新。
12 十一月 2020
MetaTrader 5 build 2690:改进MetaEditor

程序端

  1. 修正合成市场深度功能的显示。之前,这个功能可能不支持某些交易品种。

    合成市场深度用于没有提供2级价格的交易品种。在这种情况下,将从最佳卖价和最佳买价开始,以等于价格变动幅度的距离,自动构建等级。这是一种方便快捷的工具,可用于快速,最清晰地下达、修改和删除订单。



MQL5

  1. 使用SymbolInfoTick函数,优化和显著加快从MQL5程序访问最后价格的速度。
  2. 修正从对话框重置Ichimoku Kinko Hyo指标参数。



  3. 修正当交易品种不可使用历史记录时,冻结Copy*函数。
  4. 代码分析工具的总体更新中的更多改进。除了build 2650中提供的创新功能外,还实现了以下改进:
    • 改进数据显示
    • 报告中显示使用较短的列名称
    • 能够将分析报告保存到文件
    • 在报告中为函数添加带有行号的工具提示显示。



MetaEditor

  1. 添加禁用剪贴板追踪和清空剪贴板历史记录的功能。

    剪贴板追踪功能可通过提供快速访问最近使用的数据来提高源代码的可用性。在任何源代码位置按下Alt+V,从菜单中选择任何较早复制的行,然后将该行插入到所选位置。

    使用相应的工具栏命令或编辑器设置来启用/禁用追踪。



  2. 修正在程序调试期间计算一些观察表达式的问题。

MetaTester

  1. 现在禁止在框架接收模式的策略测试中运行的EA交易。
  2. 修正在策略测试中导入优化结果的问题。该错误可能导致不正确地导入时间周期值。

文档已更新。
9 十月 2020
新版MetaTrader 5平台build 2650:背景图表加载和MQL5代码分析工具改进

程序端

  1. “选项”选项卡提供一个名为“预加载未结持仓和订单的图表数据”的新设置。

    为了节省流量,交易平台仅在请求相关数据时下载交易品种价格历史(例如,在打开价格图表或启动测试时)。然而,对于常用交易品种来说,这并不是很方便。如果启用此新选项,您有未结持仓或挂单的交易品种图表将在后台模式下更新。因此,打开图表后您无需等待数据下载,相关数据将立即可供分析。




  2. 修正周末后生成日柱形图。
  3. 修正图表更新。在额外下载更新的价格数据之后,图表偶尔会出现更新失败的问题。
  4. 优化更新账户交易历史缓存。通过优化,可以减少使用History*函数时的数据延迟。
  5. 修正在交易历史显示为持仓时,评论列的显示问题。
  6. 修正信号续订按键的显示问题。

MQL5

  1. 代码分析工具的总体更新中的更多改进。除了build 2615中提供的创新功能外,还实现了以下功能:

    添加新参数
    我们之前已经宣布新分析工具的抽样方法的用法。分析工具在MQL程序操作中暂停(每秒~1000次),并收集有关在某些代码段中执行暂停次数的统计信息。这还包括对调用堆栈的分析,以确定每个函数在总代码操作时间内所占的份额。在分析后,用户会收到有关操作暂停次数以及每个函数出现在调用堆栈中的次数的统计信息:
    • 总CPU [单位,%] — 函数在调用堆栈中出现的次数。
    • 自身CPU [单位,%] — 直接在指定函数内出现的“暂停”次数。此变量对于识别瓶颈至关重要:根据统计数据,在需要更多处理器时间的情况下,暂停发生的频率更高。


    添加在分析过程中禁用函数内联的功能
    在MQL程序的编译过程中,对函数进行内联,即,将函数代码直接添加到函数调用站。这可以显着提高性能。但是,此过程会使函数分析变得困难。为了获得有关“纯”函数的报告,可以在MetaEditor设置中禁用内联:




    更新报告设计
    我们重新设计了性能分析报告,并在源代码窗口中显示性能分析信息。现代化设计将使Visual Studio用户更加熟悉。




  2. 修正CopyTicksRange函数操作的问题。该函数有时会返回不完整的数据。
  3. 新错误代码TRADE_RETCODE_HEDGE_PROHIBITED —由于禁止锁仓持仓,因此不允许开仓或下挂单。如果用户在禁用账户锁仓以及用户对相同交易品种已有反向订单或持仓的情况下试图执行交易操作,则返回错误。
  4. 删除调试指标时调用MessageBox的功能。无法从指标调用MessageBox,因为它在等待用户响应的时间段会一直暂停线程执行。
  5. 使用SymbolSelect函数优化并显着加速将交易品种添加到“市场报价”的过程。
  6. 修正固定大小数组的ArrayInsert函数行为。现在,该行为与文档中的描述相符:插入元素时,目标数组的大小不会更改,插入位置右侧的元素会向右移动(最后一个'count'元素为“下降”),同时将元素从源复制到释放空间。

Tester

  1. 修正在测试期间使用自定义交易条件设置;已修改设置对话框。

    • 修正计算自定义手续费。要启用手续费,现在只需指定交易品种名称即可,无需整个路径。
    • 重新排列选项卡,提高操作效率。
    • 重命名对话框和启用自定义设置的选项。
    • 在设置表中优化列宽。
    • 禁用“使用自定义设置”选项时,对话框中的所有其他设置均被停用。以前,设置仍可编辑,用户可能会错误地认为这些设置将在测试期间应用。




  2. 修正有关根据单号从交易历史接收订单时可能出现的错误。

MetaEditor

  1. 为代码编辑窗口添加配色方案预设:浅色(默认)、深色和蓝色。您可以自定义编辑器,而无需手动配置编辑器视图。

    此外,现在可以自定义功能工具提示的边框颜色。



     
  2. 工具栏中的所有图标均已更新,支持HiDPI显示器。

文档已更新。

17 九月 2020
MetaTrader 5 build 2615: 策略测试中的基础分析和复杂标准

程序端

  1. 扩展基础分析组件。

    添加新交易品种属性,该新属性可以更准确地对交易品种进行分类:

    • 部门 — 资产所属经济部门,例如能源、金融、医疗保健和其他部门。
    • 行业 — 资产所属行业,例如运动服、饰品、汽车制造、餐饮业和其他行业。
    • 国家 — 股票在证券交易所交易的公司所在的国家。

    基于这些属性,现在在市场报价中实施单独的系统,从而更有效地操作交易品种。从菜单中选择一个类别,所有可用交易品种将被添加到列表中进行深入分析:



    相关属性已被添加到合约规范中:



    此外,交易品种的基础数据现在可以直接从平台打开。大量聚合器的链接已经添加到“市场报价”的快捷菜单中:



    扩展数据的有效性由交易商控制。但是,我们已确保在最大数量的交易品种中默认提供高级信息。交易商将其服务器更新到新版本后,相应的国家/地区、行业和行业数据就会出现在您的平台中。
  2. 改进信号市场展示区。租用和订阅按键已添加到左侧面板:



    进一步改进版块设计。这包括提亮按键颜色、扩大MQL5登录按键及其他改进。

  3. 修正“止损”和“止盈”图表水平的潜在盈利/亏损计算。



  4. 修正计算合成交易品种时出现的错误。这些错误可能会导致平台在启动时的冻结问题。
  5. 修正在数据窗口中显示内置分形指标
  6. 平台工具栏中的所有图标已更新支持HiDPI显示器。
  7. 为已复制交易信号修正持仓交易量调整。调整操作有时会由于应用的止损水平错误而失败,从而导致“无效停止”错误。
  8. 优化服务器上相关更改后的价格历史重建。
  9. 修正在图表上显示交易水平的工具提示。在某些情况下,就是禁用显示交易水平,工具提示仍可以显示在图表上。
  10. 修正“工具箱\交易”部分的订单和持仓快捷菜单中的“在图表显示\自动更新”选项。现在,如果不勾选此选项,则所有打开的图表都将禁用交易历史显示。

MQL5

  1. 添加MathClassify函数。该函数可以确定实数型,并以ENUM_FP_CLASS枚举值的形式返回结果。
    ENUM_FP_CLASS  MathClassify(
       double  value      // 实数
       );
    该枚举包括以下值:
    • FP_SUBNORMAL — 比最小可表示正规数DBL_MIN — 2.2250738585072014e-308更接近于零的次正规数。
    • FP_NORMAL — 正规数的范围在2.2250738585072014e-308与1.7976931348623158e+308之间
    • FP_ZERO — 正零或负零,
    • FP_INFINITE — 无法用适当的类型(正或负无穷大)表示的数字。
    • FP_NAN不是一个数字。
    使用以下代码检查实数有效性:
    if(MathClassify(value)>FP_ZERO)
      {
       Print("value is not a valid number");
      }
  2. 添加可使用SymbolInfoString函数获得的交易品种属性。
    • SYMBOL_COUNTRY — 股票在证券交易所交易的公司所在的国家。
    • SYMBOL_SECTOR_NAME — 资产所属经济部门,例如能源、金融、医疗保健和其他部门。
    • SYMBOL_INDUSTRY_NAME — 资产所属行业,例如运动服、饰品、汽车制造、餐饮业和其他行业。

    该属性以字符串形式返回。

    交易品种所属的部门和行业可以枚举值形式获得。这可通过使用SymbolInfoInteger函数请求以下属性来完成:

    • SYMBOL_SECTOR
    • SYMBOL_INDUSTRY

    已添加ENUM_SYMBOL_SECTOR和ENUM_SYMBOL_INDUSTRY枚举用于处理这些属性。

  3. MQL5程序中实现了新内存管理机制。它可最高以3倍的速度进行内存分配,并避免潜在的内存访问错误。
  4. 通过History*函数,优化和加速账户报价历史的操作。
  5. 修正来自OnDeinit进入点的WebRequest调用。在早期版本中,在EA交易停止的情况下无法实现该函数的调用。
  6. 修正来自服务的WebRequest函数调用。之前,服务重启之后,函数调用可能会失败。
  7. 添加使用OpenCL时,对设备上的双精度型支持的检查。因过度四舍五入,不能在财务计算中使用浮点型。因此,平台明确要求支持双精度型进行计算。如果不支持双精度型,则在平台日志中写入相应的消息:设备'<name>'不支持'double'类型。之前,在这种情况下会显示常见错误消息。
  8. 明显加快使用ACCOUNT_EQUITY和ACCOUNT_BALANCE参数的AccountInfoDouble函数的执行速度。
  9. 修正通过ChartApplyTemplate函数将模板应用到图表的问题。
  10. 修正使用CHART_BRING_TO_TOP参数的ChartSetInteger函数调用。
  11. 新Conjugate方法已添加到内置Alglib程序库中。此方法启用复数的共轭数计算。该程序库位于MQL5\Include\Math\Alglib。
  12. 完整修订代码分析工具。新分析工具以更高的精度和速度运行。
    • 现在,该分析基于经过类似于编译程序发布版本进行优化的代码。。由于可以在程序执行期间使用完全相同的代码,因此这可以更准确地确定代码执行速度。
    • 新分析工具使用“抽样”剖析方法。这种轻量级且准确的方法通过定期收集调用堆栈数据和计算性能来收集应用程序性能统计信息。
    • 不同于以前的版本,新分析工具不会对所分析的代码进行任何更改。先前使用的工具方法在代码中添加了某些结构,用于测量函数的速度。这可能会影响最终的代码速度。
    分析工具的开发将继续进行。即将发布的平台版本还将提供进一步的改进。

Tester

  1. 优化使用MQL5云网络的操作。修正在代理上加载EA交易。
  2. 添加新优化标准“最大复杂标准”。这是测试通过质量的完整且复杂的衡量标准。它会衡量多个参数:
    • 成交数
    • 盈亏
    • 采收率
    • 期望收益
    • 夏普比率

    就复杂分析而言,参数的最大值(例如盈利)并不总是最佳选择。复杂标准逐渐选择最优通过:首先根据成交数,然后根据期望收益、采收率等。新选项可以根据所有参数接收最佳优化通过。此外,您可以根据所需参数(例如最高盈利)选择最佳通过。

    在策略测试器设置中选择新标准,然后开始优化。



    “最大复杂标准”值将显示在优化结果中单独的“结果”选项卡。可以按此列对通过进行排序。新标准支持颜色编码加亮,从而在视觉上突出显示最佳通过。低于20的值以红色突出显示,高于80的值以深绿色显示。



  3. 修正策略测试中的自定义手续费计算。

MetaEditor

  1. 我们已启动全局修订智能代码管理功能(智能提示)。
    • 现在,这些提示除了显示名称之外,还显示完整的函数签名。
    • 现在根据MetaEditor设置来设置提示的字体。
    即将发布的平台版本还将提供进一步的改进。

更新文档。

24 七月 2020
MetaTrader 5 build 2560: 改进内置学习系统

程序端

  1. 上次平台更新,我们提出一个完全修正的学习系统。在最新版本中,还做出进一步的改进:
    • 进度条图标的显示更加清晰
    • 对一些提示的文本进行修改
    • 学习进度计算得到修正
    完成所有课程,开始充分使用平台功能。



  2. 优化并显著加速处理大型报价流(每分钟数万个报价)。
  3. 修正计算相对于前一交易日收盘价的价格变化时出现的错误。若要查看这个变量,请启用“市场报价”快捷菜单中的“每日更改”栏。

MQL5

  1. 通过ChartGetInteger函数,优化并加速访问数值图表属性。
  2. 修正自定义指标搜索,即当通过iCustom函数从MQL5程序请求此类指标时。

MetaEditor

  1. 项目中添加C/C++程序的编译。

Tester

  1. 显著优化MQL5云网络的工作。由于代理搜索效率的提高,“网络”可更快地分配任务并返回计算结果。

更新文档。
10 七月 2020
MetaTrader 5 build 2530: 市场报价排序以及获得优化结果的先进操作

程序端

  1. 市场报价窗口添加了排序选项:

    • 点击列名,按所需数据(如交易品种名称、收盘价、日变化或其他变量)对列表进行排序。
    • 使用带有最受欢迎排序选项的新菜单。在交易外汇交易品种时,基于每日交易品种价格变化,按最高涨跌幅进行排序可能更实用。



  2. 重新设计并改进了内置学习系统。

    为便于导航,所有互动提示都分为不同的类别。为每个类别显示已完成和剩余的提示数量。



    现在,每个提示都提供一个清单,显示用户为完成培训而应执行的关键操作。

    我们已修改学习系统设计并修正总进度计算中的错误。

  3. 添加自动计算交易品种的上一个交易时段平仓时间和当前交易时段开仓时间。如果交易商未直接提供相应的数据,则程序端将基于交易时段的第一和最后报价来计算值。相关信息可以显示在“市场报价”窗口中:在“交易品种”部分启用相应的列,或导航到“详细信息”部分。



  4. 优化和加速申请持仓的价格。当新报价到达程序端时,价格、盈利和预付款要求会更快更新。
  5. 修正计算内置Stochastic Oscillator指标。在图表中显示有限柱形图时,可能出现错误。

MQL5

  1. 优化并加速AccountInfo*函数(提供访问交易账户属性)。
  2. 通过ChartGetInteger函数,优化并加速访问数值图表属性。

MetaEditor

  1. 下面快捷菜单命令已添加到代码编辑选项卡,以便对MQL5 存储进行高效操作:
    • 比较文件的工作副本和当前版本
    • 恢复更改
    • 查看文件更改历史



  2. 更改匹配括号的高亮部分。现在,突出显示应用于括号而非背景中。默认情况下禁用突出显示。它可以在编辑器设置中启用。


  3. 改进搜索和替换功能:

    • 如果您在文件中选择文本并打开搜索框,则该文本将自动在“查找”字段中替换。如果未选择任何文本,则剪贴板中的文本将粘贴在“查找”字段中。如果剪贴板为空,则搜索框中的默认值将设置为“查找”字段。
    • 对于替换窗口也实施类似的行为:将所选文本插入搜索字段,然后将光标移至“替换为”字段。因此,您可以立即输入所需的新文本。
    • 现在,搜索和替换结果显示在日志中,而不是以前使用的单独对话框中。如果启用了“工具箱”窗口,则将在其中自动选择“日志”选项卡。因此,您不需要使用额外的窗口。

  4. 修正使用MQL5存储时在文件比较窗口中进行搜索。
  5. 添加通过#include指令搜索和替换连接到当前文件的文件的可能性。

    新选项能够更快操作多个文件组成的项目。例如,要替换所有文件中的文本,您无需手动指定其目录,而编辑器可以通过#include指令自动找到它们。

Tester

  1. 我们已修改优化准则,其中包括两个变量,其中一个是结余。现在,该准则仅考虑到第二个变量而忽略了结余。新优化准则更易于分析。

    • Balance + Maximum Profitability -> Maximum Profitability
    • Balance + Maximum Expected Payoff -> Maximum Expected Payoff
    • Balance + Minimum Drawdown -> Minimum Drawdown
    • Balance + Maximum Recovery Factor -> Maximum Recovery Factor
    • Balance + Maximum Sharpe Ratio -> Maximum Sharpe Ratio



  2. 在“优化参数”子菜单中,我们添加新命令,用于快速显示或隐藏包括优化结果的表格中的所有输入列:



  3. 为优化结果表格和图形添加颜色,以便于视觉分析。

    该图形根据优化准则的值,以绿色到红色的渐变色进行着色。 该表格使用以下颜色:
    • 结余:初始入金上方的值用蓝色显示,初始入金下方的值用红色显示。
    • 盈利:大于零的值使用蓝色,小于零的值使用红色。
    • 期望收益:大于零的值使用蓝色,小于零的值使用红色。
    • 盈亏:从绿色(0-5%)到红色(高于30%)。
    • 夏普比率:从绿色(高于2)到红色(低于0)。
    • 采收率:从绿色(高于2)到红色(低于1)。


  4. 在优化结果表格中添加过滤器。使用过滤器隐藏列表中的不成功的通过:
    • 无交易通过
    • 亏损通过
    • 盈亏通过高于50%
    • 采收率通过低于1
    • 夏普比率通过低于0.5



  5. 优化MQL5云网络的工作。现在,当针对相同的EA交易启动优化时,网络会尝试使用在上一次优化过程中使用的相同测试代理,因为所需的市场环境(包括交易历史记录)已经在此类代理上可用。

更新文档。
5 六月 2020
MetaTrader 5 build 2485: MQL5中iCustom的改进和整体优化

程序端

  1. 优化并显著加快对自定义交易品种的柱形图历史编辑。此次改进还涉及到CustomRatesUpdate函数。
  2. 修正将自定义交易品种设置导出到JSON文件的问题。
  3. 修复崩溃日志中报告的错误。

MQL5

  1. 这个版本提供了通过iCustom修改自定义指标加载算法。

    如果在自定义指标名称前指出反斜杠符号'\',则相对于MQL5根文件夹搜索EX5指标文件。因此,对于调用iCustom(Symbol(), Period(), "\FirstIndicator"...),该指标将被加载为MQL5\FirstIndicator.ex5。如果在此路径中找不到此文件,则返回错误error 4802 (ERR_INDICATOR_CANNOT_CREATE)。

    如果路径不是以反斜杠'\'开始,则将根据以下操作顺序搜索并加载指标:

    • 在调用程序EX5所在的文件夹中搜索EX5文件。例如,CrossMA.EX5 EA交易位于MQL5\Experts\MyExperts。它包含以下调用:iCustom(Symbol()、Period()、"SecondIndicator"...)。在这种情况下,将在MQL5\Experts\MyExperts\SecondIndicator.ex5中搜索指标。
    • 如果没有找到指标,则执行相对于指标根目录的搜索:MQL5\Indicators。因此,将搜索文件MQL5\Indicators\SecondIndicator.ex5。如果找不到指标,则该函数返回INVALID_HANDLE并引发错误4802(ERR_INDICATOR_CANNOT_CREATE)。

    如果在子目录(例如MyIndicators\ThirdIndicator)中设置指标路径,则在以下路径下从调用程序的文件夹(EA交易位于文件夹MQL5\Experts\MyExperts)中开始搜索:MQL5\Experts\MyExperts\MyIndicators\ThirdIndicator.ex5。失败的情况下,将搜索文件MQL5\Indicators\MyIndicators\ThirdIndicator.ex5。请注意,路径分隔符应指定为双反斜杠'\\'。例如:iCustom(Symbol()、Period()、"MyIndicators\\ThirdIndicator"...)

    另外,如果在程序代码中找到通过iCustom进行的自定义指标调用,则编译器将隐式添加"#property tester_indicator XXX"指令(如果未指定)。

  2. 优化并显著加快HistorySelect函数的速度,该函数可以请求交易和订单的历史记录。
  3. 修正通过CopyTicksRange函数进行报价请求时出现的错误。该错误可能导致范围的开始设置为开始日期而不是指定时间。
  4. 通过Alert函数,优化和显著加快预警显示的速度。
  5. 交易品种最后报价时间(以毫秒表示)的新属性YMBOL_TIME_MSC。该属性可以使用SymbolInfoInteger函数获取。
29 五月 2020
MetaTrader 5 build 2470

程序端

  • 修正导致无法将名称中带有'-'、'='、'_'和'+'符号的交易品种添加到市场报价的错误。

MQL5

MetaEditor

  • 修正通过'\n'和'\r'行结束字符进行的扩展搜索。
更新文档。
22 五月 2020
MetaTrader 5平台Build 2450:“订阅”服务,用户界面改进以及修改MetaEditor功能

程序端

  1. 我们发布了全新的订阅服务。订阅提供了可协助您进行交易的额外服务。例如,您可以订阅来自知名提供商的高质量市场数据、分析收到的数据并开发新交易策略。您可以选择请求个人经理服务,以帮助您学习交易基础知识或掌握平台使用技能。

    该服务目前正在开发中,并将在下一版本中可用。

    工作原理
    新“订阅”部分已经添加到“导航”中。所有可用服务均显示在此部分。服务列表在交易商端配置,因此它取决于您所连接的服务器。为了便于浏览,将订阅分为不同类别。


    选择一项服务以查看它的详细描述。下一步,点击“订阅”。所有活动订阅都显示在单独的部分中。


    当您订阅市场数据时,相应的交易品种也可供在“市场报价”中选择。它们可以用作常规交易品种:在“市场报价”中查看报价,打开图表并使用对象和指标对其进行分析,以及在策略测试中运行EA。但不支持这些交易品种的交易操作。

    如何支付订阅费用
    您可以使用您交易账户的资金来支付服务费用。无需访问其他网站,支付可以直接从平台执行。

    不久,我们将添加可以通过连接到MetaQuotes-Demo购买市场数据的订阅
    我们计划建立订阅来自全球各地交易所的市场数据。只需单击几下,您就能收到来自纳斯达克(Nasdaq)、芝加哥商业交易所(CME),纽约证券交易所(NYSE)、圣保罗证券交易所(BOVESPA)和其他交易所的实时报价。您将可以使用MQL5.community账户为订阅付费,类似于市场、信号和主机服务购买。

  2. 在图表设置中添加新的“显示报价行情”选项。该选项显示/隐藏包含交易品种名称、时间周期和自定义注释的行。



  3. 在程序端设置和图表设置中添加“显示交易历史”选项。在之前的版本中可提供在图表上显示市场进入和退出的功能,但是这是通过“工具箱\历史记录”部分进行管理。新选项使历史显示的设置更加方便。您可以一次性为所有图表配置历史显示,也可以单独设置所需的图表。



    此外,您可以使用图表快捷菜单快速启用显示交易历史和交易水平:



  4. 在图表设置中添加新的“白底色”配色方案。


  5. 在持仓和订单快捷菜单中添加新命令,从而可以快速打开相关交易品种的“市场深度”和图表:



  6. 添加图表框架突出显示。当程序端中打开多个图表时,这将帮助您找到所需的交易品种图表。在“市场报价”中选择一个交易品种,在“交易”或“历史”部分中选择一个订单或持仓线,或一个警报,相应交易品种图表的框架将闪烁三次。


  7. 改进图表上交易水平的显示。
    • 为了保持图表整洁,不再显示持仓、订单和水平的单号
    • 标题以大写形式显示,提高可读性
    • 如果交易量为零,则显示的交易量不包含小数部分
    • 如果图表高度小于80像素,则隐藏水平


  8. 除了交易品种名称,还在图表的左上角添加显示交易品种描述(如果可用)。




  9. 未结订单和持仓列表中添加了新列:
    • 变化 — 操作盈利百分比
    • 价值 — 持仓的市场价值
    • 幻数 — 通过EA交易开立的订单和持仓的标识符(幻数)

    可以使用快捷菜单显示/隐藏新列。

    持仓值和幻数列也已添加到交易历史部分。

    此外,根据操作结果,未结持仓和历史记录部分的盈利字段会突出显示。

  10. 添加对负值价格的支持。这样可以在类似于近期油价跌至零值以下的情况下正常运行平台。这包括:
    • 在“市场报价”中显示报价
    • 显示图表和“市场深度”
    • 执行交易操作
    • 计算盈利和抵押

  11. 在“市场报价”中可以同时启用的最大交易品种数量已增加到5000。
  12. 修正在聊天中按最后更新日期排序。
  13. 优化和加速含有大量交易品种的操作(50,000及更多)。
  14. 修正在当前交易量与交易品种交易量变化步骤不符的情况下无法平仓的错误。

MQL5

  1. 优化和加速报价历史的操作。
  2. 添加用于处理数据库的新函数:
    • DatabaseReset — 将请求重置为初始状态,类似于DatabasePrepare调用。该函数旨在使用不同的参数值多次执行请求。例如,当使用INSERT命令将数据批量添加到表格中时,应为每个条目形成一组自定义的字段值。
    • DatabaseBind — 在请求中设置参数值。该函数在SQL请求包含"?"或"?N"参数化值的情况下被使用,这里N表示参数索引(从1开始)。
    • DatabaseBindArray — 将数组设置为参数值。

  3. FileSelectDialog函数添加FSD_FILE_MUST_EXIST标识。它指出所选文件必须存在。
  4. 描述期权的值已被添加到ENUM_SYMBOL_INFO_DOUBLE枚举:
    • SYMBOL_PRICE_CHANGE — 当前价格相对于上一交易日结束时价格的变化(以百分比表示)。
    • SYMBOL_PRICE_VOLATILITY — 价格波动率(以百分比表示).
    • SYMBOL_PRICE_THEORETICAL — 理论期权价格.
    • SYMBOL_PRICE_DELTA — 期权/warrant delta。显示当基础资产价格变动1时,期权价格变化的值。
    • SYMBOL_PRICE_THETA — 期权/warrant theta。期权价格每天因临时停止而损失的点数,即到期日临近时。
    • SYMBOL_PRICE_GAMMA — 期权/warrant gamma。显示delta的变化率 — 期权溢价变化的快慢情况。
    • SYMBOL_PRICE_VEGA — 期权/warrant vega。显示当波动率变化1%时,期权价格变化的点数。
    • SYMBOL_PRICE_RHO — 期权/warrant rho。反映了理论期权价格对利率变化1%的敏感性。
    • SYMBOL_PRICE_OMEGA — 期权/warrant omega。期权弹性 — 期权价格相对于基础资产价格变动的百分比。
    • SYMBOL_PRICE_SENSITIVITY — 期权/warrant sensitivity。通过期权基础资产价格应该变化多少点,来显示期权价格应该变化一个点。

  5. DatabaseExport函数中添加HEX格式的BLOB字段导出。
  6. 新CHART_SHOW_TICKER属性已添加到ENUM_CHART_PROPERTY_INTEGER — 在左上角显示交易品种报价行情。如果CHART_SHOW_TICKER设置为false,也会将CHART_SHOW_OHLC设置为false 并因此隐藏OHLC。   
  7. 改进编译器生成的代码质量。这可以提高其执行速度
  8. 修复与模板函数和类的编译和执行有关的错误。即是:
    • 重载模板函数调用的优先级不匹配错误
    • 模板方法/类生成错误
    • 尝试访问模板函数的模板参数的内部类引起的错误
    • 由使用内部类引起的模板类代码生成错误。
    • 在B<void*>之前使用B<int>目标对象时产生的错误
    • 创建具有内部类型C且多次封装的复杂对象时出现的错误
    • 将函数指针参数转换为const ref模板时出现的错误
    • 将内部结构传递给模板函数时出现的错误
    • 执行模板函数的优先级不匹配错误
    • for和ddo-while循环中的括号计数不正确
    • 类结构描述中的括号计数不正确
    • 在使用ArrayResize一次添加一个元素时速度变慢
    • 选择匹配的重载函数时出现的错误

  9. 修正CustomTicksReplace函数中出现的错误。
  10. 修正选择交易订单历史的显示周期。现在,该选择范围是基于订单执行日期,而不是之前使用的创建日期。

Python

  1. 路径参数已添加到initialize方法中 — metatrader.exe或metatrader64.exe的路径。如果没有指定此路径,模块会尝试自己查找可执行文件。
  2. 已添加以下新方法:
    • symbols_get — 从MetaTrader 5程序端接收所有交易品种。
    • symbols_total — 获取MetaTrader 5程序端中所有交易品种的数量。

  3. 为以下函数添加了根据交易品种组过滤: orders_getpositions_gethistory_orders_gethistory_deals_get。使用带有"group"参数的调用表格。
  4. 现在,order_sendorder_check返回值与包含原始请求完整描述的'request'字段一起传递。例如:
    ...
    comment=Request executed
    request_id=55
    retcode_external=0
    request=TradeRequest(action=1, magic=234000, order=0, symbol='USDJPY', volume=0.1, price=108.018, stoplimit=0.0, ...
        traderequest: action=1
        traderequest: magic=234000
        traderequest: order=0
        traderequest: symbol=USDJPY
        traderequest: volume=0.1
        traderequest: price=108.018
        traderequest: stoplimit=0.0
    ...
  5. 当在图表上启动时,Python脚本现在接收图表交易品种和周期(以分钟为单位)作为参数。
    import sys
    
    chart_symbol='unknown'
    chart_tf=1
    
    if len(sys.argv) == 3:
        chart_symbol, chart_tf = sys.argv[1:3];
    
    print("Hello world from", chart_symbol, chart_tf)
    
    >> Hello world from T.NYSE 15

MetaEditor

  1. 添加命令“添加现有文件夹”。它可以将所有支持的文件从所选目录批量添加到项目中。



  2. 扩展搜索和替换选项。

    添加带有部分正则表达式支持的扩展搜索功能。使用\r、\n、\t在搜索请求中指定换行符和制表符。搜索和替换对话框已合并为一个多选项卡对话框。


    添加一个用于在程序员社区搜索的单独选项卡。其中包括MQL5.community,以及GitHub、MSDN和Stack Overflow。

    来自外部资源的搜索结果显示在MetaEditor工具箱窗口中:



    此外,您可以从GitHub立即下载源文件。文件将下载到Projects文件夹的单独子目录中,该子目录根据GitHub项目名称进行命名。

    搜索结果还可以按日期排序。

  3. 添加可以在代码编辑窗口中快速更改字体大小。若要更改字体大小,请按下Ctrl并滚动鼠标滚轮。
  4. 添加可以将CSV文件的表格导入数据库表格。导入期间可以设置以下参数:
    • 数据库中的表名
    • 自动或手动文件编码检测
    • 数据分隔符类型
    • 开始时跳过指定的行数
    • 评论前缀
    • 如果文件具有列名
    • 如何确定换行符
    • 数据应该添加到新表还是现有表中
    • 字符串使用什么引号


  5. 添加用于将时间和颜色插入程序源代码的快速命令。从交互式日历和调色板中选择所需的值,然后编辑器以相应的格式将其插入。



  6. 由于现在仅生成64位代码,因此已禁用MQL4支持。
  7. 修正类片段操作。
  8. 修复对项目中绝对路径的支持。
更新文档。
6 三月 2020
新版MetaTrader 5 build 2360:扩展SQLite集成
  1. MQL5: SQLite数据库操作错误现在可使用标准的MQL5工具进行分析。已添加以下错误代码

    • ERR_DATABASE_ERROR — 普通错误。
    • ERR_DATABASE_INTERNAL — SQLite内部逻辑错误。
    • ERR_DATABASE_PERM — 拒绝访问。
    • ERR_DATABASE_BUSY — 数据库文件锁定。
    • ERR_DATABASE_LOCKED — 数据库表格锁定。
    • ERR_DATABASE_NOMEM — 内存不足,无法完成操作。
    • ERR_DATABASE_READONLY — 尝试写入只读数据库。
    • ERR_DATABASE_IOERR — 磁盘I/O错误
    • ERR_DATABASE_CORRUPT — 数据库磁盘映像损坏。
    • ERR_DATABASE_FULL — 数据库已满,插入失败。
    • ERR_DATABASE_CANTOPEN — 无法打开数据库文件。
    • ERR_DATABASE_PROTOCOL — 数据库锁定协议错误。
    • ERR_DATABASE_SCHEMA — 仅供内部使用。
    • ERR_DATABASE_TOOBIG — 字符串或BLOB超出大小限制。
    • ERR_DATABASE_CONSTRAINT — 由于违反约束而中止。
    • ERR_DATABASE_MISMATCH — 数据类型不匹配。
    • ERR_DATABASE_MISUSE — 程序库使用错误。
    • ERR_DATABASE_AUTH — 授权失败。
    • ERR_DATABASE_RANGE — 绑定参数错误,索引不正确。
    • ERR_DATABASE_NOTADB — 打开的文件不是数据库文件。

  2. MQL5:修正DatabaseImport函数的操作,其可将数据从文件导入到数据库表格中。
  3. MetaEditor:修正输出到日志的字符串长度超过32Kb。
  4. MetaEditor:修正从Python控制板(stdout, stderr)发送到编辑器错误部分的消息中出现的错误编码。
  5. 更新文档。
21 二月 2020
新版MetaTrader 5平台Build 2340:在Tester中管理账户设置,并扩展Python集成

MetaEditor

  1. 添加使用SQLite数据库的新功能。

    前一次平台更新中,我们直接从MQL5引入了对SQLite数据库操作的支持。主要功能可通过MetaEditor用户界面获得:

    • 创建并连接数据库
    • 查看表格并执行快速数据查询
    • 创建并执行SQL查询,回滚更改

    如何工作
    快速数据库创建功能可从MQL5向导中获得。您可以轻松创建第一个表格并定义它的字段。


    创建数据库之后,您将转到一个新导航版块,其中提供了管理数据的命令。

    数据库表显示在左侧窗口。双击表格名称,快速查询前1,000条记录。在此导航部分,您还可以创建和打开其他数据库,以及使用表格。

    数据库可以在主编辑器窗口中进行管理。在这里,您可以填写表格、搜索和选择数据、输入SQL查询和执行其他操作。


    关于MetaTrader 5对数据库操作的更多信息,请参阅文章“SQLite:本地处理MQL5中的SQL数据库”。

  2. 扩展对多语言项目的支持。此更新提供了使用Python脚本的更广泛的可能性:

    • 现在,此脚本可以使用MQL5向导进行创建,同时可以立即在代码中添加所需程序库的相关性。
    • 导航中添加了特殊图标,相关语法可在编辑器中获得。
    • 当通过MetaEditor运行脚本时,来自Python控制板(stdout, stderr)的消息出现在错误部分。


    点击编辑器中的“编译”,运行脚本:


    若要使用Python,请不要忘记在MetaEditor的Settings \ Compilers部分指定其路径。要启动使用MetaTrader 5程序库,请使用以下命令进行安装:
    pip install MetaTrader5
    关于Python集成的详细信息,请参阅相关文档
  3. MetaEditor:在导航中添加SQLite数据库文件的显示(*.db;*.sdb;*.sqlite;*.db3;*.s3db;*.sqlite3)。
  4. MetaEditor:修正错误保存项目属性。

MQL5

  1. 完全修订Python集成。此次更新涉及许多新函数和新命令命名。

    新命名
    现有命令已重命名如下:
    MT5Initialize       -> initialize
    MT5Shutdown         -> shutdown
    MT5TerminalInfo     -> terminal_info
    MT5Version          -> version
    MT5CopyRatesFrom    -> copy_rates_from
    MT5CopyRatesFromPos -> copy_rates_from_pos
    MT5CopyRatesRange   -> copy_rates_range
    MT5CopyTicksFrom    -> copy_ticks_from
    MT5CopyTicksRange   -> copy_tick_range

    新命令
    扩展了支持的命令列表。添加交易函数,以及用于处理交易历史和获得交易品种和当前账户信息的函数。

    • account_info()接收关于当前账户的信息。类似AccountInfoIntegerAcountIndoDoubleAccountInfoString
    • positions_total()接收持仓的数量。类似PositionsTotal
    • positions_get(symbol, ticket)接收交易品种或单号的持仓情况。
    • orders_total()接收订单的数量。类似OrdersTotal
    • orders_get(symbol, ticket)接收交易品种或单号的未结订单情况。
    • history_orders_total(from, to)接收指定历史时间段内的订单数量。
    • history_orders_get(from, to, position, ticket)接收指定历史时间段内的订单,根据单号或持仓进行筛选。
    • history_deals_total()接收历史记录中的交易数量。类似HistoryDealsTotal
    • history_deals_get(from, to, position, ticket)接收指定历史时间段内的交易,根据单号或持仓进行筛选。
    • symbol_info(symbol)接收有关交易品种的信息。类似SymbolInfoIntegerSymbolInfoDoubleSymbolInfoString
    • symbol_info_tick(symbol)接收交易品种最后报价。类似SymbolInfoTick
    • symbol_select(symbol, enable)启用/禁用市场报价中的交易品种。类似SymbolSelect
    • order_check(request)检查订单预付款。类似OrderCheck
    • order_send(request)发送订单到服务器。类似OrderSend
    • order_calc_margin(action, symbol, volume, price)计算订单的预付款。类似OrderCalcMargin
    • order_calc_profit(action, symbol, volume, price_open, price_close)计算盈利。类似OrderCalcProfit

    在图表上运行Python脚本
    Python脚本可以直接在平台图表上运行,类似于常规的MQL5程序。这些脚本在导航中使用特殊图标进行标记。


    脚本消息将显示在"Toolbox \ Experts"部分。如果在脚本中使用MetaTrader 5程序库,则脚本可以接收交易品种和账户数据,以及执行交易操作。

    Python脚本可以与其他MQL5脚本和EA并行地在同一图表上运行。要停止执行中断的脚本,请将其从图表中移除。

    附加保护
    若要在使用第三方Python程序端时启用附加账户保护,您可以在程序端设置中使用“通过外部Python API启用自动交易”选项。


    Python脚本只可在该选项禁用时执行交易操作。

  2. 明显加快重新启动MQL5程序和从MQL5程序重新创建自定义指标的速度。在某些情况下,操作执行速度要快100倍。
  3. 添加处理数据库的函数:

    DatabaseImport
    从文件导入数据到图表。
    long  DatabaseImport(
       int           database,          // 在DatabaseOpen中接收到的数据库句柄
       const string  table,             // 要向其插入数据的表格名称
       const string  filename,          // 要从中导入数据的文件名
       uint          flags,             // 标识组合
       const string  separator,         // 数据分隔符
       ulong         skip_rows,         // 要跳过的首行数
       const string  skip_comments      // 定义注释的字符串
       );

    DatabaseExport
    将表格或SQL查询结果导出到CSV文件。该文件用UTF-8编码创建。
    long  DatabaseExport( 
       int           database,           // 在DatabaseOpen中接收到的数据库句柄
       const string  table_or_sql,       // 表格名称或SQL查询
       const string  filename,           // 用于数据导出的CSV文件名
       uint          flags,              // 标识组合
       const string  separator           // CSV文件中的数据分隔符
       );

    DatabasePrint
    将表格或SQL查询结果打印到专家日志。
    long  DatabasePrint(
       int           database,          // 在DatabaseOpen中接收到的数据库句柄
       const string  table_or_sql,      // 表格或SQL查询
       uint          flags              // 标识组合
       );

  4. 添加FileSelectDialog函数,它可调用创建/打开文件或文件夹的系统对话框。
    int  FileSelectDialog(
       string   caption,              // 窗口标题
       string   initial_dir,          // 初始目录
       string   filter,               // 扩展过滤器
       uint     flags,                // 标识组合
       string&  filenames[],          // 包含文件名的数组
       string   default_filename      // 默认文件名
       );
    新函数使用户能够与MQL5程序进行有效互动。

  5. ENUM_DEAL_PROPERTY_DOUBLE枚举中的DEAL_FEE值。它用于交易费。该值表示由交易商收取的单独手续费类型。

Tester

  1. 添加在策略测试期间设置自定义交易账户设置的功能,例如交易限制、预付款设置和手续费。新功能提供了建模各种交易条件的扩展功能。


    常规设置
    在这部分,您可以设置账户上可同时存在的未结订单和持仓的最大数量。此外,您还可以配置不允许程序交易的时间段。

    预付款
    这部分可以配置将在测试中使用的预付款保留规则和持仓账户系统:

    • 风险管理 — 风险管理模式:场外交易(OTC)和场内交易(交易所)模式,单边系统和锁仓系统。更多详情请参阅帮助
    • 追加预付款水平 — 当达到该水平时,账户切换到追加预付款状态。
    • 强制平仓水平 — 当达到该水平时,取消所有订单并关闭所有持仓。这些水平可以用百分比和货币表示。在前一种情况下,它们被确定为账户的净值数值。如果选择“以百分比表示”,该水平定义为账户的“预付款水平”值(资金/预付款*100)。
    • 未兑现盈利 — 表示可用预付款中的当前浮动盈利/亏损:
      • 不使用未兑现盈利/亏损 — 计算中不包括持仓的盈利/亏损。
      • 使用未兑现盈利/亏损 — 计算中包括持仓的盈利/亏损。
      • 使用未兑现盈利 — 只包括盈利。
      • 使用未兑现亏损 — 只包括亏损。
    • 每日固定盈利 — 表示可用预付款中客户的每日固定盈利/亏损:
      • 使用每日固定盈利/亏损 — 包括一个交易日内收到的可用预付款盈利和亏损。
      • 使用每日固定亏损 — 只包括交易日内收到的亏损。交易日内,获得的盈利累计在专门账户字段(“冻结”)。交易日结束时,累计的盈利被取消冻结(归零)并被添加到账户结余中(包含在可用预付款中)。
    • 交易日结束时取消冻结固定盈利 — 该选项只在选择“使用每日固定亏损”选项时可用。如果启用此选项,则在交易日结束时将取消冻结累计的盈利(因此也包含在可用预付款中)。否则,这部分盈利将被继续冻结。

    手续费
    这部分提供管理所有交易操作收取的手续费。

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

  2. 优化并加速市场扫描模式下的工作,在此过程中,对市场报价中可用的所有交易品种进行多次测试。
  3. 现在以点数计算盈利时会考虑交易或持仓大小。之前,只对每手执行计算。
  4. 改进优化结果图形的管理。已对缩放优化图形添加了滚动选项。双击一个图点,在测试通过表格中选择相应的结果。
更新文档。

13 十二月 2019
MetaTrader 5平台Build 2280

程序端

  1. 修正了导致无法从没有数据的图表中删除EA交易的错误。
  2. 修正Wine下图表标题显示的问题。

MQL5

  1. 改善MQL5程序的加载和编译速度。
  2. 双击图表现在作为单击事件传递到MQL5程序。在此之前,此类事件并未得到处理。
  3. 修正StringTrimRight函数的操作。
  4. 添加DirectX 3D可视化功能文档。

Tester

  1. 修正导致设置中的测试交易品种为空的错误。这个错误可能由在不同交易品种设置的交易账户之间切换引起的。新操作:如果在当前连接的交易账户中没有找到之前选择的交易品种,那么会自动选择市场报价中第一个可用的交易品种。

MetaEditor

  1. 修正重新打开项目属性时加载应用程序图标的问题。


更新用户界面翻译。
基于崩溃日志进行修复。
6 十二月 2019
新版MetaTrader 5平台build 2265:用于MQL5 3D可视化的DirectX功能和策略测试中的交易品种设置

程序端

  1. 有更多列可显示在市场报价中。现在,还提供之前只显示在“详细信息”选项卡中的额外40种交易品种参数。




  2. 添加在导航中突出显示当前连接的账户和当前服务器。这个功能在您有多个不同交易商账户的情况下,将非常实用。




  3. 更新图表框架设计。框架更小,因此为有用信息留出更多空间。




  4. 改进将交易历史显示为持仓时计算交易总量的算法。现在根据实际记录计算该数值。

    要将交易历史显示为持仓,程序端会使用请求期间执行的交易信息。只有在此期间关闭的持仓才会显示在历史中。如果持仓仍未完结或平仓时间超出所选间隔,则将不会显示在历史记录中。因此,持仓模式下的总盈利和手续费可能不同于“订单/交易”历史模式下的总盈利和手续费。

    例如,您正在查看过去一周的历史。在此期间,执行了100笔交易,其中98笔参与了20个持仓的开仓和平仓。最近两笔交易开设新持仓,目前尚未结束。在这种情况下,交易历史包含100条记录和基于这些交易计算的总值。当以持仓的形式查看历史时,您将看到基于98笔交易收集的20条记录。当计算总值时,只有这些数据将被考虑。如果交易商收取入市交易费,那么交易历史中的最终手续费值将不同于持仓历史中显示的手续费,因为在后一种情况下,最后两笔交易将被忽略。

  5. 实现更快启动MQL5程序。
  6. 程序端安装文件中添加了新/beta键,可以下载测试版。在正常模式下,应该先安装发布版,然后才可更新到测试版。现在跳过这一步骤,从而节省时间和流量。安装开始示例:
    C:\mt5setup.exe /beta
  7. 修正显示“交易所股票”类型交易品种的预付款需求。
  8. 通过使用Clang/LLVM编译器,加速所有平台组件的操作。在某些情况下,编译速度可提高20%。

MQL5

  1. 为3D可视化添加新DirectX 11功能和着色器。现在,可以在MQL5中直接创建3D图形。

    新CCanvas3D类是CCanvas自定义图形类的扩展。它位于\MQL5\Include\Canvas\目录。这个类的功能是可通过DirectX API渲染3D对象。

    • 创建 — 创建一个场景。
    • 附加 — 将场景绑定到图表。
    • 破坏 — 破坏一个场景。
    • ObjectAdd — 将继承自CDXObject基类的子对象添加到场景中。
    • 渲染 — 通过ObjectAdd方法添加的完整渲染循环,包括所有CDXObject的缓冲区清除和渲染。
    • RenderBegin — 启动场景渲染,使用指定颜色(如果设置DX_CLEAR_COLOR标识)和深度缓冲区(使用DX_CLEAR_DEPTH时)填充渲染缓冲区,并为默认着色器设置DXInputScene场景缓冲区。
    • RenderEnd — 完成场景渲染并将结果接收到内部缓冲区。如果redraw==true,在图像运行的图表上显示图像。
    • ViewMatrixGet — 接收视图矩阵。
    • ViewMatrixSet — 设置视图矩阵。矩阵不兼容ViewPositionSet、ViewRotationSet、ViewTargetSet和ViewUpDirectionsSet方法。
    • ViewPositionSet — 设置视图位置。
    • ViewRotationSet — 设置视图旋转矩阵。
    • ViewTargetSet — 设置视图指向的点。与ViewUpDirectionsSet一起,是ViewRotationSet的另一种选择。
    • ViewUpDirectionsSet — 设置视图的垂直位置。与ViewTargetSet一起,是ViewRotationSet的另一种选择。
    • ProjectionMatrixGet — 接收投影矩阵。
    • ProjectionMatrixSet — 设置投影矩阵。

    关于新程序库的详细文档将很快发布。




  2. 添加支持直接从MQL5操作SQLite数据库。这使得无需创建复杂的指令即可轻松执行SQL查询。内部操作通过新的标准库扩展实现。

    提供以下函数:

    • DatabaseOpen — 在指定文件中打开或创建数据库
    • DatabaseClose — 关闭数据库
    • DatabaseTableExists — 检查数据库中是否有表格
    • DatabaseExecute — 执行对指定数据库的查询
    • DatabasePrepare — 创建查询句柄,该句柄可以使用DatabaseRead()进一步执行
    • DatabaseRead — 跳转到查询结果中的下一条记录
    • DatabaseFinalize — 删除在DatabasePrepare()中创建的查询
    • DatabaseTransactionBegin — 启动交易事务执行
    • DatabaseTransactionCommit — 完成交易事务执行
    • DatabaseTransactionRollback — 滚动返回交易事务
    • DatabaseColumnsCount — 接收查询中的字段数
    • DatabaseColumnName — 根据数字接收字段名
    • DatabaseColumnType — 根据数字接收字段类型
    • DatabaseColumnSize — 接收字段大小(以字节为单位)
    • DatabaseColumnText — 接收当前记录中的字段的字符串值
    • DatabaseColumnInteger —  接收当前记录中的int值
    • DatabaseColumnLong — 接收当前记录中的long值
    • DatabaseColumnDouble — 接收当前记录中的double值
    • DatabaseColumnBlob — 接收当前记录中的字段值数组

    函数操作添加了以下错误代码:

    • ERR_MQL_DATABASE_INTERNAL (5120) — 内部数据库错误
    • ERR_MQL_DATABASE_INVALID_HANDLE (5121) — 无效数据库句柄
    • ERR_MQL_DATABASE_TOO_MANY_OBJECTS (5122) 超出数据库对象的最大数目
    • ERR_MQL_DATABASE_CONNECT (5123)数据库连接错误
    • ERR_MQL_DATABASE_EXECUTE (5124) 请求执行错误
    • ERR_MQL_DATABASE_PREPARE (5125) 请求创建错误
    • ERR_MQL_DATABASE_NO_MORE_DATA (5126) — 没有要读取的数据
    • ERR_MQL_DATABASE_STEP (5127) 移动到下一个查询记录时出错
    • ERR_MQL_DATABASE_NOT_READY (5128) 读取查询记录的数据尚未准备好
    • ERR_MQL_DATABASE_BIND_PARAMETERS (5129) SQL查询自动替换错误

  3. 添加MQL5程序的新属性,可以选择默认的可视化方法。
    #property optimization_chart_mode "3d,InpX,InpY"
    该属性可以设置优化结束时打开的图表类型,以及X和Y轴的程序参数。

    该属性仅设置默认图表视图。它可以随时使用快捷菜单手动更改。

  4. MathArctan2新函数。返回角度的弧度值,其正切值等于两个指定数值的比率。
    double  MathArctan2(
       double  y      // 点的y坐标
       double  x      // 点的x坐标
       );
  5. 我们对程序进行了总体优化,提高性能并降低资源消耗。
  6. 添加可在策略测试中执行的数学计算示例。这些在\MQL5\Experts\Examples\Math 3D\目录下提供。
  7. 引入对namespaces(命名空间)更严格控制。
  8. 添加在MQL5程序中使用.NET库时加载链接库。如果使用的.NET程序库需要其他程序库才可运行,编译器将尝试从\MQL5\Libraries自动下载所需的程序端。
  9. 修正用于Python集成的MetaTrader模块中的时间操作。现在,所有输出数据都使用程序端连接的交易服务器的时间。

Tester

  1. 添加许多新功能和改进:


    交易品种的自定义设置
    现在您可以更改主要交易品种的设置,并为此执行测试/优化。几乎所有规格参数都可以重写:交易量、交易模式、预付款需求、执行模式和其他设置。因此,如果您需要在不同条件下检查EA,则无需创建单独的自定义交易品种和下载其历史记录。这可以通过更改标准的交易品种设置来完成。



    如果交易品种规格为自定义,则齿轮图标和交易品种图标将用星号标记。这表示自定义参数用于当前测试。




    最后设置/EA交易/图表
    使用新快捷菜单命令进行快速测试或优化设置。选择最后使用的测试设置、最近图表或应用程序:




MetaEditor

  1. 添加直接从MetaEditor处理C/C++和Python项目的能力。现在,可以使用内置编辑器管理多语言项目。

    如果您的电脑安装了对应的编译器,MetaEditor将进行检测并添加到设置中。同时,您还可以在“编译器”选项卡下指定所需组件的路径。在相同的选项卡中,您可以通过点击相应字段旁边的“安装”来下载组件。




    然后,您就可以如同处理MQL5程序一样,处理C/C++和Python项目。

  2. 添加支持Shared Project目录中的子项目,旨在通过MQL5存储开发共享项目。以前,只能在顶层创建单个项目。
  3. 内置调试程序更新。
  4. 修正在使用代码样式(styler)时添加函数标题。
  5. “跳转到上一个/下一个光标位置”命令现在不仅在“查看”菜单提供,还显示在工具栏上。
  6. 现在可以在项目名称中使用空格。

Android

  1. 添加在交易商网站快速切换到入金/出金页面的能力。

    无需在交易商网站的交易者室中搜索对应的功能。可在程序端中直接获得快速导航命令:用户可以从“账户”和“交易”部分切换到入金和出金页面:



    • 只有在交易商对交易账户启用对应的功能,才可以进行入金/出金操作。
    • 交易程序端不执行任何账户入金/出金操作。集成功能将用户重新定向到对应的交易商网站页面。

  2. 现在,历史持仓可按平仓日期进行排序。
  3. 添加在历史部分用红色和绿色垂直线标记“止损”平仓或“止盈”平仓。
  4. 交易品种规格中添加新字段:

    • 分类 — 这个属性用于额外标记交易品种。例如,这可以是该交易品种所属的市场行业:农业、石油&天然气等。只有在交易商提供对应信息的情况下才显示分类。
    • 交易所 — 进行证券交易的交易所名称。只有在交易商提供对应信息的情况下才显示分类。

  5. 交易部分添加“追加预付款”状态的显示。在这种状态出现时,“预付款”、“可用预付款”和“预付款水平”参数将显示为红色。
  6. 修正在平板电脑上显示OTP部分打开按键。
  7. 其他修复和改进。

iPhone/iPad

  1. 添加在交易商网站快速切换到入金/出金页面的能力。更多详细信息请参阅“MetaTrader 5 Android版新功能列表”。



  2. 添加对iOS/iPadOS暗模式的支持。
  3. 在iPad版本中已提供动态密码部分。
  4. 历史部分用红色和绿色垂直线标记“止损”平仓或“止盈”平仓。
  5. 现在,历史持仓可按平仓日期进行排序。如果持仓尚未关闭,则使用开仓日期进行排序。
  6. 其他修复和改进。


18 十月 2019
MetaTrader 5平台Build 2190

程序端

  1. 修正“导航”中MQL5程序的显示顺序。

MQL5

  1. 修正在输入组声明的程序中使用局部静态变量导致的编译错误。

VPS

  1. 修正请求主机日志。

Tester

  1. 改进显示三维优化图表。
  2. 修正前向优化过程中frames的接收。现在,主优化和前向优化的所有框架都可以在OnTesterDeinit函数中使用。
  3. 修正在“策略测试”设置中形成交易品种树状图。

添加旁遮普语(印度)的用户界面翻译。

文档已更新。

基于崩溃日志进行修复。

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

5 十月 2019
新版MetaTrader 5平台build 2170:MQL5作用域,全局策略测试和内置虚拟主机更新

程序端

  1. 重新设计了内置虚拟主机管理选项。关于租用程序端以及环境迁移、停止和启动功能的所有信息,现在都可以在“工具箱”窗口的单独选项卡中获得。

    在早期版本中,“虚拟主机”功能可以在“导航”窗口的快捷菜单中使用。现在所有必要的信息和控制命令都方便简捷地排列在“VPS”选项卡中:




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

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

    使用“启动/停止”按键,虚拟程序端可以快速启动或停止。

    有关主机服务器硬件和CPU使用图表的数据显示在右侧窗口区。根据显示的信息,如果您的EA交易或指标使用了过多的内存或CPU时间,您将可以及时作出响应。

    有关最后交易的环境迁移以及迁移命令的信息也在这里提供。这些命令可以在购买订阅后加快环境迁移的速度。

    虚拟平台可以从“VPS”选项卡租用。租用过程不变,仍旧可以快速轻松完成租用。您只需选择一个计划和一个合适的付款方式。将会自动选择连接您交易商的最佳服务器。




  2. 添加在交易商网站快速切换到入金/出金操作的能力。

    无需在交易商网站的交易者室中搜索对应的功能。可在程序端中直接获得快速导航命令:“导航”和“工具箱”中的账户菜单 > 交易选项卡:



    • 只有在交易商对交易账户启用对应的功能,才可以进行入金/出金操作。
    • 交易程序端不执行任何账户入金/出金操作。集成功能将用户重新定向到对应的交易商网站页面。
  3. 交易品种规格中的新字段:

    分类
    这个属性用于额外标记交易品种。例如,这可以是该交易品种所属的市场行业:农业、石油&天然气等。只有在交易商提供对应信息的情况下才显示分类。

    交易所
    进行证券交易的交易所名称。只有在交易商提供对应信息的情况下才显示分类。

    手续费
    有关交易商为成交交易品种所收取的手续费的信息。计算详细信息在这里显示:

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

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



  4. 附加期权相关字段已添加到交易品种规格中:

    • 期权类型 — 买进或卖出
    • 标的 — 期权的标的交易品种
    • 执行价格 — 期权执行价格

  5. 添加对期权"Greeks"交付的支持:delta、gamma、vega、theta、rho。交易商可以提供与此类交易品种相关的其他信息。这些数据显示在“市场报价”窗口的“详细信息”部分并可用于高级交易分析:



  6. “十字光标”工具现在除了之前可用的信息之外,还表示以百分比计算的价格水平之间的距离。




  7. 添加显示在“市价”执行和“交易所”执行操作期间交易对话框中产生的价格,如果该价格在收到交易商的响应时可用:




  8. 修正由于“市场报价”窗口中的“全部显示”命令无法显示所有可用交易品种列表而产生的错误。

MQL5

  1. 作用域操作已得到修改,因此MQL5更加接近C++。这为MQL5程序员在使用第三方程序库时提供更广泛的可能性。此更新消除了修改程序库和统一标识符的需求。

    例如,代码包含两个同名结构的声明,即使它们属于不同的类。在早期版本中,这类声明会导致编译错误:“标识符已使用”。现在,这个代码将被成功编译并执行。要从作用域外正确地访问所需的变量/结构/函数,您应指定一个类(在本例中是CBar::Item)。
    class CFoo
      {
    public:
       struct Item { int x; };
      };
    //+------------------------------------------------------------------+
    class CBar
      {
    public:
       struct Item { int x; };
      };
      
    CBar::Item item;  // 正确声明Bar类的Item结构
    Item       item;  // 错误声明
    添加namespace支持,它可以在MQL5应用程序使用第三方代码/程序库时提供更多的可能性。

    #define PrintFunctionName() Print(__FUNCTION__)
    
    namespace NS
    {
    void func()
      {
       PrintFunctionName();
      }
    
    struct C
      {
       int               x;
                         C() { PrintFunctionName(); };
      };
    }
    
    struct C
      {
       int               x;
                         C() { PrintFunctionName(); };
      };
    
    //+------------------------------------------------------------------+
    //|                                                                 |
    //+------------------------------------------------------------------+
    void func()
      {
       PrintFunctionName();
      }
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                                 |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       func();
       NS::func();
    
       C c;
       NS::C ac;
      }
    执行时,输出以下结果:
    2019.09.18 13:39:35.947    TestScript (AUDCAD,H1)    func
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    NS::func
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    C::C
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    NS::C::C

  2. 新版本支持使用以下函数更快速地访问时间序列数据:iTime、 iOpen、iHigh、iLow、iClose、iVolume、iTickVolume、iSpread。

  3. 添加对"=delete"属性的支持。它可以禁止使用某些类方法。
    class A
      {
       void              operator=(const A &)=delete;    // 禁止对象复制操作符
      };
    
    class B : public A
      {
      };
    
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                                 |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       A a1,a2;
       B b1,b2; 
      
       a1=a2;
       b1=b2;
      }
    在这个示例中,编译器将返回错误"a1=a2"和"b1=b2":
    试图引用已删除函数'void A::operator=(const A&)'
       'void A::operator=(const A&)'函数在这里被明确删除

    试图引用已删除函数'void B::operator=(const B&)'
       'void B::operator=(const B&)'函数被隐式删除,因为它由已删除函数'void A::operator=(const A&)'产生

  4. 以下值已被添加到ENUM_SYMBOL_INFO_STRING枚举:

    • SYMBOL_CATEGORY — 交易品种分类。它用于额外标记交易品种。例如,这可以是该交易品种所属的市场行业:农业、石油&天然气等。
    • SYMBOL_EXCHANGE — 进行交易品种交易的交易所的名称。

  5. 添加对通过FIFO规则平仓的支持。

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

    主要有三种平仓方法:

    • 从客户端平仓:交易者使用EA,基于“信号”服务订阅等手动平仓。如果试图平仓,但不符合FIFO规则,那么交易者将收到一个对应的错误。
    • 在“止损”或“止盈”激活时平仓:这些订单在服务器端处理,因此不在交易者端(程序端)请求平仓,而是由服务器发起。如果一个持仓触发“止损”或“止盈”,且该持仓不符合FIFO规则(相同交易品种有一个更早的持仓),则该持仓将不会平仓。
    • 在“强平”触发时平仓:这些操作也在服务器端处理。在正常模式下(禁用基于FIFO平仓),“强平”时从亏损最大的持仓开始平仓。如果启用此选项,则将为亏损持仓额外检查开仓时间。服务器确定每个交易品种的亏损持仓,找出每个交易品种的最早持仓,然后在找到的持仓中关闭亏损最大的持仓。

  6. 添加通过“输入组”进行参数分组的选项。这可以根据参数的基本逻辑实现参数的可视化分离。

    在以下EA交易代码中,输入参数根据其用途进行分组:
    input group           "Signal"
    input int             ExtBBPeriod = 20;         // 布林带周期
    input double          ExtBBDeviation=2.0;       // 偏差
    input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15;   // BB时间周期
    
    input group           "Trend"
    input int             ExtMAPeriod = 13;         // Moving Average period
    input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15;    // MA 时间周期
    
    input group           "ExitRules"
    input bool            ExtUseSL      = true;     // 使用“止损”
    input int             Ext_SL_Points = 50;       // StopLoss in points
    input bool            ExtUseTP      = false;    // 使用“止盈”
    input int             Ext_TP_Points = 100;      // TakeProfit in points
    input bool            ExtUseTS      = true;     // 使用“追踪止损”
    input int             Ext_TS_Points = 30;       // 以点数计算“追踪止损”
    
    input group           "MoneyManagement"
    sinput double         ExtInitialLot =0.1;       // 初始手数值
    input bool            ExtUseAutoLot =true;      // 自动手数计算
    
    input group           "Auxiliary"
    sinput int            ExtMagicNumber =123456;   // EA幻数
    sinput bool           ExtDebugMessage=true;     // 打印调试信息
    当这种EA在“策略测试”中启动时,输入参数块可以通过双击组名来折叠或扩展,并且可以通过单个复选框选择组内的所有参数进行优化。




  7. 修正导入名称匹配MQL5函数名称的DLL函数。例如:
    #import "lib.dll"
    int func();
    #import
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int func()
      {
       return(0);
      }
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                                 |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print( func() );
      }
    在早期版本中,编译时会返回以下错误:
    'func' - 对具有相同参数的重载函数的模糊调用可以是2种函数之一
       int func()
       int func()
    现在,默认情况下将使用优先级更高的内置MQL5函数,来代替错误。导入的函数可以通过显式指定作用域来调用:
    void OnStart()
      {
       Print( lib::func() );
      }
  8. 修正经济日历新闻中的时间规格。现在,交付事件时考虑的是程序端所连接的交易服务器的时区,而不是本地计算机的时区。
  9. 修正CopyticksCopyTicksRange函数中的过多内存消耗。

信号

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

Tester

  1. 策略测试的大规模更新。全新开始页面、重新设计的设置页面、提高了可用性。

    开始页面
    现在,tester启动之后,用户看到的是一个标准任务列表,而不是多个设置,通过选择任务,用户可以快速开始测试。新设计主要是为没有经验的用户而准备的。

    我们选择最频繁的策略测试和优化任务,并将其添加到开始页面。此外,还可以从开始页面重新启动一个以前执行的任务。如果您运行了多个任务,且这些任务不适合开始页面,那么请使用搜索栏。您可以通过任何参数找到测试:程序名称、交易品种、时间周期、建模模式等。




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




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




    使用相同的选项卡,您可以在MetaEditor中快速打开程序进行编辑。

    以点数计算盈利
    使用这些设置,您可以启用以点数计算盈利。这种模式加快了测试速度,同时不需要使用转化率以入金货币重新计算盈利(因此没有必要下载对应的价格历史)。在此模式下,取消库存费和手续费的计算。




    请注意,当以点数计算盈利时,成交量并不重要。每笔交易只计算盈/亏点数。此外,在此模式下不执行预付款控制。只将其用于快速粗略的策略评估,然后使用更精确的模式检查得到的结果。

    一般改进
    测试启动/停止按键和进度条已经被移到选项卡栏。因此,用户可以控制任何“策略测试”部分的流程。测试启动/停止命令也被添加到设置和输入部分的快捷菜单中。




  2. 优化图表现在可以显示在程序端的主工作区,而不是显示在单独的策略测试区。这样,就可以为数据分析提供更多的空间。同时更新了3D可视化系统。




  3. 为“市场报价中全部交易品种”模式添加保存优化缓存
  4. 添加保存测试缓存。

    在早期版本中,只有在优化EA交易时才会将所执行任务的结果保存到文件中。现在,单个测试期间也保存缓存文件,通过它用户可以返回到之前的计算,并随时查看统计数据、结余、净值和入金加载图。在未来的版本中,这个选项将支持测试结果的比较。

    要加载之前的测试结果,请使用Tester新开始页面:点击“之前的结果”并选择想要的网站:




  5. 明显加快了测试和优化的速度,包括使用MQL5云网络执行的操作。
  6. 修正并优化了周期操作。

MetaEditor

  1. 添加配置代码样式(styler)的功能。

    MetaEditor包含一个内置代码样式(styler),它可以根据所采用的标准自动格式化程序文本。现在除了常见样式外,您还可以使用其他流行的标准。为此,请打开MetaEditor设置并选择所需的样式:




    可以为样式(styler)额外设置以下参数:

    每个缩进空间
    设置用于对齐内嵌结构的空格数:
    if(condition)
      {
       //---
      }

    用空格代替制表符
    如果启用此选项,样式(styler)将用空格代替代码中的所有制表符。每个制表符的字符数在“一般”部分中设置。

    删除空行
    启用此选项后,样式(styler)将删除只有一个换行符的所有行。

    在逗号和分号之后插入空格
    启用此选项后,样式(styler)将使用元素枚举以可视方式分隔结构。示例:
    // 之前样式
    ParameterGetRange("InpX",enable,x_cur,x_start,x_step,x_stop);
    // 之后样式
    ParameterGetRange("InpX", enable, x_cur, x_start, x_step, x_stop);

    在声明操作符周围插入空格
    启用此选项后,样式(styler)将围绕赋值、等式、比较和其他操作符插入空格。示例:
    // 之前样式
    if(x==1&y!=2)
      {
       int a=0;
      }
    // 之后样式
    if(x == 1 & y != 2)
     {
      int a = 0;
     }

  2. “在导航中显示”命令已添加到文件书签的快捷菜单。因此,用户可以轻松地在编辑器文件夹结构中找到要编辑的打开文件。




  3. 修正在工具提示中显示'union'关键字。

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


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

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

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

文档已更新。

基于崩溃日志进行修复。

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

12 六月 2019
MetaTrader 5平台build 2085:集成Python并改进策略测试

程序端

  1. 添加新API,使用Python语言通过应用程序,启用MetaTrader 5程序端数据请求。

    Python是一种用于开发脚本和应用程序的现代高水平编程语言。它包含用于机器学习、自动化处理以及数据分析和可视化的多个程序库。

    MetaTrader Python程序包是为有效快速地从MetaTrader 5程序端直接通过处理器通信获得交易所数据而设计的。通过这种途径接收的数据可以进一步用于统计计算和机器学习。



    连接

    1. https://www.python.org/downloads/windows下载最新版Python
    2. 安装Python期间,请检查“将Python X.X添加到PATH%”,以便能够从命令行启用Python脚本。
    3. 从命令行安装MetaTrader 5模块
      pip安装MetaTrader5
    4. 添加matplotlib和pytz包
      pip安装matplotlib
      pip安装pytz

    函数

    • MT5Initialize建立与MetaTrader 5程序端的连接
    • MT5Shutdown关闭之前建立的与MetaTrader 5程序端的连接
    • MT5TerminalInfo接收所连接的MetaTrader 5程序端的状态和参数
    • MT5Version返回MetaTrader 5程序端版本
    • MT5WaitForTerminal等待直至MetaTrader 5程序端连接到交易服务器
    • MT5CopyRatesFrom从指定日期开始从MetaTrader 5程序端接收柱形图
    • MT5CopyRatesFromPos从指定索引开始从MetaTrader 5程序端接收柱形图
    • MT5CopyRatesRange从MetaTrader 5程序端接收指定日期范围内的柱形图
    • MT5CopyTicksFrom从指定日期开始从MetaTrader 5程序端接收报价
    • MT5CopyTicksRange从MetaTrader 5程序端接收指定日期范围内的报价


  2. 优化了市场信号部分。现在,产品和信号展示的运行速度提高了7倍,从而提供了更好的浏览体验服务。




  3. 新增在Wine系统下支持“市场”、“信号”和“搜索”。LinuxMac OS用户现在可以访问最大的交易应用程序商店和复制交易服务。




  4. 内置学习程序已被翻译成30多种语言,包括西班牙语、中文、葡萄牙语和德语。若要查看所需语言的互动提示,请使用“查看”菜单切换界面语言。




  5. 新选项可以验证交易者在开设模拟账户和初始账户时指定的电话号码和电子邮箱。

    是否需要验证数据由交易商来决定。如果启用了这个选项,确认码会在账户请求时自动发送给交易者,对话框中会出现特殊代码字段:




    确认码在几分钟内有效。如果在这个时间段内没有将确认码输入到字段中,那么交易者将需要重复这个程序。

    发送确认码之前,系统将检查指定电话号码/电子邮箱是否之前已确认。如果交易者已在他或她的计算机上通过了验证,那么将无需额外确认即可开户。因此,交易者在请求账户时不会遇到额外的困难。

  6. 扩展了通过PayPal系统进行付款的MQL5.community付款选项。现在,使用该系统可实现一键购买。

    如何工作
    当您使用PayPal账户登录进行购买之后,您将被要求允许进一步付款给我们公司:





    确认此选项后,您只需点击之前保存的账户按键,即可一键执行进一步购买:




    如果您点击“取消并返回MetaQuotes Software Corp.”,您将以正常的方式进行付款,为每次购买手动输入PayPal账户详情。
    MQL5.com网站和MetaTrader 5平台不存储您的付款详情。当您存款购买“市场”产品或订阅“信号”时,在付款系统端将执行数据验证。
    您可以随时移除您的PayPal 账户链接。

  7. 策略测试器的改进和优化。

    我们引入了大量隐藏的改进和修正的错误来优化策略测试器操作。此更新可以更快地测试一些任务类型,使操作稳定性更高。主要改进包括:

    框架操作
    本地、网络和源代码的操作框架得到优化。这类操作现在处理速度更快,永远不会跳过。

    将任务分配给代理
    测试器现在可以在优化过程中将任务重新分配给代理。如果有新代理可用(或发布之前用过的一个代理),测试器会使用之前在其他代理中分配的任务包自动创建新的任务包。如果检测出代理速度慢,任务还可以重新分配。这类代理的任务被发送至其他代理,以便更快地完成优化。

    数学计算模式下的任务分配速度会更快。

    日志中的优化统计
    优化日志记录得以扩展:它包括与MQL5云网络使用相关的详细统计,启用和禁用云代理等。

    在全优化日志模式下运行
    为了获得最佳的资源消耗,并不是所有来自代理的消息都被记录到测试日志中。若要查看所有日志,您可以通过测试日志快捷菜单启用“完整优化日志”选项。此前,这个模式可以明显拖慢优化进程。而现在则不会影响计算时间。

    MQL5云网络
    优化云测试代理的运行。现在,计算任务的分配更加有效。

  8. 内置经济日历提供了18个全球大型经济体相关的900+指标,包括美国、欧盟、日本和英国等国家。相关数据都是从开放资源实时收集。通过定期查看此服务,交易者可以随时了解最新的全球新闻,并做出明智的交易决策。

    经济日历可在桌面版、网页版以及移动设备上使用。可以使用程序端的“日历”快捷菜单打开应用程序:




    选择您的平台并下载Tradays apps:


    除了桌面平台提供的日历功能之外,移动版还以图表和表格的形式提供事件提醒和访问指标的完整历史记录。

  9. 添加了在导入报价历史期间自动生成自定义交易品种柱形历史。现在,如果自定义交易品种的报价数据出现变化,对应的柱形图也自动重新计算。

    • 因此,统一的数据被保存在平台中。
    • 导入报价数据(假设有足够的数据)之后,因为由程序端自动计算,而无需导入柱形图。

    更改涉及通过程序端界面执行的报价导入,以及使用CustomTicks*函数从MQL5应用程序执行的报价更新。报价数据的任何变化都会导致重新计算对应的自定义交易品种的1分钟柱形图。

  10. 修正当在分离图表上使用十字光标时“数据窗口”中的数据更新。
  11. 修正报价历史保存。在早期版本中,一毫秒内的多个报价可能以错误的顺序保存。
  12. 修正基于服务器上过短的价格历史(少于一天)生成图表的问题。

MQL5

  1. 添加MQL5服务调试选项。现在可以对这些应用程序进行类似于EA交易和指标的测试。
  2. ENUM_SYMBOL_CALC_MODE枚举中,添加了全新的盈利和预付款计算模式:

    • SYMBOL_CALC_MODE_EXCH_BONDS — 适用于交易所债券的计算。
    • SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX — 适用于莫斯科交易所股票交易的计算。
    • SYMBOL_CALC_MODE_EXCH_BONDS_MOEX — 适用于莫斯科交易所债券交易的计算。

  3. TesterDeposit函数支持在测试期间模拟入金操作。该函数适用于测试资金管理策略。
    bool  TesterDeposit(
       double money      //入金金额
       );
  4. OnDeinit方法执行期间,MQL5应用程序不会从程序端接收任何事件。以前,由于接收到其他事件,应用程序有时无法完成去初始化(例如,删除所有创建的对象)。
  5. 修正当日更改自定义交易品种报价历史后可能发生的偶然错误。
  6. 修正使用大量图形对象(数以万计)时应用程序偶尔出现的运行速度减慢的问题。
  7. 修正从MQL5程序频繁调用交易历史的情况下出现程序端冻结的问题。
  8. 修正iBarShift函数操作。通过"exact=false"标识和数据外的请求,该函数返回最早的柱数而不是最新柱数。

Tester

  1. 修正确定有多个NUMA节点的计算机处理器上的内核数。
  2. 添加使用零初始入金运行测试和优化的可能性,因为使用新TesterDeposit函数可以在测试期间模拟入金操作。

MetaEditor

  1. 现在,整码器命令可添加到工具栏以快速访问。
  2. 修正在函数和变量名称中使用非统一字符时切换到参数定义和查看相关数据。

文档已更新。

更新内容通过LiveUpdate系统提供。

21 二月 2019
MetaTrader 5平台build 2005:经济日历,MQL5应用程序服务以及R语言API

程序端

    1. 完全修正了内置经济日历。

      经济日历是我们专有的解决方案。在这里,您将看到600+财经新闻和与美国、欧盟、日本、英国、加拿大、澳大利亚、中国等,全球13个大型经济体相关的指标。相关数据都是从开放资源实时收集。

      新版本具有更新的内容和高级的事件过滤器:按照时间、优先级、货币和国家来分类。

      现在可以从MQL5程序访问经济日历数据。请参阅以下内容了解详情。




    2. 新增一种全新的MQL5应用程序类型 —— 服务。这个新类型可以为程序端创建自定义价格源,即,可以实现实时交付来自外部系统的价格,如同直接在交易商交易服务器上实施。

      与EA交易、指标和脚本不同,服务并不链接特定的图表。这些应用程序在后台运行,当程序端启动时自动启动(除非被强制停止)。

      服务可以从“导航”窗口的一个新部分进行管理:





      如何创建服务
      若要创建服务模板,请使用对应的MQL5向导选项。服务有一个Onstart切入点,类似于脚本。在这个点,您可以使用网络函数来实现无限的数据接收和处理循环。

      如何启动服务
      要使用不同的参数运行多个EA交易或指标副本,您应该在不同图表上启动它们。在这种情况下,将创建不同的程序实例,然后彼此独立操作。服务没有链接到图表,因此形成了一种创建服务实例的特殊机制。

      从“导航”选择一个服务,并在快捷菜单中点击“添加服务”。这将打开一个标准的MQL5程序对话框,您可以在其中启用/禁用交易和对信号的访问,以及设置参数。




      可以使用对应的实例菜单启动和停止服务实例。要管理所有实例,请使用服务菜单。

    3. 学习方案已实施。

      这个新功能将帮助初学者学习如何与平台互动。我们已经添加了100+关于平台主要功能的互动提示。

      • 这些提示可以在工具栏的进度条上直接显示,因而并不会分散用户的注意力。
      • 这些提示仅针对您在平台上从未执行的操作显示。
      • 所有提示都包含交互式链接,使用这些链接您可以导航到相关的界面元素。例如,可以从提示直接启动带有所需程序的交易对话框或菜单。

      每当您执行对应操作以及继续学习时,进度条的填充区域将会增加。




    4. 交易账户历史记录可以显示为持仓。平台收集与持仓相关的成交数据(开仓、交易量增加、部分或全部平仓)并将这些信息组合成一条记录。因此,您可以访问持仓的详细信息:开仓时间和平仓时间、交易量、价格和结果。这种有效的显示方式现在可以在导出到文件的历史报告中使用。




    5. 通过使用R语言的应用程序,增加MetaTrader 5程序端数据的新API启用请求。

      我们准备了一个特殊的MetaTrader软件包。它包含用于R和MetaTrader 5程序端之间互动的DLL、文档和辅助r文件。我们正在CRAN存储库中完成软件包注册,之后就可以下载和安装。




      软件包可以使用特殊命令来安装:
      R CMD INSTALL --build MetaTrader

      可使用以下与数据请求有关的命令:

      • MT5Initialize初始化并建立与MetaTrader 5程序端的连接。如果需要,可在命令执行期间启动程序端。
      • MT5Shutdown 去初始化并与MetaTrader 5断开连接。
      • MT5Version获得MetaTrader 5程序端版本。
      • MT5TerminalInfo获得到交易商服务器的程序端连接的状态和参数(账号和服务器地址)。
      • MT5WaitTerminal用于等待MetaTrader 5程序端连接到交易商服务器。
      • MT5CopyTicksFrom(symbol, from, count, flags)从指定日期开始复制指定报价数。该日期从1970.01.01开始,以毫秒指定。
      • MT5CopyTicksRange(symbol, from, to, flags)从指定周期内复制报价。这些日期从1970.01.01开始,以毫秒指定。
      • MT5CopyRatesFrom(symbol, timeframe, from, count)从指定日期开始复制指定的一分钟柱数量。该日期从1970.01.01开始,以秒指定。
      • MT5CopyRatesFromPos(symbol, timeframe, start_pos, count)从相对于最后柱形图的指定持仓复制一分钟柱形图。
      • MT5CopyRatesFromRange(symbol, timeframe, date_from, date_to)从指定周期内复制柱形图。这些日期从1970.01.01开始,以秒指定。

      支持的命令列表将进一步扩展。

    6. 优化用于反向平仓的Close By对话框。现在,这个对话框即使您有大量持仓也不会变慢。
    7. 修正了导致偶尔跳过数据的合成交易品种的计算错误。
    8. 自定义交易品种被删除时,存储其报价和柱形图历史的文件也被删除。这可以避免在硬盘上积累不用的数据。
    9. 修正在高清屏幕上显示搜索结果。

    MQL5

    1. 实现从MQL5程序访问经济日历数据。

      新函数

      CalendarCountryById — 根据标识符获得国家描述。
      bool CalendarCountryById(
         const long           country_id,    // country ID
         MqlCalendarCountry&  country        //国家描述
         );
      CalendarEventById — 根据标识符获得事件描述。
      bool CalendarEventById(
         const long           event_id,      // 事件ID
         MqlCalendarEvent&    event          // 事件描述
         );
      CalendarValueById — 根据标识符获得事件值描述。
      bool CalendarValueById(
         const long           value_id,      // 值ID
         MqlCalendarValue&    value          // 值描述
         );
      CalendarEventByCountry — 获得国家可用事件的数组。
      bool CalendarEventByCountry(
         string               country_code,  // 国家代码
         MqlCalendarEvent&    events[]       // 事件数组
         );
      CalendarEventByCurrency — 获得受影响货币的可用事件数组。
      bool CalendarEventByCurrency(
         string               currency,      //货币
         MqlCalendarEvent&    events[]       // 事件数组
         );
      CalendarValueHistoryByEvent — 根据事件标识符,获取特定时期的值数组。
      bool CalendarValueHistoryByEvent(
         ulong                event_id,      // 事件ID
         MqlCalendarValue&    values[],      // 值数组
         datetime             datetime_from, // 特定时期开始日期
         datetime             datetime_to=0  // 特定时期结束日期
         );
      CalendarValueHistory — 根据国家和/或货币筛选,获取所有事件在特定时期的值数组。
      bool CalendarValueHistory(
         MqlCalendarValue&    values[],          // 值数组
         datetime             datetime_from,     // 特定时期开始
         datetime             datetime_to=0,     // 特定时期结束
         string               country_code=NULL, // 国家代码
         string               currency=NULL      // 货币
         );
      CalendarValueLastByEvent — 根据标识符获取最后时间值的数组。此函数可以请求自上一个请求出现的值。这个操作还使用了in/out参数"change_id"。

      每当日历数据库出现变化,"change_id"属性(最后更改的标识符)都会更新。数据请求期间,您指定"change_id"则程序端返回在此之后出现的事件,以及可用于下一个请求的"change_id"当前值。在第一个函数调用期间,指定"change_id"为零:该函数将不返回任何事件,但将为进一步请求返回当前"change_id"。
      bool CalendarValueHistory(
         ulong                event_id,          // 事件ID
         ulong&               change_id,         //最后一个日历更改 ID
         MqlCalendarValue&    values[]           // 值数组
         );
      CalendarValueLast — 根据国家和/或货币筛选,获取所有事件最后值的数组。此函数可以请求自上一个请求出现的值。类似于CalendarValueLastByEvent,请求使用"change_id"属性。
      bool CalendarValueHistory(
         ulong                event_id,          // 事件ID
         ulong&               change_id,         // 最后一个日历更改 ID
         MqlCalendarValue&    values[],          // 值数组
         string               country_code=NULL, // 国家代码
         string currency=NULL                    // 货币
         );

      新结构

      MqlCalendarCountry — 国家描述。
      struct MqlCalendarCountry
        {
         ulong             id;                        // ISO 3166-1中的国家ID
         string            name;                      // 国家文本名称
         string            code;                      // ISO 3166-1 alpha-2中的国家代码名称
         string            currency;                  // 国家货币代码
         string            currency_symbol;           // 国家货币符号/标志
         string            url_name;                  // mql5.com上URL中使用的国家名称
        };
      MqlCalendarEvent — 事件描述。
      struct MqlCalendarEvent
        {
         ulong                          id;           // 事件ID
         ENUM_CALENDAR_EVENT_TYPE       type;         // 事件类型
         ENUM_CALENDAR_EVENT_SECTOR     sector;       // 事件所属区
         ENUM_CALENDAR_EVENT_FREQUENCY  frequency;    // 事件发布频率
         ENUM_CALENDAR_EVENT_TIMEMODE   time_mode;    // 事件发布时间模式
         ulong                          country_id;   // 国家ID
         ENUM_CALENDAR_EVENT_UNIT       unit;         // 时间值单位
         ENUM_CALENDAR_EVENT_IMPORTANCE importance;   // 事件重要性
         ENUM_CALENDAR_EVENT_MULTIPLIER multiplier;   // 事件重要性的倍数
         uint                           digits;       // 事件值中的小数位数
         string                         source_url;   // 源URL
         string                         event_code;   // 事件代码
         string                         name;         // 事件在程序端语言中的文本名称
        };
      MqlCalendarValue — 事件值描述。
      struct MqlCalendarValue
        {
         ulong             id;                        // 值ID
         ulong             event_id;                  // 事件ID
         datetime          time;                      // 事件日期和时间
         datetime          period;                    // 事件发布期间
         int               revision;                  // 就报告所述期间发表的指标修正
         long              actual_value;              // 当前事件值
         long              prev_value;                // 之前事件值
         long              revised_prev_value;        // 修改之前事件值
         long              forecast_value;            // 预测事件值
         ENUM_CALENDAR_EVENT_IMPACRT impact_type;     // 对汇率的潜在影响
        };

      新枚举

      enum ENUM_CALENDAR_EVENT_FREQUENCY
        {
         CALENDAR_FREQUENCY_NONE            =0,   // 没有使用
         CALENDAR_FREQUENCY_WEEK            =1,   // 每周
         CALENDAR_FREQUENCY_MONTH           =2,   // 每月
         CALENDAR_FREQUENCY_QUARTER         =3,   // 每季度
         CALENDAR_FREQUENCY_YEAR            =4,   // 每年
         CALENDAR_FREQUENCY_DAY             =5,   // 每日
        };
      
      enum ENUM_CALENDAR_EVENT_TYPE
        {
         CALENDAR_TYPE_EVENT                =0,   // 事件(会议,演讲等)
         CALENDAR_TYPE_INDICATOR            =1,   // 指标
         CALENDAR_TYPE_HOLIDAY              =2,   // 假日
        };
      
      enum ENUM_CALENDAR_EVENT_SECTOR
        {
         CALENDAR_SECTOR_NONE               =0,   // 无
         CALENDAR_SECTOR_MARKET             =1,   // 市场
         CALENDAR_SECTOR_GDP                =2,   // GDP
         CALENDAR_SECTOR_JOBS               =3,   // 工作
         CALENDAR_SECTOR_PRICES             =4,   // 价格
         CALENDAR_SECTOR_MONEY              =5,   // 资金
         CALENDAR_SECTOR_TRADE              =6,   // 交易
         CALENDAR_SECTOR_GOVERNMENT         =7,   // 政府
         CALENDAR_SECTOR_BUSINESS           =8,   // 业务
         CALENDAR_SECTOR_CONSUMER           =9,   // 消费者
         CALENDAR_SECTOR_HOUSING            =10,  // 家庭
         CALENDAR_SECTOR_TAXES              =11,  // 税收
         CALENDAR_SECTOR_HOLIDAYS           =12,  // 假日
        };
        
      enum ENUM_CALENDAR_EVENT_IMPORTANCE
        {
         CALENDAR_IMPORTANCE_NONE           =0,   // 无
         CALENDAR_IMPORTANCE_LOW            =1,   // 低
         CALENDAR_IMPORTANCE_MODERATE       =2,   // 适中
         CALENDAR_IMPORTANCE_HIGH           =3,   // 高
        };
      
      enum ENUM_CALENDAR_EVENT_UNIT
        {
         CALENDAR_UNIT_NONE                 =0,   // 无
         CALENDAR_UNIT_PERCENT              =1,   // 百分比
         CALENDAR_UNIT_CURRENCY             =2,   // 本国货币
         CALENDAR_UNIT_HOUR                 =3,   // 小时数
         CALENDAR_UNIT_JOB                  =4,   // 工作数
         CALENDAR_UNIT_RIG                  =5,   // 钻井数
         CALENDAR_UNIT_USD                  =6,   // 美元
         CALENDAR_UNIT_PEOPLE               =7,   // 人口数
         CALENDAR_UNIT_MORTGAGE             =8,   // 抵押贷款数
         CALENDAR_UNIT_VOTE                 =9,   // 投票数
         CALENDAR_UNIT_BARREL               =10,  // 原油桶数
         CALENDAR_UNIT_CUBICFEET            =11,  // 立方英尺数量
         CALENDAR_UNIT_POSITION             =12,  // 工作职位数
         CALENDAR_UNIT_BUILDING             =13   // 建筑物数量
        };
        
      enum ENUM_CALENDAR_EVENT_MULTIPLIER
        {
         CALENDAR_MULTIPLIER_NONE           =0,   // 无
         CALENDAR_MULTIPLIER_THOUSANDS      =1,   // 数以千计
         CALENDAR_MULTIPLIER_MILLIONS       =2,   // 数百万
         CALENDAR_MULTIPLIER_BILLIONS       =3,   // 数十亿
         CALENDAR_MULTIPLIER_TRILLIONS      =4,   // 数万亿
        };
        
      enum ENUM_CALENDAR_EVENT_IMPACRT
        {
         CALENDAR_IMPACT_NA                 =0,   // 不可使用
         CALENDAR_IMPACT_POSITIVE           =1,   // 积极影响
         CALENDAR_IMPACT_NEGATIVE           =2,   // 消极影响
        };
      
      enum ENUM_CALENDAR_EVENT_TIMEMODE
        {
         CALENDAR_TIMEMODE_DATETIME         =0,   //消息来源发布确切时间
         CALENDAR_TIMEMODE_DATE             =1,   // 该事件花了一整天时间
         CALENDAR_TIMEMODE_NOTIME           =2,   //消息来源没有发布事件时间
         CALENDAR_TIMEMODE_TENTATIVE        =3,   // 消息来源只提供日期,但没有提前发布确切时间,确切时间在事件发生时添加
        };

      新错误代码

      ERR_CALENDAR_MORE_DATA             =5400,   // 低于整个结果,数组较小(传递数组中合适的值)
      ERR_CALENDAR_TIMEOUT               =5401,   // 等待经济日历数据请求的反应超时
      ERR_CALENDAR_NO_DATA               =5402,   // 数据没找到

    2. 有关报价和柱形图历史的修正和操作速度的改进。
    3. 有关自定义交易品种的报价和柱形图更改函数CustomTicks*CustomRates*的修正和操作速度显著提高。
    4. 新增数据转化漏斗模型。

      CharArrayToStruct将uchar数组复制到POD结构。
      bool  CharArrayToStruct(
         void&         struct_object,    //结构
         const uchar&  char_array[],     // 数组
         uint          start_pos=0       // 数组中的开始位置
         );
      StructToCharArray将POD结构复制到uchar数组。
      bool  StructToCharArray(
         const void&  struct_object,     //结构
         uchar&       char_array[],      //数组
         uint         start_pos=0        // 数组中的开始位置
         );

    5. 添加MathSwap函数,用于更改ushort、uint和ulong值中的字节顺序。
      ushort MathSwap(ushort value);
      uint   MathSwap(uint   value);
      ulong  MathSwap(ulong  value);

    6. 添加网络函数,用于通过系统套接创建TCP与远程主机的连接:

      • SocketCreate创建具有指定标识的套接并返回其句柄
      • SocketClose关闭套接
      • SocketConnect连接到服务器,使用超时控制
      • SocketIsConnected检查套接当前是否已连接
      • SocketIsReadable获得可以从套接读取的字节数
      • SocketIsWritable检查在当前时间是否可以将数据写入该套接
      • SocketTimeouts为系统套接对象设置数据接收和发送超时
      • SocketRead从套接读取数据
      • SocketSend将数据写入套接
      • SocketTlsHandshake使用TLS Handshake协议启动与指定主机的安全TLS (SSL)连接
      • SocketTlsCertificate接收有关用于安全网络连接的证书的信息
      • SocketTlsRead读取来自安全TLS连接的数据
      • SocketTlsReadAvailable读取来自安全TLS连接的所有可用数据
      • SocketTlsSend使用TLS连接发送数据

      使用网络函数建立连接的主机地址必须明确添加到程序端设置中的可允许地址列表中。

      为网络函数的操作添加了新错误代码

      • ERR_NETSOCKET_INVALIDHANDLE (5270):传递给函数的套接句柄无效
      • ERR_NETSOCKET_TOO_MANY_OPENED (5271):打开套接过多(最多128)
      • ERR_NETSOCKET_CANNOT_CONNECT (5272):连接远程主机时出错
      • ERR_NETSOCKET_IO_ERROR (5273):从套接发送/接收数据时出错
      • ERR_NETSOCKET_HANDSHAKE_FAILED (5274):安全连接建立错误 (TLS Handshake)
      • ERR_NETSOCKET_NO_CERTIFICATE (5275) — 没有用于安全连接的证书数据

    7. 添加用于字符串操作的新函数

      StringReserve为字符串保留指定大小的内存缓存区。
      bool  StringReserve(
         string&        string_var,          // 字符串
         uint           new_capacity         // 字符串的缓冲区大小
         );
      StringSetLength设置字符中指定的字符串长度。
      bool  StringSetLength(
         string&        string_var,          //字符串
         uint           new_length           //新字符串长度
         );

    8. 为数组操作添加新函数

      ArrayRemove从数组中移除从指定索引开始的指定元素数。
      bool  ArrayRemove(
         void&         array[],              // 任何类型的数组
         uint          start,                // 要开始移除的索引
         uint          count=WHOLE_ARRAY     // 元素数
         );
      ArrayInsert 从指定索引开始,向接收方数组插入源数组中指定元素数。
      bool  ArrayInsert(
         void&         dst_array[],          // 接收方数组
         const void&   src_array[],          // 源数组
         uint          dst_start,            // 在要插入的接收方数组位置的索引
         uint          src_start=0,          // 要开始复制的源数组索引
         uint          count=WHOLE_ARRAY     // 插入元素数
         );
      ArrayReverse从指定索引开始,在数组中反转指定元素数。
      bool  ArrayReverse(
         void&         array[],              // 任何类型的数组
         uint          start=0,              // 开始反转的索引
         uint          count=WHOLE_ARRAY     // 元素数
         );

    9. 新"uint count"参数已被添加到CustomRatesUpdateCustomRatesReplaceCustomTicksAddCustomTicksReplace函数中。它可以指定传递数组中将要用于这些函数的元素数量。WHOLE_ARRAY值默认用于参数。这意味着整个数组将被利用。
    10. 添加CustomBookAdd函数,以传递自定义交易品种的市场深度的状态。该函数可以推广市场深度,类似于价格从交易商服务器到达。
      int  CustomBookAdd(
         const string        symbol,            // 交易品种名称
         const MqlBookInfo&  books[]            // 带有DOM元素描述的数组
         uint                count=WHOLE_ARRAY  // 要使用的元素数
         );
    11. 添加CustomSymbolCreate函数重载。它可以基于现有交易品种创建一个自定义交易品种。创建之后,可以使用对应的函数编辑任何交易品种的属性。
      bool  CustomSymbolCreate(
         const string        symbol_name,       //自定义交易品种名称
         const string        symbol_path="",    // 将在其中创建交易品种的组名
         const string        symbol_origin=NULL // 将基于其创建自定义交易品种的交易品种名称
         );
      自定义交易品种属性的复制源的交易品种名称在"symbol_origin"参数中指定。

    12. 将带有日期/时间的字符串转换为datetime值的StringToTime函数已经更新。现在,它支持以下日期格式:

      • yyyy.mm.dd [hh:mi]
      • yyyy.mm.dd [hh:mi:ss]
      • yyyymmdd [hh:mi:ss]
      • yyyymmdd [hhmiss]
      • yyyy/mm/dd [hh:mi:ss]
      • yyyy-mm-dd [hh:mi:ss]

    13. ENUM_TERMINAL_INFO_INTEGER枚举中的TERMINAL_VPS新属性;它显示程序端正在MetaTrader虚拟主机服务器上运行 (MetaTrader VPS)。如果应用程序在主机服务器上运行,您可以禁用其所有可视化功能,因为虚拟服务器没有图形用户界面。
    14. ENUM_SYMBOL_INFO_INTEGER枚举中的SYMBOL_EXIST新属性,意味着同名交易品种已存在。
    15. 修正使用模板函数预声明时的输入。
    16. 添加更改交易账户时重新初始化指标的功能。
    17. 优化StringSplit函数。
    18. 修正标准程序库操作中的错误。

    Tester

    1. 新增TesterStop函数 — 测试代理上EA交易的例行早期关闭。现在,达到指定数量的亏损交易、预设的下跌水平或任何其他标准后,您可以强制停止测试。

      使用此函数完成的测试被视为成功测试。函数调用之后,测试期间获得的交易历史和所有交易统计数据将被传递到程序端。

    2. 禁止在实时报价模式下通过MQL5云网络测试和优化EA交易的功能。这个模式只能在本地代理和本地网络上使用。
    3. 改进了可视化测试过程中的指标使用。现在,价格图表和指标线同步绘制,甚至包括最大的可视化速度。
    4. 优化并显著增加了测试和优化的速度。
    5. 修正了关于历史数据的指标调试。现在,可以正确地调试OnInit和OnDeinit指标函数。
    6. 在测试多货币EA交易时,更快访问历史数据。
    7. 修正在调试历史数据期间可视化测试器的偶尔冻结问题。
    8. 当通过代理处理任务包时,更快启动优化传递。
    9. 更改了向测试代理分发任务包的策略。任务包大小增加,从而大大减少网络操作上的资源损耗。
    10. 更改了选项行为,允许使用本地、网络和云代理。现在,当您关闭这些选项时,代理将完成接收任务的处理,且不再向其提供新任务。在早期版本中,该行为类似于“禁用”命令,该命令可以立即停止代理操作。




    MetaEditor

    1. 在调试器中添加了对非ANSI字符的支持。现在,即使使用斯拉夫字母指定变量名称,表达式仍可以正确显示。
    2. 修正在高清屏幕上显示搜索结果。

    添加克罗地亚语的用户界面翻译。

    文档已更新。

26 十月 2018
新版MetaTrader 5平台build 1930:浮动窗口图表和MQL5中的.Net程序库

程序端

  1. 现在,您可以在交易程序端窗口之外使用交易品种图表。

    这个功能的便利性在使用多个显示器进行操作时非常明显。因此,您可以在一个显示器上设置平台的主窗口来管理您的账户状态,并将您的图表移动到另一个显示器上以观察市场动向。若要将图表从程序端分离,请在快捷菜单中禁用“固定”选项。然后,将图表移动到所需的显示器。





    通过分离图表的独立工具栏可以应用分析对象和指标,而无需在显示器间进行切换。使用工具栏快捷菜单来管理可用命令集或将命令隐藏。

  2. 完全更新的嵌入式聊天功能。现在,该功能支持群组聊天和频道交流。可以在一个环境内与一个群组的人们进行私人讨论,而不需要在不同的对话之间切换,您还可以根据您的兴趣和语言创建频道。在MQL5.community与同业和好友进行交流,而不需要访问网站。

    群组聊天和频道交流既可以是公开的,也可以设为私人状态。由创建者来决定是否可以自由加入群聊或是只能通过邀请加入。您还可以为频道和聊天分派版主/群主,为了进一步进行交流管理。




  3. 新增对数字加密货币交易提高交易量精确性的支持。现在,交易操作可允许的最小交易量为0.00000001手数。现在,市场深度,成交时间和交易量,以及其他界面元素都能够精确显示到小数点后8位。

    最小交易量及其变动幅度取决于交易商的交易品种设置。




  4. 在工具箱窗口,添加了MQL5.community网站发布的文章的选项卡。现在,在程序端可以直接获得600多篇关于使用MQL5开发交易策略的详细材料。每周都会发布新文章。




  5. 新增在Wine系统下操作时,支持使用证书进行扩展认证
  6. 修正了市场深度被限定在一个水平时的显示。
  7. 将“另存为图片”的命令添加到标准工具栏中。现在,保存图表图片并将其分享在社区中会更加容易。




  8. 修正导入柱形图和报价时,应用时间切换。之前,在某些情况下无法使用时间切换。




  9. 修正大量经济日历新闻情况下的程序端冻结。

MQL5

  1. 添加了通过"smart"导入函数对.NET程序库的本机支持。现在,.NET程序库可以在无需编写特殊包装样式的情况下使用 — MetaEditor可以独立完成。

    若要使用.NET程序库函数,只需导入DLL本身,而不必定义特定的函数。MetaEditor自动导入所有可以使用的函数:
    • 简单结构(POD,普通旧数据) — 仅包含简单数据类型的结构。
    • 有参数的公共静态函数,在这里只有简单类型和POD结构或其数组可被使用

    若要从程序库调用函数,简单导入即可:
    #import "TestLib.dll"
    
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                         |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       int x=41;
       TestClass::Inc(x);
       Print(x);
      }
    TestClass的Inc函数C#代码如下:
    public class TestClass
    {
       public static void Inc(ref int x)
       {
        x++;
       }
    }
    作为执行结果,脚本返回值为42。

    对.NET程序库的支持工作仍继续。其功能将在未来得到扩展。

  2. 添加了支持使用标准程序库的WinAPI函数。现在,不需要手动导入程序库和描述函数签名来在MQL5程序中使用操作系统函数。只需包括来自MQL5\Include\WinAPI目录的头文件。

    WinAPI函数按其用途在单独的文件中分组:

    • libloaderapi.mqh — 使用资源
    • memoryapi.mqh — 使用内存
    • processenv.mqh — 使用环境
    • processthreadsapi.mqh — 使用流程
    • securitybaseapi.mqh — 使用OS安全系统
    • sysinfoapi.mqh — 获取系统信息
    • winbase.mqh — 常用函数
    • windef.mqh — 常量、结构和枚举
    • wingdi.mqh — 使用图形对象
    • winnt.mqh — 处理异常
    • winreg.mqh — 使用注册表
    • winuser.mqh — 窗口和界面管理
    • errhandlingapi.mqh — 处理错误
    • fileapi.mqh — 使用文件
    • handleapi.mqh — 使用句柄
    • winapi.mqh — 包含所有函数(WinAPI头文件)

    绑定仅适用于64位架构。

  3. 在解析代码时,新增对inline, __inline和 __forceinline描述符的支持。代码中的描述符不会导致错误,也不会影响编译。目前,该特性简化了将С++ 代码转为MQL5。
    MSDN中了解关于描述符的更多信息。

  4. 显著优化了MQL5程序的执行。在某些情况下,性能改进可以达到10%。在新版MetaEditor重新编译您的程序,使其运行得更快。
    遗憾的是,由于这个额外的优化功能,新程序将无法与以前的程序端版本兼容。使用MetaEditor 1910版本编译的程序之后无法在1880版本及更低的程序端中启用。使用早期的MetaEditor版本编译的程序则可以在新版程序端中运行。

  5. 显著优化了MQL5函数集。
  6. 新增向程序端主窗口附加图表/从程序端主窗口分离图表并管理图表位置的新属性。

    添加以下属性到ENUM_CHART_PROPERTY_INTEGER枚举:

    • CHART_IS_DOCKED — 图表窗口固定。如果设为'false',图表可被拖拽到程序端区域之外。
    • CHART_FLOAT_LEFT — 相对于虚拟屏幕的未固定的图表窗口的左坐标。
    • CHART_FLOAT_TOP — 相对于虚拟屏幕的未固定的图表窗口的顶部坐标。
    • CHART_FLOAT_RIGHT — 相对于虚拟屏幕的未固定的图表窗口的右坐标。
    • CHART_FLOAT_BOTTOM — 相对于虚拟屏幕的未固定的图表窗口的底部坐标。

    添加以下函数到ENUM_TERMINAL_INFO_INTEGER枚举:

    • TERMINAL_SCREEN_LEFT — 虚拟屏幕的左坐标。虚拟屏幕是覆盖所有监视器的长方形。如果系统从右至左有两个监视器,那么虚拟屏幕的左坐标可以在两个监视器的边界上。
    • TERMINAL_SCREEN_TOP — 虚拟屏幕的顶部坐标。
    • TERMINAL_SCREEN_WIDTH — 程序端宽度。
    • TERMINAL_SCREEN_HEIGHT — 程序端高度。
    • TERMINAL_LEFT — 相对于虚拟屏幕的程序端的左坐标。
    • TERMINAL_TOP — 相对于虚拟屏幕的程序端的顶部坐标。
    • TERMINAL_RIGHT — 相对于虚拟屏幕的程序端的右坐标。
    • TERMINAL_BOTTOM — 相对于虚拟屏幕的程序端的底部坐标。

  7. 将volume_real字段添加到MqlTick和MqlBookInfo结构。其设计目的在于提高交易量准确性。volume_real值的优先级要高于'volume'。如果该值已指定,那么服务器将会优先使用。

    struct MqlTick
      {
       datetime         time;          // 最后价格更新时间
       double           bid;           // 当前卖价
       double           ask;           // 当前买价
       double           last;          // 最后一笔交易的当前价格
       ulong            volume;        // 当前最后价格的交易量
       long             time_msc;      // 以毫秒计算的最后价格更新时间
       uint             flags;         // 报价标识
       double           volume_real;   // 准确性更高的当前最后价格的交易量
      };

    struct MqlBookInfo
      {
       ENUM_BOOK_TYPE   type;            //ENUM_BOOK_TYPE枚举的订单类型
       double           price;           // 价格
       long             volume;          // 交易量
       double           volume_real;     //准确度更高的交易量
      };

  8. 添加新属性到ENUM_SYMBOL_INFO_DOUBLE枚举:

    • SYMBOL_VOLUME_REAL — 最后已执行成交的交易量;
    • SYMBOL_VOLUMEHIGH_REAL — 当日已执行成交的最高交易量;
    • SYMBOL_VOLUMELOW_REAL — 当日已执行成交的最低交易量。

    使用SymbolInfoDouble函数来获得这些属性。

  9. 添加MQL_FORWARD属性到ENUM_MQL_INFO_INTEGER枚举 — 前测模式标识。
  10. 为结构添加了( integer_value )属性包。它可以使您设置结构中字段排列的对齐方式,这是在使用DLL时要求的。1、2 、4、8和16可用于integer_value。
    如果属性没有定义,则默认为1字节对齐方式——pack(1).

    使用示例:
    //+------------------------------------------------------------------+
    //| 默认包装                             |
    //+------------------------------------------------------------------+
    struct A
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| 指定包装                             |
    //+------------------------------------------------------------------+
    struct B pack(4)
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                         |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print("sizeof(A)=",sizeof(A));
       Print("sizeof(B)=",sizeof(B));
      }
    //+------------------------------------------------------------------+
    结论:
    sizeof(A)=5
    sizeof(B)=8
    MSDN中了解关于结构中对齐方式的更多信息。

  11. 降低转换枚举的需求。在隐式转换的情况下,编译器会自动替换正确的枚举值并显示警告。

    以下代码:
    enum Main
      {
       PRICE_CLOSE_,
       PRICE_OPEN_
      };
    
    input Main Inp=PRICE_CLOSE;
    //+------------------------------------------------------------------+
    //| 起始函数                             |
    //+------------------------------------------------------------------+
    void OnStart()
      {
      }
    编译器显示警告:
    从'enum ENUM_APPLIED_PRICE'隐式转换到'enum Main'
    'Main::PRICE_OPEN_'将替换'ENUM_APPLIED_PRICE::PRICE_CLOSE'并被使用
    早期,在该情况下生成以下错误:
    'PRICE_CLOSE' - 不能转换枚举
    如果在函数参数中错误地使用枚举,编译器将仍显示该错误。

  12. 修正编译模板函数。现在,当使用重载模板函数时,只重载必要的函数,而不是所有现有函数都被重载。
    class X {  };
    
    void f(int)  {  }
      
    template<typename T>
    void a(T*) { new T(2); }  // 以前,编译器在这里生成错误
      
    template<typename T>
    void a()  { f(0); }
      
      
    void OnInit()  { a<X>(); }  

  13. 通过CopyTicks* 函数优化了一些访问报价历史的情况。
  14. 添加了新TesterStop函数,可以使您提前完成测试/优化过程。当调用该函数时,整个交易统计信息和OnTester结果都会像完成常规测试/优化一样被传递到客户端。
  15. 为自定义指标添加新属性 #property tester_everytick_calculate。它用于策略测试,允许在每次报价时强制计算指标。

Tester

  1. 现在,对于非可视化测试/优化,使用的所有指标(标准指标和自定义指标)只在数据请求期间计算。包含EventChartCustom函数调用和应用OnTimer处理程序的指标排除在外。在此之前,在每次报价进入时,所有指标在策略测试中都无条件计算。这项新功能显著增加了测试和优化的速度。

    若要在每次报价时启用强制指标计算,请为该程序添加#property tester_everytick_calculate属性。
    通过之前版本的编译器编译的指标将按照之前的规则计算 —— 在每次报价时计算。

  2. 修正当测试/优化和生成相关报告时计算入金货币的准确性。
  3. 优化并加速策略测试操作。
  4. 修正多个测试和优化的错误。

MetaEditor

  1. 修正搜索整个单词。现在,搜索时,下划线被记为常规字符,而不是单词分隔符。
  2. 更新文档。

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

12345678910111213