MetaTrader 5 build 3620: mejoras en el terminal web, soporte de ONNX y multiplicación acelerada de matrices en MQL5

Añadido el soporte para trabajar con modelos ONNX (Open Neural Network Exchange). ONNX es una biblioteca abierta para construir redes neuronales de aprendizaje profundo

10 marzo 2023

Terminal

  1. Corregido el error en el cálculo del beneficio final en el informe comercial.
  2. Actualizados los datos fundamentales de los instrumentos comerciales disponibles a través de la Observación de Mercado.
  3. Corregida la ejecución de la plataforma comercial en Wine 7.0.1 al ejecutarse en los sistemas Linux.
  4. Corregida la adición de símbolos a la Observación de Mercado a través de la barra de búsqueda. Antes no se podía añadir a la lista un símbolo encontrado según la descripción clicando en su línea.

MQL5

  1.  Añadido el soporte para trabajar con modelos ONNX (Open Neural Network Exchange).

    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:


    Ejemplo de trabajo con un modelo ONNX en un proyecto público


    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.exe -m pip install --upgrade pip
    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
    En la documentación encontrará instrucciones detalladas sobre cómo utilizar ONNX.

  2. Añadido el soporte para el nuevo algoritmo de multiplicación de matrices General Matrix Multiplication (GeMM). Dicho algoritmo acelera sustancialmente los cálculos en la mayoría de los procesadores al paralelizar las tareas y ayuda a aprovechar mejor las cachés L1/L2/L3. La velocidad de cálculo es comparable a la de paquetes tan conocidos como Math Kernel Library (MKL) y OpenBLAS. En breve publicaremos pruebas comparativas detalladas.

    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.

  3. Añadido el soporte de transferencia de matrices y vectores a DLL. Ahora podrá importar funciones que usen este tipo de datos desde bibliotecas externas.

    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.

  4. 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   |
    */
      }
  5. Corregido el error que, en raras ocasiones, provocaba que se obtuviera un ticket de orden incorrecto después de enviar una solicitud con la función OrderSend. El error podía producirse al comerciar en paralelo en la misma cuenta a través de diferentes plataformas.
  6. Corregido el error al importar bibliotecas EX5 que ocurría si el nombre de la biblioteca que se estaba importando era el mismo que el nombre del archivo en el que se estaba importando.

MetaEditor

  1. Añadidas notificaciones Push a los participantes de los proyectos grupales. Ahora, todos los participantes estarán siempre al tanto de cualquier cambio en los archivos o en la configuración del proyecto. Para recibir notificaciones, indique su MetaQuotes ID en la sección "Ajustes \ Seguridad" de su perfil en MQL5.community.


    Notificaciones push sobre cambios en el proyecto


  2. Actualizados los iconos de los archivos en el Navegador. Las nuevas metáforas, más sencillas, facilitarán la comprensión de la información.

Simulador

  1. Corregido el error que provocaba el recorte del parámetro string de entrada si contenía el carácter "|".

MetaTrader 5 Web Terminal build 3620

  1. Añadidos varios esquemas de color para la interfaz. Estos afectan a la visualización de las barras y líneas en el gráfico, a los precios en la Observación de Mercado y al rendimiento financiero de la cuenta. Nuestros diseñadores han elegido combinaciones de colores cómodas pensando en los tráders.


    Nuevos esquemas de color para el terminal web


  2. Rediseñada la ventana de especificación del instrumento comercial. Todos los datos se organizan ahora en bloques lógicos compactos para facilitar su visualización.


    Ventana de especificación de instrumentos comerciales actualizada


  3. Corregida la apertura de cuentas reales a través del terminal web. En algunos casos, el servidor podía retornar un error tras completar el formulario de registro.
  4. Corregido el error en la ventana de diálogo comercial. Si el usuario abría la ventana de diálogo de modificación de la posición y luego cerraba la posición con el botón "X" de la ventana de herramientas, no se restablecía el contenido de la ventana de diálogo. En este caso, la ventana de diálogo volverá automáticamente al modo de colocación de nuevas órdenes.
  5. Corregida la visualización del campo Server en la ventana de diálogo de gestión de cuentas.
  6. Corregida la visualización fija del marco temporal actual en la barra de herramientas.
  7. Corregida la visualización fija del volumen en número de unidades del activo básico en la ventana de diálogo comercial.
  8. Corregida la modificación de los niveles de Stop Loss y Take Profit. En algunos casos, la modificación de un valor podía provocar que otro se reseteara.
  9. Corregida la visualización del aviso de riesgo para el inversor.