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.
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 |
Die Dokumentation wurde aktualisiert.
//+------------------------------------------------------------------+ //| 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.
#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");
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.