Función |
Acción |
---|---|
Singular Value Decomposition, algoritmo divide and conquer. Se considera el más rápido entre otros algoritmos SVD (función lapack de GESDD). |
|
Singular Value Decomposition, algoritmo QR. Se considera un algoritmo SVD clásico (función lapack de GESVD). |
|
Singular Value Decomposition, algoritmo QR with pivoting ( función lapack de GESVDQ). |
|
Singular Value Decomposition, algoritmo bisection (función lapack de GESVDX). |
|
Singular Value Decomposition, algoritmo Jacobi high level (función lapack de GEJSV). |
|
Singular Value Decomposition, algoritmo Jacobi low level (función lapack de GESVJ). En algunos casos, calcula valores singulares pequeños y sus vectores singulares con mucha más precisión que otras rutinas SVD. |
|
Singular Value Decomposition, algoritmo divide and conquer para una matriz bidiagonal (función lapack de BDSDC). |
|
Singular Value Decomposition, algoritmo bisection para matrices bidiagonales ( función lapack de BDSVDX). |
|
Cálculo de los valores y vectores propios de una matriz cuadrada ordinaria usando el algoritmo clásico (función lapack de GEEV). |
|
Cálculo de los valores y vectores propios de una matriz simétrica o hermitiana (conjugada compleja) usando el algoritmo divide and conquer (funciones lapack de SYEVD, HEEVD). |
|
Función de método para calcular las contribuciones relativas de los componentes espectrales a partir de los valores propios. |
|
Función de método para calcular datos reconstruidos y predichos utilizando componentes espectrales de las series temporales de entrada. |
|
Función de método para calcular los componentes reconstruidos de las series temporales de entrada y sus contribuciones. |
|
Función de método para calcular una serie temporal reconstruida utilizando los primeros componentes de component_count. |
Terminal
MQL5
Web Terminal
La actualización estará disponible a través del sistema Live Update.
MetaTrader 5 Android
Actualice sus aplicaciones móviles al build 4360 a través de Google Play, Huawei AppGallery o descargue el archivo APK.
Terminal
MetaTester
Terminal web
MetaEditor
Terminal
MQL5
Terminal web MetaTrader 5
vector<double/complex> operator[](const int i) const; vector<double/complex> operator[](const ulong i) const;Ahora, en lugar de ellos, se utilizará un método con un valor de retorno constante:
const vector<double/complex> operator[](const ulong i) const;La corrección realizada nos permitirá detectar el uso incorrecto del resultado: en la nueva versión de Alglib, el código mat[row][col]=x funciona de forma diferente que en la anterior. Antes, esto suponía la escritura en un array, pero ahora supone la escritura en un objeto vectorial temporal <double/complex> que se destruye inmediatamente después de la escritura.
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);Como los formatos de números reales para 16 y 8 bits pueden diferir, en el parámetro fmt en las funciones de conversión se deberá indicar qué formato de número debe procesarse. Para las versiones de 16 bits se utilizará la nueva enumeración NUM_FLOAT16_FORMAT, que actualmente tiene los siguientes valores:
Correcciones de crash logs.
Terminal
MQL5
MetaEditor
Simulador
Terminal web
Terminal
MQL5
Terminal web MetaTrader 5
Terminal
Terminal web MetaTrader 5
Terminal
MQL5
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ 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)]] */ }
from sys import argv data_path=argv[0] last_index=data_path.rfind("\\")+1 data_path=data_path[0:last_index] from sklearn.datasets import load_iris iris_dataset = load_iris() from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0) from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=1) knn.fit(X_train, y_train) # Convert into ONNX format from skl2onnx import convert_sklearn from skl2onnx.common.data_types import 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())Abra el archivo onnx creado en MetaEditor:
struct MyMap { long key[]; float value[]; };Aquí hemos utilizado arrays dinámicos con los tipos correspondientes. En este caso, podemos usar arrays fijos, ya que para este modelo Map siempre contiene 3 pares clave+valor.
//--- declaramos un array para recibir los datos de la capa de salida output_probability MyMap output_probability[]; ... //--- ejecución del modelo OnnxRun(modelo,ONNX_DEBUG_LOGS,float_input,output_label,output_probability);
MetaEditor
MetaTrader 5 Web Terminal build 3980
Terminal
El informe se divide en cuatro pestañas, cada una de las cuales contiene información añadida en su propia sección:
Los nuevos informes le permitirán evaluar visualmente los resultados del comercio en múltiples secciones transversales con solo clicar en la pestaña correspondiente. Los histogramas, gráficos y cuadros son interactivos y ofrecen información adicional al pasar el ratón por encima. Nuestros diseñadores han hecho un gran esfuerzo para que la información de los informes se pueda leer de la forma más fácil y clara posible. ¡Pruébelo usted mismo y notará la diferencia!
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 Hosting
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;
MetaEditor
Simulador
Correcciones de crash logs.
MetaTrader 5 Web Terminal build 3950
Terminal
MQL5
double vector::RegressionMetric( const vector& vector_true, // valores verdaderos const ENUM_REGRESSION_METRIC metric // métrica ); double matrix::RegressionMetric( const matrix& matrix_true, // valores verdaderos const ENUM_REGRESSION_METRIC metric // métrica ); vector matrix::RegressionMetric( const matrix& matrix_true, // valores verdaderos const ENUM_REGRESSION_METRIC metric, // métrica const int axis // eje );
vector vector::LinearRegression(); matrix matrix::LinearRegression( ENUM_MATRIX_AXIS axis=AXIS_NONE // eje a lo largo del cual se calcula la regresión );Ejemplo:
vector vector_a; //--- rellenamos el vector con los precios vector_a.CopyRates(_Symbol,_Period,COPY_RATES_CLOSE,1,100); //--- obtenemos la regresión lineal vector vector_r=vector_a.LinearRegression();Visualización del resultado en forma de gráfico:
ulong vector::HasNan(); ulong matrix::HasNan();Los métodos Compare y CompareByDigits, al comparar un par de elementos que tienen valores NaN, tratan estos elementos como iguales, mientras que con una comparación normal de números de coma flotante, NaN != NaN.
Modificada la estructura OnnxTypeInfo, utilizada para trabajar con modelos ONNX:
struct OnnxTypeInfo { ENUM_ONNX_TYPE type; // tipo de parámetro OnnxTensorTypeInfo tensor; // descripción del tensor OnnxMapTypeInfo map; // descripción del mapa OnnxSequenceTypeInfo sequence; // descripción de la secuencia };
Ahora el tipo de datos se especifica en ella usando nuevas subestructuras:
struct OnnxTensorTypeInfo { ENUM_ONNX_DATATYPE data_type; // tipo de datos en el tensor long dimensions[]; // número de elementos }; struct OnnxMapTypeInfo { ENUM_ONNX_DATA_TYPE key_type; // tipo de clave OnnxTypeInfo type_info; // tipo de valor }; struct OnnxSequenceTypeInfo { OnnxTypeInfo type_info; // tipo de datos en la secuencia };Dependiendo de OnnxTypeInfo::type (ONNX_TYPE_TENSOR, ONNX_TYPE_MAP o ONNX_TYPE_SEQUENCE) se rellenará la subestructura correspondiente.
bool vector<T>::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,ulong start_pos,ulong count); bool vector<T>::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,ulong count); bool vector<T>::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,datetime stop_time);
MetaEditor
Simulador
Correcciones de crash logs.
Web Terminal
MQL5.community
Terminal
MQL5
Web Terminal
Web Terminal
MQL5
MQL5: Añadidas las banderas COPY_TICKS_VERTICAL y COPY_RATES_VERTICAL para los métodos CopyTicks, CopyTicksRange y CopyRates, respectivamente.
Por
defecto, el copiado de ticks y series en la matriz se realiza a lo
largo del eje horizontal, es decir, los datos se añadirán a la izquierda
al final de la fila. En las tareas de inicio de un modelo ONNX entrenado, dicha matriz deberá transponerse para suministrar los datos de entrada:
const long ExtOutputShape[] = {1,1}; // model output shape const long ExtInputShape [] = {1,10,4}; // model input form #resource "Python/model.onnx" as uchar ExtModel[] // model as resource //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ int OnStart(void) { matrix rates; //--- get 10 bars if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10)) return(-1); //--- input a set of OHLC vectors 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);
Ahora, bastará con indicar la bandera adicional COPY_RATES_VERTICAL (COPY_TICKS_VERTICAL para los ticks) al llamar al método para evitar operaciones innecesarias de transformación de datos:
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ int OnStart(void) { matrix rates; //--- get 10 bars if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC|COPY_RATES_VERTICAL,2,10)) return(-1); //--- input a set of OHLC vectors
MetaEditor
Terminal
Terminal
MQL5
Compile el proyecto y ejecútelo en EURUSD H1 para ver el resultado.
Además
del modelo ya preparado y del código MQL5 para ejecutarlo, en el
proyecto también estará disponible el script Python
PricePredictionTraining.py. Este muestra cómo crear un modelo ONNX por
uno mismo. Para ejecutar el script, instale Python en su ordenador,
además de los módulos necesarios desde la línea de comandos:
#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)
Para procesar correctamente las matrices y vectores, además de sus búferes, deberemos transmitir sus dimensiones.Añadida la nueva función CopySeries para copiar series temporales sincronizadas desde MqlRates a arrays aparte.
La función CopySeries permite obtener de una sola vez solo las series temporales deseadas en los distintos arrays especificados, además, todas ellas estarán sincronizadas entre sí. Esto significa que todos los valores de los arrays resultantes para un determinado índice N pertenecerán a la misma barra en el par Símbolo/Marco temporal indicado. En este caso, no será necesario preocuparse de que todas las series temporales obtenidas estén sincronizadas con la hora de apertura de la barra.
A diferencia de CopyRates, que retorna un conjunto completo de series temporales como un array MQLRates, la función CopySeries permite al programador obtener solo las series temporales deseadas usando como base una combinación de banderas que indican el tipo de serie temporal solicitada. El orden de los arrays transmitidos a la función deberá coincidir con el orden de los campos de la estructura MqlRates:
struct MqlRates
{
datetime time; // hora de inicio del periodo
double open; // precio de apertura
double high; // precio máximo en el periodo
double low; // precio mínimo en el periodo
double close; // precio de cierre
long tick_volume; // volumen de ticks
int spread; // spread
long real_volume; // volumen bursátil
}
Así, si desea obtener los valores de las series temporales time, close y real_volume de las últimas 100 barras del símbolo/marco temporal actual, la llamada debería ser la siguiente:
datetime time[];
double close[];
long volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
El orden de los arrays "time, close, volume" es importante: deberá coincidir con el orden de los campos de la estructura MqlRates. En cambio, el orden de los valores en la máscara rates_mask no importará, la máscara podría ser así:
COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE
Ejemplo
//--- input parameters
input datetime InpDateFrom=D'2022.01.01 00:00:00';
input datetime InpDateTo =D'2023.01.01 00:00:00';
input uint InpCount =20;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart(void)
{
//--- matrices para obtener las series temporales de la estructura de precio Rates
double open[];
double close[];
float closef[];
datetime time1[], time2[];
//---solicitamos los precios de cierre a un array del tipo 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);
//--- ahora solicitaremos más precios apertura, mientras que los precios de cierre los solicitaremos a un array de tipo 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);
//--- comparamos los datos obtenidos
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]);
}
}
/* Resultado
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
Simulador
MetaTrader 5 Web Terminal build 3620
Terminal
Web Terminal
WebTerminal
Terminal
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); }Resultado: