Errores, fallos, preguntas - página 1542

 
comp:

¿Por qué esta clase compila en MT4 pero no en MT5?

Si se elimina la definición del operador en esta clase, se empieza a compilar bajo MT5. Esto parece ser un error en el compilador de MT5.
 
comp:
Si se elimina la definición del operador en esta clase, se empieza a compilar bajo MT5. Esto parece ser un error en el compilador de 5.

Pruebe a sustituirlo por

__MQL5__

a

__MQL5BUILD__.

 
coderex:

Pruebe a sustituirlo por

__MQL5__

a

__MQL5BUILD__

Para no confundirse con la compilación condicional, la he eliminado.

class CHARTOBJECT
{
public:
  template <typename T>
// для MT4 надо заменить ENUM_OBJECT_PROPERTY_STRING на int  
  void SetProperty( const ENUM_OBJECT_PROPERTY_STRING id, const T Value, const int Modifier = 0 ) const
  {
    const string sType = typename(T);

    if (sType == "double")
      ::ObjectSetDouble(0, "", id, Modifier, (double)Value);
    else if (sType == "string")
      ::ObjectSetString(0, "", id, Modifier, (string)Value);
    else
      ::ObjectSetInteger(0, "", id, Modifier, (long)Value);

    return;
  }
  
  virtual void operator =( const string Value ) const
  {
    this.SetProperty(OBJPROP_TEXT, Value);

    return;
  }
};

Cinco no puede compilar, cuatro está bien.

 
comp:

Para evitar confusiones con la compilación condicional, lo he eliminado

Cinco no puede compilar, cuatro está bien.

¿Qué es el registro de errores?
 
coderex:
¿Cuál es el registro de errores?
'ObjectSetDouble' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función
'ObjectSetInteger' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función

 
comp:
'ObjectSetDouble' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función
'ObjectSetInteger' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función

Creo que lo tengo. En MT5 debe especificar claramente los tres ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER y ENUM_OBJECT_PROPERTY_DOUBLE. En MT4, basta con especificar int, y todo funcionará.

En este caso ni siquiera sé si MQL5 es una solución mejor que MQL4.

 
comp:
'ObjectSetDouble' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función
'ObjectSetInteger' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función

Has pasado un parámetro no válidoENUM_OBJECT_PROPERTY_STRING id como parámetro de entrada al método ObjectSetDouble y ObjectSetInteger.

En general, no hagas una biblioteca común para dos idiomas, habría más confusión.

 
comp:

Creo que lo he descubierto. En MT5 deben especificarse claramente los tres ENUM_OBJECT_PROPERTY_STRING, ENUM_OBJECT_PROPERTY_INTEGER y ENUM_OBJECT_PROPERTY_DOUBLE. En MT4, basta con especificar int, y todo funcionará.

¡Exactamente!

#ifdef __MQL4__
  #define ENUM_OBJECT_PROPERTY_DOUBLE int
  #define ENUM_OBJECT_PROPERTY_STRING int
  #define ENUM_OBJECT_PROPERTY_INTEGER int
#endif

class CHARTOBJECT
{
public:
  template <typename T>
  void SetProperty( const int id, const T Value, const int Modifier = 0 ) const
  {
    const string sType = typename(T);

    if (sType == "double")
      ::ObjectSetDouble(0, "", (ENUM_OBJECT_PROPERTY_DOUBLE)id, Modifier, (double)Value);
    else if (sType == "string")
      ::ObjectSetString(0, "", (ENUM_OBJECT_PROPERTY_STRING)id, Modifier, (string)Value);
    else
      ::ObjectSetInteger(0, "", (ENUM_OBJECT_PROPERTY_INTEGER)id, Modifier, (long)Value);

    return;
  }
  
  virtual void operator =( const string Value ) const
  {
    this.SetProperty(OBJPROP_TEXT, Value);

    return;
  }
};

Ahora compila en ambas plataformas. Es evidente que hay un error en la Ayuda 5.

 
comp:

¡Exactamente!

Ahora compila en ambas plataformas. Está claro que hay un error en la ayuda de los cinco.

¿Qué error?
 
Slawa:
¿Cuál es el error?

Por ejemplo, en la descripción de ObjectSetInteger ahora

bool  ObjectSetInteger( 
   long    chart_id,          // идентификатор графика 
   string  name,              // имя 
   int     prop_id,           // свойство 
   long    prop_value         // значение 
   );

Debería serlo.

bool  ObjectSetInteger( 
   long                          chart_id,  // идентификатор графика 
   string                        name,      // имя 
   ENUM_OBJECT_PROPERTY_INTEGER  prop_id,   // свойство 
   long                          prop_value // значение 
   );

¿Qué pasa en cinco con IndicatorBuffers cuando el número de buffers ACTUALES no puede establecerse rígidamente a través de #property? En los cuatros no hay ninguna restricción con esto.