und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
CDouble & CDoubleVector - Bibliothek für den MetaTrader 5
- Ansichten:
- 890
- Rating:
- Veröffentlicht:
- 2018.08.15 11:27
- Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Eine Bibliothek für gängige Rundungsmethoden in der MQL-Entwicklung, primitive Wrapper-Klasse für Typ (double) und Vektor für CDouble-Objekte. MQL5 und MQL4 kompatibel!
Version 1.02: (2018.02.18)
- Es wurde ein Fehler behoben, bei dem ein gerundetes Ergebnis vom erwarteten Ergebnis abweichen konnte. DANKE AMRALI!
Version 1.01:
- Fehler behoben, bei dem arithmetische Operatoren keine gerundeten Werte zurückgaben.
- Symbol Setter Methode hinzugefügt, um das Symbol nach dem Aufruf des Konstruktors zu setzen.
CDouble
Die Klasse CDouble umschließt einen Wert vom primitiven Typ double in ein Objekt. Zusätzlich bietet diese Klasse mehrere Methoden und statische Methoden für Rundung von Doubles und Arrays/Kollektionen vom Typ double.
Deklaration
class CDouble : public CObject
Titel
#include <Double.mqh>
Vererbungshierarchie
- CObject
- CDouble
Virtuelle Methode implemented/overridden von der Klassen CObject: Type, Load, Save, Compare.
Ein Objekt vom Typ CDouble mit folgenden 5 Datenfeldern:
string |
m_symbol |
Symbol, das der Klasseninstanz zugewiesen wird, um die Wert für lot step und tick size zum Runden abzufragen. |
double |
m_value |
Unbearbeiteter Dezimalwert, der der Instanz übergeben wurde. |
uchar |
m_step |
Schrittweite zum Runden in Form eines char-Wertes, um den Speicherverbrauch zu reduzieren. z.B. 0.0025 wird zu 25. |
uchar |
m_digits |
Anzahl der Nachkommastellen. |
ENUM_PRECISION |
m_mode |
Berechnungsweise zur Auswahl der Rundungsmethode mit einer besonderen "Schrittweite". |
Bevor wir weiter in die Dokumentation einsteigen, hier ein kurzes praktisches Beispiel der Wrapper-Klasse in Aktion:
MqlTick tick; SymbolInfoTick(_Symbol,tick); CDouble price = tick.ask - 0.0087263487676283476, sl = price - 500*_Point, tp = price + 500*_Point, lots = 5.25 / 3.78789; MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = price.AsRoundedTick(); r.sl = sl.AsRoundedTick(); r.tp = tp.AsRoundedTick(); r.volume= lots.AsRoundedLots();...
Ein anderes Beispiel, das die 'static' Methoden der Bibliothek verwendet:
MqlTick tick; SymbolInfoTick(_Symbol,tick); MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = tick.ask - 0.0087263487676283476, r.sl = price - 500*_Point, r.tp = price + 500*_Point, r.volume= 5.25 / 3.78789; ... CDouble::RoundTradeRequest(r); //Preis wird automatisch auf 'tick size' gerundet //und das Volumen auf 'lot step'
Zusammenfassung der 'static' Methoden
Hinweis: Es ist nicht notwendig, OOP zu kennen oder eine Wrapper-Klasseninstanz zu verwenden, um diese Bibliothek zu nutzen. Alles was man tun muss, ist die 'static' Funktionen mit CDouble Scope Auflösung aufzurufen. Die Syntax ist wie folgt:
type variable_name = CDouble::Method(args);
Modifizierer und Typ | Methode | Beschreibung |
---|---|---|
static bool |
IsEqual (double number1, double number2, double step); |
Vergleicht zwei Dezimalzahlen und gibt einen booleschen Wert zurück, indem die zweite Zahl von der ersten abgezogen wird, die Differenz auf "step" (Schrittweite) gerundet wird und mit 0 verglichen wird. |
static bool |
IsEqual (double number1, double number2, int digits); |
Vergleicht zwei Dezimalzahlen und gibt einen booleschen Wert zurück, indem die zweite Zahl von der ersten abgezogen wird, die Differenz auf "digits" (Dezimalstellen) gerundet wird und mit 0 verglichen wird. |
static int |
Compare (double number1, double number2, double step) |
Vergkeicht zwei Dezimalzahlen und gibt eine ganze Zahl zurück:
|
static double |
RoundToStep (const double number, double step) |
Rückgabe des auf die Genauigkeit von 'step' gerundeten Wertes (zB. 0.0025). |
static double |
RoundToDigit (const double number, int digits) |
Rückgabe des auf die Genauigkeit von 'digit' Dezimalstellen gerundeten Wertes (gleich wie NormalizeDouble). |
static double |
RoundToStepUp (const double number, double step) |
Rückgabe des auf die Genauigkeit von 'step' aufgerundeten Wertes. |
static double |
RoundToStepDown (const double number, double step) |
Rückgabe des auf die Genauigkeit von 'step' abgerundeten Wertes. |
static double |
RoundToTick (const double number, string symbol=NULL) |
Rückgabe des auf den nächsten des mit tick size gerundeten Wertes des aktuellen Symbols (symbol=NULL) oder des mit dem Parameter symbol angegebenen Symbols. |
static double |
RoundToLots (const double number, string symbol=NULL, bool always_return_valid=true) |
Rückgabe des auf den nächsten des mit lot step gerundeten Wertes des aktuellen Symbols (symbol=NULL) oder des mit dem Parameter symbol angegebenen Symbols. always_return_valid == true: Rückgabe ist immer ein gültiger Wert (min_lots <= Rückgabewert <= max_lots) |
static void (MQL5) |
RoundTradeRequest (MqlTradeRequest &request) |
Ändert Preis, sl, tp und volume des in der verlangten Symbols. Rundet den Preis, sl und tp auf die nächste Tick-Größe. Rundet das Volumen auf den nächsten Los-Größe ab. |
static void |
RoundArrayToStep |
Rundet ein gesamtes Array auf den angegebenen Schrittweite oder auf die Tick-Größe des aktuellen Symbols, wenn step == NULL ist. |
static void |
RoundArrayToStep |
Rundet ein gesamtes CArrayDouble collection auf den angegebenen Schrittweite oder auf die Tick-Größe des aktuellen Symbols, wenn step == NULL ist. |
static int |
GetDigits (double floating_point) |
Rückgabe der Anzahl der Dezimalstellen bis abschließenden Nullen einer Dezimalzahl. (z.B. 0.0002500... würde 5 zurückgeben). |
static double |
GetPoint (int digits) |
Rückgabe der Dezimalzahl mit der angegebenen Anzahl von Dezimalstellen. (z.B. 3 gäbe zurück 0.001). |
static string |
ToString |
Rückgabe einer auf die angegeben Dezimalstellen gerundeten Dezimalzahl als Zeichenkette, wobei abschließende Nullen weggelassen werden (z.B. CDouble::ToString(1.23400001, 6) gäbe zurück "1.234"). |
Beispiele:
MqlTick tick; SymbolInfoTick(_Symbol,tick); double rnd_by_step = CDouble::RoundToStep(tick.bid*1.052565465,_Point); double rnd_by_digits = CDouble::RoundToDigit(tick.bid*1.052565465,_Digits); double by_lot_step = CDouble::RoundToLots(0.123423,_Symbol); double by_tick_size = CDouble::RoundToTick(tick.ask-100*_Point,_Symbol); double roundup = CDouble::RoundToStepUp(3.999999999,_Point); double rounddn = CDouble::RoundToStepDown(3.999999999,_Point); int digits = CDouble::GetDigits(0.0000025); double point = CDouble::GetPoint(10); bool equal = CDouble::IsEqual(tick.bid,tick.bid+0.00000009,_Point); string tostr = CDouble::ToString(3.1399999999999999); int compare = CDouble::Compare(tick.ask,tick.bid); #ifdef __MQL5__ MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = tick.ask+0.000089849847658759198199999; r.sl = r.price - 503 * _Point; r.tp = r.price + 503 * _Point; r.volume= 1.127984984; CDouble::RoundTradeRequest(r); #endif
Zusammenfassung der Konstruktoren
Konstruktor | Beschreibung |
---|---|
CDouble (const ENUM_PRECISION mode = PRECISION_DEFAULT, const string symbol = NULL) |
Hinweis: Es ist nicht erforderlich, den Konstruktor explizit aufzurufen, da die Argumente im Aufruf initialisiert werden. Es ist auch nicht erforderlich, eine Rundungsmethode anzugeben, da die Methoden, die einen gerundeten Wert zurückgeben, auf dem Aufruf basieren. ENUM_PRECISION:
|
CDouble (const CDouble &other) |
Konstruktor kopieren: Kopiert alle privaten Felder eines anderen Objekt in dieses Objekt. |
Beispiele:
CDouble num; CDouble bid(PRECISION_TICK_SIZE, _Symbol); CDouble ask(bid) CDouble ask2 = bid; CDouble lots(PRECISION_LOT_STEP, _Symbol);
Zzusammenfassung der Zuordnungen - Überladene Zuweisungsoperatoren
Modifizierer und Typ | Methode | Beschreibung |
---|---|---|
void |
Set(const double value) |
weist m_value den unbearbeiteten Dezimalwert zu |
void |
Set(const CDouble &other) |
weist m_value den unbearbeiteten Dezimalwert von CDouble object zu |
void |
Overloaded operators =, +=, -=, *=, /= (double OR CDouble&) | weist m_value den unbearbeiteten Dezimalwert zu oder verändert ihn. |
Hinweis: Der Zuweisungsoperator = kann in derselben Zeile wie die Deklaration aufgerufen werden.
Beispiele:
CDouble bid; bid.Set(tick.bid); CDouble ask = tick.ask; CDouble pi = 3.14; CDouble factor = 2; pi*=factor; Print(pi.ToString()); //6.28
Zusammenfassung der überladenen arithmetischen Operatoren
Modifizierer und Typ | Methode | Beschreibung |
---|---|---|
double |
Overloaded operators +, -, *, / (double OR CDouble&) | Kann entweder Double oder CDouble als Argument akzeptieren. Gibt nach der Anwendung der dem überladenen Operator zugeordneten Arithmetik einen Dezimalwert zurück. |
Hinweis: Nur eine arithmetischer Operator kann je Anweisung verwendet werden.
Syntax der überladenen arithmetischen Operatoren:
type_double_result <-- CDouble_object <-- operator <-- double //CDouble Objekte stehen immer auf der linken Seite des Operators type_double_result <-- CDouble_object1 <-- operator <-- CDouble_object2 //Die Reihenfolge spielt bei der Verwendung von zwei CDouble Objekten keine Rolle.
Beispiele:
CDouble foo = 3.14; CDouble bar = 10; CDouble foobar = bar + foo; //13.14 CDouble err = bar + foo + foobar; //Error - illegale Operation verwendet double var = bar / foo;
Zusammenfassung, überladene Vergleichsoperator
Modifizierer und Typ | Methode | Beschreibung |
---|---|---|
bool |
Overloaded operators ==, !=, >, <, >=, <= (double OR CDouble&) |
Kann entweder Double oder CDouble als Argument akzeptieren. Gibt den booleschen Wert des Wertevergleichs zurück. Hinweis: Dies verwendet die Vergleichsmethode <static int> Compare. |
Beispiele:
CDouble foo = 3.14, bar = 3.139999999999999999999; Print(foo == bar); //true Print(foo <= bar); //true Print(foo > bar); //false
Zusammenfassung Methoden zu Instanziierung
Präzisionssteuerung (Standardwerte): Dezimalstelle (digits) = 8; Schrittweite (step) = 1e-08
- Es gibt drei Möglichkeiten, die Genauigkeit zu steuern: Schrittweite, Dezimalstellen oder PrecisionMode(ENUM_PRECISION). Jeder Aufruf einer dieser Methoden überschreibt die vorherigen Einstellungen.
- Die Schrittweite ist entweder der _Point oder LOT_STEP oder TickSize; dargestellt als Dezimalzahl (zB 0.00001, 0.025 etc.)
- Es ist nicht erforderlich, die Schrittweite festzulegen, da RoundToTick und RoundToLot automatisch die entsprechenden Schrittweiten für die Rundung verwenden.
Modifizierer und Typ | Methode | Beschreibung |
---|---|---|
void |
PrecisionMode (const ENUM_PRECISION mode) |
Legt den Standardmodus für Rundungsberechnungen und ToString fest. Überschreibt bestehende Schritt- und Zifferneinstellungen. Hinweis: Kann auch im Konstruktor festgelegt werden. ENUM_PRECISION:
|
ENUM_PRECISION |
PrecisionMode() |
Rückgabe der aktuellen Rundungsart. |
void |
Step (const double step_or_point) |
Setzt die Schrittweite auf den angegebenen Wert. Überschreibt den aktuellen Wert. |
double |
Step() |
Rückgabe des der aktuellen Schrittweite. |
void |
Digits (const int digits) |
Setzt die Genauigkeit auf die angegebene Anzahl von Dezimalstellen. Überschreibt den aktuellen Wert und setzte die Schrittweite auf 1e-(Dezimalstellen). |
int |
Digits() |
Rückgabe der aktuell verwendeten Dezimalstellen. |
double |
AsRawDouble() |
Rückgabe des unbearbeiteten, gespeicherten Dezimalwerts. |
double |
AsRounded() |
Gibt den zur nächsten angegebenen Schrittweite gerundeten Wert zurück. Standard = 1e-08. Der Schrittweite ist bei PRECISION_TICK_SIZE auf tick size festgelegt. Bei PRECISION_LOT_STEP ist die Schrittweite 'step' für den Losgröße gesperrt. |
double |
AsRoundedUp() |
Rückgabe des auf die Genauigkeit von 'step' aufgerundeten Wertes. |
double |
AsRoundedDown() |
Rückgabe des auf die Genauigkeit von 'step' abgerundeten Wertes. |
double |
AsRoundedTick() |
Gibt den zur nächsten angegebenen Schrittweite gerundeten Wert zurück - bestimmt durch tick size des Symbols. |
double |
AsRoundedLots (bool always_return_valid = true) |
Gibt den zur nächsten Losgröße gerundeten Wert zurück - bestimmt durch lot setp des Symbols. |
int |
ToInt() |
Rückgabe der Ganzzahl (int). |
long |
ToLong() |
Rückgabe der Ganzzahl (long). |
string |
ToStringPrecision() |
Rückgabe als Zeichenkette inkl. der letzten Nullen. |
string |
ToString() |
Rückgabe als Zeichenkette ohne die letzten Nullen. |
string |
Symbol() |
Rückgabe des aktuellen Symbols. |
string |
Symbol(const string symbol) |
Setzt das aktuelle Symbol auf ein anderes Symbol als das des Charts, nachdem der Konstruktor aufgerufen wurde. Wird verwendet, wenn mit mehreren Symbolen gearbeitet wird. |
Beispiele:
CDouble pi2 = 3.14159265359; // getting value as... double raw_double = pi2.AsRawDouble(); double round_double_to_step = pi2.AsRounded(); double tick_size_double = pi2.AsRoundedTick(); double lot_step_double = pi2.AsRoundedLots(); double rounded_up = pi2.AsRoundedUp(); double rounded_down = pi2.AsRoundedDown(); int double_to_int = pi2.ToInt(); long double_to_long = pi2.ToLong(); string precision_str = pi2.ToStringPrecision(); pi2 = 3.140000000009; pi2.Digits(8); string truncated_str = pi2.ToString();
Zusammenfassung der virtuellen Methoden
Methoden, die von CObject überschrieben werden:
Modifizierer und Typ | Methode | Beschreibung |
---|---|---|
virtual int |
Compare (const CObject *node, const int mode=0) |
Diese Methode wird zum Sortieren und Suchen verwendet und vergleicht den AsRounded-Wert dieses Objekts mit dem AsRounded-Wert des übergebenen Knotens. |
virtual int |
Type() |
Rückgabe der Ganzzahl einer Dezimalzahl. |
virtual bool |
Save(const int file_handle) |
Serialisiert und speichert die Mitgliedsvariablen in der Datei des übergegebenen Handles. |
virtual bool |
Load(const int file_handle) |
Setzt die Mitgliedsvariablen auf die in der Datei des übergegebenen Handles gespeicherten Werte. |
Für Beispiele siehe CDoubleVector weiter unten.
CDoubleVector
Die KLasse CDoubleVector ist eine Kollektion von Objektzeigern, die für die dynamischen Instanzen CDouble spezialisiert ist.
Deklaration
class CDoubleVector : public CArrayObj
Titel
#include <Double.mqh>
Vererbungshierarchie
Virtuelle Methoden implementiert/überschrieben von der Klasse CArrayObj: CreateElement.
Zusammenfassung Methoden zu Instanziierung
**Siehe CArrayObj für die geerbten 'public' Methoden.
Modifizierer und Typ | Methode | Beschreibung |
---|---|---|
CDouble* |
operator[] (const int index) |
Überladener Indexoperator Gibt den Zeiger auf das Objekt bei mit dem Index n des Vektors zurück. |
bool |
Add(const double value) |
Nimmt eine simple Dezimalzahl als Argument und konvertiert sie in ein CDouble-Objekt und fügt es dem Ende des Vektors hinzu. |
bool |
AssignDoubleArray (const double &array[]) |
Nimmt ein Array von Dezimalzahlen und konvertiert sie in CDouble-Objekte und weist sie einem Vektor zu. |
bool |
CopyOut(double &arr[]) |
Kopiert die CDouble-Werte des Vektors in ein Array einfacher Dezimalzahlen. |
bool |
CopyOut(CArrayDouble &arr) |
Kopiert die CDouble-Werte des Vektors in eine Kollektion CDoubleArray. |
virtual bool |
Save(const int file_handle) |
Speichert einen Vektor in der Datei der übergebenen Handles. |
virtual bool |
Load(const int file_handle) |
Lädt einen gespeicherten Vektor aus der Datei des übergebenen Handles. |
Beispiele:
CDoubleVector *vect = new CDoubleVector; double dubs[]={3.14,1.21,55.555}; vect.AssignDoubleArray(dubs); vect.Add(tick.bid); //Aufruf des CDouble Objekts über den Index Print(vect[vect.Total()-1].ToString()); //neues CDouble object hinzufügen CDouble *lot = new CDouble(PRECISION_LOT_STEP); lot = 1.22; vect.Add(lot); //Vektor aufwärts sortieren vect.Sort(); int total = vect.Total(); //Speichern des Vektors in der Datei einschließlich des Status von CDouble Objekts und der Werte string f = "testdub.bin"; int h = FileOpen(f,FILE_WRITE|FILE_BIN); if(vect.Save(h)) Print("save successful"); FileClose(h); delete vect; //laden des Vektors aus der Datei CDoubleVector vect_reborn; h=FileOpen(f,FILE_READ|FILE_BIN); if(vect_reborn.Load(h)) Print("load successful"); FileClose(h); total = vect_reborn.Total(); Print("Total vector size = ",sizeof(vect_reborn)," bytes"); for(int i=0;i<vect_reborn.Total();i++) Print(vect_reborn[i].ToString()); //Kopieren in double arr double arr2[]; vect_reborn.CopyOut(arr2); Print(ArraySize(arr2));
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/en/code/19727
Ein kompletter Renko Chart-Indikator mit Dochten. Konfigurierbar mit Hilfe von Tick Size, Pip Size oder Points.
DEMA_Range_ChannelEin Kanal, der aus zwei doppelten exponentiellen gleitenden Durchschnitten besteht, die auf den gemittelten Hochs und Tiefs basieren
Dieser Indikator verwendet die kombinierten Werte von MAMA (MESA Adaptive Moving Average) und FAMA (Following Adaptive Moving Average) zur Beurteilung der Marktentwicklung.
MAMA + FAMA OscillatorKombination aus MAMA (MESA Adaptive Moving Average) und FAMA (Following Adaptive Moving Average) als Oszillator.