Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 228

 
fxsaber #:
Hinzugefügt.

Diejenigen, die bisher ohne const geschrieben haben, können dies jetzt nicht mehr tun. Sonst gibt es einen Fehler.

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
}

Es scheint, dass die Neuerung schwerwiegende Fehler in zuvor geschriebenen Codes verspricht.

 

Entschuldigung."TRADE_EVENT_POSITION_OPEN =0x1" x1 ist das erste Bit der Ereignisliste???? Ich meine, in diesem Teil der Ereignisliste können Sie jedes Bit auf diese Weise verfügbar machen?


Bitte lassen Sie es mich wissen.

 

Es gibt zwei Arten von Brokern, die die US/Europäische Zeit umrechnen. Hierdurch verschiebt sich insbesondere der Rollover-Zeitpunkt.

Der Brokertyp kann automatisch ermittelt werden.

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


Starten Sie die Ergebnisse bei einigen Brokern.

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

Hallo!

Ich weiß nicht, ob ich meine Frage im richtigen Thread stelle oder nicht...

Die Essenz der Frage - ich habe ein Panel mit Schaltflächen, Eingabefeldern und Beschriftungen auf Basis von AppDialog aus der Standardbibliothek erstellt.

Der Kunde hat sich darüber beschwert, dass beim Heranzoomen über die Personalisierungseinstellungen von Windows,

nur die Schriftarten auf dem Panel vergrößert werden, aber die Steuerelemente selbst nicht, so dass die Beschriftungen über die Grenzen der Steuerelemente hinausgehen.

Wie kann ich das Problem so lösen, dass nicht nur die Schriftarten, sondern auch die Größe der Bedienelemente und des Bedienfelds selbst skaliert werden?

Natürlich habe ich eine kleine Reserve, und ich kann die Größe der Elemente leicht erhöhen. Wenn ich dann die Bildschirmparameter auf 125%

erhöht, passt alles, aber wenn ich sie auf 150 % erhöhe, passt nichts mehr.

Ich möchte das Problem also radikal lösen, so dass die Elemente des Panels und das Panel selbst auch proportional zum Maßstab wachsen. Wie kann man das machen?

Ich verstehe, dass es notwendig ist, irgendwie, wahrscheinlich durch WIN IP, um diese Skala Figur - 100%, oder 125% oder 150%. Die Frage ist, wie man es in den EA-Code implementieren?



P.S. Zur Klarstellung. Das Programm verwendet die Standardbibliothek MQL5, ist aber in MQL4 geschrieben.


Ich bin im Voraus jedem dankbar, der antworten wird....

 
Vitaliy Davydov Standardbibliothek.

Der Kunde beschwerte sich, dass beim Zoomen in durch Windows-Personalisierungseinstellungen,

nur die Schriftarten auf dem Bedienfeld vergrößert werden, aber die Steuerelemente selbst nicht, so dass die Beschriftungen über die Grenzen der Steuerelemente hinausgehen.

Wie kann ich das Problem so lösen, dass nicht nur die Schriftarten, sondern auch die Größe der Bedienelemente und des Bedienfelds selbst skaliert werden?

Natürlich habe ich eine kleine Reserve und ich kann die Größe der Elemente leicht erhöhen, dann, wenn ich die Bildschirm-Parameter auf 125% zu erhöhen.

passt alles, aber wenn ich sie auf 150% erhöhe, dann passt nichts mehr.

Ich möchte das Problem also radikal lösen, so dass die Elemente des Panels und das Panel selbst auch im Verhältnis zur Skalierung wachsen. Wie kann ich das machen?

Ich verstehe, dass es notwendig ist, irgendwie, wahrscheinlich durch WIN IP, um diese Skala Figur - 100%, oder 125% oder 150%. Die Frage ist, wie man es in den EA-Code zu implementieren?



P.S. Zur Klarstellung. Das Programm verwendet die Standardbibliothek MQL5, ist aber in MQL4 geschrieben.


Ich bin im Voraus jedem dankbar, der antworten wird....

Versuchen Sie, die Textgröße zu definieren, bevor Sie Objekte mit TextSetFont() und TextGetSize() erstellen.

 
Alexey Viktorov #:

Versuchen Sie, die Größe des Textes durch TextSetFont() und TextGetSize() zu definieren, bevor Sie Objekte erstellen

TextGetSize() hat geholfen, danke.
 

Es ist mir gelungen, eine Fahrradkonstruktion zusammenzustellen, die ich in die Praxis umgesetzt habe. Ich werde versuchen, Ihnen kurz zu erzählen.

Es gibt eine solche Arbeit mit einer Datenbank.

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

Jedes Mal, wenn ein Element aus der Datenbank ausgewählt wird, werden seine Elemente gemischt. Künstlich, aber es ist notwendig, das zu erklären.


Und hier müssen wir das Folgende tun.

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

Erläuterung des Codes: Sie wählen ein Element zum ersten Mal aus, dann tun Sie es viele Male. Und wir müssen das Element abrufen, das beim ersten Mal ausgewählt wurde.


Wir müssen irgendwie eine DB-Klasse hinzufügen, damit wir dies tun können. Gleichzeitig ist es unmöglich, Zugriff auf den Zeiger auf das Element (DATA*) zu geben.

 
fxsaber #:

Code-Erklärung: ein Element zum ersten Mal ausgewählt, dann tat es viele Male. Und wir brauchen, um das Element, das das erste Mal ausgewählt wurde zu erhalten.

Wir müssen irgendwie eine Datenbankklasse hinzufügen, um dies zu ermöglichen. Gleichzeitig ist es unmöglich, Zugriff auf den Zeiger auf das Element (DATA*) zu geben.

Die Lösung ist, der DB-Klasse ein paar Zeilen hinzuzufügen.

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

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


Danach sieht OnStart wie folgt aus.

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

Dies ist möglich, weil die im Körper der Hauptklasse definierte Klasse Zugriff auf die versteckten statischen Mitglieder dieser Hauptklasse hat.

 
fxsaber #:

Klasse, die im Körper einer Hauptklasse definiert ist, hat Zugriff auf die verborgenen statischen Mitglieder dieser Hauptklasse.

Ich hoffe, dies ist kein Fehler der MQL-Sprache, sondern ein praktischer Standard (Feature).

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

Ich hoffe, dass dies kein Fehler in der MQL-Sprache ist, sondern ein praktischer Standard (Feature).

In Analogie zu C++. Eine verschachtelte Klasse ist ein Freund für die einschließende Klasse. Es ist dort im Standard beschrieben. Es wäre gut, es auch hier in die Hilfe zu schreiben)