MQL5文档: Matrix and vector methods / Products / GeMM
- www.mql5.com
GeMM - Products - Matrix and vector methods - MQL5参考 - 参考MetaTrader 5的算法/自动交易语言
真香
此次更新提供了网页端的改进。我们为网页端界面准备了一组颜色模板,并加强交易品种规格窗口。
此外,新版本还在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); #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 | */ }MetaTrader 5网页端build 3620
更新将通过实时更新系统提供。