MetaTrader 5新功能

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

8 六月 2023

MetaTrader 5 build 3800:预订或取消(Book or Cancel)订单、AI编码助手和增强ONNX支持

程序端

  1. 添加对新订单成交指令的支持 — 被动/预订或取消(BOC)。


    新订单成交指令 — 被动/预订或取消


    BOC指令意味着只能在市场深度(订单簿)中下订单。如果该订单可以在下单时立即成交,则该订单被取消。事实上,通过该指令可保证所下订单的价格不及当前市场价。BOC用于实现被动交易:保证下单后订单不立即执行,因此不会影响当前的流动性。此成交指令仅支持交易所执行模式中的limit订单和stop limit订单。

    新成交指令的可用性取决于交易商。

  2. 平台切换到使用Microsoft Edge WebView2来显示HTML内容。

    与之前的MSHTML相比,新组件通过提供对现代技术的访问进一步扩展了内容显示功能。WebView2的使用改善了一些平台部分的外观,提高了性能,并创建了一个响应更快的界面。特别是,新组件将影响市场、信号和VPS部分。
    Windows 10引入了对WebView2的全面支持。我们强烈建议所有用户升级到最新操作系统版本并安装所有可用更新。该平台将继续支持Windows 7和Wine下的MSHTML,但不会提供新功能。推荐的最低操作系统版本是Windows 10 21H2(build 19044,2021年11月)。

  3. 完善市场保障体系。现在,若要运行产品,用户必须在平台上获得购买产品时使用的相同MQL5账户的授权。该账户必须在工具\选项\社区部分指定:


    在平台设置中指定您的MQL5账户


    如果没有指定账户或者账户无效,产品将无法启动,平台日志中会显示如下信息:
    'ProductName' requires active MQL5 account in Tools->Options->Community
  4. 在历史部分快捷菜单中添加了概述命令。该命令可以打开该账户的交易报告


    打开交易报告的命令


  5. 修正双重身份验证对话框中的显示错误。如果程序端存在多个号码相同但在不同交易商开立的账户,账户连接表单可能无法显示动态密码字段。
  6. 实现通过DRAW_COLOR_CANDLES显示样式快速渲染指标。
  7. 修正交易报告创建错误。在某些情况下,图表上的利润和净值可能显示不正确。
  8. 在交易报告中添加成本显示。该值显示相对于交易品种的当前中点价格(中点点差成本)执行交易时发生的总成本。这是交易者因点差而损失的金额。该值的可用性取决于交易商。
  9. 更新用户界面的翻译。
  10. 改进在Wine系统下的稳定性,尤其在macOS系统。我们建议完全移除旧程序端并重新安装程序端:


  11. 加快程序包安装速度和更新下载过程。改进选择分配程序包时对用户计算机上AVX可用性的分析。
  12. 在Web协议中启用对TLS 1.3的支持。TLS1.0被认为已弃用且安全性低,因此已被禁用。
  13. 修正交易历史报告中代理手续费的会计核算。计算最终利润时可忽略相关交易。
  14. 修正无法在账户连接对话框中更改服务器的问题。当程序端中有多个来自不同交易商的相同号码的账户时,就会出现这个问题。
从此版本开始,安装程序将仅适用于64位平台版本。将停止对32位版本的支持。之前安装的32位平台版本将在2024年1月1日之后不再支持。

MQL5

  1. ENUM_STATISTICS枚举中添加了新STAT_COMPLEX_CRITERION值。使用该属性获取计算的复杂标准值,作为优化的结果。
  2. 改进RegressionMetric方法,用于根据传递的矩阵或向量计算回归指标。添加vector_true和matrix_true参数,用于传递评估预测数据质量的真值。
    double vector::RegressionMetric(
       const vector& vector_true,         // 真值
       const ENUM_REGRESSION_METRIC metric     // 指标
       );
     
    double matrix::RegressionMetric(
       const matrix& matrix_true,        // 真值
       const ENUM_REGRESSION_METRIC metric    // 指标
       );
     
    vector matrix::RegressionMetric(
       const matrix& matrix_true,               // 真值
       const ENUM_REGRESSION_METRIC metric,   // 指标
       const int            axis   // 坐标轴
       );
  3. 添加LinearRegression方法。它返回一个向量/矩阵,其中包含为传递的向量/矩阵计算线性回归值。
    vector vector::LinearRegression();
     
    matrix matrix::LinearRegression(
       ENUM_MATRIX_AXIS axis=AXIS_NONE          // 沿其计算回归的轴线
       );
    示例:
    vector vector_a;
    //--- 用价格填写向量
    vector_a.CopyRates(_Symbol,_Period,COPY_RATES_CLOSE,1,100);
    //--- 获得线性回归
    vector vector_r=vector_a.LinearRegression();
    该结果在图形中可视化:


    可视化LinearRegression方法返回的结果


  4. 添加HasNan方法,该方法返回矩阵/向量中NaN值的数量。
    ulong vector::HasNan();
    ulong matrix::HasNan();
    当比较具有NaN值的相应元素对时,CompareCompareByDigits方法认为这些元素相等,而在通常的浮点数比较中,NaN != NaN。

  5. 修改用于操作ONNX(开放神经网络交换)模型的OnnxTypeInfo结构:

    struct OnnxTypeInfo
      {
       ENUM_ONNX_TYPE    type;          // 参数类型
       OnnxTensorTypeInfo  tensor;         // 张量描述
       OnnxMapTypeInfo   map;          // 地图描述
       OnnxSequenceTypeInfo sequence;        // 序列描述
      };

    使用新子结构在结构中指定数据类型:

    • OnnxTensorTypeInfo — 张量
    • OnnxMapTypeInfo — 地图
    • OnnxSequenceTypeInfo — 序列

    struct OnnxTensorTypeInfo
      {
       ENUM_ONNX_DATATYPE   data_type;       // data type in the tensor
       long          dimensions[];       // 元素数量
      };
    
    struct OnnxMapTypeInfo
      {
       ENUM_ONNX_DATA_TYPE  key_type;        // key type
       OnnxTypeInfo      type_info;      // 值类型
      };
    
    struct OnnxSequenceTypeInfo
      {
       OnnxTypeInfo      type_info;       // 序列中的数据类型
      };
    根据OnnxTypeInfo::type(ONNX_TYPE_TENSOR、ONNX_TYPE_MAP或ONNX_TYPE_SEQUENCE),填写相关子结构。

  6. 改进对ONNX模型的支持。
  7. 添加CopyIndicatorBuffer方法,可以将指标缓冲区数据获取到 向量中。
    bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,ulong start_pos,ulong count);
    bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,ulong count);
    bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,datetime stop_time);
  8. 修正FrameAddFrameNext方法中具有两个或更多维度的数组的操作。
  9. 修正CRedBlackTree::Remove标准程序库的方法。
  10. 实现模糊逻辑库中的修复。

MetaEditor

  1. 添加与高级自动编码助手AI Assistant的集成。其操作基于OpenAI模型。输入注释或函数的一部分并发送提示。神经网络将分析提示并提供编码选项来实现这一想法。

    根据文件类型,字符串“MQL5语言”、“Python语言”或“C++语言”会自动插入到每个提示开头。因此,神经网络将以所需的语言提供结果。

    AI Assistant目前是免费的,并且已在编辑器中启用。在Tools(工具)\ Options(选项)\ AI Assistant 下有几个选项可用:


    AI Assistant设置


    付款设置:

    • 使用您的MQL5账户:此选项目前免费提供。稍后,您将能够直接从您的MQL5账户余额中支付订阅费用。
    • 如果您已购买订阅并拥有相关密钥,请使用OpenAI密钥。

    提示设置:

    • 模型 — 一个将处理您的请求的神经网络。目前可用text-davinci-003和gpt-3.5-turbo。不久将添加对gpt-4的支持。
    • 最大令牌数 — 模型可以响应提示返回的文本单元数。
    • 可变性 — 影响神经网络遵循提示的严格程度。值越大,结果随机性越大。该选项对应于OpenAI模型中的温度参数。

  2. 添加查看ONNX模型属性的功能。

    您可以直接在编辑器中查看*.onnx文件的内容。例如,在Toolbox \ Public Projects下找到项目ONNX.Price.Prediction并在快捷菜单中选择加入。该项目将下载到您的计算机并显示在导航器中。


    直接在MetaEditor中打开ONNX模型


  3. 添加使用 Netron可视化机器学习模型和神经网络的功能。该查看器支持多种流行模型,包括ONNX、TensorFlow Lite、Caffe、Keras和ncnn等。

    要查看模型,请在导航器中选择其文件并单击“在Netron中打开”。如果未安装此实用程序,将打开其GitHub页面 ,您可以根据您的操作系统从中下载相关安装程序。例如,使用适用于Windows的 Netron-Setup-XXXexe。如果程序已安装,模型将立即打开,以便从导航器中查看。


    使用Netron的可视化机器学习模型


    支持的格式:

    • armnn, caffemodel, circle, ckpt, cmf, dlc, dnn, h5, har, hd5, hdf5, hn, keras, kmodel,
    • lite, mar, meta, mge, mlmodel, mlnet, mlpackage, mnn, model, nb, ngf, nn, nnp,
    • om, onnx, ort, paddle, param, pb, pbtxt, pdiparams, pdmodel, pdopt, pdparams, prototxt, pt, pth, ptl,
    • rknn, t7, tfl, tflite, tmfile, tm, tnnproto, torchscript, uff, xmodel

  4. 更新用户界面的翻译。

Tester

  1. 修正测试报告中“平均亏损交易”指标的计算。以前,如果对此类交易收取手续费,计算可能会错误地包括进场交易。
  2. 改进策略测试中的自定义手续费的选项。要设置交易品种,请指定其名称而不是整个路径。
  3. 更新策略测试中的图标。新隐喻将使它们更容易理解。

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


