Características del lenguaje mql5, sutilezas y técnicas - página 58

 
En el probador, sólo es posible averiguar la hora actual correctamente a través deTimeTradeServer(), no de TimeCurrent().
 
fxsaber:
En el probador, sólo es posible averiguar la hora actual correctamente a través deTimeTradeServer(), no de TimeCurrent().
Esta es una afirmación muy controvertida.
 
Slava:
Una declaración bastante cuestionable.
void OnTick()
{
  Print(TimeCurrent());
  
  Sleep(3600 * 1000);
  
  Print(TimeCurrent());
  Print(TimeTradeServer());    
  
  ExpertRemove();
}

Resultado

2017.10.02 00:03:03   2017.10.02 00:03:03
2017.10.02 01:03:03   2017.10.02 01:02:59
2017.10.02 01:03:03   2017.10.02 01:03:03


TimeCurrent devuelve la hora del último tick del personaje principal, no del probador (servidor). No es posible saber la hora exacta del servidor en milisegundos.

 

Hola. He leído sobre las matrices de servicio https://www.mql5.com/ru/docs/constants/objectconstants/enum_anchorpoint ( en el último ejemplo)

doble Ups[],Downs[];
datetime Hora[];

¿hay una lista de todas las matrices de servicio en algún lugar?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Графические объекты Text, Label, Bitmap и Bitmap Label (OBJ_TEXT, OBJ_LABEL, OBJ_BITMAP и OBJ_BITMAP_LABEL) могут иметь один из 9 различных способов привязки своих координат, задаваемых свойством OBJPROP_ANCHOR. – объекты имеет ширину и высоту. Если указано "только для чтения", то это означает, что значения ширины и высоты вычисляются...
 
he estado siguiendo esta señal una semana más la seguiré

y luego veamos

es/señales/352123

 

Una técnica de lenguaje que permite el uso de métodos/campos protegidos.

Ejemplo

#include <Canvas\Canvas.mqh>

// Помещает картинку в ресурс
bool ToResource( const string Name, const uint &Data[], const uint Width )
{
  return(::ResourceCreate(Name, Data, Width, (Width == 0) ? ::ArraySize(Data) : ::ArraySize(Data) / Width, 0, 0, Width, ::COLOR_FORMAT_ARGB_NORMALIZE));
}

// Прием использования protected полей/методов
class CANVAS : public CCanvas
{
public:
  // Загрузка картинки из BMP-файла
  static bool BMPToArray( const string FileName, uint &Data[], int &Width )
  {
    CANVAS Canvas;
    
    const bool Res = Canvas.LoadFromFile(FileName);
    
    if (Res)
    {
      ArrayCopy(Data, Canvas.m_pixels);
      
      Width = Canvas.m_width;
    }
    
    return(Res);
  }
};

// Грузим BMP с альфаканалом не из ресурса, а из файла
void OnStart()
{     
  const string Resource = "::Resource";
         
  uint Data[], Width;   
  
  if (CANVAS::BMPToArray("Picture.bmp", Data, Width) &&
      ToResource(Resource, Data, Width))
  {
   ObjectCreate(0, __FILE__, OBJ_BITMAP_LABEL, 0, 0, 0);   
   ObjectSetString(0, __FILE__, OBJPROP_BMPFILE, Resource);
        
   // Сконвертировали BMP в PNG (без учета прозрачности)
   BitmapObjectToFile(0, __FILE__, "Picture.png"); // https://www.mql5.com/ru/forum/170952/page57#comment_5985505
  }
}
 
Los comentarios no relacionados con este tema han sido trasladados a "Cualquier pregunta de los novatos en MQL4, ayuda y discusión sobre algoritmos y códigos".
 
Debido a esta peculiaridad

la tipificación de los parámetros de las plantillas es estricta, la especialización con conversión implícita es inaceptable

es posible escribir funciones que sólo toman punteros de una clase base como parámetros de entrada, y rechazan los descendientes en la etapa de compilación.


Ejemplo

template <typename T>
void StrongCondition( T, T ) {}

class A
{
public:
  int i;
  
  template <typename T>  
  void SetStong( T Value )
  {
    StrongCondition(&this, Value);
    
    this.i = Value.i;
  }
  
  void Set( A* Value )
  {
    this.i = Value.i;
  }
};

class B : public A {};

void OnStart()
{
  A a;
  B b;
  
  a.Set(&b);   
  a.SetStong(&a);
  
  a.SetStong(&b);       // потомки в явном виде запрещены
  a.SetStong((A*)(&b)); // только явное приведение разрешено
}
 
¿Puedo cambiar los camposde laclase const-object o llamar a sus métodos no-const? -¡Puedes!
template <typename T>
T GetMe( const T Ptr )
{
  return((T)Ptr);
}

class A
{
public:  
  int i;
};

void OnStart()
{
  const A a;

  GetMe(&a).i = 1;
  
  Print(a.i); // 1
}

A mí tampoco me gusta este truco. Pensé que estaba asegurado contra el acceso no autorizado. ¡Pero qué mal! Por supuesto, no funciona con las estructuras const. Así que tenga en cuenta esta laguna.

 
Razón de la queja: