Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Twitter!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

CDouble & CDoubleVector - Bibliothek für den MetaTrader 5

Ansichten:
847
Rating:
(25)
Veröffentlicht:
2018.08.15 11:27
\MQL5\Scripts\CDoubleDebug\
Double.mqh (28.61 KB) ansehen
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

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:
  • 0 if equal.
  • 1 wenn Dezimalzahl 1 > Dezimalzahl 2.
  • -1 wenn Dezimalzahl 1 < Dezimalzahl 2.
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

(double &arr[], double step = NULL)

Rundet ein gesamtes Array auf den angegebenen Schrittweite oder auf die Tick-Größe des aktuellen Symbols, wenn step == NULL ist.
static void
RoundArrayToStep

(CArrayDouble &arr, double step = NULL)

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

(double number, int digits)

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:

  • PRECISION_DEFAULT - Legt die Standardgenauigkeit auf einen Schrittweite zwischen 1 und 8 Stellen fest, welches durch Aufrufen von Step() oder Digits() überschrieben werden kann
  • PRECISION_TICK_SIZE - Sperrt alle Rundungsmethoden auf die tick size des angegebenen Symbols.
  • PRECISION_LOT_STEP - Sperrt alle Rundungsmethoden auf die Schrittweite der Losgröße des angegebenen Symbols.
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:

  • PRECISION_DEFAULT - Legt die Standardgenauigkeit auf eine Schrittweite zwischen 1 und 8 Stellen fest, die durch Aufrufen von Step() oder Digits() überschrieben werden kann.
  • PRECISION_TICK_SIZE - Sperrt alle Rundungsmethoden auf die tick size des angegebenen Symbols.
  • PRECISION_LOT_STEP - Sperrt alle Rundungsmethoden auf die Schrittweite der Losgröße des angegebenen Symbols.
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

Renko 2.0 Renko 2.0

Ein kompletter Renko Chart-Indikator mit Dochten. Konfigurierbar mit Hilfe von Tick Size, Pip Size oder Points.

DEMA_Range_Channel DEMA_Range_Channel

Ein Kanal, der aus zwei doppelten exponentiellen gleitenden Durchschnitten besteht, die auf den gemittelten Hochs und Tiefs basieren

MAMA + FAMA MAMA + FAMA

Dieser Indikator verwendet die kombinierten Werte von MAMA (MESA Adaptive Moving Average) und FAMA (Following Adaptive Moving Average) zur Beurteilung der Marktentwicklung.

MAMA + FAMA Oscillator MAMA + FAMA Oscillator

Kombination aus MAMA (MESA Adaptive Moving Average) und FAMA (Following Adaptive Moving Average) als Oszillator.