网页端

  1. 改进交易历史部分:

    • 交易历史中添加结余操作的展示,如存取款、手续费、和调整等。
    • 在交易历史中添加总计显示:结余、盈利、手续费、存款、取款和订单数量等。
    • 添加在移动版本中按深度对操作进行排序和过滤历史记录的功能。


    更新交易历史部分


  2. 加强交易品种合约规范。添加了以下信息:交易量限制、报价大小和价值、初始预付款和锁仓预付款。
  3. 改进配色方案:

    • 挂单在图表上以灰色显示。持仓颜色取决于持仓方向:红色代表卖出,蓝色代表买入。新颜色提供了更便利的导航,尤其是在图表上显示大量操作的时候。
    • 当查看/编辑持仓时,只有这个持仓和它的水平高亮显示,而所有其他持仓和订单变成灰色,水平从价格标尺中隐藏。因此,将更容易管理单独的操作。
    • 止损颜色已从红色更改为橙色,以避免与卖出持仓混淆。
    • 改进图表上指示平仓时间的图标。绿色图标用于止盈平仓,红色图标用于止损平仓。

  4. 添加阿拉伯语、保加利亚语、越南语、希腊语、印度尼西亚语、马来语、荷兰语、波斯语、波兰语、泰语、乌克兰语和印地语的界面翻译。该网页端现已提供24种语言。
  5. 修正土耳其语的用户界面翻译。
  6. 修正在网页端移动版挂单修改删除问题。
  7. 修正图表上的“关闭市场”工具提示。
  8. 修正交易对话框中平仓按键的利润显示。错误通常发生在部分平仓期间。
  9. 修正图表交易通知的显示。
  10. 修正在市场深度中使用箭头修改交易量的问题。
  11. 修正在某些情况下可能导致运行指标设置被重置的错误。
  12. 修正开设新账户时的用户名检查。以前,认为名称中的撇号是错误的。
  13. 修正重新报价的处理。在某些情况下,可能不会显示包含重新报价的对话框。
  14. 修正Ichimoku Kinko Hyo指标的显示。Chikou-Span、Up Kumo和Down Kumo线将以正确的偏移量显示。
  15. 修正在开设新订单时初始预付款的检查问题。该问题通常出现在锁仓持仓账户系统。
  16. 修正合约规范窗口中的滚动问题。

MQL5.community

  1. MQL5云网络网站已整体重新设计:https://cloud.mql5.com

    了解如何使用全球数千台计算机的处理能力来优化您的交易策略。通过MQL5云网络,即使最繁重的计算也可以在几分钟内完成。访问该网站并了解如何参与该网络以及如何通过提供您的计算机资源来获得收入。


    访问更新的MQL5云网络网站


  2. 改进市场 产品中的屏幕截图部分。作者最高可以上传1920*1800像素的图片来演示应用程序的工作原理。屏幕截图库也已更新。滚动播放显示图像缩略图,单击它们可打开全尺寸图像。


    改进市场中的屏幕截图部分


  3. 自由职业者服务部分的改进。现在用户在首次下单时将收到更多提示:

    • 需求规范示例和添加提醒
    • 订单创建说明
    • 模板使用技巧

    这些提示可以帮助您创建订单并获得所需的结果。


    自由职业者服务的改进

24 三月 2023

MetaTrader 5 build 3660:其他改进和修复

客户端

  1. 修正偶尔出现的不正确的平台日志创建。
  2. 更新用户界面的翻译。

MQL5

  • 修正对全局变量的检查。当在不同的命名空间声明相同的变量时,编译器会给出一个错误的警告,即该变量已经被声明。

网页端

  1. 添加葡萄牙语的用户界面翻译。该网页端现已提供12种语言。
  2. 修正添加标准偏差指标的对话框。
  3. 其他小问题的修正和改进。

17 三月 2023

MetaTrader 5 build 3640:11种语言的网页端

网页端

  1. 添加10种常用语言的UI翻译:简体中文和繁体中文、法语、德语、意大利语、日语、韩语、西班牙语、土耳其语和俄语。此语言列表将在未来版本中进一步增加。要切换语言,请使用相关菜单:


    网页端界面提供11种语言


  2. 优化与交易服务器的连接机制。

MQL5

  • MQL5:分别为CopyTicksCopyTicksRangeCopyRates方法添加COPY_TICKS_VERTICAL和COPY_RATES_VERTICAL标识。

    默认情况下,报价和函数沿水平轴复制到矩阵,这意味着数据添加到右侧,在行尾。在练习的ONNX模型运行任务中,这样的矩阵需要被转置以提供输入数据:

    const long   ExtOutputShape[] = {1,1};    // 模型输出形状
    const long   ExtInputShape [] = {1,10,4}; // 模型输入形状
    #resource "Python/model.onnx" as uchar ExtModel[]// 作为资源的模型
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                          | 
    //+------------------------------------------------------------------+
    int OnStart(void)
      {
       matrix rates;
    //--- 获取10个柱状图
       if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
          return(-1);
    //--- 输入一组OHLC向量
       matrix x_norm=rates.Transpose();
       vector m=x_norm.Mean(0);               
       vector s=x_norm.Std(0);
       matrix mm(10,4);
       matrix ms(10,4);

    通过在调用该方法时指定附加标识COPY_RATES_VERTICALCOPY_TICKS_VERTICAL用于报价),可以消除额外的数据转置操作:

    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                         |
    //+------------------------------------------------------------------+
    int OnStart(void)
      {
       matrix rates;
    //--- 获取10个柱状图
       if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC|COPY_RATES_VERTICAL,2,10))
          return(-1);
    //--- 输入一组OHLC向量
  • ENUM_CHART_PROPERTY_INTEGER枚举中的新值 — CHART_SHOW_TRADE_HISTORY。该属性控制图表上交易历史的交易显示。使用ChartGetIntegerChartSetInteger函数获取和设置属性。有关图表上交易显示的更多详细信息,请参阅平台文档

MetaEditor

  • 修正在某些条件下文件编译过程中可能发生的界面冻结。

客户端

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

10 三月 2023

MetaTrader 5 build 3620:网页端改进,ONNX支持和MQL5快速矩阵乘法

程序端

  1. 修正交易报告中的总利润计算的问题。
  2. 更新通过市场报价窗口获取的交易品种的基本数据
  3. 修正交易品种在Linux系统中Wine 7.0.1下启动的问题。
  4. 修正通过搜索栏将交易品种添加到市场深度中的问题。通过描述找到的交易品种无法通过点击其行来添加到列表中。

MQL5

  1. 添加对ONNX模型(开放式神经网络交换)操作的支持。

    ONNX是一种机器学习模型的开源格式。许多平台支持这种格式,包括Chainer, Caffee2PyTorch。使用专门的工具创建ONNX模型,将其整合到您的MQL5应用程序,并使用它来做出交易决策。

    所有支持的功能描述都在文件中提供。在MetaEditor公共项目中提供了一个测试ONNX模型的示例。在“工具箱/公共项目”中找到ONNX.Price.Prediction项目,在快捷菜单中选择加入。该项目将下载到您的计算机,并显示在导航器中:


    在公共项目中使用ONNX模型的示例


    编译该项目并在EURUSD H1上运行以查看结果。

    除了模型和运行模型的MQL5代码外,该项目还包括PricePredictionTraining.py Python脚本。该脚本显示了您如何自己创建一个ONNX模型。要运行该脚本,请在计算机上安装Python,并从提示行安装所需的模块:

    python.exe -m pip install --upgrade pip
    python -m pip install --upgrade tensorflow
    python -m pip install --upgrade pandas
    python -m pip install --upgrade scikit-learn
    python -m pip install --upgrade matplotlib
    python -m pip install --upgrade tqdm
    python -m pip install --upgrade metatrader5
    python -m pip install --upgrade onnx==1.12
    python -m pip install --upgrade tf2onnx
    关于如何使用ONNX的说明可在文件中获得。

  2. 添加对一般矩阵乘法(GeMM)的支持。该算法通过并行化任务和优化使用L1/L2/L3缓存来加速某些处理器类型的计算。计算速度可与广受欢迎的软件包相媲美,如Math Kernel Library (MKL)和OpenBLAS。详细的对比测试即将公布。

    matrix::GeMM方法目前支持新算法。如果您的处理器支持AVXFMA指令(2013年后发布的大多数处理器都支持这些指令),该算法将被自动启用。

  3. 添加将矩阵和向量传输到DLL的功能。这使得能够从外部变量导入使用相关类型的函数

    矩阵和向量作为指向缓冲区的指针传递给DLL。例如,要传递一个float类型的矩阵,从DLL导出的函数对应的参数必须带一个float类型的缓冲区指针。示例:

    MQL5
    #import "mmlib.dll"
    bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
    #import
    C++
    extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
    除了缓冲区之外,您还应该传递矩阵和向量大小以进行正确的处理。

  4. 添加新CopySeries函数,用于将同步时间周期从MqlRates复制到单独的数组中。

    CopySeries函数允许在一次调用中只获取必要的时间周期到不同的指定数组中,同时所有的时间周期数据将被同步。这意味着结果数组中特定索引N的所有值将属于指定交易品种/时间周期上的同一柱形图。因此,程序员无需另外通过柱形图开盘时间来同步接收的时间序列。

    与将完整的时间周期集作为MqlRates数组返回的CopyRates不同,CopySeries函数允许将特定的所需时间周期获取到单独的数组中。这可以通过指定一个标识组合来选择时间序列的类型来实现。传递到函数的数组顺序必须与MqlRates结构中字段的顺序相匹配:

    struct MqlRates
      {
       datetime time;         // 期初
       double   open;         // 开仓价
       double   high;         // 该时间段的最高价
       double   low;          // 该时间段的最低价
       double   close;        // 平仓价
       long     tick_volume;  // 报价量
       int      spread;       // 点差
       long     real_volume;  // 交易量
      }

    因此,如果您需要获取当前交易品种/时间帧的最近100柱形图的"time","close"和"real_volume"时间周期的值,您应该使用以下调用:

    datetime  time[];
    double    close[];
    long      volume[];
    CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
    

    数组"time,close,volume"顺序必须与MqlRates结构中字段的顺序相匹配。忽略rates_mask中值的顺序。掩码可以如下所示:

    COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

    示例

    //--- 输入参数
    input datetime InpDateFrom=D'2022.01.01 00:00:00';
    input datetime InpDateTo  =D'2023.01.01 00:00:00';
    input uint     InpCount   =20;
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                     |
    //+------------------------------------------------------------------+
    void OnStart(void)
      {
    //--- 从Rates结构获取时间周期的数组
       double   open[];
       double   close[];
       float    closef[];
       datetime time1[], time2[];
    //---将平仓价请求到double数组
       ResetLastError();
       int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
       PrintFormat("1. CopySeries  returns %d values. Error code=%d", res1, GetLastError());
       ArrayPrint(close);
       
    
    //--- 现在还请求开仓价;为平仓价使用float数组
       ResetLastError();
       int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
       PrintFormat("2. CopySeries  returns %d values. Error code=%d", res2, GetLastError());
       ArrayPrint(closef);
    //--- 对比接收的数据
       if((res1==res2) && (time1[0]==time2[0]))
         {
          Print("  | Time             |    Open      | Close double | Close float |");
          for(int i=0; i<10; i++)
            {
             PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                         i, TimeToString(time1[i]), open[i], close[i], closef[i]);
            }
         }
    /*  Result
            1. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
            2. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
              | Time             |    Open      | Close double | Close float |
            0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
            1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
            2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
            3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
            4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
            5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
            6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
            7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
            8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
            9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
    */
      }
  5. 修正OrderSend函数的操作。如果在多个平台上同时使用同一个账户,该函数请求可能会返回错误的订单。
  6. 修正EX5程序库的导入。如果导入程序库的名称与导入的文件名称一致,则发生错误。

