MetaTrader 5 build 2121: Nuevo diseño del Probador de Estrategias - página 8

 
A100:

Los resultados de la ejecución muestran que el compilador actúa de forma contraria a la lógica:

  • En el caso de una cadena constante, se asigna más memoria de la necesaria (en principio, no se puede aumentar su longitud)
  • No se asigna memoria adicional para una cadena no constante (si su longitud aumenta, se requerirá una nueva asignación de memoria)
  • Si el usuario inicializa una cadena con StringInitInit, se asigna más memoria de la necesaria, ya que el tamaño del buffer es establecido explícitamente por el usuario y en la mayoría de los casos no se incrementará (el usuario ya ha pensado qué buffer final necesita y ha establecido su tamaño explícitamente)

Para una cadena constante pura, el tamaño del buffer por StringBufferlen=0, lo que significa que la cadena es constante:

        string s1 = "_";            // исходное "чистое" присвоение константной строки
        Print(StringBufferLen(s1)); // показывает 0 верно, не должно быть 260


Reasignar una cadena "supuestamente" constante no es trabajar con una constante, sino crear exactamente una variable dinámica con una preasignación de 260 caracteres:

        const string s2 = s1;       // динамическое создание переменной копированием данных из другой переменной (не константной строки)
        Print(StringBufferLen(s2)); // показывает 260 верно
 
Renat Fatkhullin:

Para una cadena constante pura, el tamaño del buffer por StringBufferlen=0, lo que significa que la cadena es constante:


Reasignar una cadena "supuestamente" constante no es trabajar con una constante, es crear una variable dinámica con una preasignación de 260 caracteres:

es el momento de introducir los asignadores )))

 

Un recordatorio de que hay un error con el buffer de cadenas:

#import "Shlwapi.dll"
int PathFileExistsW(string &pszPath);
#import

class CTest
{
protected:
   string bufstr;

public:
   CTest()
   {
      StringInit(bufstr, 1000111);
   }
   string getString()
   {
      PathFileExistsW(bufstr);
      Print(StringBufferLen(bufstr), " ", StringLen(bufstr));   
      return bufstr;
   }
};

CTest dll;

int OnInit()
{
   dll.getString(); // 1000111 0 - OK
   dll.getString(); // 260 0 - ???
   dll.getString(); // 260 0 - ???
   return INIT_SUCCEEDED;
}
void OnTick()
  {
  }
//+------------------------------------------------------------------+
La función de la DLL puede ser cualquier cosa.
 

Sugiero añadir una versión extendida de la funciónStringToTime a MQL en el formulario:

bool StringToTime(string timeString, datetime &time);

Porque en la versión actual la función siempre devuelve la hora válida, aunque la cadena contenga basura, y se devuelve la fecha actual, lo cual es particularmente extraño:

StringToTime("aaabbbccc") devuelve "2019.09.05 01:00:00" ¿Es esto normal? En esta implementación, la función es peligrosa para la salud en absoluto, por lo que se necesita una versión con comprobaciones de corrección.

Hasta ahora tenemos que parsear con nuestra propia función,pero el problema es que la hora puede ser especificada en diferentes formatos.Y realmente no quiero codificar todos esos formatos reinventando la rueda cuando el tiempo ya ha sido implementado en MQL.

Básicamente, esto también se aplica a otras funciones de conversión de cadenas: StringToInteger, StringToDouble. No se proporciona ninguna comprobación de validez para ellos también.

p.d. Resulta queGetLastError() genera errores en estos casos. No lo sabía. La documentación de estas funciones no dice nada de eso. Eso elimina el problema, aunque sería más fácil con un bool.
 
Alexey Navoykov:


Apoyo la sugerencia de Alexey, el manejo seguro de las cadenas es clave para evitar errores ocultos.

 
#property tester_no_cache true

error "la propiedad ya existe con un valor diferente y será omitida".

Lo usé por primera vez. Ningún otro archivo lo tiene. No depende del valor. Construye 2136.

 

Por favor, traiga de vuelta el viejo estilo de styler.

