GW News Filter
- Bibliotheken
- Jose Martinez Hernandez
- Version: 1.0
GW-Nachrichten-Filter
Filtern Sie den Handel rund um wichtige Nachrichten. Vermeiden Sie Ein- und Ausstiege während riskanter Zeitfenster, indem Sie die Kalender-API von MetaTrader oder Ihre eigenen CSV-Dateien verwenden.
Works in live, demo and Strategy Tester · Source: API or CSV · Per-currency files · Entry/Exit flags · Diagnostics (0–4)
Merkmale
Funktioniert in echten Konten, Demos und im Strategietester
Wählen Sie zwischen:
- 0 = Auto (API für Live/Demo, CSV für Strategy Tester)
- 1 = API (MetaTrader's eingebauter Kalender)
- 2 = CSV (Dateien pro Währung, z. B. EUR.csv, USD.csv, ALL.csv)
Konfigurieren Sie:
- Minimale Wichtigkeit (Niedrig, Mäßig, Hoch)
- Fenster Sekunden vor/nach Nachrichten
- Globale "ALL"-Ereignisse einbeziehen
- Getrennte Flags für das Filtern von Einträgen und das Filtern von Ausgängen
- Leichte Wrapper-Klasse für einfache Integration
- Diagnoseprotokollierung (Stufen 0-4) zum Testen und Debuggen
Installation
- Kopieren Sie MQL5/Bibliotheken/GWNewsFilterLib.ex5
- Kopieren Sie MQL5/Include/Greaterwaves/GWNewsFilterLib.mqh
- In Ihren EA/Indikator einbinden:
#include <Greaterwaves/GWNewsFilterLib.mqh>
Schnellstart
Erstellen Sie den Filter einmal (z.B. in OnInit). Wenn Sie mit CSV testen, setzen Sie den Ordner mit SetCsvLocation() .
int OnInit() { if(!g.Create(_Symbol, InpFilterEntry, InpFilterExit, InpMinImp, InpIncludeAll, InpBefore, InpAfter, InpDiagLevel, InpSource)) { Print("GWNF: failed to create instance (Did you copy GWNewsFilterLib.ex5 into MQL5/Libraries/ ?)"); return(INIT_FAILED); } // Bei Verwendung von CSV (oder Ausführung im Tester) den CSV-Speicherort festlegen if(InpSource==1 || (int)MQLInfoInteger(MQL_TESTER)!=0) { if(!g.SetCsvLocation(InpCsvBaseRel, InpCsvUseCommon)) Print("GWNF: SetCsvLocation() failed."); } return(INIT_SUCCEEDED); }
Bauen Sie dann das Fenster einmal pro Takt neu auf und agieren Sie damit:
void OnTick() { datetime bar = (datetime)iTime(_Symbol, _Period, 0); if(bar == g_last) return; g_last = bar; if(!g.RebuildWindow()) { Print("GWNF: RebuildWindow() returned false."); return; } const int active = g.GetFilteringEventsCount(); if(active > 0) { // Filter ist aktiv → Einträge überspringen / Ausgänge verwalten } else { // Filter ist inaktiv → außerhalb des Ereignisfensters } }
CSV Preparation Guide
Jede Zeile in der CSV-Datei muss die folgenden 16 Spalten enthalten, und zwar genau in dieser Reihenfolge:
- VALUE_ID → Eindeutige numerische ID für den Wert (verwenden Sie eine beliebige Ganzzahl, z. B. "10001")
- EVENT_ID → Eindeutige numerische ID für das Ereignis (z. B. "20001")
- TIME → Uhrzeit des Ereignisses im Format `YYYY.MM.DD HH:MM:SS`.
- PERIOD → Zeichenfolge für den Zeitraum (kann leer gelassen werden, wenn nicht verwendet)
- REVISION → Ganzzahlige Revisionsnummer (normalerweise `0`)
- ACTUAL → Tatsächlicher gemeldeter Wert (leer lassen, wenn unbekannt)
- PREVIOUS → Vorheriger gemeldeter Wert (leer lassen, wenn unbekannt)
- REVISED_PREV → Revidierter vorheriger Wert (leer lassen, wenn unbekannt)
- FORECAST → Prognostizierter Wert (leer lassen, falls unbekannt)
- IMPACT_TYPE → Ganzzahl (0=keine, 1=positiv, 2=negativ, 3=neutral). Kann `0` sein, wenn nicht benötigt.
- CURRENCY → Währungscode (`USD`, `EUR`, `JPY`, ... oder `ALL`)
- COUNTRY_CODE → Länderkürzel (`US`, `EU`, `GB`, ...)
- COUNTRY_ID → Numerische ID (kann `0` sein, wenn nicht relevant)
- IMPORTANCE → `LOW`, `MODERATE`, oder `HIGH`
- EVENT_CODE → Kurzer maschinenfreundlicher Bezeichner (`cpi`, `gdp`, `trade-balance`)
- NAME → Menschenfreundlicher Ereignisname
Beispielzeilen:
10001;20001;2025.08.28 12:30:00;;0;3.4;3.2;;3.5;0;USD;US;0;HIGH;cpi;Consumer Price Index (YoY) 10002;20002;2025.08.28 14:00:00;;0;1.8;2.0;;2.1;0;USD;US;0;MODERATE;housing;Housing Starts 10003;20003;2025.08.28 15:00:00;;0;;; ;0.9;0;EUR;EU;0;HIGH;confidence;Consumer Confidence Index
Explanation:
-
Bei dem ersten Ereignis handelt es sich um die Veröffentlichung des Verbraucherpreisindex für den US-Dollar mit hoher Auswirkung.
-
Das zweite Ereignis sind Daten zum Wohnungsbau mit moderaten Auswirkungen.
-
Das dritte Ereignis ist ein EUR-Vertrauensindex mit hoher Auswirkung.
Benennung und Platzierung der Dateien
Legen Sie eine CSV-Datei pro Währung (z. B. USD.csv , EUR .csv ) in einem Ordner ab.
Der Ordner kann sich befinden in:
- Common\Files\NEWS\ (wird von allen Terminals gemeinsam genutzt), oder
- MQL5\Files\NEWS\ (lokal für ein Terminal).
Sie konfigurieren den Ordner über:
g.SetCsvLocation("NEWS", true); // "true" = use Common\Files
Diagnose
- 0 = stumm
- 1 = nur kritische Fehler
- 2 = init + wenn Filter aktiv ist
- 3 = fügt "outside news"-Protokolle hinzu
- 4 = vollständige Details (listet alle Ereignisse auf)
Wichtige Hinweise
- Auch wenn Sie nicht alle Werte benötigen (wie VALUE_ID oder COUNTRY_ID), müssen Sie die Spaltenreihenfolge und die Trennzeichen beibehalten.
- Leere Felder sind erlaubt - behalten Sie einfach das Trennzeichen ; bei.
- Der Parser erwartet Semikolon ; Trennzeichen, die mit MetaTrader CSV übereinstimmen.
- Die Wichtigkeit des Ereignisses muss einer der folgenden Werte sein: NIEDRIG, MITTEL, HOCH.
Wrapper Header (kopieren Sie diesen in MQL5/Include/Greaterwaves/GWNewsFilterLib.mqh)
//+------------------------------------------------------------------+ //|GWNewsFilterLib.mqh | //| Öffentlicher Wrapper für GWNewsFilterLib.ex5 binär | //| (c) GreaterWaves - José Martínez Hernández | //+------------------------------------------------------------------+ // // BEDIENUNGSHINWEISE // 1) Kopieren Sie diese Datei nach: MQL5/Include/Greaterwaves/GWNewsFilterLib.mqh // 2) Kopieren Sie die Binärdatei nach: MQL5/Bibliotheken/GWNewsFilterLib.ex5 // 3) In Ihrem EA/Indikator: // #include <Greaterwaves/GWNewsFilterLib.mqh> // // Beispiel: // // GWNewsFilter nf; // if(nf.Create(_Symbol, true, false, // 2, // minImportance (0=Keine,1=Gering,2=Mäßig,3=Hoch) // wahr, // includeGlobalAll // 900,900,// SekundenVor/Nach // 3, // diagnosticLevel (0-4) // 0)) // forcedSource (0=Auto,1=CSV,2=API) // { // nf.SetCsvLocation("NEWS", true); // Optionaler benutzerdefinierter CSV-Pfad // nf.RebuildWindow(); // if(nf.IsFilteringNow(true,false)) // Print("Filter bei Eingabe aktiv"); // nf.UpdateChartCommentMinimal(); // } // // =============================================================== // IMPORTS aus der Binärbibliothek // =============================================================== #import "GWNewsFilterLib.ex5" int GWFilter_Create(string symbol, bool filterEntry, bool filterExit, int minImportance, bool includeGlobalAll, int secondsBefore, int secondsAfter, int diagnosticLevel, int forcedSource); bool GWFilter_Destroy(int handle); bool GWFilter_RebuildWindow(int handle); bool GWFilter_IsBlockingNow(int handle, bool forEntry, bool forExit); int GWFilter_GetBlockingEventsCount(int handle); int GWFilter_TotalInWindow(int handle); bool GWFilter_GetWindowEventAt(int handle, int index, long &value_id, long &event_id, datetime &time, string ¤cy, string &country_code, string &event_code, string &name, int &importance); bool GWFilter_SetDiagnosticLevel(int handle, int level); bool GWFilter_SetForcedSource (int handle, int forcedSource); bool GWFilter_SetBlockFlags (int handle, bool filterEntry, bool filterExit); bool GWFilter_BuildBlockingComment(int handle, string &out_comment); bool GWFilter_UpdateChartCommentMinimal(int handle); bool GWFilter_SetCsvLocation(int handle, string baseRel, bool useCommon); #import // =============================================================== // Objektorientierter Wrapper zur einfacheren Verwendung in EAs/Indikatoren // =============================================================== class GWNewsFilter { private: int m_h; // Interner Handle zum Binärobjekt public: GWNewsFilter(): m_h(0) {} // Instanz mit Einstellungen erstellen bool Create(string symbol, bool filterEntry, bool filterExit, int minImportance = 2, bool includeGlobalAll= true, int secondsBefore = 900, int secondsAfter = 900, int diagnosticLevel = 2, int forcedSource = 0) { m_h = GWFilter_Create(symbol, filterEntry, filterExit, minImportance, includeGlobalAll, secondsBefore, secondsAfter, diagnosticLevel, forcedSource); return (m_h > 0); } // Instanz zerstören bool Destroy() { if(m_h<=0) return false; bool ok=GWFilter_Destroy(m_h); m_h=0; return ok; } // Fenster mit anstehenden Ereignissen aktualisieren bool RebuildWindow() { return (m_h>0 ? GWFilter_RebuildWindow(m_h) : false); } // Prüfen, ob der Filter jetzt aktiv ist (Eintritt/Austritt) bool IsFilteringNow(bool forEntry, bool forExit) { return (m_h>0 ? GWFilter_IsBlockingNow(m_h, forEntry, forExit) : false); } // Anzahl der derzeit aktiven Filterereignisse int GetFilteringEventsCount(){ return (m_h>0 ? GWFilter_GetBlockingEventsCount(m_h) : -1); } // Gesamtzahl der Ereignisse im aktuellen Fenster int TotalInWindow() { return (m_h>0 ? GWFilter_TotalInWindow(m_h) : -1); } // Abrufen von Details zu einem Ereignis bei index bool GetWindowEventAt(int index, long &value_id, long &event_id, datetime &time, string ¤cy, string &country_code, string &event_code, string &name, int &importance) { return (m_h>0 ? GWFilter_GetWindowEventAt(m_h, index, value_id, event_id, time, currency, country_code, event_code, name, importance) : false); } // Ändern der Diagnoseprotokollebene bool SetDiagnosticLevel(int level){ return (m_h>0 ? GWFilter_SetDiagnosticLevel(m_h, level) : false); } // Datenquelle erzwingen (Auto, CSV, API) bool SetForcedSource (int forced){ return (m_h>0 ? GWFilter_SetForcedSource (m_h, forced) : false); } // Aktivieren/Deaktivieren der Filterung für die Einreise/Ausreise bool SetFilterFlags (bool fe, bool fx){ return (m_h>0 ? GWFilter_SetBlockFlags(m_h, fe, fx) : false); } // Erstellen einer minimalen Kommentarzeichenkette, wenn der Filter aktiv ist bool BuildFilteringComment(string &out_comment){ out_comment=""; return (m_h>0 ? GWFilter_BuildBlockingComment(m_h, out_comment) : false); } // Diagrammkommentar automatisch aktualisieren (nur wenn aktiv) bool UpdateChartCommentMinimal(){ return (m_h>0 ? GWFilter_UpdateChartCommentMinimal(m_h) : false); } // Speicherort des CSV-Ordners festlegen bool SetCsvLocation(const string baseRel, const bool useCommon=true) { return (m_h>0 ? GWFilter_SetCsvLocation(m_h, baseRel, useCommon) : false); } // Rückgabe des internen Handles int Handle() const { return m_h; } };
EA-Beispiel mit minimaler Nutzung
// Minimale Demo-Nutzung #include <Greaterwaves/GWNewsFilterLib.mqh> GWNewsFilter g; int OnInit() { g.Create(_Symbol, true, false, 2, true, 900, 900, 2, 0); g.SetCsvLocation("NEWS", true); // bei Verwendung von CSV return INIT_SUCCEEDED; } void OnTick() { if(g.RebuildWindow()) { if(g.GetFilteringEventsCount()>0) Print("Filter active - skip trading"); } }
Unterstützung: https://academy.greaterwaves.com

