Caractéristiques du langage mql5, subtilités et techniques - page 228

 
fxsaber #:
Ajouté.

Ceux qui avaient l'habitude d'écrire sans utiliser de const ne peuvent plus le faire maintenant. Sinon, il y aura une erreur.

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
}

Il semble que cette innovation promette de graves bogues dans les codes précédemment écrits.

 

Désolé. "TRADE_EVENT_POSITION_OPEN =0x1" x1 est le premier bit de la liste d'événements ???? Je veux dire que dans cette partie "enum event", vous pouvez avoir tous les bits disponibles comme cela ?


N'hésitez pas à m'en faire part.

 

Il existe deux types de courtiers qui convertissent l'heure américaine/européenne. C'est notamment pour cette raison que l'heure de renouvellement est décalée.

Le type de courtier peut être déterminé automatiquement.

// Вычисление типа брокера (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"));
}


Résultats du lancement sur certains courtiers.

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

Bonjour !

Je ne sais pas si je pose ma question dans le bon fil de discussion ou pas...

L'essentiel de la question - J'ai créé un panneau avec des boutons, des champs de saisie et des étiquettes basé sur AppDialog de la bibliothèque standard.

Le client s'est plaint que lors d'un zoom avant dans les paramètres de personnalisation de Windows,

seules les polices sont mises à l'échelle sur le panneau, mais les contrôles eux-mêmes ne sont pas mis à l'échelle, ce qui fait que les inscriptions dépassent les bordures des contrôles.

Comment puis-je résoudre le problème de manière à ce que non seulement les polices, mais aussi les tailles des éléments du panneau et le panneau lui-même soient mis à l'échelle ?

Bien sûr, j'ai une petite réserve et je peux augmenter légèrement la taille des éléments, puis si j'augmente les paramètres de l'écran à 125 %, tout s'adaptera, mais si j'augmente les paramètres de l'écran à 125 %, tout s'adaptera.

si j'augmente les paramètres de l'écran à 125 %, tout s'adaptera, mais si je les augmente à 150 %, rien ne s'adaptera.

Je veux donc résoudre le problème radicalement, de sorte que les éléments du panneau et le panneau lui-même augmentent proportionnellement à l'échelle. Comment procéder ?

Je comprends qu'il est nécessaire d'une manière ou d'une autre, probablement par l'intermédiaire de WIN IP, d'obtenir ce chiffre d'échelle - 100 %, ou 125 % ou 150 %. La question est de savoir comment l'implémenter dans le code EA ?



P.S. Pour plus de clarté. Le programme utilise la bibliothèque standard MQL5, mais il est écrit en MQL4.


Je remercie d'avance tous ceux qui me répondront....

 
Vitaliy Davydov bibliothèque standard.

Le client s'est plaint que lors d'un zoom avant dans les paramètres de personnalisation de Windows,

seules les polices sont agrandies sur le panneau, mais les contrôles eux-mêmes ne sont pas agrandis, ce qui fait que les inscriptions dépassent les limites du contrôle.

Comment puis-je résoudre le problème de manière à ce que non seulement les polices, mais aussi les tailles des éléments du panneau et le panneau lui-même soient mis à l'échelle ?

Bien sûr, j'ai une petite réserve et je peux légèrement augmenter la taille des éléments, puis lorsque j'augmente les paramètres de l'écran à 125%.

Tout s'adaptera, mais si j'augmente les paramètres à 150 %, rien ne s'adaptera.

Je veux donc résoudre le problème radicalement, de sorte que les éléments du panneau et le panneau lui-même augmentent proportionnellement à l'échelle. Comment faire ?

Je comprends qu'il est nécessaire d'une manière ou d'une autre, probablement par l'intermédiaire de WIN IP, d'obtenir ce chiffre d'échelle - 100 %, ou 125 % ou 150 %. La question est de savoir comment l'implémenter dans le code EA.



P.S. Pour plus de clarté. Le programme utilise la bibliothèque standard MQL5, mais il est écrit en MQL4.


Je remercie d'avance tous ceux qui me répondront....

Essayez de définir la taille du texte avant de créer des objets en utilisant TextSetFont() et TextGetSize().

 
Alexey Viktorov #:

Essayez de définir la taille du texte à l'aide de TextSetFont() et TextGetSize() avant de créer des objets.

TextGetSize() a aidé, merci.
 

J'ai réussi à assembler une construction de bicyclette que j'ai mise en pratique. Je vais essayer de vous en parler brièvement.

Il s'agit d'un travail avec une base de données.

// Элемент БД.
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;

Chaque fois qu'un élément est sélectionné dans la base de données, ses éléments sont mélangés. Artificiellement, mais il est nécessaire de l'expliquer.


Et voici ce qu'il faut faire.

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.
}

Explication du code : vous sélectionnez un élément pour la première fois, puis vous le faites plusieurs fois. Nous devons récupérer l'élément qui a été sélectionné la première fois.


Nous devons d'une manière ou d'une autre ajouter une classe DB pour pouvoir le faire. En même temps, il est impossible de donner accès au pointeur de l'élément (DATA*).

 
fxsaber #:

Explication du code : un élément a été sélectionné pour la première fois, puis plusieurs fois. Et nous avons besoin de récupérer l'élément qui a été sélectionné la première fois.

Nous devons en quelque sorte ajouter une classe de base de données pour rendre cela possible. En même temps, il est impossible de donner accès au pointeur de l'élément (DATA*).

La solution consiste à ajouter quelques lignes à la classe DB.

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

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


Après cela, OnStart ressemble à ceci.

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.
}

Cela est possible parce que la classe définie dans le corps de la classe principale a accès aux membres statiques cachés de cette classe principale.

 
fxsaber #:

définie dans le corps d'une classe principale a accès aux membres statiques cachés de cette classe principale.

J'espère qu'il ne s'agit pas d'un défaut du langage MQL, mais d'une norme (fonctionnalité) pratique.

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 #:

J'espère qu'il ne s'agit pas d'un défaut du langage MQL, mais d'une norme (fonctionnalité) pratique.

Par analogie avec C++. Une classe imbriquée est un ami pour la classe incluse. C'est écrit dans le standard. Il serait bon de l'écrire dans l'aide ici aussi)