程序端
- 修正交易报告中的总利润计算的问题。
- 更新通过市场报价窗口获取的交易品种的基本数据。
- 修正交易品种在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关于如何使用ONNX的说明可在文件中获得。
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 python -m pip install --upgrade tf2onnx
- 添加对一般矩阵乘法(GeMM)的支持。该算法通过并行化任务和优化使用L1/L2/L3缓存来加速某些处理器类型的计算。计算速度可与广受欢迎的软件包相媲美,如Math Kernel Library (MKL)和OpenBLAS。详细的对比测试即将公布。
matrix::GeMM方法目前支持新算法。如果您的处理器支持AVX和FMA指令(2013年后发布的大多数处理器都支持这些指令),该算法将被自动启用。
- 添加将矩阵和向量传输到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)除了缓冲区之外,您还应该传递矩阵和向量大小以进行正确的处理。
-
添加新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 | */ } - 修正OrderSend函数的操作。如果在多个平台上同时使用同一个账户,该函数请求可能会返回错误的订单。
- 修正EX5程序库的导入。如果导入程序库的名称与导入的文件名称一致,则发生错误。
MetaEditor
- 添加向共享项目成员发送推送通知的功能。新选项可以通知用户有关项目设置和文件的更改。要启用通知,请在您的MQL5.community个人资料的“设置\安全”部分输入您的MetaQuotes ID。
- 更新导航器中的文件图标。全新、简单的隐喻将使它们更容易理解。
Tester
- 修正导致输入字符串参数在包含“|”字符时被截断的错误。
MetaTrader 5网页端build 3620
- 为网页端界面添加现有的颜色模板。模板会影响图表柱形图和线型图的显示,以及市场报价和账户财务报表中的价格。我们设计团队根据您的建议和传统颜色组合准备了颜色模板预设。
- 重新设计交易品种规格窗口。为了便于查看,交易品种数据已重新排列成逻辑块。
- 修正通过网页端开设真实账户的问题。服务器可能会在填写注册表后返回错误。
- 修正交易对话框中的错误。如果用户在持仓修改对话框打开时通过按下工具箱窗口中的X按键关闭持仓,则对话框内容不会重置。更新后,在这种情况下对话框将自动重置为新的下单模式。
- 修正账户管理对话框中服务器字段的显示。
- 修正工具栏上当前时间周期的显示。
- 修正在交易对话框中基础资产单位的交易量显示。
- 修正持仓止损和止盈水平的修改。修改在某些情况下其中一个值可能会重置第二个值。
- 修正投资风险提示的显示。