MetaEditor

  1. 添加向共享项目成员发送推送通知的功能。新选项可以通知用户有关项目设置和文件的更改。要启用通知,请在您的MQL5.community个人资料的“设置\安全”部分输入您的MetaQuotes ID


    关于项目更新的推送通知


  2. 更新导航器中的文件图标。全新、简单的隐喻将使它们更容易理解。

Tester

  1. 修正导致输入字符串参数在包含“|”字符时被截断的错误。

MetaTrader 5网页端build 3620

  1. 为网页端界面添加现有的颜色模板。模板会影响图表柱形图和线型图的显示,以及市场报价和账户财务报表中的价格。我们设计团队根据您的建议和传统颜色组合准备了颜色模板预设。


    新网页端颜色模板


  2. 重新设计交易品种规格窗口。为了便于查看,交易品种数据已重新排列成逻辑块。


    更新交易品种规格窗口


  3. 修正通过网页端开设真实账户的问题。服务器可能会在填写注册表后返回错误。
  4. 修正交易对话框中的错误。如果用户在持仓修改对话框打开时通过按下工具箱窗口中的X按键关闭持仓,则对话框内容不会重置。更新后,在这种情况下对话框将自动重置为新的下单模式。
  5. 修正账户管理对话框中服务器字段的显示。
  6. 修正工具栏上当前时间周期的显示。
  7. 修正在交易对话框中基础资产单位的交易量显示。
  8. 修正持仓止损和止盈水平的修改。修改在某些情况下其中一个值可能会重置第二个值。
  9. 修正投资风险提示的显示。

6 三月 2023

MetaTrader 5 iPhone/iPad:改进图表交易和分析功能
  1. 添加在图表下stop order订单和stop-limit order订单的功能。

    早期版本仅提供limit order订单。通过连续按下图表底部面板中的按键来选择所需的类型。


    在图表下stop order订单和stop-limit order订单


  2. 添加从图表访问平仓或删除挂单功能。在图表上选择持仓或订单水平,相关命令将出现在下方的交易面板中:


    从图表管理持仓和订单


  3. 改进移动价格图表右边框的功能。若要更改移位,只需将图表滚动到最后一个价格,直到出现垂直分隔符。接下来,拖动图表底部标尺的三角形:


    通过拖动底部标尺的三角形来更改图表移位


  4. 添加在图表上复制分析对象的功能。这可以更快地进行图表标记。长按打开对象菜单并选择“复制”:

    创建分析对象的副本


  5. 添加管理不同时间周期内指标显示的功能。如果该指标不适用于某些图表周期,则可以将其隐藏以释放屏幕上的空间供其他分析工具使用。


    管理不同时间周期内的指标显示


  6. 在交易品种规格窗口中添加交易品种手续费的显示。


    在交易品种规格中查找手续费金额


  7. 添加密码恢复链接。账户密码只能通过相关交易商恢复。该链接显示了交易商的联系方式。


    帮助恢复密码


  8. 添加分享MQL5.community频道链接的功能。


    通过应用程序分享您的频道链接


  9. 改进连接到具有交易限制的账户时的用户体验。

    交易可能因各种原因受到限制:只读模式连接;交易协议未被接受;交易商验证尚未完成等。此前,没有解释交易功能不可用的原因。

    现在,如果交易被限制,“交易”部分的下单按键将显示为灰色。按下此键,会显示相关信息和建议。


    交易受限时的有用信息


  10. 通过用于高级身份验证的SSL证书改进工作流程。

    现在,当用户连接到高级身份验证的账户时,该应用程序将显示所需操作的简要说明。


    改进SSL证书工作


    证书可以从PFX文件导入。在文件应用程序中保存必要的文件,然后在开始对话框中使用导入功能。

    还可以将证书导入文件,这样就可以在其他设备上使用证书。为此,请进入“设置”\“证书”并在证书菜单中选择“导出”。

  11. 价格图表的构建已转移到Metal,这是Apple设备中使用的最新一代图形API。这可以明显提高图表、指标和对象的渲染性能。
  12. 修正市场深度中止损和止盈水平的替换。对于FIFO账户,止损水平将根据相同交易品种的现有未结持仓的止损水平自动设置。这个过程要求遵循FIFO规则。
  13. 修正重新报价。当返回重新报价时,用户有很短的时间来接受或拒绝新价格。如果在要求的时间范围内没有采取任何行动,请求将被自动拒绝,重新报价窗口将自动关闭。
  14. 修正在使用深色界面主题时“图表”部分的时间显示问题。

16 十二月 2022

MetaTrader 5 build 3550:改进和修复

客户端

  1. 程序端:更新用户界面的翻译。
  2. 基于崩溃日志进行修复。

网页端

9 十二月 2022

MetaTrader 5 build 3540:2FA/TOTP身份验证和改善网页端的市场报价

网页端

  1. 添加对使用Google Authenticator和类似应用程序进行2FA/TOTP身份验证的支持。

    2FA/TOTP身份验证可以保护交易账户即使在泄露登录名和密码的情况下也可以免受未经授权的访问。可以使用多种移动应用程序来实现使用基于时间的动态密码算法(TOTP) 的身份验证。其中最受欢迎的是Google Authenticator、Microsoft Authenticator、LastPass Authenticator和Authy。现在您可以通过这种Authenticator应用程序生成的动态密码在MetaTrader 5客户端连接您的账户。

    要启用双重身份验证选项,请通过MetaTrader 5网页端连接到您的账户。然后在菜单中点击您的账户,并在新打开的对话框中选择“启用2FA/TOTP”。在您的移动设备上安装并运行Authenticator应用程序,点击"+"添加您的交易账户,并用客户端扫描二维码。在“动态密码”字段中输入生成的代码,并点击“启用2FA”。然后,在交易商的交易服务器上,将为您的账户注册一个密钥。


    添加对使用Google Authenticator和类似应用程序进行2FA/TOTP身份验证的支持


    保存的密钥将用于Authenticator应用程序中,以便生成您每次连接账户时所需的OTP代码(动态密码)。每个动态密码在30秒内有效。失效后会再生成一个新动态密码。


    连接到账户时,需要从Authenticator应用程序中获得的附加动态密码


    在二维码对话框中还会显示一个备份代码,用于链接到生成器。将其保存在一个安全的地方。如果您失去对链接设备的访问,该代码将允许您再次将账户添加到Authenticator应用程序中。

    如果您决定从Authenticator应用程序中删除存储的密钥,您应首先通过对应账户的菜单命令禁用2FA/TOTP身份验证。如果您的账户没有新2FA/TOTP身份验证方法,请联系您的交易商。

  2. 扩大市场报价中显示的数据量。现在,除了当前的卖价/买价以及价格变化百分比外,您还可以看到:

    • 当前交易时段的最高和最低卖价/买价
    • 当前交易时段的开盘价和上一交易时段的收盘价

    使用快捷菜单来自定义显示的信息:


    其他市场报价数据


  3. 添加当交易商启用相应的设置时显示风险通知。一些监管机构要求交易者在交易前阅读并接受通知。
  4. 修正在屏幕顶部有缺口的iPhone机型上,显示顶部工具条的问题。之前,顶部工具条有时可以覆盖面板上的按键。
  5. 修正在谷歌浏览器中显示账户的最终财务参数(利润、净值等)。有时,这些数据没有被更新。

客户端

  1. 程序端:优化并大幅度加快模拟账户开户对话框。
  2. 程序端:更新用户界面的翻译。
  3. 基于崩溃日志进行修复。

