Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 58

 
Nel tester, è possibile trovare correttamente l'ora corrente solo tramiteTimeTradeServer(), non TimeCurrent().
 
fxsaber:
Nel tester, è possibile trovare correttamente l'ora corrente solo tramiteTimeTradeServer(), non TimeCurrent().
Questa è un'affermazione molto discutibile.
 
Slava:
Un'affermazione alquanto discutibile.
void OnTick()
{
  Print(TimeCurrent());
  
  Sleep(3600 * 1000);
  
  Print(TimeCurrent());
  Print(TimeTradeServer());    
  
  ExpertRemove();
}

Risultato

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 restituisce il tempo dell'ultimo tick del personaggio principale, non del tester (server). Non è possibile conoscere l'ora esatta del server in millisecondi.

 

Ho letto degli array di servizi https://www.mql5.com/ru/docs/constants/objectconstants/enum_anchorpoint (nell'ultimo esempio)

doppio Ups[],Downs[];
datetime Time[];

c'è un elenco di tutti gli array di servizi da qualche parte?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Графические объекты Text, Label, Bitmap и Bitmap Label (OBJ_TEXT, OBJ_LABEL, OBJ_BITMAP и OBJ_BITMAP_LABEL) могут иметь один из 9 различных способов привязки своих координат, задаваемых свойством OBJPROP_ANCHOR. – объекты имеет ширину и высоту. Если указано "только для чтения", то это означает, что значения ширины и высоты вычисляются...
 
Ho seguito questo segnale ancora una settimana e lo seguirò

e poi vediamo

it/segnali/352123

 

Una tecnica linguistica che permette l'uso di metodi/campi protetti.

Esempio

#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
  }
}
 
I commenti non relativi a questo argomento sono stati spostati in "Tutte le domande dei neofiti su MQL4, aiuto e discussione su algoritmi e codici".
 
A causa di questa peculiarità

la tipizzazione dei parametri dei template è rigorosa, la specializzazione con conversione implicita è inaccettabile

è possibile scrivere funzioni che prendono solo puntatori di una classe base come parametri di input, e rifiutano i discendenti in fase di compilazione.


Esempio

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)); // только явное приведение разрешено
}
 
Posso cambiare i campidella classe const-object o chiamare i suoi metodi non-const? -Tu puoi!
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
}

Anche a me non piace questo trucco. Pensavo di essere assicurato contro l'accesso non autorizzato. Che peccato, però! Naturalmente, non funziona con le strutture const. Quindi tenete a mente questa scappatoia.