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

 
Mihail Matkovskij #:

Nun, bei ENUM_TIMEFRAMES sind die Mindest- und Höchstwerte bekannt. Sie können daher explizit festgelegt werden.

Bei anderen Aufzählungen genügt es, ihren ungefähren Wertebereich zu kennen. Wenn in der Enum-Deklaration keine Konstanten angegeben sind, beginnen die Werte dort normalerweise bei 0. i_max_enum kann durch eine beliebige zwei- oder dreistellige Zahl festgelegt werden: 50, 100, 255.

Sie können auch experimentell die minimalen und maximalen Enum-Werte ermitteln. Schreiben Sie sie auf und geben Sie sie in StringToEnum an, um die optimale Geschwindigkeit zu erreichen:

int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
  int min, max;
  min = INT_MAX; max = INT_MIN;
  nEnum = 0;
  for(int i = _minEnum; i <= _maxEnum && !IsStopped(); i++) {
    enum_ = (T)i;
    if(StringFind(EnumToString(enum_), "::", 0) >= 0)
      continue;
    if (i < min)
      min = i;
    if (i > max)
      max = i;
    nEnum++;
  }
  if (min != INT_MAX && max != INT_MIN) {
    __min = min;
    __max = max;
    return true;
  }
  return false;
}

template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN, INT_MAX); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  int min, max;
  if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))
    printf("enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d", min, max, nEnum);
  else
    Print("enumFindMinMax Error!");
}

Ergebnis des Skripts:

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37, max: 52, Count: 14

Öffnen Sie ENUM_ACCOUNT_INFO_DOUBLE und sehen Sie. Die Anzahl der Konstanten ist Count (14). So können Sie zu Beginn der Anwendung alle notwendigen enum behandeln, ihre minimalen und maximalen Werte schreiben und StringToEnum entsprechenden min und max mit der besten Geschwindigkeit verwenden.

P.S. Die zweite Variante von enumFindMinMax mit INT_MIN und INT_MAX ist wirklich sehr langsam. Ich habe es anfangs versucht. Dann war ich es leid, auf die Beendigung von enumFindMinMax zu warten, und setzte Werte von -500 bis 500.

if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))

So kam ich zu dem Schluss, dass es nicht notwendig ist, den gesamten int-Bereich zu verwenden.

Dateien:
 

Ich habe mit einem seltsamen Verhalten des Terminals zu kämpfen.

Die Situation ist wie folgt: ein Expert Advisor arbeitet in einem Chart, der zu einem bestimmten Zeitpunkt einen anderen Chart öffnet und einen bestimmten Temple auf dem neuen Chart setzt. Die letztgenannte Vorlage wurde für den Start des zweiten EA auf dem neuen Chart definiert.

In der Mitte der Woche funktioniert alles gut, aber wenn der Markt geschlossen ist, am Wochenende, wird der neue Versuch auf dem neuen Chart gestartet (wie man sehen kann, wenn man das Aussehen des Charts ändert), aber der zweite EA startet dort nicht. Die einzige Möglichkeit, den zweiten Expert Advisor zu "pushen", ist der manuelle Start eines beliebigen Charts, eines beliebigen Skripts, selbst eines völlig leeren. Dann beginnt der zweite Expert Advisor mit der Arbeit an einem neuen Chart.

Ich habe diesen Code im ersten Expert Advisor sowohl mit ChartOpen- und ChartApplyTemplate-Funktionen als auch mit der CChart-Klasse geschrieben - es stellt sich immer das Gleiche heraus, in einem geschlossenen Markt startet der zweite Expert Advisor auf einem neuen Chart erst, wenn ich das Terminal irgendwie manuell "pushe".

Wer ist vielleicht schon einmal in eine solche Situation geraten? Wie kann man damit umgehen, in welche Richtung soll man "graben"?

 
akskarabey ChartApplyTemplate-Funktionen als auch mit der CChart-Klasse geschrieben - es stellt sich immer das Gleiche heraus, in einem geschlossenen Markt startet der zweite Expert Advisor auf einem neuen Chart erst, wenn ich das Terminal irgendwie manuell "pushe".

Wer ist vielleicht schon einmal in eine solche Situation geraten? Wie soll man damit umgehen, wie soll man "graben"?

Woher wissen Sie, dass er nicht anspringt?

P.S.

Probieren Sie es so

