bool CalendarCountryById( const long country_id, // Länder-ID MqlCalendarCountry& country // Länderbeschreibung );CalendarEventById — Abrufen der Ereignisbeschreibung auf Grund des Identifikators.
bool CalendarEventById( const long event_id, // Ereignis-ID MqlCalendarEvent& event // Ereignisbeschreibung );CalendarValueById — Abrufen der Wertbeschreibung des Ereignisses auf Grund des Identifikators.
bool CalendarValueById( const long value_id, // Werte-ID MqlCalendarValue& value // Wertbeschreibung );CalendarEventByCountry — Abrufen eines Arrays der verfügbaren Ereignisse eines Landes.
bool CalendarEventByCountry( string country_code, // Länder-Code MqlCalendarEvent& events[] // Array der Ereignisse );CalendarEventByCurrency — Abrufen eines Arrays der verfügbaren Ereignisse, die eine Währung beeinflussen.
bool CalendarEventByCurrency( string currency, // Währung MqlCalendarEvent& events[] // Array der Ereignisse );CalendarValueHistoryByEvent — Abrufen eines Arrays mit den Werten einer angegebenen Zeitspanne, nach dem Ereignis-Identifikator.
bool CalendarValueHistoryByEvent( ulong event_id, // Ereignis-ID MqlCalendarValue& values[], // Array der Werte datetime datetime_from, // Anfangszeitpunkt der Zeitspanne datetime datetime_to=0 // Endzeitpunkt der Zeitspanne );CalendarValueHistory — Abrufen eines Arrays von Werten der angegebenen Zeitspanne mit allen Ereignissen, gefiltert nach Land und/oder Währung.
bool CalendarValueHistory( MqlCalendarValue& values[], // Array der Werte datetime datetime_from, // Anfangszeitpunkt der Zeitspanne datetime datetime_to=0, // Endzeitpunkt der Zeitspanne string country_code=NULL, // Länder-Code string currency=NULL // Währung );CalendarValueLastByEvent — Abrufen eines Array der letzten Ereigniswerte nach Identifikator. Diese Funktion ermöglicht das Abrufen der Werte, die seit der letzten Anforderung erschienen sind. Für diesen Vorgang wird zusätzlich der In/Out-Parameter "change_id" verwendet.
bool CalendarValueHistory( ulong event_id, // Ereignis-ID ulong& change_id, // letzte Änderungs-ID des Kalenders MqlCalendarValue& values[] // Array der Werte );CalendarValueLast — Abrufen eines Arrays der letzten Werte aller Ereignisse, gefiltert nach Land und/oder Währung. Diese Funktion ermöglicht das Abrufen der Werte, die seit der letzten Anforderung erschienen sind. Ähnlich wie bei CalendarValueLastByEvent wird die Eigenschaft "change_id" für die Anforderung verwendet.
bool CalendarValueHistory( ulong event_id, // Ereignis-ID ulong& change_id, // letzte Änderungs-ID des Kalenders MqlCalendarValue& values[], // Array der Werte string country_code=NULL, // Länder-Code string currency=NULL // Währung );
struct MqlCalendarCountry { ulong id; // Länder-ID in ISO 3166-1 string name; // Text-Name des Landes string code; // Code-Name des Landes in ISO 3166-1 alpha-2 string currency; // Währungscode des Landes string currency_symbol; // Symbol/Zeichen der Landeswährung string url_name; // Ländername, der in der URL von mql5.com verwendet wird };MqlCalendarEvent — Ereignisbeschreibung
struct MqlCalendarEvent { ulong id; // Ereignis-ID ENUM_CALENDAR_EVENT_TYPE type; // Ereignis-Typ ENUM_CALENDAR_EVENT_SECTOR sector; // Sektor, zu dem das Ereignis gehört ENUM_CALENDAR_EVENT_FREQUENCY frequency; // Häufigkeit der Ereignisveröffentlichung ENUM_CALENDAR_EVENT_TIMEMODE time_mode; // Zeitmodus der Ereignisveröffentlichung ulong country_id; // Länder-ID ENUM_CALENDAR_EVENT_UNIT unit; // Einheit der Ereigniswerte ENUM_CALENDAR_EVENT_IMPORTANCE importance; // Wichtigkeit des Ereignisses ENUM_CALENDAR_EVENT_MULTIPLIER multiplier; // Multiplikator der Wichtigkeit des Ereignisses uint digits; // Dezimalstellen des Ereigniswertes string source_url; // URL der Quelle string event_code; // Ereignis-Code string name; // Text-Name des Ereignisses in der Sprache des Terminals };MqlCalendarValue — Wertbeschreibung des Ereignisses.
struct MqlCalendarValue { ulong id; // Werte-ID ulong event_id; // Ereignis-ID datetime time; // Datum und Zeit des Ereignisses datetime period; // Zeitperiode, für den das Ereignis veröffentlicht wird int revision; // Revision des veröffentlichten Indikators in Relation zur Berichtsperiode long actual_value; // aktueller Ereigniswert long prev_value; // vorheriger Ereigniswert long revised_prev_value; // revidierter, vorheriger Ereigniswert long forecast_value; // prognostizierter Ereigniswert ENUM_CALENDAR_EVENT_IMPACRT impact_type; // mögliche Auswirkung auf den Währungskurs };
enum ENUM_CALENDAR_EVENT_FREQUENCY { CALENDAR_FREQUENCY_NONE =0, // nicht bekannt CALENDAR_FREQUENCY_WEEK =1, // wöchentlich CALENDAR_FREQUENCY_MONTH =2, // monatlich CALENDAR_FREQUENCY_QUARTER =3, // vierteljährlich CALENDAR_FREQUENCY_YEAR =4, // jährlich CALENDAR_FREQUENCY_DAY =5, // täglich }; enum ENUM_CALENDAR_EVENT_TYPE { CALENDAR_TYPE_EVENT =0, // Ereignis (Sitzung, Rede etc.) CALENDAR_TYPE_INDICATOR =1, // Indikator CALENDAR_TYPE_HOLIDAY =2, // Feiertag }; enum ENUM_CALENDAR_EVENT_SECTOR { CALENDAR_SECTOR_NONE =0, // kein Sektor bestimmt CALENDAR_SECTOR_MARKET =1, // Markt CALENDAR_SECTOR_GDP =2, // BIP CALENDAR_SECTOR_JOBS =3, // Arbeitsstellen CALENDAR_SECTOR_PRICES =4, // Preise CALENDAR_SECTOR_MONEY =5, // Geld CALENDAR_SECTOR_TRADE =6, // Handel CALENDAR_SECTOR_GOVERNMENT =7, // Regierung CALENDAR_SECTOR_BUSINESS =8, // Geschäft CALENDAR_SECTOR_CONSUMER =9, // Verbraucher CALENDAR_SECTOR_HOUSING =10, // Wohnen CALENDAR_SECTOR_TAXES =11, // Steuern CALENDAR_SECTOR_HOLIDAYS =12, // Feiertage }; enum ENUM_CALENDAR_EVENT_IMPORTANCE { CALENDAR_IMPORTANCE_NONE =0, // nicht bestimmt CALENDAR_IMPORTANCE_LOW =1, // niedrig CALENDAR_IMPORTANCE_MODERATE =2, // mittel CALENDAR_IMPORTANCE_HIGH =3, // hoch }; enum ENUM_CALENDAR_EVENT_UNIT { CALENDAR_UNIT_NONE =0, // ohne Einheit CALENDAR_UNIT_PERCENT =1, // Prozent CALENDAR_UNIT_CURRENCY =2, // Landeswährung CALENDAR_UNIT_HOUR =3, // Anzahl der Stunden CALENDAR_UNIT_JOB =4, // Anzahl der Arbeitsstellen CALENDAR_UNIT_RIG =5, // Anzahl der Förderanlagen CALENDAR_UNIT_USD =6, // US-Dollar CALENDAR_UNIT_PEOPLE =7, // Anzahl der Leute CALENDAR_UNIT_MORTGAGE =8, // Anzahl der Hypotheken CALENDAR_UNIT_VOTE =9, // Anzahl der Stimmen CALENDAR_UNIT_BARREL =10, // Anzahl der Barrels CALENDAR_UNIT_CUBICFEET =11, // Volumen in Kubikfuß CALENDAR_UNIT_POSITION =12, // Anzahl der Arbeitsstellen CALENDAR_UNIT_BUILDING =13 // Anzahl der Gebäude }; enum ENUM_CALENDAR_EVENT_MULTIPLIER { CALENDAR_MULTIPLIER_NONE =0, // kein Multiplikator CALENDAR_MULTIPLIER_THOUSANDS =1, // Tausend CALENDAR_MULTIPLIER_MILLIONS =2, // Million CALENDAR_MULTIPLIER_BILLIONS =3, // Milliarde CALENDAR_MULTIPLIER_TRILLIONS =4, // Billion }; enum ENUM_CALENDAR_EVENT_IMPACRT { CALENDAR_IMPACT_NA =0, // nicht vorhanden CALENDAR_IMPACT_POSITIVE =1, // positive CALENDAR_IMPACT_NEGATIVE =2, // negative }; enum ENUM_CALENDAR_EVENT_TIMEMODE { CALENDAR_TIMEMODE_DATETIME =0, // die exakte Veröffentlichungszeit der Quelle CALENDAR_TIMEMODE_DATE =1, // Das Ereignis dauert den ganzen Tag CALENDAR_TIMEMODE_NOTIME =2, // die Quelle veröffentlicht keinen Ereigniszeitpunkt CALENDAR_TIMEMODE_TENTATIVE =3, // die Quelle veröffentlicht nur das Datum und keinen genauen Zeitpunkt der Veröffentlichung };
ERR_CALENDAR_MORE_DATA =5400, // das Array ist für alle Ergebnisse zu klein (Werte, die hineinpassen, werden zurückgegeben) ERR_CALENDAR_TIMEOUT =5401, // Timeout für das Warten auf die Antwort der Kalenderdaten ERR_CALENDAR_NO_DATA =5402, // Daten nicht gefunden
bool CharArrayToStruct( void& struct_object, // Struktur const uchar& char_array[], // Array uint start_pos=0 // Startposition im Array );StructToCharArray weist einer POD-Struktur einem Array vom Typ uchar zu.
bool StructToCharArray( const void& struct_object, // Struktur uchar& char_array[], // Array uint start_pos=0 // Startposition im Array );
ushort MathSwap(ushort value); uint MathSwap(uint value); ulong MathSwap(ulong value);
bool StringReserve( string& string_var, // Zeichenkette uint new_capacity // Puffergröße für die Zeichenkette );StringSetLength legt die Anzahl der Buchstaben einer Zeichenkette fest.
bool StringSetLength( string& string_var, // Zeichenkette uint new_length // neue Länge der Zeichenkette );
bool ArrayRemove( void& array[], // Array irgendeines Typs uint start, // Startindex für das Entfernen uint count=WHOLE_ARRAY // Anzahl der Elemente );ArrayInsert fügt in das Empfängerarray ab dem angegebenen Index eine bestimmte Anzahl von Elementen aus einem Quellarray ein.
bool ArrayInsert( void& dst_array[], // Zielarray const void& src_array[], // Quellarray uint dst_start, // Index des Zielarrays, ab dem eingefügt werden soll uint src_start=0, // Index im Quellarray, ab dem aus dem Quellarray kopiert werden soll uint count=WHOLE_ARRAY // Anzahl der einzufügenden Elemente );ArrayReverse kehrt in einem Array eine angegebene Anzahl von Elemente ab dem angegebenen Index um.
bool ArrayReverse( void& array[], // Array irgendeines Typs uint start=0, // Startindex der Umkehrung uint count=WHOLE_ARRAY // Anzahl der Elemente );
int CustomBookAdd( const string symbol, // Symbolname const MqlBookInfo& books[] // Array der Beschreibungen der Elemente der Markttiefe (DOM) uint count=WHOLE_ARRAY // Anzahl der zu verwendenden Elemente );
bool CustomSymbolCreate( const string symbol_name, // Name des nutzerdefiniertes Symbol const string symbol_path="", // Name der Gruppe, in der das Symbol erzeugt wird const string symbol_origin=NULL // Symbolname, auf dessen Basis das nutzerdefinierte Symbole erstellt wird );Der Name des Symbols, dessen Eigenschaften für das nutzerdefinierte Symbol kopiert werden sollen, wird im Parameter "symbol_origin" angegeben.
Die Übersetzung der Benutzeroberfläche ins Kroatische wurde hinzugefügt.
Die Dokumentation wurde aktualisiert.
#import "TestLib.dll" //+------------------------------------------------------------------+ //| Startfunktion eines Skripts | //+------------------------------------------------------------------+ void OnStart() { int x=41; TestClass::Inc(x); Print(x); }Der C#-Code der Funktion Inc() aus TestClass schaut wie folgt aus:
public class TestClass { public static void Inc(ref int x) { x++; } }Als Ergebnis der Ausführung gibt das Skript den Wert 42 zurück.
struct MqlTick
{
datetime time; // Aktualisierungszeit des letzten Preises
double bid; // Aktueller Bid-Preis
double ask; // Aktueller Ask-Preis
double last; // Aktueller Preis der letzten Transaktion (Last)
ulong volume; // Volumen des letzten aktuellen Preises
long time_msc; // Letzte Preisaktualisierung in Millisekunden
uint flags; // Tick-Flags
double volume_real; // Volumen des aktuelle Preises (Last) mit höherer Genauigkeit
};
struct MqlBookInfo { ENUM_BOOK_TYPE type; // Order-Typ der Enumeration ENUM_BOOK_TYPE double price; // Preis long volume; // Volumen double volume_real; // Volumen mit höherer Genauigkeit };
//+------------------------------------------------------------------+ //| Standard-Packing | //+------------------------------------------------------------------+ struct A { char a; int b; }; //+------------------------------------------------------------------+ //| besonderes Packing | //+------------------------------------------------------------------+ struct B pack(4) { char a; int b; }; //+------------------------------------------------------------------+ //| Startfunktion eines Skripts | //+------------------------------------------------------------------+ void OnStart() { Print("sizeof(A)=",sizeof(A)); Print("sizeof(B)=",sizeof(B)); } //+------------------------------------------------------------------+Ergebnis:
sizeof(A)=5 sizeof(B)=8Weiter Informationen über die Angleichung innerhalb von Strukturen in MSDN.
enum Main { PRICE_CLOSE_, PRICE_OPEN_ }; input Main Inp=PRICE_CLOSE; //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void OnStart() { }zeigt der Compiler eine Warnung:
class X { }; void f(int) { } template<typename T> void a(T*) { new T(2); } // vorher hat der Compiler hier einen Fehler ausgeworfen template<typename T> void a() { f(0); } void OnInit() { a<X>(); }
Aktualisierte Dokumentation.
Die Dokumentation wurde aktualisiert.
Die Dokumentation wurde aktualisiert.
datetime iTime( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
double iOpen( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
double iHigh( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
double iLow( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
double iClose( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
long iVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
int iBars( string symbol, // Symbol ENUM_TIMEFRAMES timeframe // Zeitrahmen );
int iBarShift( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen datetime time, // Zeit bool exact=false // Modus );
int iLowest( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int type, // Identifikator der Zeitreihe int count, // Anzahl der Elemente int start // Index );
int iHighest( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zietrahmen int type, // Indentifikator der Zeitreihe int count, // Anzahl der Elemente int start // Index );
long iRealVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
long iTickVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
long iSpread( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Zeitrahmen int shift // Verschiebung );
void TesterHideIndicators( bool hide // Flag );
Die Dokumentation wurde aktualisiert.
Vor einigen Monaten haben wir bereits die Einstellung der Unterstützung für alte Versionen von Betriebssystemen
angekündigt. Windows 2003, Windows Vista und besonders Microsoft
Windows XP sind veraltete Betriebssysteme. Microsoft stellte die
Unterstützung für Windows XP vor drei Jahren ein, denn wegen technischer
Einschränkungen lies dieses System die Möglichkeiten der Hardware nicht
voll ausschöpfen.
MetaTrader 5 Build 1745 und ältere
Versionen der Plattform werden auch weiterhin auf den genannten
Betriebssystemen laufen, aber keine Updates erhalten. Darüber hinaus
können Installers in den genannten Systemen nicht gestartet werden.
Die
minimale Anforderung an das Betriebssystem für MetaTrader 5 ist Windows
7, wir empfehlen aber dringend, 64-Bit-Versionen von Windows 10 zu
nutzen.
In der neuen Version der Plattform wird die Unterstützung für Desktop-Terminals und mobile Terminals älterer Versionen eingestellt:
Solche Terminals können sich nicht mit Servern der neuen Versionen verbinden. Wir empfehlen Ihnen ausdrücklich, Ihre Terminals vorab zu aktualisieren.
Für die Unterstützung von Gruppenprojekten wurde die Protokolldatei des MQL5 Storage geändert. Aus diesem Grund müssen Sie nach dem Update der Plattform alle Daten aus dem Storage erneut laden (Checkout). Die Daten, die im MQL5 Storage gespeichert sind, werden während der Aktualisierung nicht betroffen und gehen nicht verloren.
Vor dem Update auf die neue Version der Plattform empfehlen wir alle lokalen Änderungen im Storage zu speichern (Commit ausführen).
Wie es funktioniert
Sie können zum Beispiel ein Finanzinstrument erstellen, welches den Dollarindex (USDX) zeigt. Seine Formel sieht wie folgt aus:
50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)
Hinweis: in der ursprünglichen Formel des Dollarindex werden die
Währungspaare USDEUR und USDGBP verwendet. Das es nur gegenläufige
Währungspaare auf der Plattform gibt, wird für diese eine negative
Potenz und der Ask-Preis statt Bid-Preis verwendet.
Die
Plattform berechnet den Preis des neuen Symbols in Echtzeit basierend
auf den Kursen der sechs anderen Symbole, die von Ihrem Broker
bereitgestellt werden. In der Marktübersicht und auf dem Chart sehen
Sie, wie sich sein Preis ändert:
int CustomTicksAdd( const string symbol, // Symbolname const MqlTick& ticks[] // Array mit Tickdaten, die auf das benutzerdefinierte Finanzinstrument angewandt werden müssen );Die Funktion CustomTicksAdd erlaubt es, die Tick so zu übertragen, als ob sie vom Server des Brokers eintreffen würden. Die Daten werden nicht direkt in die Datenbank von Ticks geschrieben, sondern in die Marktübersicht gesendet. Das Terminal speichert dann die Ticks aus der Marktübersicht in seiner Datenbank. Wenn eine große Datenmenge bei einem Aufruf übertragen wird, ändert die Funktion ihr Verhalten, um Ressourcen zu sparen. Wenn über 256 Ticks übergeben werden, werden die Daten in zwei Teile geteilt. Der erste Teil (der größere) wird direkt in die Datenbank von Ticks geschrieben (wie dies CustomTicksReplace tut). Der zweite Teil, der aus den letzten 128 Ticks besteht, wird in die Marktübersicht übertragen und danach vom Terminal in der Datenbank gespeichert.
Nun sind vollständige Projekte im MetaEditor verfügbar. Es ist viel einfacher geworden, Programme zu entwickeln.
Die Hauptdatei eines MQL5-Programms erscheint jetzt nicht mehr als
Projekt. Ein Projekt ist eine separate Datei "MQPROJ", in welcher die
Einstellungen eines Programms, Parameter der Kompilierung und
Informationen über alle verwendeten Dateien gespeichert werden. Der
Zugriff auf die wichtigsten Einstellungen des Projekts erfolgt über ein
separates Dialog-Fenster. Man braucht nicht mehr diese im Queelcode über
#property anzugeben.
Für eine bequeme Arbeit mit Projekten gibt es ein separates Tab
im Navigator-Fenster. Hier werden alle verwendeten Dateien nach
Kategorien angezeigt: include, resource, header usw. Dabei werden die
Dateien zum Navigator des Projekts automatisch hinzugefügt. Zum
Beispiel, wenn Sie eine neue MQH-Datei in den Code miteinbeziehen, wird
diese im Bereich "Dependencies" im Navigator-Fenster automatisch
angezeigt.
Es wurde die Möglichkeit implementiert, mit neuen
Projekten im MQL5 Online-Storage zu arbeiten. Nun kann man große
Projekte gemeinsam mit anderen Mitgliedern der MQL5.community
entwickeln.
Für das Arbeiten mit Gruppenprojekten wurde der neue Bereich Shared Projects hinzugefügt. Ein Projekt, das in diesem Bereich erstellt wurde, wird direkt in den Storage geschickt. Sie können anderen Nutzern Zugriffsrechte schnell erteilen und mit einer gemeinsamen Entwicklung beginnen.
Bei der Kompilierung des Projekts in Shared Project wird die EX5-Datei je nach dem Typ des Programms in das lokale Verzeichnis Experts, Indicators oder Scripts automatisch kopiert. Sie können das Programm direkt auf dem Chart starten, ohne Dateien jedes Mal manuell kopieren zu müssen.
Neue Funktionen bei der Arbeit mit dem MQL5 Storage
Für die Implementierung einer vollständigen Arbeit mit Gruppenprojekten wurde das Protokoll der Arbeit mit dem MQL5 Storage komplett geändert. Aus diesem Grund müssen Sie nach dem Update der Plattform alle Daten aus dem Storage erneut laden (Checkout). Die Daten, die im MQL5 Storage gespeichert sind, werden während der Aktualisierung nicht betroffen und gehen nicht verloren.
Der Befehl "Checkout from Storage" ist nicht mehr verfügbar. Für das Extrahieren von Daten werden die Befehle "MQL5 Storage aktivieren" und "Dateien aus dem Storage erhalten" verwendet:
Neue Projekte: ein Beispiel für die Erstellung und Details der Arbeit
Dem MetaEditor wurde eine neue Einheit hinzugefügt. Es geht um Projekte. Das ist eine Datei mit der Erweiterung mqproj, in welcher allgemeine Eigenschaften eines Programms sowie Informationen über alle verwendeten Dateien gespeichert werden. Nun kann man die Eigenschaften des Programms in einem separaten Dialogfensters des MetaEditors verwalten statt diese manuell im Quellcode zu ändern (Anweisungen #property).
Wenn Sie einen Code haben, können Sie neue Projekte ganz einfach testen, indem Sie den Befehl "Neues Projekt aus der Quelldatei" ausführen.
Im Verzeichnis, in welchem sich die ausgewählte Quelldatei befindet, wird eine gleichnamige Datei des Projekts mit der Erweiterung mqproj erstellt. Dem Projekt werden die Haupteigenschaften des Programms automatisch hinzugefügt, die als #property in der Quelldatei angegeben sind. Dazu gehören Name, Copyright, Version, Link zum Autor und Beschreibung.
Es wurden zwei neue Optionen für die Kompilierung von MQL5-Programmen den Projekteigenschaften hinzugefügt:
Für die Arbeit mit dem Projekt nutzen Sie das separate Tab "Projekt" im Navigator-Fenster. In diesem Reiter werden alle im Projekt verwendeten Dateien angezeigt. Bei der Erzeugung eines Projekts aus der Quelldatei werden zum Bereich "Dependencies" alle Include-Dateien (die mittels der Anweisung #include in der MQ5-Hauptdatei und in allen miteinbezogenen Dateien angegeben wurden) automatisch hinzugefügt.
Beim Hinzufügen neuer Include-Dateien zum Quellcode erscheinen diese auch im Navigator des Projekts. Zum Bereich Headers werden die verwendeten Header-Dateien hinzugefügt, zum Bereich Resources — Abbildungen, Töne und andere MQL5-Programme, die als Ressourcen ins Projekt miteinbezogen werden. Im Bereich Sources werden MQ5-Datein mit dem Quellcode angezeigt. Zum Bereich "Einstellungen und Dateien" kann man andere Dateien hinzufügen, zum Beispiel Testeinstellungen und Vorlagen für Charts.
Um bereits existierende Dateien zum Projekt hinzuzufügen oder Dateien aus dem Projekt zu löschen, nutzen Sie Befehle des Kontextmenüs. Seien Sie aufmerksam beim Löschen: Sie können eine Datei aus dem Projekt entfernen (Bindung entfernen) oder diese von der Festplatte komplett löschen:
Ein neues Projekt zu erstellen ist genauso einfach, wie ein MQL5-Programm. Klicken Sie auf "Neues Projekt" und wählen Sie den Typ des Programms aus sowie geben Sie seine Eigenschaften im MQL5 Wizard an (Name, Event-Handler usw.).
Um eine ausführbare EX5-Datei zu erhalten, können Sie das Projekt öffnen und die Kompilierung ausführen (F7) oder wie früher, die MQL5-Hauptdatei öffnen und diese kompilieren.
Gruppenprojekte im MQL5 Storage: Details der Arbeit
Gruppenprojekte werden im Bereich Shared Projects verwaltet. Wenn Sie den Storage noch nicht aktiviert haben, führen Sie den Befehl Activate MQL5 Storage im Kontextmenü des Ordners aus. MetaEditor überprüft, ob Ihr Storage gespeicherte Daten enthält und ob Gruppenprojekte für Sie verfügbar sind. Die vorhandenen Daten werden aus dem Storage extrahiert und auf den PC geladen (Checkout). Verfügbare Gruppenprojekte werden im Bereich Shared Project angezeigt. Um ein Gruppenprojekt zu erhalten, klicken Sie auf "Dateien aus dem Storage extrahieren" im Kontextmenü.
Um ein neues Gruppenprojekt zu erstellen, wählen Sie den Ordner Shared Projects aus und klicken Sie auf "Neues Projekt":
Durchlaufen Sie die Standardschritte des MQL5 Wizards: Geben Sie den Typ, den Namen und die Eigenschaften des künftigen Programms ein. Wählen Sie klare und verständliche Namen für Gruppenprojekte aus, damit andere Teilnehmer diese leicht finden könnten. Der Name darf nur lateinische Buchstaben enthalten, Leerzeichen sind nicht erlaubt.
Sobald das Projekt erstellt ist, wird es zum MQL5 Storage automatisch hinzugefügt. Die verwendeten Dateien der Standardbibliothek werden zum Storage nicht hinzugefügt, sie können diese manuell hinzufügen wenn nötig.
Um anderen Teilnehmern die Arbeit an dem Projekt zu erlauben, öffnen Sie seine Eigenschaften. Hier kann man konkreten Nutzern Zugriffsrechte erteilen, indem man ihre Benutzernamen bei der MQL5.community angibt, sowie gemeinsame Parameter der Gruppenarbeit setzen:
Einfachheitshalber wird die finale ausführbare Datei (EX5) bei
der Kompilierung je nach dem Typ des Programms in den Ordner Experts,
Indicators oder Scripts automatisch kopiert. Auf diese Weise können Sie
das Programm direkt im Terminal starten, ohne es manuell in das
benötigte Verzeichnis kopieren zu müssen.
Öffentliche Projekte im MQL5 Storage: Details der Arbeit
Wie bereits oben erwähnt, kann man für jedes Gruppenprojekt im MQL5 Storage einstellen, wer auf das Projekt zugreifen kann: das Projekt kann privat sein oder offen für die Teilnahme anderer Nutzer. Nun werden alle Projekte, an denen jeder teilnehmen darf, im separaten Reiter "Öffentliche Projekte" angezeigt.
Jeder kann ein interessantes Projekt für sich finden und sich an der Entwicklung beteiligen. Klicken Sie auf "Teilnehmen" und erhalten Sie das Projekt aus dem Storage.
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Template-Datei als binäres Array unsigned char my_template[]= { 0xFF,0xFE,0x3C, ... ,0x00 // das Array im Beispiel wurde gekürzt }; //--- Speichern und Anwenden des Templates if(FileSave("my_template.tpl",my_template)) { Print("Custom template saved in \\MQL5\\Files"); if(ChartApplyTemplate(0,"\\Files\\my_template.tpl")) Print("Custom template applied to the current chart"); else Print("Failed to apply custom template"); } else Print("Failed to save custom template"); }
Funktion | Aktion |
---|---|
CustomSymbolCreate | Erstellt ein benutzerdefiniertes Symbol mit dem angegebenen Namen in der angegebenen Gruppe |
CustomSymbolDelete | Löscht ein benutzerdefiniertes Symbol mit dem angegebenen Namen |
CustomSymbolSetInteger | Setzt den Wert einer Eigenschaft vom ganzzahligen Typ für ein benutzerdefiniertes Symbol |
CustomSymbolSetDouble | Setzt den Wert einer Eigenschaft vom reellen Typ für ein benutzerdefiniertes Symbol |
CustomSymbolSetString | Setzt den Wert einer Eigenschaft vom String-Typ für ein benutzerdefiniertes Symbol |
CustomSymbolSetMarginRate | Setzt den Koeffizienten der Margin je nach Typ und Richtung einer Order für ein benutzerdefiniertes Symbol |
CustomSymbolSetSessionQuote | Setzt den Anfang und das Ende der angegebenen Notierungssitzung für das angegebene Symbol und Wochentag |
CustomSymbolSetSessionTrade | Setzt den Anfang und das Ende der angegebenen Notierungssitzung für das angegebene Symbol und Wochentag |
CustomRatesDelete | Löscht alle Balken im angegebenen Zeitintervall aus der Preishistorie des benutzerdefinierten Symbols |
CustomRatesReplace | Ersetzt die komplette Preishistorie des benutzerdefinierten Symbols im angegebenen Zeitraum durch die Daten aus einem Array vom Typ MqlRates |
CustomRatesUpdate | Fügt der Historie des benutzerdefinierten Symbols fehlende Balken hinzu und ersetzt die vorhandenen Balken durch die Daten aus dem Array vom Typ MqlRates |
CustomTicksAdd | Fügt Daten aus einem Array vom Typ MqlTick zur Preis-Historie eines benutzerdefinierten Symbols hinzu. Das benutzerdefinierte Symbol muss in der Marktübersicht ausgewählt werden |
CustomTicksDelete | Löscht alle Balken im angegebenen Zeitintervall aus der Preishistorie des benutzerdefinierten Symbols |
CustomTicksReplace | Ersetzt die komplette Preishistorie des benutzerdefinierten Symbols im angegebenen Zeitraum durch die Daten aus einem Array vom Typ MqlTick |
Die Bibliothek befindet sich im Verzeichnis des Terminals im Ordner Include\Generic.
bool ArraySwap( void& array1[], // erstes Array void& array2[] // zweites Array );Die Funktion akzeptiert dynamische Arrays von einem Typ und einer Dimension. Für mehrdimensionale Arrays muss die Anzahl der Elemente in allen Dimensionen außer der ersten gleich sein.
Es wurde die Möglichkeit hinzugefügt, sich Marktstatistik über Finanzinstrumente anzusehen, die im Modus der Börsenausführung gehandelt werden. Dafür muss man das Menü des gewünschten Symbols in der Markttiefe öffnen und "Statistik" auswählen.
Das Arbeiten mit Positionen im Reiter "Handel" wurde verbessert. Durch Tippen auf einer Position/Order werden detaillierte Informationen und verfügbare Aktionen angezeigt: Schließen, Modifizieren oder Erhöhen des Volumens einer Position sowie Öffnen des Charts des Symbols der Position.
Der neue MetaTrader 5 für Android bietet nun die Option einer schnellen Eröffnung vorläufiger (preliminary) Konten bei Brokern an. Wählen Sie die Option "Realkonto eröffnen" aus und finden Sie Ihren Broker in der Liste der Server. Fügen Sie der Anfrage ein Ausweisdokument und einen Kontoauszug bei. Ihre Anfrage wird an den Broker weitergeleitet, der ein Realkonto für Sie eröffnen wird und wenn nötig zusätzliche Informationen anfordern kann.
union LongDouble { long long_value; double double_value; };Im Gegensatz zu Strukturen, gehören verschiedene Komponenten einer Union zu demselben Speicherbereich. In diesem Beispiel wurde die LongDouble Union deklariert, in welcher sich der Wert vom Typ long und der Wert vom Typ double einen Speicherbereich teilen. Man muss sich im Klaren sein, diese Union kann nicht gleichzeitig den gannzahligen Wert long und den reelen Wert double speichern (wie es in Strukturen der Fall ist), denn die Variablen long_value und double_value überschneiden sich (im Speicher). Das MQL5-Programm kann aber jederzeit die Information, die die Union beinhaltet, als einen ganzzahligen (long) oder reellen Wert (double) bearbeiten. Daraus folgt, dass die Union die Interpretation einer und derselben Reihenfolge von Daten auf zwei (oder mehr) verschiedenen Weisen ermöglicht.
union LongDouble { long long_value; double double_value; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- LongDouble lb; //--- die ungültige Zahl -nan(ind) erhalten und ausgeben lb.double_value=MathArcsin(2.0); printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value); //--- die größte normalisierte Zahl (DBL_MAX) lb.long_value=0x7FEFFFFFFFFFFFFF; printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value); //--- die kleinste positive normalisierte Zahl (DBL_MIN) lb.long_value=0x0010000000000000; printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value); } /* Das Ergebnis der Ausführung 1. double=-nan(ind) integer=FFF8000000000000 2. double=1.7976931348623157e+308 integer=7FEFFFFFFFFFFFFF 3. double=2.2250738585072014e-308 integer=0010000000000000 */
class Foo { int value; public: string Description(void){return IntegerToString(value);}; //--- Konstruktor standardmäßig Foo(void){value=-1;}; //--- Konstruktor mit Parametern Foo(int v){value=v;}; }; //+------------------------------------------------------------------+ //| Struktur, die Objekte vom Typ Foo beinhaltet | //+------------------------------------------------------------------+ struct MyStruct { string s; Foo foo; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- MyStruct a,b; Foo an_foo(5); a.s="test"; a.foo=an_foo; Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); //--- Print("b=a"); b=a; //--- Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); /* Das Ergebnis der Ausführung; a.s=test a.foo.Description()=5 b.s= b.foo.Description()=-1 b=a a.s=test a.foo.Description()=5 b.s=test b.foo.Description()=5 */ }Im impliziten Operator wird das Kopieren von Objekten gliederweise bzw. "memberweise" umgesetzt.
ENUM_POSITION_REASON | ENUM_DEAL_REASON | ENUM_ORDER_REASON | Beschreibung des Grunds |
---|---|---|---|
POSITION_REASON_CLIENT | DEAL_REASON_CLIENT | ORDER_REASON_CLIENT | Die Operation wurde infolge der Auslösung einer Order ausgeführt, die einem Desktop-Terminal platziert wurde |
POSITION_REASON_MOBILE | DEAL_REASON_MOBILE | ORDER_REASON_MOBILE | Die Operation wurde infolge der Auslösung einer Order ausgeführt, die in einer mobilen Anwendung platziert wurde |
POSITION_REASON_WEB | DEAL_REASON_WEB | ORDER_REASON_WEB | Die Operation wurde infolge der Auslösung einer Order ausgeführt, die auf der Webplattform platziert wurde |
POSITION_REASON_EXPERT | DEAL_REASON_EXPERT | ORDER_REASON_EXPERT | Die Operation wurde infolge der Auslösung einer Order ausgeführt, die durch ein MQL5-Programm - einen Expert Advisor oder ein Script platziert wurde |
- | DEAL_REASON_SL | ORDER_REASON_SL | Die Operation wurde infolge der Auslösung von Stop Loss durchgeführt |
- | DEAL_REASON_TP | ORDER_REASON_TP | Die Operation wurde infolge der Auslösung von Take Profit durchgeführt |
- | DEAL_REASON_SO | ORDER_REASON_SO | Die Operation wurde infolge des Ereignisses Stop Out ausgeführt |
- | DEAL_REASON_ROLLOVER | - | Der Abschluss wurde infolge eines Rollovers ausgeführt |
- | DEAL_REASON_VMARGIN | - | Der Abschluss wurde infolge der Anrechnung/Abbuchung der Variation Margin ausgeführt |
- | DEAL_REASON_SPLIT | - | Der Abschluss wurde nach einem Split (Preissenkung) einer Aktie oder eines Vermögenswertes ausgeführt, auf welcher(m) es eine offene Position im Moment der Ankündigung des Splits gab |
Der neue MetaTrader 5 für iOS bietet nun die Option einer schnellen Eröffnung vorläufiger (preliminary) Konten bei einem Broker an. Nun reicht es, die Option "Realkonto eröffnen" im Menü auszuwählen und den gewünschten Broker in der Liste der Server anzugeben. Nachdem Sie persönliche Daten ausgefüllt haben, fügen Sie zwei Dokumente bei, die Ihre Identität und Wohnsitz nachweisen, und schicken Sie die Anfrage ab. Ihr Broker wird direkt ein Realkonto für Sie eröffnen. Wenn nötig kann er zusätzliche Informationen anfordern.
Das neue MetaTrader 5 Build 1605 für iOS zeichnet sich auch durch die Optimierung und das neue Design für Mail aus:
Die Dokumentation wurde aktualisiert.
Die Handelshistorie wird jetzt in Form von Positionen dargestellt. Früher wurden nur Orders und Abschlüsse im Reiter "Historie" angezeigt, nun beinhaltet er auch Positionen. Jetzt werden alle Daten einer Transaktion in eine Eintragung zusammengefasst, die folgende Informationen enthält:
Es wurde die Darstellung der Handelshistorie in Form von Positionen hinzugefügt. Früher wurden nur Orders und Abschlüsse im Reiter "Historie" angezeigt, nun beinhaltet er auch Positionen. Die Handelsplattform sammelt Details von Deals, die zu einer Positionen gehören, und gruppiert diese Daten in einer Eintragung. Die Eintragung umfasst:
//+------------------------------------------------------------------+ //| Template-Funktion | //+------------------------------------------------------------------+ template<typename T1,typename T2> string Assign(T1 &var1,T2 var2) { var1=(T1)var2; return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Spezielle Überladung für den Fall bool+string | //+------------------------------------------------------------------+ string Assign(bool &var1,string var2) { var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0); return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int i; bool b; Print(Assign(i,"test")); Print(Assign(b,"test")); }Als Ergebnis der Ausführung dieses Codes sehen wir, dass für das Paar int+string das Funktionstemplate Assign() verwendet wurde, und dass beim zweiten Aufruf für das Paar bool+string bereits die überladene Version verwendet wurde.
string Assign<int,string>(int&,string) string Assign(bool&,string)
template<typename T> T Func() { return (T)0; } void OnInit() { Func<double>(); // explizite Spezialisierung von Funktionstemplates }Auf diese Weise erfolgt die Spezialisierung nicht durch die Aufrufparameter, sondern durch eine explizite Angabe der Typen.
Die Dokumentation wurde aktualisiert.
Die Dokumentation wurde aktualisiert.
Es wurde die Möglichkeit hinzugefügt, sich bei MQL5.com mit
Facebook zu registrieren oder einzuloggen. Jeder Nutzer dieses sozialen
Netzwerkes kann jetzt in wenigen Klicks Zugang zu Chats und allen
Services für MetaTrader 5 bekommen.
#resource path_to_resource_file als type_of_resource_variable name_of_resource_variable
#resource "data.bin" as int ExtData[] // Deklaration des eindimensionalen Arrays vom nummerischen Typ, das Daten aus der Datei data.bin enthält #resource "data.bin" as MqlRates ExtData[] // Deklaration des Arrays einfacher Strukturen, das Daten aus der Datei data.bin enthält #resource "data.txt" as string ExtCode // Deklaration des Strings, der Daten aus der Datei data.txt enthält #resource "data.txt" as string ExtCode[] // Deklaration eines Strings-Arrays, das Daten aus der Datei data.txt enthält #resource "image.bmp" as bitmap ExtBitmap[] // Deklaration eines eindimensionalen Arrays, das die Bitmap aus der BMP Datei enthält, Arraygröße = height * width #resource "image.bmp" as bitmap ExtBitmap2[][] // Deklaration des zweidimensionalen Arrays, das die Bitmap aus der BMP Datei enthält, Arraygröße [height][width]
Die Dokumentation wurde aktualisiert.
string str; ... if(str) // Kompilierungsfehler "Cannot convert type 'string' to 'bool'" (in den vorherigen Builds trat der Fehler nicht auf) Print("str is true");Man muss eine explizite Bedingung schreiben:
string str; ... //--- überprüfen, ob der String initialisiert wurde if(str!=NULL) Print("str is true"); oder //--- überprüfen, ob der Wert des Strings "true" ist if(StringCompare(str,"true",false)) Print("str is true"); oder //--- überprüfen, ob der String eine Zahl ist und nicht gleich Null ist if((int)str!=0) Print("str is true");