Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1877

 
Maksim Emeliashin statische Arrays mit den Namen der einzelnen möglichen Werte und eine Stringsuche in diesem Array.

Für MQL wird diese Funktion nicht korrekt funktionieren

template<typename T>
bool StringToEnum(const string i_str, T &o_val)
{
   for(int i = 0; i < 256; i++)
      {
         o_val = (T)i;
         if(StringCompare(EnumToString(o_val), i_str, false) == 0)
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}

https://www.mql5.com/ru/docs/strings/stringcompare

Parameter

string1

[in] Die erste Zeichenkette.

string2

[in] Zweiter String.

case_sensitive=true

[in] Groß- und Kleinschreibung. Wenn wahr, dann "A">"a". Wenn falsch, dann ist "A"="a". Der Standardwert ist true.

Wenn es zwei Konstanten in enum gibt, zum Beispiel ENUM1 und enum1, dann kann die Funktion"enum1" bei i_str den Wert der KonstanteENUM1 zurückgeben.Warum überhaupt StringCompare? Wenn dies auf folgende Weise geschehen kann:

template<typename T>
bool StringToEnum(const string i_str, T &o_val)
{
   for(int i = INT_MIN; i <= INT_MAX && !IsStopped(); i++) // перебор всех возможных значений int
      {
         o_val = (T)i;
         if(i_str == EnumToString(o_val))
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}
 
Amon1953 für die Schließung einer Position durch SL erfahren kann.

Ich brauche sie, um eine Entscheidung über das weitere Vorgehen zu treffen.

Im Verlaufsfenster des MT5-Terminals können Sie ein Geschäft, einen Auftrag oder eine Position auswählen.

In der Handelshistorie müssen Sie nach einem Handel mit DEAL_REASON gleich DEAL_REASON_SL suchen.


Hinzugefügt: Es kann vereinfacht werden - in OnTradeTransaction einfach die Transaktion TRADE_TRANSACTION_DEAL_ADD abfangen und in der Trade History nach DEAL suchen, das diese Transaktion erzeugt hat. Und dann das gleiche Rezept: ... DEAL_REASON ist gleich DEAL_REASON_SL

 
Mihail Matkovskij #:

Die Funktion funktioniert nicht korrekt für MQL

https://www.mql5.com/ru/docs/strings/stringcompare

Wenn es zwei Konstanten in enum gibt, zum Beispiel ENUM1 und enum1, dann kann die Funktion mit i_str:"enum1" den Wert der KonstanteENUM1 zurückgeben.Warum brauchen wir StringCompare überhaupt? Wenn dies auf folgende Weise geschehen kann:

Und eine schnellere Variante:

template<typename T>
bool StringToEnum(const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for(int i = i_min_enum; i <= i_max_enum && !IsStopped(); i++) 
      {
         o_val = (T)i;
         if(i_str == EnumToString(o_val))
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
 
Alexey Viktorov #:

Wozu ist das alles gut? Möchten Sie die numerischen Werte von ENUM_TIMEFRAMES durch Ihre eigenen ersetzen? Oder was?

Nun, im Moment muss ich die Einstellungen der Indikatoren und EA-Parameter in die Datenbank schreiben. Gleichzeitig möchte ich aber auch:

1. von Menschen lesbare Aufzeichnungen

2. maschinenlesbare Aufzeichnungen

3. die Stabilität, um neue Werte in einer benutzerdefinierten Aufzählung hinzuzufügen, nicht unbedingt am Ende.

Es gibt kein Problem mit record - EnumToString, aber die Entwickler haben keine umgekehrte Funktion erstellt, im Gegensatz zu allen anderen Typen.

 
Mihail Matkovskij #:

Und schnellere Version:

Ich stimme über case-insensitive Vergleich, ich schrieb eine verallgemeinerte Fahrrad für mich, für meine eigene enum, wo ich nicht Kleinschreibung verwenden.

Aber wenn für ENUM_TIMEFRAMES laufen diese Variante:

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
Sie können Zeit für einen Kaffee haben, während es weitergeht, z. B. für PERIOD_MN1 :)
 
Valeriy Yastremskiy #:

Holen Sie sich die Preise von den Geraden auf jedem Balken und vergleichen Sie oder finden Sie die Differenz, an den Stellen, an denen sich die Vorzeichen der sich kreuzenden Differenzen ändern) Es darf übrigens keine Gleichheiten auf dem Balken geben.

Welche Funktion wird dafür verwendet? MqlRates? Und wenn ich ObjectGet verwenden, dann muss ich die Objekt-Eigenschaft dort angeben, wenn ich OBJPROP_PRICE dann nehmen, wie kann ich es bekommen den Preis vor der aktuellen bar.
 
12345678902003 #:
Hilfe bitte, ich zeichne zwei Gunn-Linien und sie schneiden sich in einem bestimmten Punkt, ich muss die Koordinaten des Schnittpunktes dieser Linien wissen.
Wenn Sie den Preis des zweiten Punktes der Gann-Linie bestimmen können, dann kann KimIV Ihnen weiterhelfen
 
Maksim Emeliashin #:

Ich stimme über den Vergleich mit Groß- und Kleinschreibung ignorieren, schrieb ich eine verallgemeinerte Fahrrad für mich, für meine eigene enum, wo ich nicht Kleinschreibung verwenden.

Aber wenn für ENUM_TIMEFRAMES diese Variante ausgeführt wird:

Sie haben vielleicht noch Zeit, Kaffee zu trinken, bevor es losgeht, z. B. für PERIOD_MN1 :)

Nun, bei ENUM_TIMEFRAMES sind die Mindest- und Höchstwerte bekannt. Deshalb können sie explizit angegeben werden.

Für den Rest der Aufzählung genügt es, ihren ungefähren Wertebereich zu kennen. Wenn in der Enum-Deklaration keine Konstanten angegeben sind, sind die Werte dort in der Regel ab 0. i_max_enum kann durch eine beliebige zwei- oder dreistellige Zahl angegeben werden: 50, 100, 255.

 
Maksim Emeliashin #:

Im Moment muss ich Indikatoreinstellungen und EA-Parameter in die Datenbank schreiben. Gleichzeitig möchte ich aber auch:

1. von Menschen lesbare Aufzeichnungen

2. maschinenlesbare Aufzeichnungen

3. Stabilität, um neue Werte in der benutzerdefinierten Aufzählung hinzuzufügen, nicht unbedingt am Ende.

Es gibt kein Problem mit record - EnumToString, aber die Entwickler haben im Gegensatz zu allen anderen Typen keine Umkehrfunktion entwickelt.

Haben Sie schon einmal versucht, eine Aufzählung zu drucken?

Print(PERIOD_M5);

Was wird Ihrer Meinung nach gedruckt werden?


Aber eine Aufzählung programmatisch zu erstellen... ja. Das wäre interessant.

 
x572intraday #:
Warum können wir die Eingabeparameter nicht in einer Schleife durchlaufen? Warum bestrafen Sie uns auf diese Weise?
Dies ist natürlich eine Krücke, aber ich benutze sie: Geben Sie alle erforderlichen Daten in eine String-Eingabevariable über ein bestimmtes Trennzeichen ein, und verwenden Sie dann StringSplit, um sie in ein Array zu überlaufen.
Grund der Beschwerde: