Errores, fallos, preguntas - página 1856

 
Andrey Dik:

¿Cómo puedo ver la codificación?
Sé que ha cambiado al cambiar la apariencia del texto en un editor de terceros, pero cómo saber qué codificación no lo sé.
Andrey Khatimlianskii:
Acaba de crear un EA en ME 1580: Win-1251 (ANSI)

Sí, con Akepad veo que la codificación es Win-1251 (ANSI), pero los archivos más antiguos tienen UTF-16LE 1200.

Entonces, ¿cambia la codificación por defecto para los nuevos archivos?

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Características del lenguaje mql5, sutilezas y trucos

fxsaber, 2017.04.14 11:40

Sí, corredores de bolsa corruptos. También pondrían números negativos.

Sería bueno que los desarrolladores tuvieran un límite en el rango de valores posibles de cada parámetro cuando los corredores configuran los símbolos.

 

Me he dado cuenta de que cuando actualizo los productos desde el mercado, todos los ajustes de ese producto en los gráficos se restablecen a los valores predeterminados.

Esto no está bien, ¿cómo se puede evitar?

 

ArrayMaximum() y ArrayMinimum() - el orden en que se pasan los parámetros no coincide con la ayuda:


 
fxsaber:
Un poco de conocimiento. Evitar el operador de asignación

Resultado

No es un consejo, es una perversión.

No esperaba eso de ti.

 
Koldun Zloy:

No es un truco inteligente, es una perversión.

No lo esperaba de ti.

Así que esto es para ti

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: TypeToBytes

fxsaber, 2017.04.13 13:34

Un ejemplo de cómo esta función puede ser útil para identificar posibles errores.

Escribir y ejecutar el guión.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


Resultado.

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

Esto indica que el operador de asignación no copiará la estructura en una estructura del mismo tipo.


Si añadimos más a la estructura,

  void operator =( STRUCT &Value ) { this.i = 0; }

el resultado será el mismo.


Puede parecer que al cambiar este operador por

  void operator =( STRUCT &Value ) { this.i = Value.i; }

pero la biblioteca dice lo contrario.


Este es quizás el punto más sutil de este ejemplo.

Corríjalo con

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}

  void operator =( const STRUCT &Value ) { this.i = Value.i; }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

y se obtiene el resultado

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


¡Ahora el operador de copia es correcto!

Podemos comprobar la corrección de los operadores de asignación/copia de cualquier estructura simple de la misma manera.

 

1. Cuando escribimos así:

STRUCT StructCopy1 = Struct;
No hay que llamar al operador= sino al constructor de la copia.

Aunque eso es más bien una pregunta para los Metaquotes.

2. Si no se llama al constructor de copia creado por el compilador, podemos escribirlo nosotros mismos.

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

Ahora no se llama a operator=.

3. Como los miembros de la estructura están a nuestra disposición, podemos escribirlo así:

StructCopy1.i = Struct.i;

Pero si los haces privados, tu tiphook tampoco servirá.

4. y lo más importante: el operador= se utiliza para garantizar que todas las asignaciones pasen por él y no lo eludan.

Por lo general, el constructor de copia se define junto con él.

Sí. He mirado la muestra. No vi muchos beneficios.

 
Koldun Zloy:

1. Cuando escribimos así:

No hay que llamar al operador= sino al constructor de la copia.

Aunque eso es más bien una pregunta para los Metaquotes.

2. Si no se llama al constructor de copia creado por el compilador, podemos escribirlo nosotros mismos.

Ahora no se llama a operator=.

3. Como los miembros de la estructura están a nuestra disposición, podemos escribirlo así:

Pero si los haces privados, tu tiphook tampoco servirá.

4. y lo más importante: el operador= se utiliza para garantizar que todas las asignaciones pasen por él y no lo eludan.

Por lo general, el constructor de copia se define junto con él.

Sí. He mirado la muestra. No vi muchos beneficios.

Lifehack también evita el constructor de copias. Y el beneficio está aquí
#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2;
  }
  
  void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Struct(1);  

  ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;  // STRUCT( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

_R es algo universal. Por eso no necesitamos redefinir las estructuras ajenas con sus propios operadores.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Structs[] = {{1}, {2}};
  
  ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik:

Sí, con Akepad veo que la codificación es Win-1251 (ANSI), pero los archivos más antiguos tienen UTF-16LE 1200.

¿Ha cambiado la codificación por defecto de los nuevos archivos?

No, siempre fue Win-1251 (ANSI) y en algún momento se añadió UTF. Pero sólo para aquellos archivos de origen que contengan caracteres que no sean ASI.
 
Andrey Khatimlianskii:
No, siempre fue Win-1251 (ANSI) y en algún momento se añadió UTF. Pero sólo para aquellas fuentes que contengan caracteres no ANSI.
Ya veo. Gracias.