MQL5

  1. 将新方法添加到标准程序库的COpenCL类:

    • BufferFromMatrix — 用矩阵中的数据填充设备缓冲区
    • BufferToMatrix — 将数据从设备缓冲区读入到矩阵中
    • ContextCreate — 创建设备上下文(Initialize方法的第一部分)
    • ProgramCreate — 基于OpenCL源代码创建一个程序(Initialize方法的第二部分)
    • ContextClean — 释放属于设备上下文的所有数据(类似于Shutdown方法,但不删除上下文)
    • GetDeviceInfoInteger — 接收一个整数设备属性
    • GetKernelInfoInteger — 接收一个整数内核属性
    • GetDeviceInfo — 接收任何ENUM_OPENCL_PROPERTY_INTEGER枚举中不存在的单一整数设备属性

    GetDeviceInfo使用实例:
    long preferred_workgroup_size_multiple=OpenCL.GetDeviceInfo(0x1067);
  2. 添加TERMINAL_CPU_NAME和TERMINAL_OS_VERSION值到ENUM_TERMINAL_INFO_STRING枚举中。它们允许接收用户的CPU和操作系统名称。
    void OnStart()
      {
       string cpu,os;
    //---
       cpu=TerminalInfoString(TERMINAL_CPU_NAME);
       os=TerminalInfoString(TERMINAL_OS_VERSION);
       PrintFormat("CPU: %s, OS: %s",cpu,os);
      }
    
    Result:
    CPU:Intel Xeon  E5-2630 v4 @ 2.20GHz, OS:Windows 10 build 19045
  3. 修正DatabasePrintDatabaseExport函数中"table_or_sql"参数的操作。现在除了SQL查询外,还能传递一个表格名称。

MetaEditor

  1. 修正对数据库中可显示最大列数的检查。现在最多可以显示64列。
  2. 修正短结构中断点的操作,如IF[ if(cond) break; ]。

25 十一月 2022

MetaTrader 5 build 3520:使用Google Authenticator进行2FA/TOTP身份验证

程序端

  1. 添加使用Google Authenticator和类似应用程序进行2FA/TOTP身份验证。

    2FA/TOTP身份验证可以保护交易账户即使在泄露登录名和密码的情况下也可以免受未经授权的访问。可以使用多种移动应用程序来实现使用基于时间的动态密码算法(TOTP) 的身份验证。其中最受欢迎的是Google Authenticator、Microsoft Authenticator、LastPass Authenticator和Authy。现在您可以通过这种Authenticator应用程序生成的动态密码在MetaTrader 5客户端连接您的账户。

    要启用双重身份验证选项,请连接到您的账户并执行账户快捷菜单中的“启用2FA/TOPT”命令。在您的移动设备上安装并运行Authenticator应用程序,点击"+"添加您的交易账户,并用客户端扫描二维码。在“动态密码”字段中输入生成的代码,并点击“启用2FA”。然后,在交易商的交易服务器上,将为您的账户注册一个密钥。


    添加对使用Google Authenticator和类似应用的2FA/TOTP身份验证的支持。

    保存的密钥将用于Authenticator应用程序中,以便生成您每次连接账户时所需的OTP代码(动态密码)。每个动态密码在30秒内有效。失效后会再生成一个新动态密码。



    连接到账户时,需要从Authenticator应用程序中获得的附加动态密码

    如果您决定从Authenticator应用程序中删除存储的密钥,您应首先通过对应账户的快捷菜单命令禁用2FA/TOTP身份验证。如果您的账户没有新2FA/TOTP身份验证方法,请联系您的交易商。

MQL5

  1. 修正对自定义交易品种的CopyTicks函数的操作。当使用自定义交易品种时,在某些条件下,可能会返回前一个时段的初始报价,而不是所要求的数据。

  2. MQL5:添加新枚举值,以获得最后OpenCL错误代码和文本描述。
    1. CL_LAST_ERROR (код 4094)值已被添加到ENUM_OPENCL_PROPERTY_INTEGER枚举中

      当通过CLGetInfoInteger获取最后一个OpenCL错误时,忽略句柄参数。错误描述:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS
      对于未知错误代码,会返回字符串"unknown OpenCL error N(未知OpenCL错误N)",其中N是错误代码。

      示例:
      //--- 在获得最后一个错误代码时,将忽略第一个句柄参数
      int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);

    2. CL_ERROR_DESCRIPTION (4093)值已添加到ENUM_OPENCL_PROPERTY_STRING枚举中。
      可以使用CLGetInfoString获得文本错误描述。错误描述:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS

      当使用CL_ERROR_DESCRIPTION时,应将错误代码传递为CLGetInfoString中的句柄参数。如果传递的是CL_LAST_ERROR而不是错误代码,该函数将返回最后的错误描述。

      示例:
      //--- 获得最后一个OpenCL错误的代码
      int    code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
      string desc; // 要获得错误的文本描述
      
      //--- 使用错误代码来获得错误的文本描述
      if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      
      
      //--- 要在没有接收代码的情况下获取最后一个OpenCL错误的描述,请传递CL_LAST_ERROR  
      if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION, desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      内部枚举名称作为错误描述传递。其解释可显示在https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS。例如,CL_INVALID_KERNEL_ARGS值意味着“在某些内核参数未设置或无效时,在对内核进行排队时返回。”

  3. 修正matrix::MatMul方法的操作。在处理大型矩阵时,程序端可能在某些尺寸上出现崩溃的情况。

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

18 十一月 2022

MetaTrader 5 build 3510:网页端的改进

MetaTrader 5 WebTerminal

  1. 在移动版中,我们已经实现了交易历史的排序和深度过滤。使用顶部面板的命令自定义历史显示:


    移动版中可定制的交易历史视图


    操作可以按主要参数进行排序,如日期、单号、交易品种和交易量等。

  2. 改进对交易账户细节的访问。

    • 在桌面版中,当前账户数据可以点击。点击账户,查看其详细信息。
    • 在移动版中,当前账户显示在设置部分。点击账户,查看其详细信息。


    改进对交易账户数据的访问

  3. 修正账户管理窗口中账户类型的显示问题。
  4. 修正在手机浏览器中刷新网页端页面后净值和可用预付款的显示问题。
  5. 修正火狐手机浏览器中的底栏显示。

程序端

  1. 修正交易报告中净值和结余图形计算的问题。

MQL5

  1. typename(expr)的新行为。更新后的函数返回带有修饰符和维度的完整类型(数组):
    class A
      {
      };
    
    void OnStart(void)
      {
       const A *const arr[][2][3]={};
       Print(typename(arr));
      }
    
    Result:
    "class A const * const [][2][3]"

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

11 十一月 2022

MetaTrader 5 build 3500:改进和修复

程序端

  1. 在交易和历史部分的快捷菜单中增加一个新命令,新交易报告


    交易报告提供以下工作数据:
    • 图表和表格,可视化每月增长指标
    • 净值图表
    • 雷达图,可以快速评估账户状态
    • 按交易品种划分的交易统计数据
    • 用于交易分析的各种额外指标

  2. 修正交易报告中初始存款的计算。
  3. 修正使用图表和市场观察中快速交易面板时止损和止盈水平的设置。即使不需要继承,也可以从以前开设的持仓继承水平(相关功能针对基于FIFO账户实现)。
  4. 更新用户界面翻译。

MQL5

  1. 修正一个编译器错误,该错误允许使用带有字段名值的常量字符串访问结构字段。
  2. 修正使用TerminalInfoInteger(TERMINAL_KEYSTATE_*)函数检查密钥状态的问题。

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

MetaTrader 5 WebTerminal(网页端)build 3500

  1. 修正重新报价时的平仓。
  2. 修正在将长时间不活动的浏览器窗口最大化后重新连接到服务器的问题。
  3. 修正信贷资金的显示。
  4. 其他改进和修复。

4 十一月 2022

MetaTrader 5 build 3490:移动网页端版本和MQL5的新矩阵方法

网页平台的移动端版本

全新网页端为移动设备提供全功能的支持。该界面将自动适应屏幕尺寸,实现iOS与Android手机和平板电脑的高效操作:

在新网页端中添加对移动设备的支持

此外,网页端还进行多项修复和改进。

全新MetaTrader 5网页端支持全部交易功能。使用户能够:

  • 使用模拟账户和真实账户进行交易
  • 接收任何交易品种的报价
  • 在任何市场进行交易
  • 使用30多个指标和20个图形对象分析交易品种报价
  • 使用经济日历数据进行基本面分析


程序端

  1. 扩展任务管理器功能。新版本可以更准确地监控消耗的资源。
    • 添加线程中堆栈大小的显示。
    • 添加上下文切换数量的显示。
    • 添加对系统和第三方DLL线程的识别。
    • 添加内核模式运行时间的显示。与在用户模式下花费的时间相比,该指标的增加可能表明系统级问题:驱动程序问题、硬件错误或减缓硬件。更多细节,请参阅Microsoft文档
    • 添加用户模式运行时间的显示。

    控制可用设备的OpenCL管理器


  2. 程序端设置中用于管理可用设备的新OpenCL选项卡。新OpenCL管理器能够明确指定用于计算的设备。

    控制可用设备的OpenCL管理器

  3. 为在FIFO模式下运行的账户添加在市场深度中止损和止盈水平的指示(该模式可以在交易商端启用)。

    根据FIFO规则,每个交易品种的持仓只能按照开仓的相同顺序进行平仓。为确保通过止损位平仓符合FIFO标准,在客户端实施以下逻辑:

    如果同一交易品种存在多个持仓,则为任何持仓设置止损水平会导致所有其他持仓也设置相同的水平。因此,如果触发一个水平,则所有仓位都将按照FIFO规则平仓。

    现在,当用户为已经有未结持仓的交易品种打开市场深度时,现有持仓水平(如果有)会自动在止损和止盈字段中指定。

  4. 修正使用工具箱\交易窗口中的X按键删除止损和止盈水平的问题。该错误通常在禁用快速交易功能时发生。单击该按键将打开一个交易对话框,其中包含相关级别的空值。

  5. 修正交易报告中的图形标题和最后手续费计算的问题。该部分可能显示报告统计中的不正确的利润,和净值与结余图的工具提示中的不正确值。

