Struktur des Wirtschaftskalenders
Dieser Abschnitt beschreibt die Funktionen für das Arbeiten mit dem Wirtschaftskalender, die direkt auf der MetaTrader-Plattform verfügbar sind. Der Wirtschaftskalender ist eine vorgefertigte Enzyklopädie mit Beschreibungen makroökonomischer Indikatoren, deren Veröffentlichungsterminen und Wichtigkeitsmerkmalen. Relevante Werte makroökonomischer Indikatoren werden direkt zum Zeitpunkt der Veröffentlichung an die MetaTrader-Plattform gesendet und in einem Chart als Tags angezeigt, mit denen Sie die erforderlichen Indikatoren nach Ländern, Währungen und Bedeutung visuell verfolgen können.
Die Funktionen des Wirtschaftskalenders ermöglichen die automatische Analyse eingehender Ereignisse nach benutzerdefinierten Wichtigkeitskriterien aus der Perspektive der benötigten Länder/Währungspaare.
Länderbeschreibungen werden von der Struktur MqlCalendarCountry gesetzt. Sie wird in den Funktionen CalendarCountryById() und CalendarCountries() verwendet.
struct MqlCalendarCountry
{
ulong id; // Länder-ID (ISO 3166-1)
string name; // Ländername in Textform (in der aktuellen Kodierung des Terminals)
string code; // Länder-Code (ISO 3166-1 alpha-2)
string currency; // Währungs-Code des Landes
string currency_symbol; // Symbol der Landeswährung
string url_name; // URL-Landesname, wie er auf der Website von mql5.com verwendet wird
};
|
Ereignisbeschreibungen werden mit der Struktur MqlCalendarEvent dargestellt. Sie wird in den Funktionen CalendarEventById(), CalendarEventByCountry() und CalendarEventByCurrency() verwendet.
Ereigniswerte werden mit der Struktur MqlCalendarValue dargestellt. Sie wird in den Funktionen CalendarValueById(), CalendarValueHistoryByEvent(), CalendarValueHistory(), CalendarValueLastByEvent() und CalendarValueLast() verwendet
struct MqlCalendarValue
{
ulong id; // Werte-ID
ulong event_id; // Ereignis-ID
datetime time; // Datum und Zeit des Ereignisses
datetime period; // Ereignisberichtszeitraum
int revision; // Revision des veröffentlichten Indikators in Bezug auf den Berichtszeitraum
long actual_value; // aktueller Wert in ppm oder LONG_MIN, wenn der Wert nicht gesetzt wurde
long prev_value; // vorheriger Wert in ppm oder LONG_MIN, wenn der Wert nicht gesetzt wurde
long revised_prev_value; // revidierter vorheriger Wert in ppm oder LONG_MIN, wenn der Wert nicht gesetzt wurde
long forecast_value; // prognostizierter Wert in ppm oder LONG_MIN, wenn der Wert nicht gesetzt wurdet
ENUM_CALENDAR_EVENT_IMPACT impact_type; // mögliche Auswirkung auf die Währungskurse
//--- Funktionen zur Prüfung der Werte
bool HasActualValue(void) const; // Rückgabe von true, wenn der Wert gesetzt wurde
bool HasPreviousValue(void) const; // Rückgabe von true, wenn der vorherige Wert gesetzt wurde
bool HasRevisedValue(void) const; // Rückgabe von true, wenn der revidierte, vorherige Wert gesetzt wurde
bool HasForecastValue(void) const; // Rückgabe von true, wenn der prognostizierte Wert gesetzt wurde
//--- Funktionen zur Rückgabe der Werte
double GetActualValue(void) const; // Rückgabe des aktuellen Wertes oder nan, wenn er nicht gesetzt wurde
double GetPreviousValue(void) const; // Rückgabe des vorherigen Wertes oder nan, wenn er nicht gesetzt wurde
double GetRevisedValue(void) const; // Rückgabe des revidierten vorherigen Wertes oder nan, wenn er nicht gesetzt wurde
double GetForecastValue(void) const; // Rückgabe des prognostizierten Wertes oder nan, wenn er nicht gesetzt wurde
};
|
Die Struktur von MqlCalendarValue bietet Methoden zum Prüfen und Setzen von Werten der Felder actual_value, forecast_value, prev_value und revised_prev_value. Wenn kein Wert angegeben wird, speichert das Feld LONG_MIN (-9223372036854775808).
Bitte beachten Sie, dass die in diesem Feld gespeicherten Werte mit einer Million multipliziert werden. Dies bedeutet, dass, wenn Sie Werte von MqlCalendarValue mithilfe der Funktionen CalendarValueById, CalendarValueHistoryByEvent, CalendarValueHistory, CalendarValueLastByEvent und CalendarValueLast abrufen, sollten Sie überprüfen, ob die Feldwerte gleich LONG_MIN sind; wenn in einem Feld ein Wert angegeben ist, sollten Sie den Wert durch 1.000.000 dividieren, um den Wert zu erhalten. Eine andere Methode zum Abrufen der Werte besteht darin, die Werte mit den Funktionen der Struktur MqlCalendarValue zu überprüfen und abzurufen.
Ein Beispiel für den Umgang mit Kalenderereignissen:
//--- Erstellen einer Struktur zum Speichern von Kalenderereignissen mit reellen Werten anstelle von ganzen Zahlen
struct AdjustedCalendarValue
{
ulong id; // Werte-ID
ulong event_id; // Ereignis-ID
datetime time; // Datum und Zeit des Ereignisses
datetime period; // Ereignisberichtszeitraum
int revision; // Revision des veröffentlichten Indikators in Bezug auf den Berichtszeitraum
double actual_value; // aktueller Wert
double prev_value; // vorheriger Wert
double revised_prev_value; // revidierter, vorheriger Wert
double forecast_value; // prognostizierter Wert value
ENUM_CALENDAR_EVENT_IMPACT impact_type; // mögliche Auswirkung auf die Währungskurse
};
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion |
//+------------------------------------------------------------------+
void OnStart()
{
//---
//--- Länder-Code der EU (ISO 3166-1 Alpha-2)
string EU_code="EU";
//--- Abrufen aller Ereigniswerte der EU
MqlCalendarValue values[];
//--- Festlegen der Zeitgrenzen des Intervalls für die Ereignisse
datetime date_from=D'01.01.2021'; // Abfrage aller Ereignisse von 2021
datetime date_to=0; // 0 bedeutet alle bekannten Ereignisse, einschließlich derer, die noch nicht eingetreten sind
//--- Abfrage der Ereignishistorie der EU seit 2021
if(!CalendarValueHistory(values, date_from, date_to, EU_code))
{
PrintFormat("Fehler! Es konnten keine Ereignisse für country_code=%s, EU_code abgerufen werden.");
PrintFormat("Fehlernummer: %d", GetLastError());
return;
}
else
PrintFormat("Erhaltene Ereigniswerte für country_code=%s: %d",
EU_code, ArraySize(values));
//--- die Größe des Arrays für die Ausgabe an das Journal zu reduzieren
if(ArraySize(values)>5)
ArrayResize(values, 5);
//--- Ausgabe von Ereigniswerten in das Journal, wie sie sind, ohne Prüfung oder Umwandlung in tatsächliche Werte
Print("Ausgabe der Kalenderwerte wie sie sind");
ArrayPrint(values);
//--- Überprüfung der Feldwerte und Konvertierung in tatsächliche Werte
//--- Option 1 zum Prüfen und Abrufen der Werte
AdjustedCalendarValue values_adjusted_1[];
int total=ArraySize(values);
ArrayResize(values_adjusted_1, total);
//--- Kopieren der Werte mit Kontrollen und Anpassungen
for(int i=0; i<total; i++)
{
values_adjusted_1[i].id=values[i].id;
values_adjusted_1[i].event_id=values[i].event_id;
values_adjusted_1[i].time=values[i].time;
values_adjusted_1[i].period=values[i].period;
values_adjusted_1[i].revision=values[i].revision;
values_adjusted_1[i].impact_type=values[i].impact_type;
//--- Werte prüfen und durch 1.000.000 dividieren
if(values[i].actual_value==LONG_MIN)
values_adjusted_1[i].actual_value=double("nan");
else
values_adjusted_1[i].actual_value=values[i].actual_value/1000000.;
if(values[i].prev_value==LONG_MIN)
values_adjusted_1[i].prev_value=double("nan");
else
values_adjusted_1[i].prev_value=values[i].prev_value/1000000.;
if(values[i].revised_prev_value==LONG_MIN)
values_adjusted_1[i].revised_prev_value=double("nan");
else
values_adjusted_1[i].revised_prev_value=values[i].revised_prev_value/1000000.;
if(values[i].forecast_value==LONG_MIN)
values_adjusted_1[i].forecast_value=double("nan");
else
values_adjusted_1[i].forecast_value=values[i].forecast_value/1000000.;
}
Print("Die erste Methode zum Prüfen und Abrufen der Kalenderwerte");
ArrayPrint(values_adjusted_1);
//--- Option 2 zum Prüfen und Abrufen der Werte
AdjustedCalendarValue values_adjusted_2[];
ArrayResize(values_adjusted_2, total);
//--- Kopieren der Werte mit Kontrollen und Anpassungen
for(int i=0; i<total; i++)
{
values_adjusted_2[i].id=values[i].id;
values_adjusted_2[i].event_id=values[i].event_id;
values_adjusted_2[i].time=values[i].time;
values_adjusted_2[i].period=values[i].period;
values_adjusted_2[i].revision=values[i].revision;
values_adjusted_2[i].impact_type=values[i].impact_type;
//--- Prüfen und Abrufen der Werte
if(values[i].HasActualValue())
values_adjusted_2[i].actual_value=values[i].GetActualValue();
else
values_adjusted_2[i].actual_value=double("nan");
if(values[i].HasPreviousValue())
values_adjusted_2[i].prev_value=values[i].GetPreviousValue();
else
values_adjusted_2[i].prev_value=double("nan");
if(values[i].HasRevisedValue())
values_adjusted_2[i].revised_prev_value=values[i].GetRevisedValue();
else
values_adjusted_2[i].revised_prev_value=double("nan");
if(values[i].HasForecastValue())
values_adjusted_2[i].forecast_value=values[i].GetForecastValue();
else
values_adjusted_2[i].forecast_value=double("nan");
}
Print("Die zweite Methode zum Prüfen und Abrufen der Kalenderwerte");
ArrayPrint(values_adjusted_2);
//--- Option 3 zur Ermittlung der Werte - ohne Prüfungen
AdjustedCalendarValue values_adjusted_3[];
ArrayResize(values_adjusted_3, total);
//--- Kopieren der Werte mit Kontrollen und Anpassungen
for(int i=0; i<total; i++)
{
values_adjusted_3[i].id=values[i].id;
values_adjusted_3[i].event_id=values[i].event_id;
values_adjusted_3[i].time=values[i].time;
values_adjusted_3[i].period=values[i].period;
values_adjusted_3[i].revision=values[i].revision;
values_adjusted_3[i].impact_type=values[i].impact_type;
//--- Abrufen der Werte ohne Prüfung
values_adjusted_3[i].actual_value=values[i].GetActualValue();
values_adjusted_3[i].prev_value=values[i].GetPreviousValue();
values_adjusted_3[i].revised_prev_value=values[i].GetRevisedValue();
values_adjusted_3[i].forecast_value=values[i].GetForecastValue();
}
Print("Die dritte Methode zum Abrufen der Kalenderwerte - ohne Prüfung");
ArrayPrint(values_adjusted_3);
}
/*
Wir haben die Ereigniswerte für country_code=EU erhalten:1051
Ausgabe der Kalenderwerte wie sie sind
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55200000 55500000 -9223372036854775808 55500000 2 ...
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143100000 143900000 -9223372036854775808 -9223372036854775808 0 ...
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 ...
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11000000 10500000 -9223372036854775808 11000000 0 ...
[4] 111619 999010019 2021.01.05 12:00:00 2020.11.01 00:00:00 0 3100000 3100000 3200000 3100000 0 ...
Die erste Methode zum Prüfen und Abrufen von Kalenderwerten
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 999010019 2021.01.05 12:00:00 2020.11.01 00:00:00 0 3.10000 3.10000 3.20000 3.10000 0
Die zweite Methode zum Prüfen und Abrufen von Kalenderwerten
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 999010019 2021.01.05 12:00:00 2020.11.01 00:00:00 0 3.10000 3.10000 3.20000 3.10000 0
Die dritte Methode zum Abrufen von Kalenderwerten - ohne Prüfung
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 999010019 2021.01.05 12:00:00 2020.11.01 00:00:00 0 3.10000 3.10000 3.20000 3.10000 0
*/
|
Die Häufigkeit eines Ereignisses wird in der Struktur MqlCalendarEvent dargestellt. Im Folgenden aufgelistete Werte sind möglichENUM_CALENDAR_EVENT_FREQUENCY
|
|
CALENDAR_FREQUENCY_NONE
|
Veröffentlichungshäufigkeit ist nicht angegeben
|
CALENDAR_FREQUENCY_WEEK
|
Veröffentlichung einmal im Monat
|
CALENDAR_FREQUENCY_MONTH
|
Veröffentlichung einmal im Monat
|
CALENDAR_FREQUENCY_QUARTER
|
Veröffentlichung einmal im Quartal
|
CALENDAR_FREQUENCY_YEAR
|
Veröffentlichung einmal im Jahr
|
CALENDAR_FREQUENCY_DAY
|
Veröffentlichung einmal am Tag
|
Ereignis-Typ wird mit der Struktur MqlCalendarEvent dargestellt. Im Folgenden aufgelistete Werte sind möglichENUM_CALENDAR_EVENT_TYPE
|
|
CALENDAR_TYPE_EVENT
|
Ereignis (Sitzung, Rede etc.)
|
CALENDAR_TYPE_INDICATOR
|
Indikator
|
CALENDAR_TYPE_HOLIDAY
|
Feiertag
|
Der wirtschaftliche Sektor eines Ereignisses wird in der Struktur MqlCalendarEvent dargestellt. Im Folgenden aufgelistete Werte sind möglichENUM_CALENDAR_EVENT_SECTOR
|
|
CALENDAR_SECTOR_NONE
|
Ein Sektor wurde nicht angegeben
|
CALENDAR_SECTOR_MARKET
|
Markt, Börse
|
CALENDAR_SECTOR_GDP
|
Bruttoinlandsprodukt (BIP)
|
CALENDAR_SECTOR_JOBS
|
Arbeitsmarkt
|
CALENDAR_SECTOR_PRICES
|
Preise
|
CALENDAR_SECTOR_MONEY
|
Geld
|
CALENDAR_SECTOR_TRADE
|
Handel
|
CALENDAR_SECTOR_GOVERNMENT
|
Regierung
|
CALENDAR_SECTOR_BUSINESS
|
Geschäft
|
CALENDAR_SECTOR_CONSUMER
|
Konsum
|
CALENDAR_SECTOR_HOUSING
|
Bau
|
CALENDAR_SECTOR_TAXES
|
Steuern
|
CALENDAR_SECTOR_HOLIDAYS
|
Feiertage
|
Die Wichtigkeit des Ereignisses wird in der Struktur MqlCalendarEvent dargestellt. Im Folgenden aufgelistete Werte sind möglichENUM_CALENDAR_EVENT_IMPORTANCE
|
|
CALENDAR_IMPORTANCE_NONE
|
Wichtigkeit wurde nicht bestimmt
|
CALENDAR_IMPORTANCE_LOW
|
Geringe Wichtigkeit
|
CALENDAR_IMPORTANCE_MODERATE
|
Mittlere Wichtigkeit
|
CALENDAR_IMPORTANCE_HIGH
|
Hohe Wichtigkeit
|
Maßeinheit für die Anzeige der Ereigniswerte wird in der Struktur MqlCalendarEvent dargestellt. Im Folgenden aufgelistete Werte sind möglichENUM_CALENDAR_EVENT_UNIT
|
|
CALENDAR_UNIT_NONE
|
Maßeinheit wurde nicht angegeben
|
CALENDAR_UNIT_PERCENT
|
Prozentsatz
|
CALENDAR_UNIT_CURRENCY
|
Nationale Währung
|
CALENDAR_UNIT_HOUR
|
Stunden
|
CALENDAR_UNIT_JOB
|
Jobs
|
CALENDAR_UNIT_RIG
|
Förderanlagen
|
CALENDAR_UNIT_USD
|
USD
|
CALENDAR_UNIT_PEOPLE
|
Menschen
|
CALENDAR_UNIT_MORTGAGE
|
Hypothekarkredite
|
CALENDAR_UNIT_VOTE
|
Stimmen
|
CALENDAR_UNIT_BARREL
|
Barrels
|
CALENDAR_UNIT_CUBICFEET
|
Kubikfuß
|
CALENDAR_UNIT_POSITION
|
Nichtkommerzielle Nettoposition
|
CALENDAR_UNIT_BUILDING
|
Immobilen
|
In einigen Fällen benötigen wirtschaftliche Werte einen Multiplikator, die mit der Struktur MqlCalendarEvent dargestellt werden. Im Folgenden aufgelistete Multiplikatoren sind möglichENUM_CALENDAR_EVENT_MULTIPLIER
|
|
CALENDAR_MULTIPLIER_NONE
|
Ein Multiplikator wurde nicht bestimmt
|
CALENDAR_MULTIPLIER_THOUSANDS
|
Tausend
|
CALENDAR_MULTIPLIER_MILLIONS
|
Million
|
CALENDAR_MULTIPLIER_BILLIONS
|
Milliarde
|
CALENDAR_MULTIPLIER_TRILLIONS
|
Billion
|
Die mögliche Auswirkung auf die Währungskurse wird in der Struktur MqlCalendarValue dargestellt. Im Folgenden aufgelistete Werte sind möglichENUM_CALENDAR_EVENT_IMPACT
|
|
CALENDAR_IMPACT_NA
|
Wichtigkeit ist nicht bestimmt
|
CALENDAR_IMPACT_POSITIVE
|
Positive Wirkung
|
CALENDAR_IMPACT_NEGATIVE
|
Negative Wirkung
|
Der Zeitpunkt eines Ereignisses wird in der Struktur MqlCalendarEvent dargestellt. Im Folgenden aufgelistete Werte sind möglichENUM_CALENDAR_EVENT_TIMEMODE
|
|
CALENDAR_TIMEMODE_DATETIME
|
Die Quelle veröffentlicht eine genaue Uhrzeit eines Ereignisses
|
CALENDAR_TIMEMODE_DATE
|
Das Ereignis dauert den ganzen Tag
|
CALENDAR_TIMEMODE_NOTIME
|
Die Quelle veröffentlicht keine Zeit für ein Ereignis
|
CALENDAR_TIMEMODE_TENTATIVE
|
Die Quelle veröffentlicht einen Tag statt eines genauen Zeitpunktes für ein Ereignis Die Zeit wird beim Eintreten des Ereignisses angegeben.
|
Siehe auch