Errores, fallos, preguntas - página 2460

 
Pide a los desarrolladores de ME que pulsen CTRL+SHIFT+F y escriban "MQL5Info". Corrija los rudimentos encontrados en los archivos SB resultantes.
 
Me llevó 2 horas aislar el problema del código del proyecto.
#define  PRINT(x) Print(#x, ":", string(x))

template<typename DATA_TYPE>
struct Wrapper{
   uchar type;
   DATA_TYPE data;
   
   template<typename T>
   void operator=(T value){                  // при замене данной строки на "void operator=(T &value){" происходит перезапись оператора присвоения в классе наследнике B (код не компилируется).
      this.data = value;   
   };
   
   void operator=(DATA_TYPE &_data){
      this.data = _data;   
   };
};

struct A{
   string data;
   
   void operator=(string value){
      data = value;
   };
};

struct B : Wrapper<A>{};


void OnStart(){  
  B b;
  
  string str_value;
  b = str_value;
  
  A a;
  b = a;
  
  B b1;
  b = b1;
}


Usando el código anterior todo funciona como se espera,
sin embargo si intentamos extender la funcionalidad y añadir soporte no sólo para tipos simples como (string) de la clase A, sino también para estructuras,
resulta que el operador de asignación de la plantilla de la clase base anula los operadores de asignación por defecto de las clases descendientes, matando toda la funcionalidad.
Se pueden utilizar otros operadores como solución, como "operator*=", pero es un lío.


Para los desarrolladores:
Por favor, añada la posibilidad de especificar la generación forzada de código para el operador de asignación por defecto (constructor de copia):
class_name & class_name :: operator= ( const class_name & ) = default;  
class_name & class_name :: operator= ( const class_name & ) = delete;   
 

Me puede decir si uso indicadores estándar en mi EA, por ejemplo, iMA,

¿cómo configuro sus estilos de dibujo para que se muestren correctamente en la ventana de visualización?

 
Игорь Евдокимов:

Me puede decir si uso indicadores estándar en mi EA, por ejemplo, iMA,

¿Cómo puedo configurar los estilos de dibujo para que se muestren correctamente en la ventana de visualización?

Así:Color de entrada de la media móvil personalizada

 
Gente conocedora, ¡una pista! Tengo un símbolo personalizado basado en uno real. ¿Cómo puedo hacer que una operación esté disponible en el gráfico de este símbolo? ¿O no existe esta funcionalidad en MT5?
 

De hecho, tienes que escribir tu propio indicador. Reescribir los indicadores estándar no es la solución.

La pregunta era exactamente cómo establecer el estilo para el indicador estándar.

¿Hay alguna otra manera?

 
En versiones recientes de MT, como parte del cambio de paradigma en el manejo de cadenas, se considera que se abandona el uso de cadenas terminadas en NULL.
Sin embargo, el funcionamiento de la función StringSetLength plantea una serie de preguntas.

Con StringSetLength sólo se puede truncar la longitud de una cadena, pero nunca aumentarla, lo cual no tiene sentido.
¿Es este el comportamiento previsto?

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
  string str = "123456789";
  PRINT(str);
  PRINT(StringLen(str));
  
  
  PRINT(StringSetLength(str, StringLen(str)-1));
  PRINT(str);
  PRINT(StringLen(str));
  
  PRINT(StringSetLength(str, StringLen(str)+2));
  PRINT(str);
  PRINT(StringLen(str));
}

Resultado:
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringSetLength(str,StringLen(str)-1):true
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:12345678
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):8
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringSetLength(str,StringLen(str)+2):false
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:12345678
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):8
 
El usuario preferiría pegarse un tiro antes de implementar unStringSetLength"en toda regla", con caracteres "nuevos" inicializados como 0x0000.

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
  string str = "123\x0000\x0000\x0000\x0000456789";
  PRINT(str);
  PRINT(StringLen(str));                                                  // StringLen(str):13      StringLen поддерживает работу с 0х0000 short value
  
  PRINT(StringSetLength_using_StringInit(str, 100));                      // false                  StringInit           не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_ShortArrayToString(str, 100));              // false                  ShortArrayToString   не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_StringInit_with_StringFill(str, 100));      // false                  StringFill           не поддерживает работу с 0х0000 short value
}


bool StringSetLength_using_StringInit(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{
      string string_tail;
      StringInit(string_tail, new_length - prev_length, 0x0000);
      data += string_tail;
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}

bool StringSetLength_using_ShortArrayToString(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{    
      short data_array[];
      StringToShortArray(data, data_array);
      ArrayResize(data_array, new_length);
      ArrayFill(data_array, prev_length, new_length - prev_length, 0x0000);
      data = ShortArrayToString(data_array, 0, new_length);
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}

bool StringSetLength_using_StringInit_with_StringFill(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{    
      string string_tail;
      StringInit(string_tail, new_length - prev_length, 0x1111);
      StringFill(string_tail, 0x0000);
      data += string_tail;
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}
 
Sergey Dzyublik:
En las versiones recientes de MT, como parte del cambio de paradigma en el manejo de cadenas, vemos un rechazo al uso de cadenas terminadas en NULL.

¿Podría desarrollar esta idea?

 
rsrozhkov:
Gente conocedora, ¡podéis darme una pista! Tengo un símbolo personalizado creado a partir de un símbolo real. ¿Cómo puedo hacer que una operación esté disponible en el gráfico de este símbolo? ¿O no existe esta funcionalidad en MT5?

La respuesta se explica por sí misma. Un símbolo personalizado se obtiene mediante algún tipo de transformación a partir de símbolos reales. Alguien (EA, script o manualmente) tiene que hacer la transformación inversa y enviar órdenes para los símbolos reales.