int OnInit()
{
....
....

 ChartRedraw();
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij #:

Sie können die Konstante in enum mit einer Brute-Force-Funktion finden (gleiches Prinzip wie), sie mit EnumToString übersetzen und mit der gewünschten Konstante vergleichen. Jetzt muss nur noch das Ergebnis zurückgegeben werden.

Können Sie uns ein Beispiel nennen (oder zumindest eine Schlüsselzeile), denn mir fällt nichts ein? Müssten Sie auch eine riesige Liste von Werten durchgehen und alle Linkshänder aussortieren, oder würden Sie nur nach nützlichen Werten suchen? Im Moment glaube ich nicht, dass es etwas zu sichten gibt, es gibt keine Linkshänder in der Liste... aber ich kann mich mit der Idee nicht anfreunden.

 
x572intraday #:

Können Sie mir ein Beispiel nennen (oder zumindest eine Schlüsselzeile), denn mir fällt nichts ein? Wäre es auch eine riesige Liste von Werten, bei der die richtigen unter den linken Werten ausgesucht werden, oder gäbe es nur nützliche? Im Moment glaube ich nicht, dass es etwas zu sichten gibt, es gibt keine Linkshänder in der Liste... aber ich kann mich mit der Idee nicht anfreunden.

Um zu vermeiden, dass man alle möglichen Enum-Werte durchgehen muss (weil es wirklich lang ist), sollten die folgenden Vorbereitungen getroffen werden(so etwas wie Caching). Mit Hilfe dieser Funktion können Sie Strings/Zeilen leicht in Enums übersetzen, wenn Sie die Bereiche aller benötigten Enums kennen. Oder man kann nach enum in einem vergleichsweise kleinen Bereich suchen.

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);
}


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

Wie haben Sie festgestellt, dass er nicht anspringt, woran können Sie das erkennen?

P.S.

Probieren Sie es so

Der zweite Experte im Abschnitt OnInit zieht Schlussfolgerungen im Protokoll und es gibt keine Protokollmeldungen. Das Protokoll enthält nicht einmal eine Meldung des Terminals über den Start des Expert Advisors. Und der Name des Expert Advisors erscheint nicht auf dem Diagramm in der oberen rechten Ecke.

 
12345678902003 #:
Und welche Funktion wird zu diesem Zweck verwendet? MqlRates? Und wenn ich ObjectGet verwende, sollte ich die Objekteigenschaft dort angeben; wenn ich OBJPROP_PRICE nehme, wie sollte ich es machen, den Preis für den aktuellen Balken zu holen.

Get ist Get. Und es gibt eine Funktion, um den Preis oder die Zeit auf einem Balken von einem Objekt nach Name oder nach Typ des Objekts und Name zu erhalten, um eine bestimmte Eigenschaft des Objekts zu erhalten. Es wird nicht die Taktnummer, sondern die Abweichung von Null verwendet.

 
Valeriy Yastremskiy #:

Get ist Get. Und es gibt eine Funktion, um den Preis oder die Zeit auf einem Balken von einem Objekt nach Name oder nach Typ des Objekts und Name zu erhalten, um eine bestimmte Eigenschaft des Objekts zu erhalten. Nicht die Taktnummer, sondern die Abweichung von Null wird verwendet.

Dies kann mit der Funktion ObjectGetValueByTime() geschehen.

Beispiel

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
Ich habe folgendes Problem - der Ordner Terminal\MQL4\Indicators hat Indikatoren in seiner Indikatorenliste, aber das Terminal MQL4 hat diese Indikatoren nicht in seiner Liste, aus der diese Indikatoren auf den Chart gezogen werden. Wie kann man diese Indikatoren in der Terminal-Liste erscheinen lassen, so dass sie im Diagramm des MQL4-Terminals verwendet werden können ? Im Screenshot rechts sind die Indikatoren, die im MQL4-Terminal verfügbar sind, und links die Indikatoren desselben Terminals im OrdnerMQL4 4\Indicators (als Beispiel)
Dateien:
 
Halina Okopna-Pecuch #:
Ich habe das folgende Problem - die Liste der Indikatoren im Ordner Terminal\MQL4\Indicators enthält Indikatoren, aber im Terminal MQL4 in seiner Liste, aus der diese Indikatoren auf das Diagramm gezogen werden, sind sie nicht. Wie kann man diese Indikatoren in der Terminal-Liste erscheinen lassen, so dass sie im Diagramm des MQL4-Terminals verwendet werden können ? Im Screenshot auf der rechten Seite sind die Indikatoren, die im MQL4-Terminal verfügbar sind, und auf der linken Seite sind die Indikatoren desselben Terminals im OrdnerMQL4 4\Indicators (als Beispiel )

Dies sind wahrscheinlich keine Indikatoren.

Grund der Beschwerde: