Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 203

 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von Neulingen zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes" verschoben.
 

Wir erweitern die Initialisierungssequenzen "{ ... }", im nächsten Build wird jeder Ausdruck erlaubt sein, nicht nur eine Konstante.

Anstelle dieser Änderung wird es eine Einschränkung bei der Verwendung von Konstanten für Aufzählungen geben (wie bei einem normalen Ausdruck): Wenn eine Konstante nicht Teil einer Aufzählung ist, wird ein entsprechender Fehler erzeugt.

Die Analyse bestehender Codes hat gezeigt, dass die einzelne Nullfolge "{0}" häufig falsch verwendet wird.

Zum Beispiel so:

MqlTradeRequest request={0};


Eine solche Notation bedeutet, dass für das erste Feld der Struktur der Wert Null gesetzt wird und die übrigen Felder auf Null gesetzt werden.

Für die obige Codezeile ergibt sich nach den neuen Regeln ein Fehler, da das erste Feld den Typ ENUM_TRADE_REQUEST_ACTIONS hat, eine Aufzählung, die nicht den Wert "0" hat.

cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'


Der richtige Weg wäre:

MqlTradeRequest request={};
 
Ilyas:

Das ist richtig:

MqlTradeRequest request={};

Und was würde request.action dann bedeuten?

 
mktr8591:

Und was würde request.action dann bedeuten?

Null, natürlich, denn wenn ZeroMemory für das Objekt dieser Struktur aufgerufen wird

 

Wie behalte ich den Überblick über Zeitreihen und darauf basierende Indikatoren?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Slawa, 2021.05.29 18:16

Ich möchte Sie daran erinnern.

1. Für jedes Symbol, für das mindestens ein Chart geöffnet ist, arbeitet ein eigener Thread zur Verarbeitung der eingehenden Ticks. Es können mehrere Diagramme für ein Symbol geöffnet sein, aber es gibt nur einen Thread.

2. Der Symbolfaden verarbeitet keine Diagramme, sondern Zeitreihen. Das heißt, dieselben Datenfelder, die der CopyRates-Anfrage unterzogen werden.

3. Es ist nutzlos, Ihr Symbol in OnTick oder OnCalculate zu fragen, ob es synchronisiert ist. Natürlich ist es das!

4. Alle Zeitreihen werden in der Reihenfolge vom niedrigsten zum höchsten Wert bearbeitet. Zunächst wird der Tick angewandt und dann die Berechnung aller Indikatoren, die für diese Zeitreihe erstellt wurden. Wenn Sie Daten für dasselbe H1-Symbol vom Indikator abfragen, der auf M1 arbeitet, werden Sie niemals Daten mit dem angewandten Tick erhalten. Die Daten werden immer einen Tick zurückliegen, egal welche Tricks Sie anwenden. Denn ein Thread pro Symbol mit fortlaufender Zeitrahmenverarbeitung.

5. Die obige Aussage gilt nicht für EAs und Skripte, da EAs und Skripte jeweils in ihren eigenen separaten Threads arbeiten.


 
Andrey Khatimlianskii:

Wie behalte ich den Überblick über Zeitreihen und darauf basierende Indikatoren?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Slawa, 2021.06.01 06:34

Wenn Sie zum ersten Mal eine Anfrage stellen, kann es sein, dass der Indikator keine Daten von seinem Symbol, sondern von einem anderen Zeitrahmen erhält, und zwar aus einem einzigen Grund: Die benötigte Zeitreihe ist noch nicht erstellt worden oder wurde bereits nach einiger Zeit zerstört, als es noch keine Anfragen gab.

Nach einer erfolglosen Anfrage senden Sie einfach einen Befehl an Ihr Diagramm, um es zu aktualisieren, und beenden OnCalculate sofort. Es ist garantiert, dass OnCalculate aufgerufen wird und die Zeitreihe zu diesem Zeitpunkt fertig ist

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Merkmale der Sprache mql5, Feinheiten und Tricks

fxsaber, 2017.11.30 09:48

Memo

Aktion/Art des Programms Änderung von TF oder Symbol Kontoänderung
Indikator OnDeinit und OnInit ausführen, globale Klassenobjektänderungen (vollständige Rücksetzung). Es passiert nichts, außer dass prev_calculated zurückgesetzt wird.
EA OnDeinit und OnInit ausführen, das globale Klassenobjekt ändert sich nicht. OnDeinit und OnInit ausführen, globale Klassenobjektänderungen (vollständiges Neuladen).
Das hervorgehobene Verhalten der Indikatoren hat sich geändert. Es ist jetzt dasselbe wie beim EA.
 
fxsaber:
Das Verhalten des hervorgehobenen Indikators hat sich geändert. Er fällt nun mit dem EA zusammen.

Der Punkt ist ein anderer - könnte es sich um ein Versehen und nicht um eine bewusste Verhaltensänderung handeln? Haben Sie es herausgefunden?

 
Artyom Trishkin:

Der Punkt ist ein anderer - könnte es sich um ein Versehen und nicht um eine bewusste Verhaltensänderung handeln? Haben Sie es erkannt?

Das habe ich nicht. Es gibt so gut wie keine Rückmeldungen. Ich habe jedoch gerade eine neue Funktion entdeckt.

const bool Init = EventSetMillisecondTimer(1);
const long Account = AccountInfoInteger(ACCOUNT_LOGIN);

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnTimer()
{
  if (Account != AccountInfoInteger(ACCOUNT_LOGIN))
    Alert(TOSTRING(Account) + TOSTRING(AccountInfoInteger(ACCOUNT_LOGIN)));
}

Dieser Expert Advisor warnt beim Wechsel zwischen Konten. Es scheint, dass sie dies nach der Regel nicht tun sollte.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Merkmale der Sprache mql5, Feinheiten und Tricks

fxsaber, 2017.11.30 09:48

Memo

Aktion/Art des Programms Änderung von TF oder Symbol Kontoänderung
Indikator OnDeinit und OnInit ausführen, globale Klassenobjektänderungen (vollständige Rücksetzung). Es passiert nichts, außer dass prev_calculated zurückgesetzt wird.
EA OnDeinit und OnInit ausführen, das globale Klassenobjekt ändert sich nicht. OnDeinit und OnInit ausführen, globale Klassenobjektänderungen (vollständiges Neuladen).
Dies ist jedoch auf den Timer zurückzuführen.
 
fxsaber:

Dieser Berater warnt beim Wechsel zwischen Konten. Es scheint, dass sie dies nicht tun sollte, gemäß der Regel

Dies geschieht jedoch aufgrund des Timers.

Niemand hat garantiert, dass andere Ereignisbehandler unterbrochen (oder nicht ausgeführt) werden.

Nach dem Alarm erfolgen sowohl deinit als auch init, richtig?

Grund der Beschwerde: