Nueva versión de MetaTrader 5 build 3620: mejoras en el terminal web, soporte de ONNX y multiplicación acelerada de matrices en MQL5
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
El viernes 10 de marzo de 2023 se lanzará la versión actualizada de la plataforma MetaTrader 5 en el modo beta.
En esta actualización, hemos mejorado el terminal web, añadiéndole diferentes esquemas de color para la interfaz y también hemos mejorado la ventana de especificación de instrumentos.
Además, MQL5 ofrece ahora soporte al nuevo algoritmo de multiplicación de matrices General Matrix Multiplication (GeMM), que permite acelerar considerablemente la computación en la mayoría de los procesadores. En estos momentos, el nuevo algoritmo es compatible con el método matrix::GeMM.
MQL5 también permite trabajar con modelos ONNX: esto facilitará significativamente el uso de redes neuronales en los asesores comerciales.
La actualización contiene los siguientes cambios:
MetaTrader 5 Client Terminal build 3620
ONNX es una biblioteca abierta para construir redes neuronales de aprendizaje profundo. Este formato es compatible con muchas plataformas, como Chainer, Caffee2 y PyTorch. Al crear un modelo ONNX usando herramientas especializadas, podemos integrarlo en nuestro programa MQL5 y utilizarlo para tomar decisiones comerciales.
La documentación incluye una descripción de todas las funciones compatibles. Encontrará un ejemplo de trabajo con un modelo de prueba en los proyectos públicos en el MetaEditor. Busque el proyecto ONNX.Price.Prediction en el apartado "Herramientas \ Proyectos Públicos", y pulse después "Unirse" en el menú contextual. El proyecto se descargará en su ordenador y aparecerá en el Navegador:
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:
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
Actualmente, el nuevo algoritmo es compatible con el método matrix::GeMM. Si su procesador admite las instrucciones AVX y FMA (como la mayoría de los procesadores lanzados después de 2013), el algoritmo se activará automáticamente.
Las matrices y los vectores se transmiten a DLL como un puntero al búfer. Por ejemplo, para transmitir una matriz de tipo float, el parámetro correspondiente de la función exportada desde la DLL deberá tomar un puntero a un búfer de tipo float. Ejemplo:
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)
Para procesar correctamente las matrices y vectores, además de sus búferes, deberemos transmitir sus dimensiones.MQL5: 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 | */ }
MetaTrader 5 Web Terminal build 3620
La actualización estará disponible a través del sistema Live Update.