Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 228

 
fxsaber #:
Aggiunto.

Coloro che scrivevano senza usare le costanti non possono più farlo. In caso contrario, si verificherà un errore.

template <typename T>
bool IsMqlTick( const T& ) // Без этого const будет неверно работать.
{
  return(typename(T) == "struct MqlTick");
}

void OnStart()
{
  const MqlTick Value1 = {};
  MqlTick Value2 = {};
  
  Print(IsMqlTick(Value1)); // true
  Print(IsMqlTick(Value2)); // true
}

Sembra che l'innovazione prometta gravi bug nei codici scritti in precedenza.

 

Scusate... "TRADE_EVENT_POSITION_OPEN         =0x1" x1 é il primo bit dell'elenco event???? Cioé, in quel part. evento enum si può avere a disposizione così ogni bit???


Fatemi sapere.

 

Esistono due tipi di broker che traducono l'orario USA/Europeo. A causa di ciò, in particolare, l'orario di rollover viene spostato.

Il tipo di broker può essere determinato automaticamente.

// Вычисление типа брокера (USA/Europe).

bool IsEuropeBroker()
{
  MqlCalendarValue Value[1];
  
  CalendarValueHistoryByEvent(840030016, Value, D'2022.11.03', D'2022.11.05');
  
  return(Value[0].time == ChartNewsTime(Value[0].time)); // https://www.mql5.com/ru/forum/357793/page5#comment_44225999
}

void OnStart()
{
  Print(AccountInfoString(ACCOUNT_SERVER) + " - " + (IsEuropeBroker() ? "Europe" : "USA"));
}


Risultati del lancio su alcuni broker.

RannForex-Server - Europe
MetaQuotes-Demo - Europe
FXOpen-MT5 - USA
Alpari-MT5 - Europe
Tickmill-Live - USA
ICMarketsSC-MT5-2 - USA
Darwinex-Live - USA
 

Salve!

Non so se sto facendo la mia domanda nel thread giusto o no...

L'essenza della domanda: ho realizzato un pannello con pulsanti, campi di input ed etichette basato su AppDialog della libreria standard.

Il cliente si è lamentato del fatto che quando si esegue lo zoom attraverso le impostazioni di personalizzazione di Windows,

solo i caratteri vengono ridimensionati sul pannello, ma i controlli stessi non vengono ridimensionati, con il risultato che le scritte vanno oltre i bordi dei controlli.

Come posso risolvere il problema in modo che non solo i caratteri, ma anche le dimensioni degli elementi del pannello e il pannello stesso vengano ridimensionati?

Certo, ho una piccola riserva e posso aumentare leggermente le dimensioni degli elementi, poi se aumento i parametri dello schermo al 125%

tutto si adatta, ma se li aumento al 150%, non si adatta nulla.

Voglio quindi risolvere il problema in modo radicale, in modo che gli elementi del pannello e il pannello stesso aumentino in proporzione alla scala. Come fare?

Ho capito che è necessario in qualche modo, probabilmente tramite WIN IP, ottenere questa cifra di scala - 100%, o 125% o 150%. La domanda è: come implementarlo nel codice EA?



P.S. Per chiarire. Il programma utilizza la libreria standard MQL5, ma è scritto in MQL4.


Sono grato in anticipo a tutti coloro che risponderanno....

 
Vitaliy Davydov libreria standard.

Il cliente si è lamentato del fatto che quando si esegue lo zoom attraverso le impostazioni di personalizzazione di Windows,

solo i caratteri vengono ridimensionati sul pannello, ma i controlli stessi non vengono ridimensionati, con il risultato che le scritte vanno oltre i bordi dei controlli.

Come posso risolvere il problema in modo che non solo i caratteri, ma anche le dimensioni degli elementi del pannello e il pannello stesso vengano ridimensionati?

Naturalmente, ho una piccola riserva e posso aumentare leggermente le dimensioni degli elementi, poi quando aumento i parametri dello schermo al 125%.

tutto si adatta, ma se li aumento al 150%, non si adatta nulla.

Voglio quindi risolvere il problema in modo radicale, in modo che gli elementi del pannello e il pannello stesso aumentino in proporzione alla scala. Come fare?

Ho capito che è necessario in qualche modo, probabilmente tramite WIN IP, ottenere questa cifra di scala - 100%, o 125% o 150%. La domanda è: come implementarlo nel codice EA?



P.S. Per chiarire. Il programma utilizza la libreria standard MQL5, ma è scritto in MQL4.


