Fehler, Irrtümer, Fragen - Seite 436

 
Interesting:

1. Warum ist das so? Schädliche Symptome müssen behandelt werden, und zwar entschlossen.

2. Variablen, Arrays und andere Dinge sollten nicht einheitlich oder mit sprachlichen Schlüsselwörtern benannt werden (aber das Array "Symbol" ist sehr auffällig, man kann im Code nicht erkennen, ob es ein Array oder etwas anderes ist).

1. Zunächst einmal muss man feststellen, ob es sich bei den Symptomen um positive oder negative Erscheinungsformen handelt. Meiner Erfahrung nach hat es Fälle gegeben, in denen ich versucht habe, den Wert einer globalen Variablen in einer Funktion zu ändern, die dafür nicht vorgesehen war (verdammtes Copypaste). Ich habe ein paar Tage gebraucht, um diesen Fehler zu finden. Seitdem verwende ich globale Variablen in Fällen, in denen ich im Prinzip nicht darauf verzichten kann.

2. Ich stimme zu. Aber wenn sie innerhalb einer Funktion verwendet werden, stört mich das nicht. Aber globale Variablen mit solchen Namen sind eine Quelle künftiger Verwirrung.

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 

Ich wiederhole jedoch meine Frage.

Ist es möglich, die Auslösung von OnInit innerhalb von OnTick zu bestimmen?
Kann ich zum Beispiel eine statische Variable innerhalb von OnTick deklarieren, die die Anzahl der Initialisierungen des EA speichert (wenn diese oder eine ähnliche Eigenschaft in MQL5 vorhanden ist)?

 
voix_kas:

Ich muss paranoid sein. Ich mag keine öffentlichen (globalen) Variablen. Ich halte es für ein Muveton.

Globale Variablen sind zumindest aus der Ferne sichtbar. Aber das Verstecken von schwerwiegenden kumulativen Variablen innerhalb von Funktionen in der Statik ist eine Möglichkeit, sich einen Vorteil zu verschaffen. Dies ist das erste Mal, dass ich ein akkumulatives statisches Array gesehen habe, das auf diese Weise in einer Funktion versteckt ist. Das ist eine feurige Harke.

Verwenden Sie Klassen - sie werden die globale Ebene sauber lassen, alle Eingeweide verstecken und die Krücken loswerden.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
voix_kas:

Ich wiederhole jedoch meine Frage.

Ist es möglich, die Auslösung von OnInit innerhalb von OnTick zu bestimmen?
Können wir zum Beispiel eine statische Variable innerhalb von OnTick deklarieren, die die Nummer der Initialisierung des EA speichert (wenn es eine solche oder ähnliche Variable in MQL5 gibt)?

Es ist nicht nur möglich, die Anzahl der OnInit-Auslöser zu zählen, sondern auch festzustellen, warum die Initialisierung erfolgte (die Implementierung ist ein anderes Thema).

Sind Sie zum Beispiel mit _UninitReason vertraut?

 
Sie können es in OnInit lesen, aber ich brauche diese Daten in einem anderen Ereignis (ohne globale Variablen zu verwenden). Wie auch immer man es betrachtet, es ist eine Frage der Umsetzung. Das Gleiche gilt für OnDenit.
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Klassen, die ich nie geschrieben habe. Wenn mir jemand helfen kann, wäre ich sehr dankbar.
Sie müssen eine WorkSymbols-Klasse schreiben.
Methoden:
string GetSymbol[];
bool UpdateSymbols(inWorkSymbols);
bool UpdateSymbolsStatus();
int GetSymbolCount();

Entschuldigung, wenn die Anfrage frech ist... Ich werde auch versuchen, es selbst herauszufinden.
 
Renat:

Ja, es scheint ein Fehler zu sein, den Symbolwechsel und die Zeitrahmenbedingung zu kombinieren.

Ich bin auch dafür, sie in zwei Bedingungen aufzuteilen. Das Ticket wurde bereits im Service Desk hinterlegt.

Ich danke Ihnen!
 

Ich habe es irgendwie ausgeheckt. Kritik ist willkommen.

input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

class CSymbolList {
  private:
    string Symbols[];

  public:
    void   CSymbolList() { SetSymbols(""); }
    void  ~CSymbolList() { ArrayFree(Symbols); }
    int    GetSymbolCount() { return ArraySize(Symbols); }
    void   SetSymbols(string);
    string GetSymbolName(int);
};

void CSymbolList::SetSymbols(string Source) {
  ArrayFree(Symbols);
  for (int count = 1, i = 0; i < SymbolsTotal(false); i++)
    if (StringFind(Source, SymbolName(i, false)) != -1) {
      if (ArrayResize(Symbols, count) != count) {
        ArrayFree(Symbols);
        return;
      }
      Symbols[count-1] = SymbolName(i, false);
      count++;
    }
}

string CSymbolList::GetSymbolName(int Item) {
  if (Item < 0 || !ArraySize(Symbols) || Item >= ArraySize(Symbols)) return "";
  return Symbols[Item];
}

void OnStart() {
  CSymbolList slMain;
  slMain.SetSymbols(inWorkSymbols);
  for (int i = 0; i < slMain.GetSymbolCount(); i++)
    Print(slMain.GetSymbolName(i));
}
 

Das einzige, was mir hier nicht gefällt, ist die "Live"-Anpassung der Größe des Arrays, das die Arbeitsdaten enthält.
Frage an die Entwickler: Ist gewährleistet, dass die zuvor eingegebenen Benutzerdaten in dem dynamischen Feld, das geändert wird, unter der folgenden Bedingung erhalten bleiben?

if (ArrayResize(Symbols, count) == count)
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
voix_kas:

Das einzige, was mir hier nicht gefällt, ist die "Live"-Anpassung der Größe des Arrays, das die Arbeitsdaten enthält.
Eine Frage an die Entwickler: Ist gewährleistet, dass die zuvor eingegebenen Benutzerdaten in dem dynamischen Array, das geändert wird, unter der folgenden Bedingung erhalten bleiben?

Ich wette, das ist garantiert. Zumindest verlasse ich mich ständig darauf, und das Problem ist noch nie aufgetreten.