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:
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
);
MetaEditor: Dem MQL5 Wizard wurde ein neuer Link zum Video Tutorial "Wie man einen Handelsroboter im MQL5 Wizard erstellt" hinzugefügt. Schauen Sie sich das dreiminütige Video an und erstellen Sie einen Handelsroboter, ohne eine einzige Codezeile zu schreiben.
Die Dokumentation wurde aktualisiert.
2015.10.14 14:48:18.486 Data Folder: C:\Program Files\MetaTrader 5 2015.10.14 14:48:18.486 Windows 7 Professional (x64 based PC), IE 11.00, UAC, 8 x Intel Core i7 920 @ 2.67GHz, RAM: 8116 / 12277 Mb, HDD: 534262 / 753865 Mb, GMT+03:00 2015.10.14 14:48:18.486 MetaTrader 5 build 1190 started (MetaQuotes Software Corp.)
struct MqlTick { datetime time; // Zeit der letzten Preisaktualisierung double bid; // Aktueller Bid-Preis double ask; // Aktueller Ask-Preis double last; // Aktueller Preis des letzten Trades (Last) ulong volume; // Volumen für den aktuellen Last-Preis long time_msc; // Zeit der letzten Aktualisierung der Preise in Millisekunden uint flags; // Tick-Flags };Für jeden Tick werden alle Parameter ausgefüllt, unabhängig davon, ob sich die Daten im Vergleich zum vorherigen Tick geändert haben oder nicht. Dies erlaubt es, immer aktuelle Kurse zu jedem Zeitpunkt zu haben, ohne nach vorherigen Werten der Tickhistorie suchen zu müssen. Mit dem Eintreffen eines Ticks könnte sich z.B. nur der Bid-Preis ändern, aber die anderen Parameter werden neben dem neuen Preis auch in der Struktur angegeben: vorheriger Ask-Preis, Positionsgröße usw. Um festzustellen, welche Daten sich mit dem aktuellen Tick geändert haben, analysieren Sie seine Flags:
//+------------------------------------------------------------------+ //| TemplTest.mq5 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Deklarieren einer Template-Klasse | //+------------------------------------------------------------------+ template<typename T> class TArray { protected: T m_data[]; public: bool Append(T item) { int new_size=ArraySize(m_data)+1; int reserve =(new_size/2+15)&~15; //--- if(ArrayResize(m_data,new_size,reserve)!=new_size) return(false); //--- m_data[new_size-1]=item; return(true); } T operator[](int index) { static T invalid_index; //--- if(index<0 || index>=ArraySize(m_data)) return(invalid_index); //--- return(m_data[index]); } }; //+---------------------------------------------------------------------+ //| Template-Klasse eines Arrays von Pointers, im Destruktor löscht er | //| Objekte, deren Pointers in diesem Array gespeichert wurden. | //| | //| Beachten Sie die Vererbung von der Template-Klasse TArray | //+---------------------------------------------------------------------+ template<typename T> class TArrayPtr : public TArray<T *> { public: void ~TArrayPtr() { for(int n=0,count=ArraySize(m_data);n<count;n++) if(CheckPointer(m_data[n])==POINTER_DYNAMIC) delete m_data[n]; } }; //+---------------------------------------------------------------------------------------+ //| Deklarieren wir die Klasse, die Pointers auf ihre Objekte werden im Array gespeichert | //+---------------------------------------------------------------------------------------+ class CFoo { int m_x; public: CFoo(int x):m_x(x) { } int X(void) const { return(m_x); } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ TArray<int> ExtIntArray; // das Template TArray instanziieren (das Template TArray durch den Typ int spezialisieren) TArray<double> ExtDblArray; // das Template TArray instanziieren (das Template TArray durch den Typ double spezialisieren) TArrayPtr<CFoo> ExtPtrArray; // das Template TArrayPtr instanziieren (das Template TArrayPtr durch den Typ CFoo spezialisieren) //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- die Arrays mit Daten füllen for(int i=0;i<10;i++) { int integer=i+10; ExtIntArray.Append(integer); double dbl=i+20.0; ExtDblArray.Append(dbl); CFoo *ptr=new CFoo(i+30); ExtPtrArray.Append(ptr); } //--- den Inhalt der Arrays ausgeben string str="Int:"; for(int i=0;i<10;i++) str+=" "+(string)ExtIntArray[i]; Print(str); str="Dbl:"; for(int i=0;i<10;i++) str+=" "+DoubleToString(ExtDblArray[i],1); Print(str); str="Ptr:"; for(int i=0;i<10;i++) str+=" "+(string)ExtPtrArray[i].X(); Print(str); //--- die über new erstellten CFoo-Objekte müssen nicht gelöscht werden, sie werden im Destruktor des Objekts TArrayPtr<CFoo> gelöscht }Das Ergebnis der Ausführung:
int ObjectsDeleteAll( long chart_id, // Chart-ID const string prefix, // Präfix des Objektnamens int sub_window=-1, // Index des Fensters int object_type=-1 // Typ des zu löschenden Objekts );
Verbesserungen anhand Crash-Logs.
Die Dokumentation wurde aktualisiert.
Nun kann man jede Anwendung im Market in einem Schritt ohne Registrierung direkt im MetaTrader 4/5 kaufen. Dafür klicken Sie einfach auf "Kaufen" und wählen Sie das gewünschte Zahlungssystem aus.
Sie werden auf die Seite des Zahlungssystems weitergeleitet, wo Sie den Kauf abschließen können. PayPal, WebMoney, Neteller oder Kreditkarte - bezahlen Sie Ihre Käufe im Market für Handelsroboter und Indikatoren, wie es Ihnen am besten passt.
Nach dem Kauf empfehlen wir Ihnen, ein Benutzerkonto in MQL5.community anzulegen. Ihr Kauf wird automatisch an den Account gebunden. Auf diese Weise bekommen Sie die Möglichkeit, das Produkt zu aktualisieren und es auf anderen PCs zu installieren. Darüber hinaus bietet ein MQL5.community Account Ihnen Zugang zu einer Vielzahl von Services für die MetaTrader Plattformen, dazu gehören Signale für das Kopieren von Trades erfolgreicher Händler, virtuelles Hosting für eine ununterbrochene Arbeit Ihrer Anwendungen und der Freelance-Service für das Bestellen von Handelsroboter bei Entwicklern.
Nun kennen Sie die einfachste und schnellste Weise, einen Handelsroboter zu bekommen. Über 5 000 verschiedene Anwendungen für MetaTrader warten auf Sie im Market - einfach auswählen und kaufen!
Assets werden zu Equity addiert und erhöhen die freie Margin, was es erlaubt, das Volumen von Transaktionen auf dem Konto zu erhöhen.
Auf diese Weise gibt es die Möglichkeit, Konten mit verschiedenen Typen der Margin-Berechnung zu eröffnen.
ulong GetMicrosecondCount();
Diese Funktion kann für ein zusätzliches Profiling der Ausführung eines Programms und das Identifizieren von "Engpässen" verwendet werden.Verbesserungen anhand Crash-Logs.
Die Dokumentation wurde aktualisiert.
Die Aktualisierung wird über LiveUpdate verfügbar sein.
Fehlerbehebungen und Verbesserungen im Strategietester. Die Zeitverlust bei vorbereitenden Operationen und Netzwerklatenz wurden erheblich reduziert. Das Testen und die Optimierung wurden in allen Modi beschleunigt: bei der Arbeit mit lokalen Testagenten, mit Agenten in einem lokalen Netz und bei der Verwendung des MQL5 Cloud Netzwerkes.
Verbesserungen anhand Crash-Logs.
Die Dokumentation wurde aktualisiert.
Die Aktualisierung wird über LiveUpdate verfügbar sein.
Auf diese Weise können Sie jederzeit die Anzahl der Charts und Symbole, den Set der laufenden Programme und deren Eingabeparameter, Einstellungen des Terminals und Signalabos ändern.
Bei der Durchführung der Migration werden die ganzen Informationen ins Journal des Handelsterminals geschrieben.
Testagenten arbeiten nun in nur 64-Bit-Systemen. Diese Entscheidung geht mit der Notwendigkeit einher, mit der Entwicklung der IT-Branche Schritt zu halten. Der Verzicht auf alte Technologien erlaubt es, die Performance der Berechnungen zu erhöhen und MQL5 Cloud Network weiterzuentwickeln.
Änderungen in den Komponenten der Plattform:
int WebRequest (string method, string url,string headers,int timeout, const char &data[], int data_size,char &result[], string &result_headers)
Diese Funktion erlaubt es, den Inhalt des Headers einer HTTP-Anfrage explizit zu bilden, indem sie einen flexiblen Mechanismus für die Interaktion mit verschiedenen Web-Services bietet. Beispiel - Automatische Veröffentlichung mit WebRequest()
Verbesserungen anhand Crash-Logs.
Die Dokumentation wurde aktualisiert.
Die Aktualisierung wird über LiveUpdate verfügbar sein.
int CopyTicks( const string symbol_name, // Symbolname MqlTick &ticks_array[], // Array, in welchem die Ticks gespeichert werden uint flags=COPY_TICKS_ALL, // Flag, das den Typ der Ticks festlegt ulong from=0, // Datum, von welchem die Ticks erhalten werden; in Millisekunden vom 01.01.1970 uint count=0 // Anzahl der letzten Ticks, die erhalten werden müssen );Die Ticks können nach Datum abgefragt werden, indem man den Wert from angibt oder nach Anzahl, indem man count angibt. Wenn keiner der Parameter angegeben wurde, werden alle verfügbaren Ticks übergeben, aber höchstens 2000. Ticks können auch nach Typ über den Parameter flags abgefragt werden. Verfügbare Werte:
Verbesserungen anhand Crash-Logs.
Die Dokumentation wurde aktualisiert.
Die Aktualisierung wird über LiveUpdate verfügbar sein.
//+------------------------------------------------------------------+ //| MacroExample | //| Copyright 2014, MetaQuotes Software Corp. | //| https://www.metaquotes.net | //+------------------------------------------------------------------+ #property script_show_inputs input bool InpSecond=true; #define DEFCLASS(class_name) class class_name:public CBase{public:class_name(string name):CBase(name){}}; #define TOSTR(x) #x #define AUTODEL(obj) CAutoDelete auto_##obj(obj) #define NEWOBJ(type,ptr) do { ptr=new type(TOSTR(ptr)); \ Print("Create object '",TOSTR(type)," ",TOSTR(ptr),"' by macro NEWOBJ"); } \ while(0) //+------------------------------------------------------------------+ //| Basisklasse, die für das automatische Löschen von Objekten benötigt wird | //+------------------------------------------------------------------+ class CBase { protected: string m_name; public: CBase(string name):m_name(name) { } string Name(void) const{ return(m_name); } }; //+------------------------------------------------------------------+ //| Die Klasse für das automatische Löschen von Objekten erlaubt es, die erstellten Objekte nicht zu | //| überwachen. Sie löscht diese in ihrem Destruktor | //+------------------------------------------------------------------+ class CAutoDelete { CBase *m_obj; public: CAutoDelete(CBase *obj):m_obj(obj) { } ~CAutoDelete() { if(CheckPointer(m_obj)==POINTER_DYNAMIC) { Print("Delete object '",m_obj.Name(),"' by CAutoDelete class"); delete m_obj; } } }; //+------------------------------------------------------------------+ //| Deklariere zwei neue Klassen - CFoo und CBar | //+------------------------------------------------------------------+ DEFCLASS(CFoo); DEFCLASS(CBar); //+------------------------------------------------------------------+ //| Hauptfunktion des Skriptes | //+------------------------------------------------------------------+ void OnStart() { CFoo *foo; //--- erstelle ein Objekt der Klasse CFoo NEWOBJ(CFoo,foo); //--- erstelle eine Instanz der Klasse für das automatische Löschen des Objektes CFoo foo AUTODEL(foo); //--- if(InpSecond) { CBar *bar; //--- NEWOBJ(CBar,bar); AUTODEL(bar); } //--- foo muss man nicht löschen, es wird automatisch gelöscht } //+------------------------------------------------------------------+
Verbesserungen anhand Crash-Logs.
Die Dokumentation wurde aktualisiert.
Die Aktualisierung wird über LiveUpdate verfügbar sein.
Verbesserungen anhand Crash-Logs.
Die Dokumentation wurde aktualisiert.
Die Aktualisierung wird über LiveUpdate verfügbar sein.