MetaTrader 5 build 1485: modos adicionales de simulación y gráficos en la biblioteca estándar

Modificado el orden de representación de las entradas en los diarios de registro del terminal y del MetaEditor

24 noviembre 2016

Terminal

  1. Modificado el orden de representación de las entradas en los diarios de registro del terminal y del MetaEditor. Antes, al inicio del diario se mostraban las entradas más recientes, ahora, las más antiguas. El orden inverso de clasificación hará la lectura del diario más cómoda y sencilla.



    Además, a través del menú contextual del diario ahora se pueden ocultar las columnas "Hora" y "Fuente".

  2. En la historia comercial ahora se muestra el ticket de la posición cerrada de las órdenes y operaciones de cierre de posiciones en el modo de cobertura. Esto facilitará la búsqueda de las operaciones de apertura y cierre.



  3. Corregido el error que provocaba el copiado de los nivles de SL/TP desde la posición disponible a la posición nueva del mismo instrumento. El error aparecía al usar funciones en el comercio con un click (por ejemplo, el panel en el gráfico, la ventana de Observación del mercado) en el modo de cobertura.
  4. Corregida la representación de los objetos-flechas en las pantallas de alta resolución (4К).

MQL5

  1. Añadida la función ArrayPrint para mostrar en el diario las matrices de los tipos simples y las estructuras.
    void  ArrayPrint(
       const void&   array[],             // matriz mostrada
       uint          digits=_Digits,      // número de decimales tras la coma
       const string  separator=NULL,      // separador entre los valores de los campos de la estructura
       ulong         start=0,             // índice del primer elemento mostrado
       ulong         count=WHOLE_ARRAY,   // número de elementos mostrados
       ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN    
       );
    ArrayPrint no muestra en el diario todos los campos de la matriz de estructuras, los campos-matrices y los campos-punteros de los objetos se omiten. Para mostrar todos los campos de esta estructura será necesaria una función propia de muestra masiva con el fotmato deseado.
    //--- muestra los valores de las 10 últimas barras
       MqlRates rates[];
       if(CopyRates(_Symbol,_Period,1,10,rates))
         {
          ArrayPrint(rates);
          Print("Comprobando\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
          for(int i=0;i<10;i++)
            {
             PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
             TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
             rates[i].open,rates[i].high,rates[i].low,rates[i].close,
             rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
            }
         }
       else
          PrintFormat("CopyRates failed, error code=%d",GetLastError());
    //--- ejemplo de muestra
    /*
                        [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295         18110       10   17300175000
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747         17829        9   15632176000
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744         13458       10    9593492000
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194         15362        9   12352245000
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172         16833        9   12961333000
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052         15933        8   10720384000
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528         11888        9    8084811000
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915          7284       10    5087113000
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904          8710        9    6769629000
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263          8956        7    7192138000
       Comprobando
       [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 
    */

  2. Corregido el error de concatenación de líneas S1=S2+S1
  3. Modificado el comportamiento de la función ArrayResize. Al transmitir el valor -1 como parámetro reserve_size, la función libera la memoria no utilizada (memoria reservada), si con ello no tiene lugar un aumento del tamaño de la matriz. El cambio de tamaño de la matriz a 0 con un valor reserve_size=-1 equivale a la llamada de ArrayFree. El nuevo comportamiento permite optimizar el uso de la memoria en los programas MQL5.
    void OnStart()
      {
       int arr[];
    //--- cuánta memoria se ha usado al inicio 
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- cuánta memoria se ha usado para la matriz con el tamaño 1, pero con reserva
       ArrayResize(arr,1,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- tras aumentar la matriz, el tamaño utilizado de la memoria no ha aumentado a cuenta de la reserva
       ArrayResize(arr,1024*512,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- tras disminuir la matriz, el tamaño de la memoria tampoco cambiará
       ArrayResize(arr,1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- la memoria no utilizada por la matriz queda libre gracias a la eliminación de la reserva
       ArrayResize(arr,1,-1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      }

  4. Se han añadido a la biblioteca estándar funciones para la construcción de gráficos. Para usarlas, incluya el archivo MQL5\Include\Graphics\Graphic.mqh en su proyecto.

    Construcción de un gráfico de 3 series de datos con la ayuda de GraphPlot:
    #include <Graphics/Graphic.mqh>
    
    double Func1(double x) { return MathPow(x,2); }
    double Func2(double x) { return MathPow(x,3); }
    double Func3(double x) { return MathPow(x,4); }
    
    void OnStart()
      {
       GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      }
    
    Resultado:


    Construcción de un gráfico usando una matriz de datos con la ayuda de GraphPlot:
    #include <Math/Stat/Binomial.mqh>
    #include <Graphics/Graphic.mqh>
    
    void OnStart(void)
      {
       double    vars[101];
       double    results[101];
       const int N=2000;
    //---  
       MathSequence(0,N,20,vars);
       MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
       ArrayPrint(results,4);
       GraphPlot(results);
    //---
      }
    Resultado:



  5. Actualizadas las funciones para trabajar con estadística matemática en la biblioteca estándar. Se ha puesto a prueba a gran escala la calidad y la precisión de todas las funciones tanto en la versión de MQL5, como en el lenguaje R fuente. Para controlar la precisión y la velocidad del funcionamiento, se distribuyen pruebas unitarias con la biblioteca estadística. Se encuentran en el catálogo \MQL5\Scripts\UnitTests\Stat.

    • TestStat.mq5 es el script principal de prueba para comprobar los resultados de los cálculos
    • TestPrecision.mq5 es el test de precisión de los cálculos
    • TestBenchmark.mq5 es el test con medición de la productividad de los cálculos

Tester

  1. Ampliados los ajustes del retraso de ejecución de las solicitudes comerciales al realizar la simulación. Ahora es posible realizar una simulación con un robot teniendo en cuenta una variedad aún mayor de condiciones comerciales: desde un caso ideal sin retrasos, hasta considerando un retraso indicado por el usuario.


    Antes solo estaba disponible el modo de retraso aleatorio.

  2. Corregido el error de formación del volumen de ticks de las barras al simular en el modo OHLC en М1.
  3. Corregida la inscripción de la hora de apertura de las órdenes y posiciones con una precisión de hasta un milisegundo al comerciar en el modo con cobertura.
  4. Corregido el error "old tick" (el tick ha expirado), que aparecía en la simulación multidivisa o de marco temporal múltiple en el modo de ticks reales.
  5. Acelerado el funcionamiento de la función CopyTicks en el caso de que los ticks hayan sido leídos de una base localizada en el disco.

MetaEditor

  1. Los comandos para trabajar con el repositorio de versión de los códigos fuente MQL5 Storage han sido añadidos al menú contextual del archivo en el Navegador y al panel de instrumentos.



  2. Corregido el error que rompía ocasionalmente la integridad de la base local MQL5 Storage al trabajar con más de 1024 archivos en el repositorio.
  3. Corregidos los errores de representación del árbol de archivos de MQL5 Storage.
  4. Corregida la representación un archivo tras la sustitución masiva de texto.

Documentación actualizada.