MQL5

  1. 添加向量和矩阵方法CopyTicks和CopyTicksRange。它们可以轻松地将报价数据数组复制到向量和矩阵中。
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    复制的数据类型使用ENUM_COPY_TICKS枚举在"flags"参数中指定。以下值可供使用:
    COPY_TICKS_INFO    = 1,       // 由卖价和/或买价更改得出的报价
    COPY_TICKS_TRADE   = 2,       // 由最后价和交易量更改得出的报价
    COPY_TICKS_ALL     = 3,       // 所有报价都发生变化
    COPY_TICKS_TIME_MS = 1<<8,    // 以毫秒为单位的时间
    COPY_TICKS_BID     = 1<<9,    // 卖价
    COPY_TICKS_ASK     = 1<<10,   // 买价
    COPY_TICKS_LAST    = 1<<11,   // 最后价
    COPY_TICKS_VOLUME  = 1<<12,   // 交易量
    COPY_TICKS_FLAGS   = 1<<13,   // 报价标识
    如果选择了多种数据类型(仅适用于矩阵),矩阵中的行序将对应于枚举中的值的顺序。

  2. 扩展了matrix::Assignvector::Assign方法的功能。

    现在可以为矩阵分配一个一维数组或向量:
    bool matrix::Assign(const vector &vec);
    结果将是一个单行矩阵。

    此外,现在可以将矩阵分配给向量(将执行矩阵平滑):
    bool vector::Assign(const matrix &mat);
  3. 为向量和矩阵添加Swap方法。
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    每个数组、向量或矩阵都指向一个包含该对象元素的内存缓冲区。Swap方法实际上交换指向这些缓冲区的指针,而不将元素写入内存。因此,矩阵仍然是矩阵,向量仍然是向量。交换矩阵和矢量会产生一个带有矢量元素的单行矩阵和一个平面表示的带有矩阵元素的矢量(见Flat方法)。
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                           |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {4, 5, 6}};
      Print("a before Swap: \n", a);
      matrix b= {{5, 10, 15, 20},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {25, 30, 35, 40},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {45, 50, 55, 60}};
      Print("b before Swap: \n", b);  
    //--- swap矩阵指针
      a.Swap(b);
      Print("a after Swap: \n", a);
      Print("b after Swap: \n", b);
      /*
      a before Swap:
      [[1,2,3]
      [4,5,6]]
      b before Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a after Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b after Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v before Swap: \n", v);
      Print("b before Swap: \n", b);
      v.Swap(b);
      Print("v after Swap: \n", v);
      Print("b after Swap: \n", b);
      /*
      v before Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b before Swap:
      [[1,2,3]
      [4,5,6]]
      
      v after Swap:
      [1,2,3,4,5,6]
      b after Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    Swap()方法还可以使用动态数组进行操作(固定大小的数组不能作为参数传递)。数组可以是任何维度,但具有约定的大小,这意味着矩阵或向量的总大小必须是数组零维度的倍数。数组零维度是第一个索引处包含的元素数。例如,对于动态三维数组"double array[][2][3]",零维是第二维和第三维大小的乘积:2x3=6。因此,这样的数组只能在Swap方法中用于总大小为6的倍数的矩阵和向量:6、12、18、24等。

    考虑以下示例:
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                           |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- 用7.0值填写1x10矩阵
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix before Swap:\n", m);
    //--- 尝试交换矩阵和数组
      double array_small[2][5]= {{1, 2, 3, 4, 5},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {6, 7, 8, 9, 10}};
      Print("array_small before Swap:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small after Swap:");
        ArrayPrint(array_small);
        Print("matrix after Swap: \n", m);
       }
      else // 矩阵大小不是第一个数组维度的倍数
       {
        Print("m.Swap(array_small) failed. Error ", GetLastError());
       }
      /*
      matrix before Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small before Swap:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) failed. Error 4006
      */
    //--- 使用更大的矩阵并重试交换操作
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static before Swap:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static after Swap:");
        ArrayPrint(array_static);
        Print("matrix after Swap: \n", m);
       }
      else // 静态数组不能用于与矩阵交换
       {
        Print("m.Swap(array_static) failed. Error ", GetLastError());
       }
      /*
      array_static before Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) failed. Error 4006
      */
    //--- 交换数组和矩阵的另一种尝试
      double array_dynamic[][10];    // 动态数组
      ArrayResize(array_dynamic, 3); // 设置第一维度大小
      ArrayCopy(array_dynamic, array_static);
    //--- 现在为swap使用动态数组
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic after Swap:");
        ArrayPrint(array_dynamic);
        Print("matrix after Swap: \n", m);
       }
      else //  没有错误
       {
        Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
       }
      /*
      array_dynamic after Swap:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      matrix after Swap:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  4. 添加向量和矩阵的LossGradient方法。这种方法计算损失函数对预测值的偏导函数的向量或矩阵。在线性代数中,这样的向量被称为梯度,并在机器学习中使用。
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  5. 启用SQLite中的FOREIGN KEYS,以在SQL查询中加强表格之间的关系。  示例:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  6. 修正根据方法和对象的不变性,选择对应类方法的问题。

MetaEditor

  1. 添加提交到MQL5存储中的评论的允许长度。 在大型项目中,向存储库提交修改时的详细评论被认为是很好的实践,但以前评论的长度被限制在128个字符。现在允许的长度最多260个字符。

MetaTester

  1. 提高可视模式下测试速度开关的灵敏度。

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

17 九月 2022

MetaTrader 5 build 3440:新交易账户报告

程序端

  1. 增加新账户交易业绩报告。这类似于在统计资料可用性和数据展示方面的熟悉的信号报告。以下性能数据将在平台上提供:
    • 图表和表格,可视化每月增长指标
    • 净值图表
    • 雷达图,可以快速评估账户状态
    • 按交易品种划分的交易统计数据
    • 用于交易分析的各种额外指标

    报告可以直接在平台中查看,而不需要将其导出到文件中。要打开它,请在“查看”菜单中选择“报告”。




  2. 修正数量或交易品种类型不匹配的看涨和看跌合约成交的期权板
  3. 修正Close by操作过程中交易对话框中的持仓选择。对于按任何列而非单号排序的反向订单列表,可能会发生错误。
  4. 加快平台记录速度。
  5. 修正自定义交易品种图表上的评论显示。

MQL5

  1. 修正CArrayList::LastIndexOf函数操作。以前,总是返回-1,而不是最后找到的元素的索引。
  2. 增加新矩阵和向量方法 - Assign。它用传递的矩阵/向量或数组数据替换矩阵/向量元素。
    bool vector<TDst>::Assign(const vector<TSrc> &assign);
    bool matrix<TDst>::Assign(const matrix<TSrc> &assign);
    
    示例:
      //--- copying matrices
      matrix b={};
      matrix a=b;
      a.Assign(b);
      
      //--- copying an array to a matrix
      double arr[5][5]={{1,2},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    {3,4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    {5,6}};
      Print("array arr");
      ArrayPrint(arr);
      b.Assign(arr);
      Print("matrix b \n",b);
    /*
    array arr
            [,0]    [,1]    [,2]    [,3]    [,4]
    [0,] 1.00000 2.00000 0.00000 0.00000 0.00000
    [1,] 3.00000 4.00000 0.00000 0.00000 0.00000
    [2,] 5.00000 6.00000 0.00000 0.00000 0.00000
    [3,] 0.00000 0.00000 0.00000 0.00000 0.00000
    [4,] 0.00000 0.00000 0.00000 0.00000 0.00000
    matrix b 
    [[1,2,0,0,0]
     [3,4,0,0,0]
     [5,6,0,0,0]
     [0,0,0,0,0]
     [0,0,0,0,0]]
    
    */
  3. 增加新矩阵和向量方法 - CopyRates。它将价格数据数组复制成向量和矩阵。
    bool matrix::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    bool vector::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    复制的数据类型使用ENUM_COPY_RATES枚举在rates_mask参数中指定。有以下值可供使用:
    COPY_RATES_OPEN
    COPY_RATES_HIGH
    COPY_RATES_LOW
    COPY_RATES_CLOSE
    COPY_RATES_TIME
    COPY_RATES_VOLUME_TICK
    COPY_RATES_VOLUME_REAL
    COPY_RATES_SPREAD
    COPY_RATES_OHLC
    COPY_RATES_OHLCT
    最后两个值可以同时选择多个柱形图参数。开盘价、最高价、最低价、收盘价和时间。

    如果选择了多种数据类型(仅适用于矩阵),矩阵中的行序将对应于枚举中的值的顺序。

  4. 修正文本标签对象的显示。当使用OBJPROP_XOFFSET和OBJPROP_YOFFSET属性时,可能会在图表上显示一个错误的图像片段。

  5. 修正改变将常量参数作为对象指针引用传递给函数时的错误。

    const指定符将一个变量声明为常量,以防止它在程序执行中被更改。它只允许在声明时进行一次性的变量初始化。OnCalculate函数中的常量变量示例:

    int OnCalculate (const int rates_total,      // price[] array size
                     const int prev_calculated,  // bars processed on previous call
                     const int begin,            // meaningful data starts at
                     const double& price[]       // array for calculation
       );
    

    下面的示例包含一个编译器错误,它允许隐式指针强制转换引用参数:

    class A {};
    const A *a = new A;
    
    void foo( const A*& b )
      {
       b = a;
      }
    
    void OnStart()
      {
            A *b; 
            foo(b);  // not allowed
            Print( a,":",b );
      }
    编译器会检测到这种非法操作,并返回相关错误。

MetaEditor

  1. 修正调试器中复数引用的显示。
  2. 改进MQL5云保护器。以前,文件保护在某些情况下可能会失败。
  3. 修正崩溃日志中的错误报告。


全新MetaTrader 5网页端

我们发布了经过改进的MetaTrader 5网页端,它提供了更新的界面和重新设计的内核。新界面类似于iPad程序端:



它还包含许多新功能:

  • 能够通过详细的注册表单和文件提交选项请求真实账户
  • 支持价格数据订阅和接收延迟报价的能力
  • 更多的分析对象和便捷的管理选项
  • 在图表上显示市场进入和退出
  • 在图表上显示经济日历事件
  • 在“市场报价”中方便地配置交易品种,以及每日价格变化数据
  • 简化界面,帮助初学者开始使用程序端:删除图表快捷菜单和顶部菜单;所有图表控制命令、对象和指标都在左侧和顶部面板中可用,而其他命令可以通过归类菜单访问
  • 界面的暗模式