Ahora no puedo averiguar qué se supone que se ejecuta aquí:

   int size=ArraySize(prices);
   if(size>1)
     {
      if(size>2)
         return(true);
      if(extrema[1]<0.0 && extrema[0]<0.0)
        {
         if(extrema[1]>extrema[0])
            if(prices[1]<prices[0])
              {
               int d=0;
              }
        }
      else
         if(extrema[1]>0.0 && extrema[0]>0.0)
           {
            if(extrema[1]<extrema[0])
               if(prices[1]>prices[0])
                 {
                  int d=0;
                 }
           }
         else
           {
            return(true);
           }
     }
   else
     {
      int d=0;
     }

Esta pieza solía tener este aspecto:

   int size=ArraySize(prices);
   if(size>1)
     {
      if(size>2)
         return(true);
      if(extrema[1]<0.0 && extrema[0]<0.0)
        {
         if(extrema[1]>extrema[0])
            if(prices[1]<prices[0])
              {
               int d=0;
              }
        }
      else if(extrema[1]>0.0 && extrema[0]>0.0)
        {
         if(extrema[1]<extrema[0])
            if(prices[1]>prices[0])
              {
               int d=0;
              }
        }
      else
        {
         return(true);
        }
     }
   else
     {
      int d=0;
     }
 
Edgar:
#property tester_no_cache true

error "la propiedad ya existe con un valor diferente y será omitida".

Lo usé por primera vez. Ningún otro archivo lo tiene. No depende del valor. Construye 2136.

Este error se produce al trabajar con proyectos si el valor de la propiedad especificada en el código fuente entra en conflicto con el valor de la configuración del proyecto.

Propiedades del proyecto

Las propiedades del programa en el archivo de proyecto tienen prioridad sobre las propiedades especificadas en el código fuente. Si especifica propiedades tanto en el proyecto como en el código fuente, se utilizarán las propiedades del proyecto.
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
  • www.metatrader5.com
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
 
Vladimir Karputov:

Por favor, traiga de vuelta el viejo estilo de styler.

Ahora no puedo averiguar qué se supone que se ejecuta aquí:

Esta pieza solía tener este aspecto:

Los ifs anidados múltiples no pueden ser guardados por ninguna alineación. Tenemos que cambiar el código para que sea legible.

bool Sample()
  {
//---
   double prices[], extrema[];
   int size=ArraySize(prices);
   if(size>2)
      return(true);

   if(size<=1)
     {
      int d=0;
      return(false);
     }

   if(extrema[1]<0.0 && extrema[0]<0.0)
     {
      if(extrema[1]>extrema[0])
         if(prices[1]<prices[0])
           {
            int d=0;
           }
      return(false);
     }

   if(extrema[1]>0.0 && extrema[0]>0.0)
     {
      if(extrema[1]<extrema[0])
         if(prices[1]>prices[0])
           {
            int d=0;
           }
      return(false);
     }
//---     
   return(true);
  }
 
Rashid Umarov:

Los ifs anidados múltiples no pueden ser guardados por ninguna alineación. Hay que cambiar el código para que sea legible.

No hay anidación múltiple - el nivel superior es if, luego if else.

Pido el estilo antiguo, cuando si se parecía a esto:

      else if

- Estaba en una sola línea y no había desplazamiento del texto posterior hacia la derecha.


Este es un ejemplo de la ayuda de lasentencia condicional if-else (el antiguo styler)

//--- Вложенные операторы
if(x=='a')
  {
   y=1;
  }
else if(x=='b')
  {
   y=2;
   z=3;
  }
else if(x=='c')
  {   
   y=4;
  }
else Print("ERROR");

y esto es lo que hace el nuevo estilista:

//--- Вложенные операторы
   if(x=='a')
     {
      y=1;
     }
   else
      if(x=='b')
        {
         y=2;
         z=3;
        }
      else
         if(x=='c')
           {
            y=4;
           }
         else
            Print("ERROR");
Стилизатор - Разработка программ - MetaTrader 5
Стилизатор - Разработка программ - MetaTrader 5
  • www.metatrader5.com
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...