Merkmale der Sprache mql4, Feinheiten und Techniken - Seite 6

 
fxsaber:
Im Gegensatz zu MQL5 können statische Arrays in MQL4 ihre Größe ändern.
Nicht immer

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Neue Version der Plattform MetaTrader 5 build 1595: Zugang zur Kurshistorie

fxsaber, 2017.05.01 16:36

#property strict

template <typename T>
struct ARRAY
{
  T Simple[100];
};

void OnStart()
{
  int ArraySimple[100];
  ARRAY<int> Array;

  Print(ArrayResize(Array.Simple, 10)); // MQL4: -1
  Print(ArrayResize(ArraySimple, 10));  // MQL4: 10
  
  Print(ArraySize(ArraySimple));        // MQL4: 10
  Print(ArraySize(Array.Simple));       // MQL4: 100
}
 

In MT4 gab es schon immer einen Trailing Stop Fehler. Wenn Sie während einer starken Auf- und Abwärtsbewegung der Kurse beobachten,
können Sie sehen, wie sich der SL auf und ab bewegt. Hier gefangen eine kleine Bewegung, passiert viele Male größer
2017.05.22 10:53:38.563 '9898616': Nachlaufstopp #1465775202 -> 1.29765
2017.05.22 10:53:38.483'9898616': Nachlaufstopp #1465775202 -> 1.29764
2017.05.22 10:53:33.236'9898616': Nachlaufstopp #1465775202 -> 1.29763
2017.05.22 10:53:33.130'9898616': Nachlaufstopp #1465775202 -> 1.29764
2017.05.22 10:53:32.813 '9898616': Nachlaufstopp #1465775202 -> 1.29762
Ich habe es bekommen, als SL = 2 war (letzte Ziffer der Einfachheit halber), beim nächsten Tick stieg der Preis und das Terminal gab den Befehl, SL auf 4 zu erhöhen.
Beim nächsten Tick ging es nach unten, aber der SL steht immer noch bei 2. Das Terminal gibt den Befehl, SL auf 3 zu erhöhen.
Der Server, der wie eine Giraffe mit langem Hals aussieht, bearbeitet die erste Bestellung und erhöht SL auf 4. Der Server verarbeitete den zweiten Auftrag und verringerte SL auf 3.
Das Terminal sendet also zusätzliche sinnlose Aufträge, was die Belastung des Servers erhöht.
Darüber hinaus besteht für den Händler das Risiko eines unnötigen Verlustes aufgrund der Rückwärtsbewegung des SL.
Dies gilt auch für Programme, die durch EA oder Skripte abgeschlossen werden . Teilweise korrigieren wir dies, indem wir den SL in Schritten von 3...5 Pips verschieben.

Was ist zu tun? Speichern des Wertes von SL, der bei der letzten OrderModify ausgegeben wurde.
Auf der Grundlage dieses Wertes wird dann die nächste Bestellung berechnet.
Das würde so aussehen: zwei Aufträge weniger an den Server, SL wird nur nach vorne verschoben, was die CPU-Belastung des Computers reduziert.
2017.05.22 10:53:38.563 '9898616': Nachlaufstopp #1465775202 -> 1.29765
2017.05.22 10:53:33.130 '9898616': Nachlaufstopp #1465775202 -> 1.29764
2017.05.22 10:53:32.813 '9898616': Nachlaufstopp #1465775202 -> 1.29762

 

Bei der Änderung von Aufträgen ist es oft notwendig, den vorherigen TP/SL mit dem neuen zu ändernden Wert zu vergleichen. Wenn wir versuchen, ihn mit dem alten Wert zu ändern, erhalten wir Fehler Nr. 1.

Nehmen wir als Beispiel den Vergleich zwischen dem alten SL (100,03) und dem neuen SL (100,02) für USDJPY (Digits = 2). Dies ist in der Hilfe beschrieben:

Bei der zweiten Methode wird die normierte Differenz zweier reeller Zahlen mit einem Nullwert verglichen. Der Vergleich der Differenz von normierten Zahlen mit Null ist nutzlos, da bei jeder mathematischen Operation mit normierten Zahlen das Ergebnis nicht normiert ist.

Das heißt, der Vergleich muss auf diese Weise durchgeführt werden:

if(NormalizeDouble(100.03 - 100.02, Digits) != 0) // можно модифицировать

Manchmal kann der Makler aber auch nicht-normierte Preise angeben. Und wir haben zum Beispiel den Preis 100,025 und nicht 100,02. Nachdem wir nach dem obigen Schema verglichen haben, erhalten wir den Unterschied von 0,01, d.h. wir können ihn ändern. Aber nachdem wir für die Änderung normalisiert auf Digits 100.025 bestanden haben, werden wir tatsächlich 100.03 passieren und dementsprechend werden wir Fehler #1 erhalten.

Generell bin ich nach meinen bisherigen Erfahrungen zu dem Schluss gekommen, dass es bei gleichen Ziffern für Änderungen besser ist, dieDifferenz der normierten Zahlen mit Null zu vergleichen (was die Hilfe nicht empfiehlt).

Skript zur Überprüfung:

void OnStart()
{
  double a = 0.02;
  double b = 0.015;
  
  Print(" norm1 dif=", ND(a - b));            // результат = 0.01
  Print(" norm2 dif=", ND(a) - ND(b));        // результат = 0.0
}

double ND(double d) {return NormalizeDouble(d, 2);}
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
 
if(MathAbs(a-b)>=Point)
 
Yurij Kozhevnikov:
Ja, das können Sie tun. Dies ist die erste Vergleichsmöglichkeit, die in der Hilfe angegeben ist. Ich wollte nur auf die Falle der Normalisierung der realen Zahlen hinweisen, in die ich selbst getappt bin, als ich die zweite in der Dokumentation empfohlene Methode verwendet habe.
 
Kommentare, die für dieses Thema nicht relevant sind, wurden in den Bereich "Organisation des Auftragszyklus" verschoben.
 

Im Gegensatz zu OrderProfit() in MT4 speichert OrderCommission() Daten, die nicht auf Cents gerundet sind.


SZZ In OrderPrint() wird die Provision gerundet (wie im GUI).

 
fxsaber:

Im Gegensatz zu OrderProfit() in MT4 speichert OrderCommission() Daten, die nicht auf Cents gerundet sind.


SZZ In OrderPrint() wird die Provision gerundet (wie im GUI).

Was sollte ich also tun, um den richtigen Wert für OrderProfit()+OrderComission()+OrderSwap() zu erhalten?

 
Artyom Trishkin:

Was ist demnach zu tun, um den richtigen Wert für OrderProfit()+OrderComission()+OrderSwap() zu erhalten?

Nichts! Dies ist der korrekteste Wert. Dank dieser Provision können wir in der GUI sehen, dass die Gesamtprovision um einen Cent von der Summe der von der GUI angezeigten Zahlen abweicht.

 
fxsaber:

Nichts! Dies ist der korrekteste Wert. Dank dieser Provision können Sie in der grafischen Benutzeroberfläche sehen, dass die Gesamtprovision um einen Cent von der Summe der Zahlen abweicht, die die grafische Benutzeroberfläche anzeigt.

Dann verstehe ich das überhaupt nicht. Was meinen Sie mit "OrderCommission() speichert Daten, die nicht auf Cents gerundet sind"? Wo sind sie abgerundet? Und wie werden sie abgerundet?

Grund der Beschwerde: