Wie gehe ich eine Aufzählung konsequent durch? - Seite 5

 
Sergei Vladimirov:
Warum sollte ich das tun?
TickSize auf MIX ist 25, Digits ist 0. Die Normalisierung eines ganzzahligen Preises, der nicht ein Vielfaches von 25 ist, führt zu einem OrderSend-Fehler.
 
fxsaber:
TickSize auf MIX ist 25 und Digits ist 0. Die Normalisierung eines ganzzahligen Preises, der nicht ein Vielfaches von 25 ist, führt zu einem OrderSend-Fehler.
Gerade eben in einem benachbarten Thread geraten, den Computer in der Badewanne zu ertränken, dann wird alles noch mehr diskreditiert.
 
Dmitry Fedoseev:
Eben noch in einem Nachbarthread dazu geraten, den Computer in der Badewanne zu ertränken, dann wird alles noch mehr diskreditiert.
Sie sind leider ein Quasselstrippe. Ich schaffe nichts, aber ich habe das Recht, Kritik zu üben - an Ihnen.
 
fxsaber:
TickSize auf MIX ist 25 und Digits ist 0. Die Normalisierung eines ganzzahligen Preises, der nicht ein Vielfaches von 25 ist, führt zu einem OrderSend-Fehler.
Nun, mit dieser Logik würde selbst bei einer Normalisierung in 0,25 Schritten ein Fehler auftreten. Der Zweck der Normalisierung ist nicht die Anpassung des Preises an eine exotische Preisstufe, sondern die Rundung der Fließkommazahl auf eine bestimmte Genauigkeit. Sie verursacht keine Fehler.
 
Sergei Vladimirov:
Nun, mit dieser Logik würde die Normalisierung selbst bei einem Schritt von 0,25 einen Fehler ergeben. Der Zweck der Normalisierung ist nicht die Anpassung des Preises an eine exotische Preisstufe, sondern die Rundung der Fließkommazahl auf eine bestimmte Genauigkeit. Sie führt zu keinen Fehlern.
Die Normalisierung wurde ursprünglich nur für eine Sache eingeführt (und sie wird in der Hilfe erwähnt) - für Handelsfunktionen.
 
Vladimir Batrudinov:

Wahrscheinlich gibt es zwei Funktionen, die eingegeben werden müssen: 1 - gibt die Anzahl der Elemente in der Aufzählung zurück, 2 - gibt das Element nach Nummer zurück...


In einer Aufzählung können Sie den Elementen beliebige Werte zuweisen, z. B. wie unten dargestellt. Ein Enum ist kein Array.

enum crazy
{
    e1 = 100500,
    e2 = -200,
    e3 = -100500,
    e4 = 0
};


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
    int z10 = e2;
    int z1 = e4;
  
}

Sprachen wie C# erfordern die Angabe des Enum-Namens, während C++ und damit auch MQL4/5 ziemlich frei mit Enums umgehen. Nur für den Fall, dieser Unsinn kompiliert sowohl auf MQL5 als auch auf C++

 
Alexey Volchanskiy:

In einer Aufzählung können Sie den Elementen einen beliebigen Wert zuweisen, z. B. den folgenden. enum ist kein Array.

Na und? Es ging darum, die Elemente in der Reihenfolge der Erklärung durchzugehen.
 
Alexey Navoykov:
Na und? Es ging darum, diese Elemente in der Reihenfolge ihrer Erklärung durchzugehen.
Oh, richtig, ich habe die Frage falsch gelesen, dachte ich, nach Werten.
 

Ein Hinweis für Programmierer:

#define  ENUM_QQ             \
  ENUM_QQ_HELPER(el_1, 3)   \
  ENUM_QQ_HELPER(el_2, 9)   \
  ENUM_QQ_HELPER(el_3, 38)  \
  ENUM_QQ_HELPER(el_4, 1)   

enum Enum_qq
{
#define  ENUM_QQ_HELPER(el, val) el = val,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
};

void get_enumqq_array(int &ar[])
{
  int temp[] = {
#define  ENUM_QQ_HELPER(el, val) el,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
  };
  ArrayResize(ar, ArraySize(temp));
  for(int i = 0;  i < ArraySize(temp);  ++i)
    ar[i] = temp[i];
}

void OnStart()
{
  int q[];
  get_enumqq_array(q);
  for(int i = 0;  i < ArraySize(q);  ++i)
    Alert(q[i]);
}


Wenn wir nun eine Aufzählung bearbeiten müssen, müssen wir sie einmal und an einer Stelle bearbeiten. Wir müssen ein neues Element hinzufügen, zum Beispiel element_new = 56, wir fügen hinzu

ENUM_QQ_HELPER(element_new , 56)

Und machen Sie sich nicht die Mühe, get_enumqq_array() zu bearbeiten. Die Technik heißt X-Makro https://en.wikipedia.org/wiki/X_Macro. Wenn Entwickler dies wünschen, können sie die Standardaufzählung auf diese Weise leicht ändern.

Die Aufzählung ist vielleicht nicht auf den ersten Blick ersichtlich, aber sie hat sich folgendermaßen entwickelt:

enum Enum_qq
{
   el_1 = 3
   el_2 = 9
   el_3 = 38
   el_4 = 1   
};
 
Vasiliy Sokolov:

Nehmen wir an, wir haben eine Aufzählung. Wie können wir alle möglichen Werte dieser Aufzählung nacheinander abrufen, z. B. in einer Schleife?

D.h. tf1++ muss nacheinander PERIOD_M1, PERIOD_M2, PERIOD_M5... zurückgeben. Ich denke, dass dies mit den Sprachwerkzeugen nicht möglich ist.

Aber in der Theorie, wenn es ein ENUM_MYENUM gibt, sollte (ENUM_MYENUM)INT_MAX den maximalen Wert der Aufzählung angeben. Andernfalls handelt es sich um einen Fehler bei der Typkonvertierung. Der Grund dafür ist, dass der Typumwandlungsoperator den Wert genau dieses Typs zurückgeben muss. Nicht unbedingt im Kontext gültig, aber für den Typ gültig.