立即体验www.mql5.com新网页端。它不久将可供您的交易商使用。

4 八月 2022

MetaTrader 5 build 3390:在OpenCL和数学函数中的浮点,机器学习的激活和损失方法

程序端

  1. 添加在第一次连接到交易账户时自动打开教程。这将帮助初学者学习交易基础知识和了解平台功能。本教程分为几个部分,每个部分都提供有关特定主题的简要信息。训练进度以蓝线显示。

    添加在第一次连接到交易账户时自动打开教程。


  2. 修正‘关闭盈利’/‘关闭亏损’批量操作。以前,如果存在此类持仓,该平台将使用反向持仓。例如,如果您有两个亏损买入持仓(EURUSD)和一个盈利卖出持仓(EURUSD),所有三个持仓都将在‘关闭亏损’批量操作中关闭。买入和卖出将通过'Close by'操作关闭,而其余的买入将通过正常操作关闭。现在,这些指令操作正常:它们只关闭选定的持仓,无论是盈利还是亏损。
  3. 修正显示负历史价格。此类价格将正确显示在所有时间周期内。
  4. 优化并显著降低程序端的系统资源消耗。
  5. 更新交易品种的基本数据库。可用于交易所交易品种的数据聚合器数量已扩大到15个。用户将能够通过最受欢迎的经济聚合器访问更多代码的信息。

    更新交易品种的基本数据库。可用于交易所交易品种的数据聚合器数量已扩大到15个。

    大约7,000只证券和2,000多只ETF在全球交易所市场上市。此外,交易所还提供期货和其他衍生品。MetaTrader 5平台提供对交易所交易品种的庞大数据库的访问权限。要访问相关的基本数据,用户可以从市场报价直接一键切换到所选聚合器网站。为方便起见,该平台为每种交易品种提供了多种信息源。

  6. 修正在新下单窗口中的止损和止盈指示。对于FIFO账户,停止水平将根据相同交易品种的现有未结持仓的停止水平自动设置。这个程序要求符合FIFO规则。

