MetaTrader 5 build 3390: Float en OpenCL y funciones matemáticas, métodos de activación y pérdida para el aprendizaje automático

Actualizada la base de datos fundamentales de los instrumentos comerciales. El número de agregadores disponibles para ver un instrumento bursátil se ha ampliado a 15, lo cual le permitirá encontrar información sobre el mayor número posible de tickers en los agregadores económicos más populares

4 agosto 2022

Terminal

  1. Añadida la apertura automática del tutorial la primera vez que se conecte a su cuenta comercial. Esto permitirá a los principiantes aprender los fundamentos del comercio más rápidamente y familiarizarse con las características de la plataforma directamente en el terminal. El tutorial está dividido en varias secciones, cada una con una breve información. El progreso de la rúbrica se mostrará con una línea azul.

    Añadida la apertura automática del tutorial la primera vez que se conecte a su cuenta comercial.

  2. Corregido el error de las operaciones grupales "Cerrar posiciones con beneficios/pérdidas". Antes, la plataforma usaba las posiciones opuestas para cerrar las posiciones correspondientes, si las había. Por ejemplo, si teníamos dos posiciones de compra con pérdidas en EURUSD y una posición de venta con beneficios en EURUSD, al realizar el cierre masivo de las posiciones con pérdidas, las tres posiciones existentes se cerrarían. Las posiciones Buy y Sell se cerrarían con una operación Close by, mientras que la posición Buy restante se cerraría con una operación de cierre normal. Los comandos ahora funcionan según lo previsto, cerrando solo las posiciones seleccionadas, sean o no rentables.

  3. Corregida la visualización de la historia de precios para los precios negativos en los gráficos del periodo D1. Los gráficos de precios negativos se muestran ahora correctamente en todos los marcos temporales.
  4. Optimizado y significativamente reducido el consumo de recursos del sistema por parte del terminal.
  5. Actualizada la base de datos fundamentales de los instrumentos comerciales. El número de agregadores disponibles para ver un instrumento bursátil se ha ampliado a 15, lo cual le permitirá encontrar información sobre el mayor número posible de tickers en los agregadores económicos más populares.

    Actualizada la base de datos fundamentales de los instrumentos comerciales

    En todo el mundo cotizan al menos 7.000 acciones líquidas y más de 2.000 ETF. Además, hay muchos futuros y otros derivados. La plataforma MetaTrader 5 contiene una enorme base de datos de instrumentos bursátiles y le permite ir directamente desde la Observación de Mercado a la página web del agregador en un solo clic para obtener datos fundamentales. Para la comodidad de los inversores, ofrecemos una variedad de fuentes de información a elegir para cada valor.

  6. Corregido el ajuste de los niveles de Stop Loss y Take Profit en la nueva ventana de colocación de nuevas órdenes. En el caso de las cuentas FIFO, los niveles de stop se fijarán ahora de manera automática según los niveles de stop de las posiciones ya abiertas para el mismo instrumento. Esto será necesario para cumplir con la regla FIFO.