Sono grato in anticipo a tutti coloro che risponderanno....

Provare a definire la dimensione del testo prima di creare gli oggetti utilizzando TextSetFont() e TextGetSize()

 
Alexey Viktorov #:

Cercare di definire la dimensione del testo tramite TextSetFont() e TextGetSize() prima di creare gli oggetti.

TextGetSize() mi ha aiutato, grazie.
 

Sono riuscito ad assemblare una costruzione di biciclette, che ho messo in pratica. Cercherò di spiegarvelo brevemente.

Esiste un lavoro di questo tipo con un database.

// Элемент БД.
class DATA
{
private:
  static int Count;
  
public:
  int Num;
  
  DATA() : Num(DATA::Count++) {}
};

static int DATA::Count = 0;

#define  SIZE 5

// БД.
class A
{
private:  
  static DATA DataArray[SIZE]; // База данных.
  static DATA* Data;           // Выбранный элемент БД.
  
public:
  static void Set( const int Num ) // Выбор элемента и перемешение элементов БД.
  {
    A::Data = &A::DataArray[Num % SIZE];
    
    ::ArrayReverse(A::DataArray); // Перемешение элементов БД.
  }
  
  static int Get() { return(A::Data.Num); } // Получение значения элемента.
};

static DATA A::DataArray[5];
static DATA* A::Data;

Ogni volta che si seleziona un elemento dal database, i suoi elementi vengono mescolati. Artificialmente, ma è necessario spiegarlo.


E qui è necessario fare quanto segue.

void OnStart()
{  
  A::Set(2);
  Print(A::Get()); // Какое-то значение Value.

  // Перемешиваем БД.
  MathSrand((int)TimeLocal());
  for (int i = MathRand(); i >= 0; i--)
    A::Set(i);
    
  Print(A::Get()); // Что-то образовалось.  
  
  Print(A::Get()); // Здесь хочется получить Value.
}

Spiegazione del codice: si seleziona un elemento per la prima volta, poi lo si fa più volte. Dobbiamo ottenere l'elemento che è stato selezionato la prima volta.


Dobbiamo aggiungere in qualche modo una classe DB per poterlo fare. Allo stesso tempo è impossibile dare accesso al puntatore all'elemento (DATA*).

 
fxsaber #:

Spiegazione del codice: si è selezionato un elemento per la prima volta, poi lo si è fatto più volte. Dobbiamo ottenere l'elemento che è stato selezionato la prima volta.

Dobbiamo aggiungere in qualche modo una classe di database per rendere possibile questa operazione. Allo stesso tempo è impossibile dare accesso al puntatore all'elemento (DATA*).

La soluzione è aggiungere alcune righe alla classe DB.

// БД.
class A
{
// Тело класса до решения задачи.
// .....

// В БД-класс дописываются эти строки.
public:
  class POINTER
  {
  private:
    DATA* Data;
    
  public:
    POINTER() : Data(A::Data) {}
    
    void Set() const { A::Data = this.Data; }
  };  
};


Dopo di che OnStart si presenta in questo modo.

void OnStart()
{  
  A::Set(2);
  Print(A::Get()); // Какое-то значение Value.

  A::POINTER Pointer; // Запоминание элемента без доступа к нему.

  // Перемешиваем БД.
  MathSrand((int)TimeLocal());
  for (int i = MathRand(); i >= 0; i--)
    A::Set(i);
    
  Print(A::Get()); // Что-то образовалось.  
  
  Pointer.Set(); // Запомненный элемент становится выбранным в БД.
  Print(A::Get()); // Здесь хочется получить Value.
}

È possibile farlo perché la classe definita nel corpo della classe principale ha accesso ai membri statici nascosti di questa classe principale.

 
fxsaber #:

definita nel corpo di una classe principale ha accesso ai membri statici nascosti di tale classe principale.

Spero che questo non sia un difetto del linguaggio MQL, ma un comodo standard (caratteristica).

class A
{
  private: static int Num;
    
  public: struct B { static int Get() { return(A::Num); } };
};

static int A::Num = 5;

void OnStart()
{
  Print(A::B::Get()); // 5
}
 
fxsaber #:

Spero che questo non sia un difetto del linguaggio MQL, ma un comodo standard (caratteristica).

Per analogia con il C++. Una classe annidata è un amico per la classe inclusa. È scritto nello standard. Sarebbe bene scriverlo anche qui nella guida).
Motivazione: