新版MetaTrader 5 build 3620:网页端改进,ONNX支持和MQL5快速矩阵乘法 新评论 MetaQuotes 2023.03.03 19:02 此次更新提供了网页端的改进。我们为网页端界面准备了一组颜色模板,并加强交易品种规格窗口。 此外,新版本还在MQL5中提供了通用矩阵乘法 (GeMM)。该算法可加快大部分处理器的计算速度。matrix::GeMM方法目前支持新算法。 我们还在MQL5中实现了对ONNX模型操作的支持。这将大幅度促进神经网络在EA交易中的使用。 新版将有以下变化: MetaTrader 5客户端build 3620 程序端:修正交易报告中的总利润计算的问题。 程序端:更新通过市场报价窗口获取的交易品种的基本数据。 程序端:修正交易品种在Linux系统中Wine 7.0.1下启动的问题。 程序端:修正通过搜索栏将交易品种添加到市场深度中的问题。通过描述找到的交易品种无法通过点击其行来添加到列表中。 MQL5:添加对ONNX模型(开放式神经网络交换)操作的支持。 ONNX是一种机器学习模型的开源格式。许多平台支持这种格式,包括Chainer, Caffee2和PyTorch。使用专门的工具创建ONNX模型,将其整合到您的MQL5应用程序,并使用它来做出交易决策。 所有支持的功能描述都在文件中提供。在MetaEditor公共项目中提供了一个测试ONNX模型的示例。在“工具箱/公共项目”中找到ONNX.Price.Prediction项目,在快捷菜单中选择加入。该项目将下载到您的计算机,并显示在导航器中: 编译该项目并在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的说明可在文件中获得。 MQL5:添加对一般矩阵乘法(GeMM)的支持。该算法通过并行化任务和优化使用L1/L2/L3缓存来加速某些处理器类型的计算。计算速度可与广受欢迎的软件包相媲美,如Math Kernel Library (MKL)和OpenBLAS。详细的对比测试即将公布。 matrix::GeMM方法目前支持新算法。如果您的处理器支持AVX和FMA指令(2013年后发布的大多数处理器都支持这些指令),该算法将被自动启用。 MQL5:添加将矩阵和向量传输到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); #importC++ 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)除了缓冲区之外,您还应该传递矩阵和向量大小以进行正确的处理。 MQL5:添加新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 | */ } MQL5:修正OrderSend函数的操作。如果在多个平台上同时使用同一个账户,该函数请求可能会返回错误的订单。 MQL5:修正EX5程序库的导入。如果导入程序库的名称与导入的文件名称一致,则发生错误。 MetaEditor:添加向共享项目成员发送推送通知的功能。新选项可以通知用户有关项目设置和文件的更改。要启用通知,请在您的MQL5.community个人资料的“设置\安全”部分输入您的MetaQuotes ID。 MetaEditor:更新导航器中的文件图标。全新、简单的隐喻将使它们更容易理解。 Tester:修正导致输入字符串参数在包含“|”字符时被截断的错误。 修正崩溃日志中的错误报告。 MetaTrader 5网页端build 3620 为网页端界面添加现有的颜色模板。模板会影响图表柱形图和线型图的显示,以及市场报价和账户财务报表中的价格。我们设计团队根据您的建议和传统颜色组合准备了颜色模板预设。 重新设计交易品种规格窗口。为了便于查看,交易品种数据已重新排列成逻辑块。 修正通过网页端开设真实账户的问题。服务器可能会在填写注册表后返回错误。 修正交易对话框中的错误。如果用户在持仓修改对话框打开时通过按下工具箱窗口中的X按键关闭持仓,则对话框内容不会重置。更新后,在这种情况下对话框将自动重置为新的下单模式。 修正账户管理对话框中服务器字段的显示。 修正工具栏上当前时间周期的显示。 修正在交易对话框中基础资产单位的交易量显示。 修正持仓止损和止盈水平的修改。修改在某些情况下其中一个值可能会重置第二个值。 修正投资风险提示的显示。 更新将通过实时更新系统提供。 New MetaTrader 5 build 3620: Web Terminal improvements, ONNX support and fast matrix multiplications in MQL5 如何在 MQL5 中使用 ONNX 模型 Xiaoyu Huang 2023.03.06 11:23 #1 通用矩阵乘法 (GeMM) https://www.mql5.com/zh/docs/matrix/matrix_products/matrix_gemm MQL5文档: Matrix and vector methods / Products / GeMM www.mql5.com GeMM - Products - Matrix and vector methods - MQL5参考 - 参考MetaTrader 5的算法/自动交易语言 欧阳 2023.03.06 14:48 #2 真香 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
此次更新提供了网页端的改进。我们为网页端界面准备了一组颜色模板,并加强交易品种规格窗口。
此外,新版本还在MQL5中提供了通用矩阵乘法 (GeMM)。该算法可加快大部分处理器的计算速度。matrix::GeMM方法目前支持新算法。
我们还在MQL5中实现了对ONNX模型操作的支持。这将大幅度促进神经网络在EA交易中的使用。
新版将有以下变化:
MetaTrader 5客户端build 3620
ONNX是一种机器学习模型的开源格式。许多平台支持这种格式,包括Chainer, Caffee2和PyTorch。使用专门的工具创建ONNX模型,将其整合到您的MQL5应用程序,并使用它来做出交易决策。
所有支持的功能描述都在文件中提供。在MetaEditor公共项目中提供了一个测试ONNX模型的示例。在“工具箱/公共项目”中找到ONNX.Price.Prediction项目,在快捷菜单中选择加入。该项目将下载到您的计算机,并显示在导航器中:
编译该项目并在EURUSD H1上运行以查看结果。
除了模型和运行模型的MQL5代码外,该项目还包括PricePredictionTraining.py Python脚本。该脚本显示了您如何自己创建一个ONNX模型。要运行该脚本,请在计算机上安装Python,并从提示行安装所需的模块:
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
matrix::GeMM方法目前支持新算法。如果您的处理器支持AVX和FMA指令(2013年后发布的大多数处理器都支持这些指令),该算法将被自动启用。
矩阵和向量作为指向缓冲区的指针传递给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)
除了缓冲区之外,您还应该传递矩阵和向量大小以进行正确的处理。MQL5:添加新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 | */ }
MetaTrader 5网页端build 3620
更新将通过实时更新系统提供。