MQL5

  1. Las funciones matemáticas ahora pueden trabajar con matrices y vectores.

    Seguimos ampliando las capacidades de la plataforma MetaTrader 5 para el trading algorítmico y el aprendizaje automático. Antes, añadimos un nuevo tipo de datos, matrices y vectores, que nos permite eliminar el uso de arrays para el procesamiento de datos. Para manejarlos, hemos añadido al lenguaje MQL5 más de 70 métodos que nos permiten realizar cálculos de álgebra lineal y estadística como una sola operación. La multiplicación, la conversión y la resolución de un sistema de ecuaciones se realizan ahora de forma sencilla y sin programación innecesaria. La incorporación de nuevos tipos no ha dejado intactas las funciones matemáticas.

    Las funciones matemáticas se diseñaron originalmente para realizar operaciones matemáticas con cantidades escalares. Ahora la mayoría de estas funciones pueden utilizarse con los nuevos tipos de datos (matrices y vectores) MathAbs, MathArccos, MathArcsin, MathArctan, MathCeil, MathCos, MathExp, MathFloor, MathLog, MathLog10, MathMod, MathPow, MathRound, MathSin, MathSqrt, MathTan, MathExpm1, MathLog1p, MathArccosh, MathArcsinh, MathCosh, MathSinh, MathTanh. En este caso, la matriz o el vector se procesarán término a término. Ejemplo:
    //---
      matrix a= {{1, 4}, {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    En el caso de MathMod y MathPow, el segundo parámetro podrá ser un escalar, o una matriz o vector del tamaño correspondiente.

    Vamos a mostrar con un ejemplo cómo calcular la desviación estándar usando las funciones matemáticas sobre un vector.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- используем инициализирующую функцию для заполнения вектора
      vector r(10, ArrayRandom); // массив случайных чисел от 0 до 1
    //--- вычислим среднее значение
      double avr=r.Mean();       // среднее значение массива
      vector d=r-avr;            // вычислим массив отклонений от среднего значения
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // массив квадратов отклонений
      double sum=s2.Sum();       // сумма квадратов отклонений
    //--- вычислим стандартное отклонение 2-мя способами
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. Las funciones de plantilla pueden ahora utilizar las entradas matrix<double>, matrix<float>, vector<double>, vector<float> en lugar de los tipos de matriz correspondientes, matrixf, vector, vectorf.
  3. Mejoradas las funciones matemáticas para trabajar con el tipo float. Debido a la nueva posibilidad de aplicar funciones matemáticas a matrices y vectores de tipo float, también se han mejorado las funciones correspondientes aplicadas a escalares del tipo float. Antes, los parámetros de estas funciones se convertían incondicionalmente al tipo double, se llamaba a la implementación correspondiente de la función matemática y luego el resultado se convertía en float. Ahora, en el caso del tipo float, los parámetros y los resultados no se convierten, ya que se llaman las implementaciones de las funciones matemáticas correspondientes al tipo float.

    Diferencia en los cálculos usando como ejemplo el seno matemático:

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  массив случайных чисел от 0 до 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. Añadidos los métodos de matrices y vectores Activation (función de activación) y Derivative (derivada de la función de activación) con los parámetros:
    AF_ELU               Exponential Linear Unit
    AF_EXP               Exponential
    AF_GELU              Gaussian Error Linear Unit
    AF_HARD_SIGMOID      Hard Sigmoid
    AF_LINEAR            Linear
    AF_LRELU             Leaky REctified Linear Unit
    AF_RELU              REctified Linear Unit
    AF_SELU              Scaled Exponential Linear Unit
    AF_SIGMOID           Sigmoid
    AF_SOFTMAX           Softmax
    AF_SOFTPLUS          Softplus
    AF_SOFTSIGN          Softsign
    AF_SWISH             Swish
    AF_TANH              Hyperbolic Tangent
    AF_TRELU             Thresholded REctified Linear Unit
    La función de activación en una red neuronal determina cómo la suma ponderada de la señal de entrada se transforma en la señal de salida de un nodo o varios nodos a nivel de red. La elección de la función de activación ejerce una gran influencia en las capacidades y el rendimiento de la red neuronal. Las diferentes partes del modelo pueden usar funciones de activación distintas. En MQL5 no solo se implementan todas las funciones de activación conocidas, sino también las derivadas de la función de activación. Las funciones derivadas son necesarias a la hora de calcular rápidamente una corrección basada en el error resultante durante el entrenamiento de una red neuronal.
  5. Añadido el método de matrices y vectores Loss (función de pérdida) con los siguientes parámetros:
    LOSS_MSE            Mean Squared Error
    LOSS_MAE            Mean Absolute Error
    LOSS_CCE            Categorical Crossentropy
    LOSS_BCE            Binary Crossentropy
    LOSS_MAPE           Absolute Percentage Error
    LOSS_MSLE           Mean Squared Logarithmic Error
    LOSS_KLD            Kullback-Leibler Divergence
    LOSS_COSINE         Cosine similarity/proximity
    LOSS_POISSON        Poisson
    LOSS_HINGE          Hinge
    LOSS_SQ_HINGE       Squared Hinge
    LOSS_CAT_HINGE      Categorical Hinge
    LOSS_LOG_COSH       Logarithm of the Hyperbolic Cosine
    LOSS_HUBER          Huber

    La función de pérdida se encarga de valorar lo bien que el modelo predice el valor real. La construcción del modelo se reduce a resolver el problema de la minimización del valor de esta función en cada etapa. Dependiendo del tipo de datos, se requerirán enfoques distintos, es decir, funciones diferentes. La función de pérdida también puede depender de las variables de los pesos y el desplazamiento. La función de pérdida es unidimensional y no supone un vector, ya que evalúa el rendimiento global de la red neuronal.

  6. Añadidos los métodos de matrices y vectores matrix::CompareByDigits y vector::CompareByDigits. Estos comparan los elementos de dos matrices/vectores para que coincidan los dígitos significativos.

  7. Añadido el soporte para las funciones MathMin y MathMax para líneas. En este caso, las funciones utilizarán la comparación lexicográfica: las letras se compararán según el alfabeto y distinguiendo entre mayúsculas y minúsculas.

  8. Aumentado el número máximo de objetos OpenCL de 256 a 65536. Los manejadores de los objetos OpenCL en el programa MQL5 se crean mediante las funciones CLContextCreate, CLBufferCreate y CLProgramCreate. La anterior limitación de 256 manejadores no permitía usar métodos eficaces de aprendizaje automático.

  9. Permitido el uso de OpenCL en tarjetas sin soporte de double. Antes, los programas MQL5 ciertamente solo usaban GPUs con soporte de double, aunque muchas tareas permiten y están diseñadas para los cálculos con uso de float. El tipo float se considera originalmente nativo de la computación paralela porque ocupa menos espacio. Este requisito ha sido eliminado.

    Si el problema requiere usar solo GPUs que soporten double, esto podrá indicarse explícitamente al llamar a CLContextCreate utilizando el nuevo valor CL_USE_GPU_DOUBLE_ONLY (solo se permiten dispositivos con soporte de cálculos de tipo double).
       int cl_ctx;
    //--- инициализация OpenCL контекста
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. Corregida la función CustomBookAdd. Antes, si se indicaba un valor nulo en el campo MqlBookInfo::volume_real, no se creaba una instantánea de la profundidad de mercado. La comprobación ahora se realiza de la siguiente forma:
    Se comprueba que los datos transmitidos sean correctos: para cada elemento hay que especificar el tipo, el precio y el volumen. MqlBookInfo.volume y MqlBookInfo.volume_real no deben ser cero o negativos: si ambos volúmenes son negativos, se considerará un error. Se puede especificar uno o ambos volúmenes; se tomará el indicado o el que sea positivo:

       volume=-1 && volume_real=2 — se utilizará volume_real=2,

       volume=3 && volume_real=0 — se utilizará volume=3.

    El volumen con la precisión MqlBookInfo.volume_real tiene mayor prioridad en comparación con MqlBookInfo.volume normal. Si se especifican ambos valores para un elemento de la profundidad de mercado, se usará volume_real.

    Si al menos un elemento de la profundidad de mercado se describe de forma incorrecta, el sistema descartará por completo el estado transmitido.

  11. Corregida la función CalendarValueLast. En algunos casos, se daba un error consistente en que las llamadas sucesivas a la función después de los cambios en el calendario económico (el parámetro de cambio recibía un nuevo valor después de la llamada) podían pasar por alto los eventos al usar el filtro según la divisa.
    CalendarValueLast(change, result, "", "EUR")
  12. Corregido el comportamiento de la función ArrayBSearch: si hay varios elementos idénticos, se retornará el enlace al primero por orden, en lugar de uno aleatorio, como antes.
  13. Corregida la visibilidad de la función de plantilla en la clase. El error consistía en que las funciones de plantilla de las clases declaradas como privadas/protegidas estaban en realidad disponibles públicamente (public).

MetaEditor

  1. Corregidos los errores y el comportamiento ambiguo de MetaAssist.
  2. Añadido el soporte para la macro %terminal%, que indica la ruta al directorio de datos de la plataforma donde se encuentra instalado este terminal. Por ejemplo, %terminal%\MQL5\Experts. 


    Añadido el soporte para la macro %terminal%, que indica la ruta al directorio de datos de la plataforma donde se encuentra instalado este terminal.

  3. Mejorada la visualización de arrays en el depurador.
  4. Aumentado el búfer para copiar valores del depurador.
  5. Mejoradas las indicaciones de error.
  6. Las rutas relativas se escriben ahora en el archivo *.mproj del proyecto. Antes, las rutas eran absolutas, lo cual provocaba errores de compilación al mover el proyecto.
  7. Añadida la incorporación automática de recursos BMP como matrices de mapas de bits de 32 bits disponibles globalmente cuando se incluyen en los proyectos. Esto elimina la necesidad de llamar a ResourceReadImage en el código para leer el recurso gráfico.
    'levels.bmp' as 'uint levels[18990]'
    
  8. Mejorada la lectura de los formatos extendidos de los archivos BMP.
  9. Actualizadas las traducciones de la interfaz de usuario.
  10. Correcciones de crash logs.