void ArrayPrint( const void& array[], // Output Array uint digits=_Digits, // Anzahl von Dezimalstellen nach dem Komma const string separator=NULL, // Trennzeichen zwischen den Werten der Felder einer Struktur ulong start=0, // Index des ersten ausgegebenen Elements ulong count=WHOLE_ARRAY, // Anzahl der ausgegebenen Elemente ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN );ArrayPrint gibt nicht alle Felder eines Struktur-Arrays im Journal aus – Felder-Arrays und Pointer-Arrays von Objekten werden ausgelassen. Für die Ausgabe aller Felder einer solcher Struktur wird eine eigene Funktion mit der gewünschten Formatierung benötigt..
//--- ibt die Werte der letzten zehn Balken aus MqlRates rates[]; if(CopyRates(_Symbol,_Period,1,10,rates)) { ArrayPrint(rates); Print("Überprüfung\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]"); for(int i=0;i<10;i++) { PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i, TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS), rates[i].open,rates[i].high,rates[i].low,rates[i].close, rates[i].tick_volume,rates[i].spread,rates[i].real_volume); } } else PrintFormat("CopyRates failed, error code=%d",GetLastError()); //--- Beispiel für den Output /* [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 Überprüfung [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 */
void OnStart() { int arr[]; //--- wie viel Speicherplatz ursprünglich verwendet wurde Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- wie viel Speicherplatz für das Array mit der Größe 1 verwendet wurde, aber mit Reserve ArrayResize(arr,1,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- nach der Vergrößerung des Arrays wird der Speicherplatz dank der Reserve nicht geändert ArrayResize(arr,1024*512,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- nach der Reduzierung des Arrays verändert sich die Speichergröße nicht ArrayResize(arr,1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- der vom Array nicht genutzte Speicherplatz wird durch das Löschen der Reserve frei ArrayResize(arr,1,-1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); }
#include <Graphics/Graphic.mqh> double Func1(double x) { return MathPow(x,2); } double Func2(double x) { return MathPow(x,3); } double Func3(double x) { return MathPow(x,4); } void OnStart() { GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES); }Das Ergebnis:
#include <Math/Stat/Binomial.mqh> #include <Graphics/Graphic.mqh> void OnStart(void) { double vars[101]; double results[101]; const int N=2000; //--- MathSequence(0,N,20,vars); MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results); ArrayPrint(results,4); GraphPlot(results); //--- }Das Ergebnis:
Die Dokumentation wurde aktualisiert.
Es wurden Tooltips für die Buttons Buy, Sell und Close in Handelsdialogen hinzugefügt. Die Tooltips erklären, welche Aktiva genau bei der Abwicklung der Transaktion gekauft bzw. verkauft werden, und helfen Anfängern den Sinn des Handeslprozesses besser nachzuvollziehen.
Eigenschaften der Bibliothek
Wie es verwendet wird
Die Dateien der ALGLIB sind im Verzeichnis \MQL5\Include\Math\Alglib gespeichert. Für die Verwendung der Funktionen, fügen Sie Ihrem Programm die Hauptdatei hinzu:
Der Standardbibliothek wurden Funktionen für das Arbeiten mit der mathematischen Statistik hinzugefügt. Nun sind die Möglichkeiten der R-Sprache, eines der besten Werkzeuge der statistischen Datenverarbeitung und -analyse, in MQL5 verfügbar.
Eigenschaften der Bibliothek
Die statistische Bibliothek beinhaltet Funktionen für die Berechnung statistischer Eigenschaften sowie Funktionen für das Arbeiten mit statistischen Verteilungen:
Wie es verwendet wird
Die Dateien der statistischen Bibliothek sind in \MQL5\Include\Math\Stat gespeichert. Um Funktionen der Bibliothek zu verwenden, fügen Sie die Datei mit den notwendigen Funktionen in Ihr Programm hinzu, zum Beispiel:
#include <Math\Stat\Binomal.mqh> #include <Math\Stat\Cauchy.mqh>
Eine ausführliche Beschreibung der Bibliotheksfunktionen finden Sie im Artikel Statistische Verteilung in MQL5 - das beste aus R rausholen.
Der Standardbibliothek wurde eine MQL5-Version der Fuzzy-Bibliothek hinzugefügt, in der Inferenzen vom Typ Mamdani und Sugeno implementiert werden.
Eigenschaften der Bibliothek
Wie es verwendet wird
Die Dateien der Fuzzy-Bibliothek sind im Verzeichnis \MQL5\Include\Math\Fuzzy gespeichert. Um Funktionen der Bibliothek zu verwenden, fügen Sie die Datei mit den notwendigen Funktionen in Ihr Programm hinzu, zum Beispiel:
#include <Math\Fuzzy\mamdanifuzzysystem.mqh> #include <Math\Fuzzy\sugenofuzzysystem.mqh>
Eine ausführliche Beschreibung der Bibliothek ist in der Code Base zu finden: Fuzzy - Bibliothek für das Arbeiten mit der Fuzzy-Logik
long FileLoad( const string filename, // [in] Dateiname void &buffer[], // [out] ein Array, in das die Datei geschrieben wird liest uint common_flag=0 // [in] 0 - Suche nach der Datei im Files-Ordner des Terminals, FILE_COMMON - im gemeinsamen Verzeichnis der Terminals ); bool FileSave( const string filename, // [in] Dateiname const void &buffer[], // [in] Array, welches in der Datei gespeichert wird uint common_flag=0 // [in] 0 - Erstellung einer Datei im Files-Ordner des Terminals, FILE_COMMON - im gemeinsamen Verzeichnis der Terminals ); );Ein Beispiel dafür, wie Ticks in eine Datei geschrieben und anschließend gelesen werden:
//--- Eingabeparameter input int ticks_to_save=1000; // Anzahl von Ticks //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { string filename=_Symbol+"_ticks.bin"; MqlTick ticks[]; //--- int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save); if(copied!=-1) { PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied); //--- wenn die Tick-Historie synchronisiert ist, ist der Fehlercode gleich Null if(!GetLastError()==0) PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError); //--- schreiben wir die Ticks in eine Datei if(!FileSave(filename,ticks,FILE_COMMON)) PrintFormat("FileSave() failed, error=%d",GetLastError()); } else PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError()); //--- nun lesen wir diese Ticks aus der Datei ArrayFree(ticks); long count=FileLoad(filename,ticks,FILE_COMMON); if(count!=-1) { Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags"); for(int i=0;i<count;i++) { PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x", TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000, ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags); } } }
//--- Kerzen haben die gleiche Farbe #property indicator_label1 "One color candles" #property indicator_type1 DRAW_CANDLES //--- es wurde nur eine Farbe angegeben, deswegen haben alle Kerzen die gleiche Farbe #property indicator_color1 clrGreenWenn zwei Farben angegeben wurden, werden die Umrisse der Kerzen die erste Farbe und der Körper — die zweite Farbe haben.
//--- die Farbe der Kerzen unterscheidet sich von der Farbe der Schatten #property indicator_label1 "Two color candles" #property indicator_type1 DRAW_CANDLES //--- Schatten und Umriss - grün, Körper - weiss #property indicator_color1 clrGreen,clrWhiteWenn drei Farben angegeben wurden, werden der Umriss der Kerzen die erste Farbe, bullische Kerzen - die zweite und bärische Kerzen - die dritte Farbe haben.
//--- die Farbe der Kerzen unterscheidet sich von der Farbe der Schatten #property indicator_label1 "One color candles" #property indicator_type1 DRAW_CANDLES //--- die Schatten und der Umriss sind grün, der Körper der bärischen Kerze ist weiß, der Körper der bärischen Kerze ist rot #property indicator_color1 clrGreen,clrWhite,clrRedAuf diese Weise kann man mithilfe des Stils DRAW_CANDLES eigene benutzerdefinierte Varianten der Kerzenfarben gestalten. Alle Farben können beim Laufen des Indikators mithilfe der Funktion PlotIndexSetInteger(Index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_nummer, Farbe) geändert werden, wobei:
//--- setzen wir die Farbe für den Umriss und die Schatten PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue); //--- setzen wir die Farbe für den Körper der bullischen Kerze PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen); //--- setzen wir die Farbe für den Körper der bärischen Kerze PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
Die Dokumentation wurde aktualisiert.
class CFoo final { //--- Body der Klasse }; class CBar : public CFoo { //--- Body der Klasse };Bei einem Versuch der Vererbung von einer Struktur mit dem final Modifier, wie im Beispiel oben, gibt der Compiler einen Fehler aus:
class CFoo { void virtual func(int x) const { } };Weiter wird die Methode in der abgeleiteten Klasse neu definiert:
class CBar : public CFoo { void func(short x) { } };Aber durch einen Fehler ändert sich der Typ des Arguments von int zu short. In diesem Fall wird die Methode nicht mehr überschrieben, sondern überladen. In einigen Situationen kann der Compiler entsprechend dem Algorithmus der überladenen Funktion eine in der Basisklasse definierte Methode statt einer überschriebenen auswählen.
class CBar : public CFoo { void func(short x) override { } };Wenn die Signatur beim Überschreiben geändert wird, kann der Compiler keine Methode mit der gleichen Signatur in der Basisklasse finden und gibt einen Kompilierungsfehler aus:
class CFoo { void virtual func(int x) final { } }; class CBar : public CFoo { void func(int) { } };Bei einem Versuch der Vererbung von einer Struktur mit dem final Modifier, wie im Beispiel oben, gibt der Compiler einen Fehler aus:
class CFoo { }; class CBar { }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { void *vptr[2]; vptr[0]=new CFoo(); vptr[1]=new CBar(); //--- for(int i=0;i<ArraySize(vptr);i++) { if(dynamic_cast<CFoo *>(vptr[i])!=NULL) Print("CFoo * object at index ",i); if(dynamic_cast<CBar *>(vptr[i])!=NULL) Print("CBar * object at index ",i); } CFoo *fptr=vptr[1]; // Führt zu einem Fehler bei der Umwandlung der Pointer, vptr[1] ist kein Objekt von CFoo } //+------------------------------------------------------------------+
string text="Hello"; ushort symb=text[0]; // Gibt den Code des Symbols 'H' zurück
Die Dokumentation wurde aktualisiert.
Tester: Berechnung der Kommission als Zinssatz per annum beim Testen korrigiert.
Tester: Neuberechnung und Anzeige des Kontostandes auf dem Chart korrigiert, der im Laufe des Testens erstellt wird.
Nach zwei Monaten nach dem öffentlichen Testen wurde die Webversion der Multi-Asset-Plattform MetaTrader 5 offiziell herausgegeben. Mit der Webplattform MetaTrader 4 können Sie von jedem Browser aus in jedem Betriebssystem handeln. Die Plattform soll nicht auf Ihren PC installiert werden, Sie brauchen nur einen Internetanschluss und einen Browser.
Die Benutzerfreundlichkeit und die Cross-Plattform-Eigenschaft des Webterminals wird durch die Vorteile der MetaTrader 5 Desktopversion ergänzt. Dazu gehören die Schnelligkeit, die Multi-Asset-Feature und erweiterte Handelsfunktionen. Das Hauptmerkmal dieser Version stellt die Markttiefe dar, die es erlaubt Markt- und Pending Orders mit einem Klick zu platzieren.
Darüber hinaus erlaubt es die Webplattform, technische Analyse
durchzuführen und Handelsoperationen genauso wie in der Desktop-Version
auszuführen. Die Anwendung bietet:
Nun ist es einfach, SSL-Zertifikate aus der Desktop-Plattform in die mobile zu übertragen. iTunes wird nicht mehr benötigt.
Konten in MetaTrader 5 kann man zusätzlich durch ein Zertifikat geschützt werden, ohne dessen man sich nicht in das Konto einloggen kann. Wenn das Zertifikat in der Desktop-Plattform erstellt wurde, muss es für den Zugriff auf das Konto in der mobilen Plattform übertragen werden.
Um ein Zertifikat zu übertragen, öffnen Sie die Desktop-Version von MetaTrader 5, klicken Sie mit der rechten Maustaste auf dem Konto im Navigator-Fenster und wählen Sie "Übertragen" aus. Geben Sie ein Passwort für den Schutz des Zertifikats ein, öffnen Sie das mobile Terminal und loggen Sie sich ein. Es wird Ihnen angeboten, das Zertifikat zu importieren.
Darüber hinaus gibt es einen Migrations-Dialog für die Konten, die aus dem MetaTrader 4 übertragen wurden. Wenn Ihr Konto auf die Plattform der fünften Generation übertragen wurde, werden Sie herzlichst begrüßt und über Features der Plattform informiert. Anschließend wird es Ihnen angeboten, Ihr Passwort zu ändern.
Früher |
Jetzt |
|
---|---|---|
Auslösung | Alle Arten von Pending Orders und SL/TP Orders zu Bid/Ask |
Limit Orders zu Bid/Ask Stop, Stop Limit und SL/TP Orders zu Last |
Ausführung | Alle Arten von Pending Orders und SL/TP Orders zum Preis, der in der Order angegeben wurde |
Alle Arten von Pending Orders und SL/TP Orders zu Bid/Ask Marktkursen zum Zeitpunkt der Auslösung |
Schauen wir uns das Symbol Si-6.16 als Beispiel an. Bei aktuellen
Kursen Bid=72570, Ask=72572, Last=72552 wurde eine Buy Stop Order mit
der Auslösung zum Preis 72580 platziert. Im Price Stream haben wir neue
aktuelle Kurse bekommen:
Als Auslöser von Stop Orders dient für Börseninstrumente der
Last-Kurs. Aus diesem Grund aktiviert Last=72580 im Stream die Buy Stop
Order. Früher hätte man den Kurs 72580 für die Ausführung dieser Order
verwendet. Das war aber falsch, denn es gibt keinen Ask=72580 für die
Ausführung des Buy-Trades auf dem Markt.
Verbesserungen anhand Crash-Logs.
Auf vielfachen Wunsch von Tradern wurde ein Webversion der Handelsplattform MetaTrader 5 entwickelt. Die Benutzerfreundlichkeit und die Cross-Plattform-Eigenschaft des Webterminals wird durch die Vorteile der MetaTrader 5 Desktopversion ergänzt. Dazu gehören die Schnelligkeit, die Multi-Asset-Feature und erweiterte Handelsfunktionen.
Die Webplattform MetaTrader 5 ist nun auf der Webseite der MQL5.community verfügbar können Sie aus jedem Browser in jedem Betriebssystem handeln. Dafür brauchen sie nur einen Internetanschluss.
Die Betaversion bietet den Tradern:
Netting
In diesem System kann zur gleichen Zeit nur eine Position pro Symbol vorhanden sein:
Dabei ist es irrelevant, was den Trade in der entgegengesetzte
Richtung hervorgerufen hat — die Ausführung einer Marktorder oder
Auslösung einer Pending-Order.
Das Beispiel unten zeigt die Ausführung von zwei Buy-Trades EURUSD mit dem Volumen in Höhe von 0.5 Lots:
Aus der Ausführung dieser Trades ergab sich eine gemeinsame Position mit einem Volumen in Höhe von einem Lot.
Hedging-System
Beim Hedging kann man eine Vielzahl von Positionen auf einem und
demselben Symbol haben, darunter auch von entgegengesetzte Positionen.
Wenn eine offene Position für das Symbol vorhanden ist, und der Händler
einen neuen Trade ausführt (bzw. eine Pending-Order ausgelöst wird),
wird eine neue Position eröffnet. Die vorhandene Position ändert sich
nicht.
Das Beispiel unten zeigt die Ausführung von zwei Buy-Trades EURUSD mit dem Volumen in Höhe von 0.5 Lots:
Die Ausführung dieser Trades führte zur Eröffnung zwei separater Positionen.
Neuer Typ von Handelstransaktionen Close By
Für Konten mit Hedging wurde ein neuer Typ von Transaktionen
hinzugefügt — Schließung einer Position zur Gegenposition. Diese
Operation ermöglicht es, zwei gegensätzliche Positionen auf einem
Instrument gleichzeitig zu schließen. Wenn die Gegenpositionen
unterschiedliche Zahl von Lots haben, bleibt nur eine der Orders offen.
Ihr Volumen ist der Differenz der Lots dieser zwei geschlossener
Positionen gleich, und die Richtung der Position sowie der
Eröffnungspreis stimmen mit der größeren (nach Volumen) Position
überein.
Im Gegensatz zur einzelnen Schließung von zwei Positionen, lässt die Schließung zur Gegenposition einen Spread sparen:
Beim Schließen einer Position zur Gegenposition wird eine Order vom Typ "close by" platziert. Im Kommentar zur Order sind die Tickets der Positionen angegeben, die geschlossen werden. Die Schließung eines Paares gegenläufiger Positionen erfolgt durch zwei Trades vom Typ "out by". Der Gesamtgewinn/-verlust nach der Schließung der beiden Positionen wird nur in einem Trade angegeben.
Beim Import werden Tickets von
Orders und Positionen (Orders der Historie eingeschlossen) nicht
gespeichert, denn einem Satz in der Historie des MetaTrader 4 können bis
zu vier Sätze in der Historie des MetaTrader 5 entsprechen. Allen
Eintragungen werden neue Tickets zugewiesen.
Kontonummern können erhalten bleiben oder durch neue ersetzt werden, je nach dem, wie Ihr Broker den Import durchgeführt hat.
Beim Testen anhand realer Ticks kann viel Internet-Traffic über MQL5 Cloud Network übertragen werden. Dies kann sich auf den Endpreis für die Nutzung des Rechnernetzes auswirken.
class CAnimal { public: CAnimal(); // Konstruktor virtual void Sound() = 0; // rein virtuelle Funktion private: double m_legs_count; // Pfotenzahl };Die Sound() Funktion ist hier rein virtuell, weil diese mit dem Spezifikator der rein virtuellen PURE-Funktion (=0) deklariert wurde.
class CAnimal { public: virtual void Sound()=NULL; // PURE method, muss in der abgeleiteten Klasse neu definiert werden; die CAnimal Klasse selbst ist abstrakt geworden und kann nicht erstellt werden }; //--- abgeleitet von der abstrakten Klasse class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PURE wurde neu definiert, die Klasse Ccar ist nicht abstrakt und kann erstellt werden }; //--- Beispiele für die falsche Anwendung new CAnimal; // Fehler 'CAnimal' - der Compiler zeigt die Fehlermeldung "cannot instantiate abstract class" an CAnimal some_animal; // Fehler 'CAnimal' - der Compiler zeigt die Fehlermeldung "cannot instantiate abstract class" an //--- Beispiele für die richtige Anwendung new CCat; // kein Fehler - die CCat Klasse ist nicht abstrakt; // kein Fehler - die Klasse CCat ist nicht abstraktBegrenzungen bei der Anwendung abstrakter Klassen
//+------------------------------------------------------------------+ //| Abstrakte Basisklasse | //+------------------------------------------------------------------+ class CAnimal { public: //--- rein virtuelle Funktion virtual void Sound(void)=NULL; //--- Funktion void CallSound(void) { Sound(); } //--- Konstruktor CAnimal() { //--- expliziter Aufruf der virtuellen Methode Sound(); //--- impliziter Aufruf (über eine dritte Funktion) CallSound(); //--- Konstruktor bzw. Destruktor ruft immer eigene Funktionen auf, //--- trotz der Virtualität und Neudefinierung der aufgerufenen Funktion in einer abgeleiteten Klasse //--- wenn die Funktion rein virtuell ist, //--- führt der Aufruf zum kritischen Ausführungsfehler: "pure virtual function call" } };Jedoch können Konstruktoren und Destruktoren abstrakter Klassen andere Memberfunktionen aufrufen.
typedef int (*TFunc)(int,int);Jetzt ist TFunc ein Typ, man kann die Pointer-Variable auf Funktion deklarieren:
TFunc func_ptr;In der Variablen func_ptr kann man die Funktionsadresse speichern, um diese später aufzurufen:
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // Fehler: neg hat nicht den Typ int (int,int) Print(func_ptr(10)); // Fehler: zwei Parameter müssen vorhanden seinPointers auf Funktionen können als Parameter gespeichert und übergeben werden. Man kann keinen Pointer auf eine nicht statische Methode der Klasse erhalten.
ulong PositionGetTicket( int index // Nummer in der Liste der Positionen );
bool PositionSelectByTicket(
ulong ticket // das Ticket der Position
);
Netting
In diesem System kann zur gleichen Zeit nur eine Position pro Symbol vorhanden sein:
Dabei ist es irrelevant, was den Trade in der entgegengesetzte
Richtung hervorgerufen hat — die Ausführung einer Marktorder oder
Auslösung einer Pending-Order.
Das Beispiel unten zeigt die Ausführung von zwei Buy-Trades EURUSD mit dem Volumen in Höhe von 0.5 Lots:
Aus der Ausführung dieser Trades ergab sich eine gemeinsame Position mit einem Volumen in Höhe von einem Lot.
Hedging-System
Beim Hedging kann man eine Vielzahl von Positionen auf einem und
demselben Symbol haben, darunter auch von entgegengesetzte Positionen.
Wenn eine offene Position für das Symbol vorhanden ist, und der Händler
einen neuen Trade ausführt (bzw. eine Pending-Order ausgelöst wird),
wird eine neue Position eröffnet. Die vorhandene Position ändert sich
nicht.
Das Beispiel unten zeigt die Ausführung von zwei Buy-Trades EURUSD mit dem Volumen in Höhe von 0.5 Lots:
Die Ausführung dieser Trades führte zur Eröffnung zwei separater Positionen.
Neuer Typ von Handelstransaktionen Close By
Für Konten mit Hedging wurde ein neuer Typ von Transaktionen
hinzugefügt — Schließung einer Position zur Gegenposition. Diese
Operation ermöglicht es, zwei gegensätzliche Positionen auf einem
Instrument gleichzeitig zu schließen. Wenn die Gegenpositionen
unterschiedliche Zahl von Lots haben, bleibt nur eine der Orders offen.
Ihr Volumen ist der Differenz der Lots dieser zwei geschlossener
Positionen gleich, und die Richtung der Position sowie der
Eröffnungspreis stimmen mit der größeren (nach Volumen) Position
überein.
Im Gegensatz zur einzelnen Schließung von zwei Positionen, lässt die Schließung zur Gegenposition einen Spread sparen:
Beim Schließen einer Position zur Gegenposition wird eine Order vom Typ "close by" platziert. Im Kommentar zur Order sind die Tickets der Positionen angegeben, die geschlossen werden. Die Schließung eines Paares gegenläufiger Positionen erfolgt durch zwei Trades vom Typ "out by". Der Gesamtgewinn/-verlust nach der Schließung der beiden Positionen wird nur in einem Trade angegeben.
class CAnimal { public: CAnimal(); // Konstruktor virtual void Sound() = 0; // rein virtuelle Funktion private: double m_legs_count; // Pfotenzahl };Die Sound() Funktion ist hier rein virtuell, weil diese mit dem Spezifikator der rein virtuellen PURE-Funktion (=0) deklariert wurde.
class CAnimal { public: virtual void Sound()=NULL; // PURE method, muss in der abgeleiteten Klasse neu definiert werden; die CAnimal Klasse selbst ist abstrakt geworden und kann nicht erstellt werden }; //--- abgeleitet von der abstrakten Klasse class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PURE wurde neu definiert, die Klasse Ccar ist nicht abstrakt und kann erstellt werden }; //--- Beispiele für die falsche Anwendung new CAnimal; // Fehler 'CAnimal' - der Compiler zeigt die Fehlermeldung "cannot instantiate abstract class" an CAnimal some_animal; // Fehler 'CAnimal' - der Compiler zeigt die Fehlermeldung "cannot instantiate abstract class" an //--- Beispiele für die richtige Anwendung new CCat; // kein Fehler - die CCat Klasse ist nicht abstrakt; // kein Fehler - die Klasse CCat ist nicht abstraktBegrenzungen bei der Anwendung abstrakter Klassen
//+------------------------------------------------------------------+ //| Abstrakte Basisklasse | //+------------------------------------------------------------------+ class CAnimal { public: //--- rein virtuelle Funktion virtual void Sound(void)=NULL; //--- Funktion void CallSound(void) { Sound(); } //--- Konstruktor CAnimal() { //--- expliziter Aufruf der virtuellen Methode Sound(); //--- impliziter Aufruf (über eine dritte Funktion) CallSound(); //--- Konstruktor bzw. Destruktor ruft immer eigene Funktionen auf, //--- trotz der Virtualität und Neudefinierung der aufgerufenen Funktion in einer abgeleiteten Klasse //--- wenn die Funktion rein virtuell ist, //--- führt der Aufruf zum kritischen Ausführungsfehler: "pure virtual function call" } };Jedoch können Konstruktoren und Destruktoren abstrakter Klassen andere Memberfunktionen aufrufen.
typedef int (*TFunc)(int,int);Jetzt ist TFunc ein Typ, man kann die Pointer-Variable auf Funktion deklarieren:
TFunc func_ptr;In der Variablen func_ptr kann man die Funktionsadresse speichern, um diese später aufzurufen:
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // Fehler: neg hat nicht den Typ int (int,int) Print(func_ptr(10)); // Fehler: zwei Parameter müssen vorhanden seinPointers auf Funktionen können als Parameter gespeichert und übergeben werden. Man kann keinen Pointer auf eine nicht statische Methode der Klasse erhalten.
ulong PositionGetTicket( int index // Nummer in der Liste der Positionen );
bool PositionSelectByTicket(
ulong ticket // Ticket der Position
);
Neues Kontosystem — wie im MetaTrader 4. Dabei können Trader von allen Vorteilen der fünften Version der Plattform profitieren, zu welchen die Ausführung von Orders durch mehrere Trades (darunter auch Teilausführung), Stop Limit Orders und vieles mehr gehören.
Aktualisieren Sie die Plattform und entdecken Sie die Hedging-Option. Beim Eröffnen eine Demokontos aktivieren Sie die Option "Hedging verwenden". Sie wird verfügbar sein, wenn der Server des Brokers bereits aktualisiert und eingestellt wurde.
Neues Kontosystem — wie im MetaTrader 4. Dabei können Trader von allen Vorteilen der fünften Version der Plattform profitieren, zu welchen die Ausführung von Orders durch mehrere Trades (darunter auch Teilausführung), Stop Limit Orders und vieles mehr gehören.
Aktualisieren Sie die Plattform und entdecken Sie die Hedging-Option. Beim Eröffnen eine Demokontos aktivieren Sie die Option "Hedging verwenden". Sie wird verfügbar sein, wenn der Server des Brokers bereits aktualisiert und eingestellt wurde.