MQL5

  1. 数学函数现在可以处理矩阵和向量。

    我们致力于继续扩展MetaTrader 5平台的功能,用于算法交易和机器学习。之前,我们添加新数据类型:矩阵和向量,从而无需使用数组进行数据处理。已有70多种方法添加到MQL5中,用于这些数据类型的操作。新方法可以在单个操作中进行线性代数和统计计算。乘法、变换和方程组可以很容易地实现,无需过多的代码行。最新更新包括数学函数。

    数学函数最初设计用于对标量值执行相关操作。在此基础上,大多数函数都可以应用于矩阵和向量。这些包括MathAbs、MathArccos、MathArcsin、MathArctan、MathCeil、MathCos、MathExp、 MathFloor、MathLog、MathLog10、MathMod、MathPow、MathRound、MathSin、MathSqrt、MathTan、MathExpm1、MathLog1p、MathArccosh、MathArcsinh、MathArctanh、MathCosh、MathSinh和MathTanh。这类操作意味着对矩阵或向量进行元素式处理。示例:
    //---
      matrix a= {{1, 4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    对于MathModMathPow,第二个元素既可以是标量,也可以是相应大小的矩阵/向量。

    以下示例显示了如何通过将数学函数应用于向量来计算标准偏差。
    //+------------------------------------------------------------------+
    //| Script program start function                  |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- Use the initializing function to populate the vector
      vector r(10, ArrayRandom); // Array of random numbers from 0 to 1
    //--- Calculate the average value
      double avr=r.Mean();       // Array mean value
      vector d=r-avr;            // Calculate an array of deviations from the mean
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // Array of squared deviations
      double sum=s2.Sum();       // Sum of squared deviations
    //--- Calculate standard deviation in two ways
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Fills the vector with random values                |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. 在模板函数中,添加对标记matrix<double>、matrix<float>、vector<double>、vector<float>的支持,而不是对应的matrix、matrixf、vector和vectorf类型。

  3. 改进浮点类型运算的数学函数。新实现的将数学函数应用于‘float'矩阵和向量的可能性可以改进应用于‘float'标量的数学函数。以前,这些函数参数被无条件地转换为‘double'类型,然后调用相应实施的数学函数,并将结果转换回‘float'类型。现在,实施这些操作,无需其他类型转换。

    以下示例显示了数学正弦计算的差值:

    //+------------------------------------------------------------------+
    //| Script program start function                  |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  Array of random numbers from 0 to 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Fills the vector with random values                |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. 为矩阵和向量添加激活和导数方法:
    AF_ELU               Exponential Linear Unit函数
    AF_EXP               Exponential函数
    AF_GELU              Gaussian Error Linear Unit函数
    AF_HARD_SIGMOID      Hard Sigmoid函数
    AF_LINEAR            Linear函数
    AF_LRELU             Leaky REctified Linear Unit函数
    AF_RELU              REctified Linear Unit函数
    AF_SELU              Scaled Exponential Linear Unit函数
    AF_SIGMOID           Sigmoid函数
    AF_SOFTMAX           Softmax函数
    AF_SOFTPLUS          SoftPlus函数
    AF_SOFTSIGN          Softsign函数
    AF_SWISH             Swish函数
    AF_TANH              Hyperbolic Tangent函数
    AF_TRELU             Thresholded REctified Linear Unit函数
    神经网络激活函数决定了加权输入信号如何在网络层面转化为节点输出信号。激活函数的选择对神经网络的性能有很大的影响。模型的不同部分可以使用不同的激活函数。除了所有已知函数外,MQL5还提供导数。导数函数可以根据学习中收到的错误快速计算调整。

  5. 为矩阵和向量添加损失函数。它包括以下参数:

    LOSS_MSE            均方差损失函数
    LOSS_MAE            平均绝对误差损失函数
    LOSS_CCE            Categorical Crossentropy函数
    LOSS_BCE            Binary Crossentropy函数
    LOSS_MAPE           平均 绝对百分比误差损失函数
    LOSS_MSLE           均方对数误差损失函数
    LOSS_KLD            Kullback-Leibler Divergence函数
    LOSS_COSINE         Cosine similarity/proximity函数
    LOSS_POISSON        Poisson函数
    LOSS_HINGE          Hinge函数
    LOSS_SQ_HINGE       Squared Hinge函数
    LOSS_CAT_HINGE      Categorical Hinge函数
    LOSS_LOG_COSH       双曲余弦对数 函数
    LOSS_HUBER          Huber函数

    损失函数评估模型预测实际值的程度。模型构建的目标是在每个阶段最小化函数值。该方法取决于特定的数据集。此外,损失函数可能取决于权重和偏移量。损失函数是一维函数,不是向量,因为它提供对神经网络的普通评估。

  6. 矩阵和向量添加matrix::CompareByDigits和vector::CompareByDigits方法。它们比较两个矩阵/向量的元素,直到有效数字。

  7. 添加对字符串MathMinMathMax函数的支持。这些函数将使用字典式比较:字母按字母顺序比较,区分大小写。

  8. OpenCL对象的最大数已从256个增加到65536个。OpenCL对象句柄在MQL5程序中使用CLContextCreateCLBufferCreateCLProgramCreate函数创建。之前256个句柄的限制不足以有效使用机器学习方法。

  9. 添加在没有‘double' 支持的情况下在图形卡上使用OpenCL的功能。以前,在MQL5程序中只允许使用支持双精度类型的GPU,尽管许多任务允许使用浮点类型进行计算。浮点类型最初被认为是并行计算的原生类型,因为它占用的空间更少。因此,旧的要求已被取消。

    要为特定任务设置强制使用支持双精度类型的GPU,请在CLContextCreate调用中使用 CL_USE_GPU_DOUBLE_ONLY。
       int cl_ctx;
    //--- Initializing the OpenCL context
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. 修正CustomBookAdd函数的操作问题。以前,MqlBookInfo::volume_real字段中的非零值会阻止函数创建市场深度快照。现在执行如下检查:
    传输的数据经过验证:必须为每个元素指定类型、价格和交易量数据。此外,MqlBookInfo.volume和MqlBookInfo.volume_real不得为零或负数。如果两边交易量都是负数,这将被视为错误。您可以指定任何交易量类型或两者都指定,而系统将使用指示的交易量类型或正值交易量类型:

       volume=-1 && volume_real=2 — volume_real=2将被使用,

       volume=3 && volume_real=0 — volume=3将被使用。

    精度更高的交易量MqlBookInfo.volume_real的优先级高于MqlBookInfo.volume。因此,如果两个值都已指定且有效,则将使用 volume_real。

    如果有任何市场深度元素描述不正确,系统将完全丢弃转移状态。

  11. 修正CalendarValueLast函数的操作问题。由于错误,在使用货币过滤器时,经济日历更改后的连续函数调用(调用后‘change' 参数设置一个新值)可能会跳过一些事件
    CalendarValueLast(change, result, "", "EUR")
  12. 修正ArrayBSearch函数行为的问题。如果找到多个相同的元素,将返回指向第一个结果的链接,而不是随机链接。
  13. 修正对类中模板函数可见性的检查。由于错误,声明为私有/受保护的类模板函数显示为公开

MetaEditor

  1. 修正MetaAssist的错误和模棱两可行为的问题。
  2. 添加对%terminal%宏的支持,该宏指示程序端安装目录的路径。例如,%terminal%\MQL5\Experts。 

    添加对%terminal%宏的支持,该宏指示程序端安装目录的路径。

  3. 改进调试器中数组的显示。
  4. 增加从调试器复制值的缓冲区。
  5. 改进错误提示。
  6. 在*.mproj项目文件中添加相对路径的指示。以前,使用绝对路径,如果项目被移动,这会导致编译错误。
  7. 添加自动嵌入BMP资源为项目中全局可用的32位位图数组。这消除了在代码中需要调用ResourceReadImage来读取图形资源。
    'levels.bmp' as 'uint levels[18990]'
    
  8. 改进读取扩展的BMP文件格式。
  9. 更新用户界面的翻译。
  10. 修复崩溃日志中报告的错误。


2 六月 2022

MetaTrader 5 build 3320:其他改进和修复

程序端

  1. 扩展图表中显示的交易对象的工具提示:
    • 市场退出交易现在显示盈利。
    • 针对由于激活止盈或止损而执行的交易而显示相关指示。

    类似的工具提示可用于连接进入和退出交易的行。

    扩展交易对象的工具提示



  2. 改进图形系统性能。
  3. 程序端:添加对未结订单和未结持仓批量操作的记录。当这样的命令被执行时,相关记录将被添加到日志中,例如:"开始批量关闭XXX持仓"。
  4. 程序端:修正批量关闭反向持仓。
  5. 程序端:修正图表上显示交易历史对象的更新。在更改图表交易品种时会发生错误。

MQL5

  1. 矩阵和向量函数的开发正在进行中:正在实施对“浮点”和“复数”的支持。
  2. MQL5:指针操作符"!" (LNOT)通过隐含的CheckPointer调用来检查其有效性。操作符"=="应该用于快速检查NULL。例如:ptr==NULL或ptr!=NULL。

MetaTester

  1. 修正测试图表上交易对象的显示。
  2. 改进图形系统性能。

MetaEditor

  • 更新用户界面的翻译。

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

20 五月 2022

MetaTrader 5 build 3300: MetaEditor中的快速编译和改进代码导航

程序端

  1. 添加通过拖动矩形图形对象的四个角来调整其大小的功能。


  2. 加快图形用户界面渲染。
  3. 改进对IPv6地址的支持。
  4. 修正首次平台启动时较低日期字段的高度计算和右侧价格字段的宽度计算的问题。

MQL5

  1. 添加处理矩阵和向量的函数 —  RegressionMetric。它设置了回归评估的指标。
     double vector.RegressionError(const enum lr_error);
     double matrix.RegressionError(const enum lr_error);
     vector matrix.RegressionError(const enum lr_error,const int axis);
    以下变量可用作度量指标:
    enum REGRESSION_ERROR
      {
       REGRESSION_MAE,     // 平均绝对误差
       REGRESSION_MSE,     // 均方差
       REGRESSION_RMSE,    // 均方根误差
       REGRESSION_R2,      // R平方
       REGRESSION_MAPE,    // 平均绝对百分比误差
       REGRESSION_MSPE,    // 均方百分比误差
       REGRESSION_RMSLE    // 均方根对数误差
      };
  2. 添加写入数据大小大于INT_MAX(结构数组)的数组的功能。

MetaEditor

  1. 选项卡栏改进:
    • 即使只打开一个窗口,面板也不会隐藏。因此,选项卡快捷菜单命令始终对用户可见。
    • 每个选项卡都添加了'X'关闭按钮。此外,可以使用鼠标中键或通过快捷菜单关闭选项卡。


  2. 添加用于快速程序编译的命令。此模式会跳过代码优化,从而显著加快EX5可执行文件的创建速度。当您需要快速检查编写的代码时,且在积极开发阶段可使用此模式。在最终程序编译期间,打开最大优化模式以增强性能。


    项目设置中的“最大优化”参数执行相同的功能。

    所有编译关系操作都可在“构建”菜单下获得。

  3. 代码管理改进:
    • 已经实现用于跳转到定义和声明的单独命令。以前,菜单只有一个命令可以打开选择子菜单。新命令可以更快地切换到必要的代码部分。
    • 除了"Enter"之外,还添加用"Tab"键替换已识别的关键字。


  4. 添加在调试器报价列表中自动显示局部变量的功能。可以通过“本地”快捷菜单命令启用显示。随着调试器操作在代码中进行,当前作用域中的变量会自动显示在列表中。



  5. 对向量和矩阵的调试器报价列表进行改进。
  6. 修正项目文件中的路径。错误可能会导致文件从项目中消失。

Tester

  1. 改进在平台关闭时停止测试器代理的问题。
  2. 添加第五个MQL5 云网络节点。该节点位于香港。新节点通过最近区域的网络加快EA的优化速度。

修复崩溃日志中报告的错误

29 四月 2022

MetaTrader 5 build 3280:根据交易者反馈的其他改进和修复

程序端

  1. 修正在未结订单和未结持仓的快捷菜单中显示标准追踪止损水平的问题。


  2. 更新用户界面翻译。

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

21 四月 2022

MetaTrader 5 build 3270: 其他改进和修复

程序端

  1. 内置聊天功能的改进。
    • 更新设计。现在显示消息没有圆圈气泡,来优化显示和空间利用率。添加头像和日期分隔符。
    • 复制和删除命令已添加到消息菜单中。
    • 漏洞修复和稳定性改进。



  2. 修正批量平仓命令。使用锁仓账户系统的账户会出现错误。
  3. 修正生成持仓历史时,对某些交易类型的考虑。

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

15 四月 2022

MetaTrader 5 build 3260:批量操作,矩阵和向量函数,增强聊天功能

程序端

  1. 添加批量平仓和取消挂单的命令。

    新“批量操作”命令已添加到交易选项卡的快捷菜单。可用命令列表会根据所选操作和您的账户类型自动形成。



    菜单中始终提供以下命令:
    • 关闭锁仓账户中的所有持仓,系统尝试反向平仓(Close By),然后按照常规程序关闭剩余持仓。
    • 关闭所有盈利持仓或亏损持仓
    • 删除所有挂单
    • 删除特定类型的挂单:limit(限价单)、stop(停损单)和stop limit(停损限价)

    如果您选择一个持仓,菜单中会出现其他命令:
    • 关闭交易品种的所有持仓
    • 关闭同方向的所有持仓(锁仓账户)
    • 关闭相同交易品种的反向持仓(锁仓账户)
    • 持仓逆转(单边账户)

    如果您选择挂单,菜单中会出现其他命令:
    • 删除同一交易品种的所有挂单
    • 删除相同交易品种的所有相同类型的挂单

    这些命令仅在平台设置中启用一键交易时可用:工具\选项\交易。
  2. 增强内部聊天功能:
    • 添加回复消息的功能。回复中将引用源消息文本。
    • 添加创建不同内容类型的消息的功能,例如带有文本的图像和带有附件的文本等。
    • 修正显示已读和未读消息之间的分隔符。
    • 错误修复和稳定性改进。



  3. 优化和加快程序端图形系统的运行速度。界面渲染需要的资源将会更少。
  4. 修正期货每日价格变化的计算。如果交易商提供清算价格,该价格将被用于计算。
    ((Last - Clearing Price)/Clearing Price)*100
    文档中提供了所有计算类型的详细说明。

  5. 修正购买MQL5服务时出现的错误:
    • 在某些条件下,支付系统可能为成功操作返回错误。
    • 市场中的中间产品租用环节可能会显示不正确的价格。

  6. 修正购买/下载市场产品页面上的“开始”按键的操作。现在,该按键在第一个打开的图表上正确启动应用程序。
  7. 修正生成持仓历史时,对某些交易类型的考虑。

MQL5

  1. 添加处理矩阵和向量的新函数:
    • Median — 返回矩阵或向量元素的中位数
    • Quantile — 返回矩阵/向量元素或沿指定轴的元素的第q个分位数
    • Percentile — 返回矩阵/向量元素或沿指定轴的元素的第q个百分位数
    • Std — 计算矩阵或向量元素的标准差
    • Var — 计算矩阵或向量元素的方差
    • CorrCoef — 计算矩阵/向量相关系数
    • Correlate — 计算两个向量的交叉相关
    • Convolve — 返回两个向量的离散,线性卷积
    • Cov — 计算协方差矩阵

  2. 我们已经开始为数值数组添加内置方法。新方法增强了可用性,提高代码紧凑性,并加强代码与其他语言的兼容性。

    以下三种方法已经可用:
    • ArgSort — 按指定维度对数组进行排序;默认使用最后一个 (axis=-1)。
    • Range — 返回指定数组维度中的元素数。类似于ArrayRange
    • Size — 返回数组元素的数量。类似于ArraySize

    例如:
    void OnStart()
      {
       int arr[4][5]=
         {
            {22, 34, 11, 20,  1},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {10, 36,  2, 12,  5},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {33, 37, 25, 13,  4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {14,  9, 26, 21, 59}
         };
       ulong indexes[4][5];
    //--- 排序数组
       arr.ArgSort(indexes,-1,0);
       Print("indexes");  
       ArrayPrint(indexes);
      }
    
    // 结果日志:
    // 索引
    //     [,0][,1][,2][,3][,4]
    // [0,]   4   2   3   0   1
    // [1,]   2   4   0   3   1
    // [2,]   4   3   2   0   1
    // [3,]   1   0   3   2   4

  3. 我们已开始为字符串添加内置方法。

    目前可以使用以下方法:
    • BufferSize — 返回为字符串分配的缓冲区大小。
    • Compare — 比较两个字符串并将比较结果返回为整数。
    • Length — 返回字符串中的字符数。
    • Find — 搜索字符串中的子字符串。
    • Upper — 将字符串大写。
    • Lower — 将字符串转换为小写。
    • Replace — 替换一个子字符串。
    • Reserve — 为字符串保留缓冲区。

    所有方法都类似于字符串函数

    例如:
    void OnStart()
      {
       string test="some string";
       PrintFormat("String length is %d",test.Length());
      }
    
    // 结果日志:
    // 字符串长度是11
  4. 将SYMBOL_SUBSCRIPTION_DELAY值添加到ENUM_SYMBOL_INFO_INTEGER枚举中,以延迟特定交易品种的报价交付。

    它仅用于基于订阅的交易品种。延迟通常适用于试用模式提供的数据。

    只能为在市场报价中选择的交易品种请求该属性。否则,将返回ERR_MARKET_NOT_SELECTED (4302)错误。

  5. 将ACCOUNT_HEDGE_ALLOWED属性添加到ENUM_ACCOUNT_INFO_INTEGER枚举中 — 启用反向持仓和挂单。该属性仅用于锁仓账户,以符合特定监管要求,根据该监管要求,同一交易品种的账户不能有反向持仓,但允许同向持仓。

    如果禁用此选项,则账户将不允许持有同一交易品种的反向持仓和订单。例如,如果该账户是Buy持仓,那么用户就不能建立Sell持仓或下单卖出挂单。如果用户尝试执行此类操作,则会返回TRADE_RETCODE_HEDGE_PROHIBITED错误。

  6. ENUM_SYMBOL_INFO_DOUBLE枚举中的新属性:
    • SYMBOL_SWAP_SUNDAY
    • SYMBOL_SWAP_MONDAY
    • SYMBOL_SWAP_TUESDAY
    • SYMBOL_SWAP_WEDNESDAY
    • SYMBOL_SWAP_THURSDAY
    • SYMBOL_SWAP_FRIDAY
    • SYMBOL_SWAP_SATURDAY

    使用这些值来获取一周中特定日期的库存费计算率。1 — 单库存费,3 — 三倍库存费,0 — 无库存费。

  7. 修正CopyTicksCopyTicksRange 函数操作。过夜时,该错误可能导致返回过时的数据。当没有为交易品种提供报价时会发生错误。
  8. 修复崩溃日志中报告的错误。

11 二月 2022

MetaTrader 5 build 3210:修订夏普比率计算算法、新矩阵方法和对指标最小值/最大值的控制

MQL5

  1. 为向量和矩阵添加Min、Max、ArgMin、ArgMax和Sum函数。使用函数查找最小值和最大值、相关指数和总和。
  2. 添加对矩阵平面方法的支持。使用这些方法,矩阵元素可以通过一个索引而不是两个索引来寻址。
    double matrix::Flat(ulong index) const;      // getter
    void matrix::Flat(ulong index,double value); // setter

    计算矩阵元素地址的伪代码:

    ulong row=index / mat.Cols();
    ulong col=index % mat.Cols();
    
    mat[row,col]

    例如,对于'matrix mat(3,3)',访问元素可以按如下写出:

       阅读:'x=mat.Flat(4)',相当于'x=mat[1][1]'
       书写:'mat.Flat(5, 42)',相当于'mat[1][2]=42'

    如果使用无效的矩阵索引调用函数,则会抛出OutOfRange严重执行错误

  3. 改进MQL5程序输入参数中浮点数的格式。在读取一些实数时,将带有许多零的数字代入输入参数,例如,0.4表示为0.400000000002。
  4. 修正Math\Stat\Math.mqh数学库中出现的错误。该数学库中的MathSample函数已经过修改,以匹配类似数学库在回溯采样时的传统行为。
  5. 修正当没有提供交易品种报价时,可能导致过夜返回过时数据的CopyTicks/CopyTicksRange错误。
  6. 在ENUM_CUSTOMIND_PROPERTY_INTEGER枚举中,添加INDICATOR_FIXED_MINIMUM和INDICATOR_FIXED_MAXIMUM新值。
    使用这些属性,您可以使用IndicatorSetInteger函数修正/取消修正最小和最大指标值。调用IndicatorSetInteger(INDICATOR_FIXED_MINIMUM/INDICATOR_FIXED_MAXIMUM, true)时,使用当前的最小值或最大值。


Tester

  1. 修正夏普比率计算算法以匹配传统公式,公式值对应于一年的间隔。之前的算法基于获得的PnL的变量,却忽略了针对未结持仓的净值波动。现在计算包括净值变动,而夏普比率则是按照经典方式进行解释:
    • 夏普比率 < 0 该策略无利润,也不合适。不好。
    • 0 < 夏普比率 < 1.0 风险不会得到回报。当没有其他选择时,可以考虑这种策略。不明确。
    • 夏普比率 ≥ 1.0 如果夏普比率大于 1。这可能意味着风险得到回报,并且投资组合/策略可以显示结果。好。
    • 夏普比率 ≥ 3.0 高数值表示在每笔特定交易中获得损失的概率非常低。非常好。

程序端

  1. 优化程序端的内存消耗。
  2. 通过网络子系统改进平台操作,以提高性能并减少网络延迟。
  3. 删除禁用网格渲染时指标中零网格级别的显示。

28 一月 2022

MetaTrader 5 build 3180:MQL5中的向量和矩阵,提高可用性

程序端

  1. 添加将市场报价交易品种或交易操作从账户历史移动到图表窗口的激活。

    这两个操作可将图表交易品种更改为选定的交易品种。在此之前,他们不会如此激活图表窗口。因此,一些进一步的操作,例如调用交易对话框(F9)或使用热键更改比例(+/-),可能会错误地应用于另一个图表。现在,已通过拖动更改其交易品种的图表将立即被选中以进行进一步的工作。

  2. 添加双击账户历史中交易操作时打开新订单窗口。用户点击操作中的交易品种会立即插入对话框中,从而加快交易速度。快捷菜单中添加一个类似的命令。



  3. 添加在打开新图表时的真实交易量或报价量的智能包含。在分析市场时,此数据很重要。但是,并非所有交易者都知道它在平台中的可用性。

    真实交易量具有更高的优先级。如果交易量是由交易商提供,则会显示在图表上。否则,将启用显示报价量。

    该机制仅在使用default.tpl模板打开图表时使用。如果用户在图表设置中手动禁用了交易量,则在重新打开图表时不再启用交易量。自定义模板不受影响。

  4. 优化并大幅度加速用户界面显示。
  5. 改进通过文件菜单调用的图表打印功能:
    • 修正保存打印设置的问题
    • 改进打印页面外观:增加网格线,删除程序名称,更新页眉字体
    • 放大打印对话框以正确显示界面

  6. 修正图表快速交易面板中的交易量字段操作的问题。在修正之前,输入新值并按下Tab后,值会重置为上一个值。
  7. 修正图表上的交易历史显示。在此之前,在账户之间切换时,之前账户操作不会从图表中删除。
  8. 修正通过PayPal支付MQL5.com的问题。
  9. 修正显示期权波动率图表时平台冻结的问题。
  10. 修正在真实账户注册窗口中的电话号码验证问题。在某些情况下,平台不允许用户在输入正确号码后进入下一个注册阶段。
  11. 修正在加入与MQL5.com成员的群聊时检查权限的问题。以前,新加入的用户只能阅读消息而不能编写消息。
  12. 在数据缺失的情况下更改图表文本。现在,用交易品种名称、时间周期和交易品种替换“等待更新”。
  13. 改进支持build 2450中添加的负价格。现在也可以为相应的市场报价交易品种显示零值。
  14. 修正在Wine下工作时在市场上显示产品LOGO的问题。

MQL5

  1. 我们继续添加向量和矩阵支持。这些新函数大幅度扩展基于神经网络的解决方案开发人员的可能性。

    多个函数目前已准备使用:
    • Eye — 构造一个矩阵,其中指定对角线上为1,其他位置为0。
    • Identity — 构造一个具有指定大小的矩阵,主对角线上为1,其他位置为0。
    • Ones — 构造一个用1填充且具有指定大小的矩阵。
    • Zeroes — 构造一个用零填充且具有指定大小的矩阵。
    • Full — 构造一个用指定值填充且具有指定大小的矩阵。
    • Copy — 构造一个矩阵或向量的副本。
    • Diag — 从矩阵中提取对角线并用向量中的值填充指定的对角线。
    • Tri — 构造一个矩阵,其中指定对角线及其下方为1,其他位置为0。
    • Row — 将矩阵行返回为向量,并用向量中的值填充指定行。
    • Col — 将矩阵列返回为向量,并用向量中的值填充指定列。
    • Rows — 返回矩阵中的行数。
    • Cols — 返回矩阵中的列数。
    • Transpose — 转置一个矩阵。
    • * — 矩阵、向量和标量的乘积 — 点积。
    • Power — 将矩阵提升为幂。
    • Kron — Kronecker乘积。
    • Cholesky — Cholesky分解。
    • QR — 矩阵的QR因式分解。
    • SVD — 奇异值分解。
    • LU — 矩阵的LU分解。
    • LUP — 矩阵的LUP分解。
    • Norm — 计算矩阵范数。
    • Cond — 计算矩阵的条件数。
    • Spectrum — 计算矩阵的频谱。
    • Det — 计算矩阵的行列式。
    • Rank — 计算矩阵的秩。
    • SLogDet — 计算矩阵行列式的符号和底对数。
    • Trace — 计算矩阵迹线。
    • Solve — 求解线性方程组。
    • LstSq — 使用最小二乘法求解线性方程组。
    • Inv — 计算矩阵的逆。
    • PInv — 通过Moore-Penrose方法计算矩阵的伪逆。
    • Compare — 使用epsilon比较两个矩阵。

    有关更多详细信息,请参阅相关MQL5文档

  2. 修正处理与路径长度限制相关的文件和数据库时的错误。特别是,DatabaseOpen函数允许将路径设置为大于可接受的路径,从而导致错误的数据库创建。现在该函数正确返回ERR_TOO_LONG_FILE_NAME错误代码。
  3. 修正变量恒常性控制。之前,编译器有时会跳过“常量变量不能作为引用传递”错误。
  4. 修正关于使用未初始化变量时错误的编译器警告。
  5. 修正指标的ChartWindowOnDropped函数操作。以前,它通常返回零。
  6. 将对Python 3.10的支持添加到Python集成模块。

VPS

  1. 修正在导航器中显示VPS项目的问题。之前,它有时会在账户之间切换时消失。

MetaEditor

  1. 修正调试观察窗口中复杂表达式的展开问题。

Tester

修正将测试报告导出到文件的问题。如果将精度为0位小数的货币用作入金货币,则某些值可能会被错误地四舍五入。例如,JPY。
12345678