函数 |
操作 |
---|---|
奇异值分解(SVD),分而治之算法;被认为是其他 SVD 算法中最快的算法(lapack 函数为 GESDD)。 |
|
奇异值分解,QR 算法;被认为是经典的 SVD 算法(lapack 函数为 GESVD)。 |
|
奇异值分解、带枢轴算法的 QR(lapack 函数为 GESVDQ)。 |
|
奇异值分解,分段算法(lapack 函数为 GESVDX)。 |
|
奇异值分解,Jacobi 高级算法(lapack 函数为 GEJSV)。 |
|
奇异值分解,Jacobi 低级算法(lapack 函数为 GESVJ)。在某些情况下,该方法计算小奇异值及其奇异向量的精确度远远高于其他 SVD 程序。 |
|
奇异值分解,双对角矩阵的分而治之算法(lapack 函数为 BDSVDX)。 |
|
奇异值分解,双对角矩阵的分段算法(lapack 函数为 BDSVDX)。 |
|
使用经典算法计算正方形矩阵的特征值和特征向量(lapack 函数为 GEEV)。 |
|
使用分而治之算法计算对称或 Hermitian(复共轭)矩阵的特征值和特征向量(lapack 函数为 SYEVD、HEEVD)。 |
|
基于特征值计算光谱成分相对贡献的方法函数 |
|
利用输入时间序列的频谱成分计算重建和预测数据的方法函数。 |
|
用于计算输入时间序列的重构成分及其贡献的方法函数。 |
|
利用第一个 component_count 组件计算重建时间序列的方法函数。 |
客户端
MQL5
网页端
更新将通过实时更新系统提供。
MetaTrader 5 Android
通过Google Play、华为 AppGallery或下载APK文件更新手机应用程序。
MetaEditor
程序端
MQL5
MetaTrader 5网页端
vector<double/complex> operator[](const int i) const; vector<double/complex> operator[](const ulong i) const;取而代之的是一个具有恒定返回值的方法:
const vector<double/complex> operator[](const ulong i) const;在新版Alglib中,mat[row][col]=x的代码运行方式与旧版不同,因此此次修改将有助于在适当的位置捕捉结果的错误使用。以前,这表示写入一个矩阵。现在,该值被写入一个临时对象向量<double/complex>,记录后会立即销毁。
bool ArrayToFP16(ushort &dst_array[],const float &src_array[],ENUM_FLOAT16_FORMAT fmt); bool ArrayToFP16(ushort &dst_array[],const double &src_array[],ENUM_FLOAT16_FORMAT fmt); bool ArrayToFP8(uchar &dst_array[],const float &src_array[],ENUM_FLOAT8_FORMAT fmt); bool ArrayToFP8(uchar &dst_array[],const double &src_array[],ENUM_FLOAT8_FORMAT fmt); bool ArrayFromFP16(float &dst_array[],const ushort &src_array[],ENUM_FLOAT16_FORMAT fmt); bool ArrayFromFP16(double &dst_array[],const ushort &src_array[],ENUM_FLOAT16_FORMAT fmt); bool ArrayFromFP8(float &dst_array[],const uchar &src_array[],ENUM_FLOAT8_FORMAT fmt); bool ArrayFromFP8(double &dst_array[],const uchar &src_array[],ENUM_FLOAT8_FORMAT fmt);由于16位和8位的实数格式可能不同,因此转换函数中的“fmt”参数必须指示需要处理哪种数字格式。对于16位版本,使用新的枚举NUM_FLOAT16_FORMAT,当前具有以下值:
程序端
MQL5
MetaEditor
Tester
网页端
程序端
MQL5
MetaTrader 5网页端
程序端
MetaTrader 5网页端
程序端
MQL5
//+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart() { complex a=1+1i; complex b=a.Conjugate(); Print(a, " ", b); /* (1,1) (1,-1) */ vectorc va= {0.1+0.1i, 0.2+0.2i, 0.3+0.3i}; vectorc vb=va.Conjugate(); Print(va, " ", vb); /* [(0.1,0.1),(0.2,0.2),(0.3,0.3)] [(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)] */ matrixc ma(2, 3); ma.Row(va, 0); ma.Row(vb, 1); matrixc mb=ma.Conjugate(); Print(ma); Print(mb); /* [[(0.1,0.1),(0.2,0.2),(0.3,0.3)] [(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)]] [[(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)] [(0.1,0.1),(0.2,0.2),(0.3,0.3)]] */ ma=mb.Transpose().Conjugate(); Print(ma); /* [[(0.1,0.1),(0.1,-0.1)] [(0.2,0.2),(0.2,-0.2)] [(0.3,0.3),(0.3,-0.3)]] */ }
从 sys 导入 argv data_path=argv[0] last_index=data_path.rfind("\\")+1 data_path=data_path[0:last_index] 从 sklearn.datasets 导入 load_iris iris_dataset = load_iris() 从 sklearn.model_selection 导入 train_test_split X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0) 从 sklearn.neighbors 导入 KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=1) knn.fit(X_train, y_train) # 转换 为 ONNX格式 从 skl2onnx 导入 convert_sklearn 从 skl2onnx.common.data_types 导入 FloatTensorType initial_type = [('float_input', FloatTensorType([None, 4]))] onx = convert_sklearn(knn, initial_types=initial_type) path = data_path+"iris.onnx" with open(path, "wb") as f: f.write(onx.SerializeToString())在MetaEditor中打开创建的onnx文件:
struct MyMap { long key[]; float value[]; };这里我们使用具有适当类型的动态数组。在这种情况下,我们可以使用固定数组,因为这个模型的Map始终包含3个键+值对。
//--- 声明一个数组来接收来自输出层output_probability的数据 MyMap output_probability[]; ... //--- 模型运行 OnnxRun(model,ONNX_DEBUG_LOGS,float_input,output_label,output_probability);
MetaEditor
程序端
报告分为四个选项卡,每个选项卡都包含汇总信息:
Terminal MetaTrader 5 x64 build 3914 started for MetaQuotes Software Corp.
Terminal Windows 10 build 19045, 20 x Intel Xeon E5-2630 v4 @ 2.20GHz, AVX, 41 / 63 Gb memory, 58 / 280 Gb disk, UAC, GMT+2
VPS主机
MQL5
#define MACRO1 /* #define MACRO2 */ void OnStart() { #ifdef MACRO2 Print( 2 ); #else Print( 1 ); #endif }
void OnStart() { Print("CPU name: ",TerminalInfoString(TERMINAL_CPU_NAME)); Print("CPU cores: ",TerminalInfoInteger(TERMINAL_CPU_CORES)); Print("CPU architecture: ",TerminalInfoString(TERMINAL_CPU_ARCHITECTURE)); Print(""); Print("EX5 architecture: ",__CPU_ARCHITECTURE__); } CPU name: 12th Gen Intel Core i9-12900K CPU cores: 24 CPU architecture: AVX2 + FMA3 EX5 architecture: AVX
extern int X=0; void OnStart() { }
extern int X; void OnStart() { }
extern int X; int Y=X; void OnStart(void) { Print("Y=",Y," X=",X); } int X=_Digits;
将ALGLIB库更新至版本3.19。ALGLIB是一个高性能的数值分析库,专用于数值方法和数据分析算法。
我们修正了现有的库类来使用矩阵和向量,还添加了ALGLIB
3.19的新功能。所有的源代码都经过修改,并采用了单一的设计风格。ALGLIB库的源代码位于<程序端数据目录>\MQL5\Include\Math\Alglib。测试脚本位于MQL5\Scripts\UnitTests\Alglib。
除了库本身之外,测试脚本也进行了更新 - 类的测试数量从62个增加到91个,接口的测试数量从143个增加到152个。因此,MetaTrader 5平台开发人员为交易者提供了更有效的解决方案:
MetaEditor
Tester
MetaTrader 5网页端build 3950
程序端
MQL5
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 // 坐标轴 );
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();该结果在图形中可视化:
ulong vector::HasNan(); ulong matrix::HasNan();当比较具有NaN值的相应元素对时,Compare和CompareByDigits方法认为这些元素相等,而在通常的浮点数比较中,NaN != NaN。
修改用于操作ONNX(开放神经网络交换)模型的OnnxTypeInfo结构:
struct OnnxTypeInfo { ENUM_ONNX_TYPE type; // 参数类型 OnnxTensorTypeInfo tensor; // 张量描述 OnnxMapTypeInfo map; // 地图描述 OnnxSequenceTypeInfo sequence; // 序列描述 };
使用新子结构在结构中指定数据类型:
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),填写相关子结构。
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);
MetaEditor
Tester
网页端
MQL5.community
客户端
MQL5
网页端
网页端
MQL5
MQL5:分别为CopyTicks、CopyTicksRange和CopyRates方法添加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_VERTICAL(COPY_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向量
MetaEditor
客户端
程序端
MQL5
编译该项目并在EURUSD H1上运行以查看结果。
除了模型和运行模型的MQL5代码外,该项目还包括PricePredictionTraining.py Python脚本。该脚本显示了您如何自己创建一个ONNX模型。要运行该脚本,请在计算机上安装Python,并从提示行安装所需的模块:
#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)
除了缓冲区之外,您还应该传递矩阵和向量大小以进行正确的处理。添加新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 |
*/
}
MetaEditor
Tester
MetaTrader 5网页端build 3620
网页端
客户端
MQL5
long preferred_workgroup_size_multiple=OpenCL.GetDeviceInfo(0x1067);
void OnStart() { string cpu,os; //--- cpu=TerminalInfoString(TERMINAL_CPU_NAME); os=TerminalInfoString(TERMINAL_OS_VERSION); PrintFormat("CPU: %s, OS: %s",cpu,os); }Result:
MetaEditor