[{"data":1,"prerenderedAt":1337},["ShallowReactive",2],{"\u002Fde\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor":3,"\u002Fde\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor-surround":1316,"\u002Fde\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor-langs":1327},{"id":4,"title":5,"authors":6,"badge":12,"body":14,"date":1304,"description":1305,"draft":1306,"extension":1307,"image":1308,"meta":1310,"navigation":256,"path":1311,"seo":1312,"stem":1313,"updated":1314,"__hash__":1315},"posts\u002Fde\u002F3.guides\u002F41.add-a-news-filter-to-your-mt4-expert-advisor.md","So baust du einen News-Filter in deinen MT4-Expert-Advisor ein",[7],{"name":8,"to":9,"avatar":10},"ShowMyTrades Team","https:\u002F\u002Fshowmytrades.com",{"src":11},"\u002Ficon-512.png",{"label":13},"Automatisierung",{"type":15,"value":16,"toc":1293},"minimark",[17,27,40,45,56,140,144,159,165,176,180,195,952,958,962,965,1031,1042,1053,1057,1060,1122,1126,1177,1181,1189,1193,1204,1210,1220,1226,1236,1247,1251,1278,1281,1289],[18,19,20,21,26],"p",{},"Ein ",[22,23,25],"a",{"href":24},"\u002Fglossary\u002Fwhat-is-an-expert-advisor","Expert Advisor",", der mitten in den US-Arbeitsmarktbericht (Non-Farm Payrolls) oder einen Zinsentscheid hinein handelt, folgt nicht mehr seiner Strategie: Er wirft eine Münze, und das bei breitem Spread. Ein News-Filter verhindert das. Er setzt neue Einstiege einige Minuten vor und nach den Veröffentlichungen aus, die den Markt bewegen, und lässt die Strategie den Rest der Zeit ungestört arbeiten.",[18,28,29,30,34,35,39],{},"MetaTrader 5 hat einen Kalender eingebaut. ",[31,32,33],"strong",{},"MetaTrader 4 nicht",", der EA muss sich die News also selbst besorgen. Diese Anleitung nutzt die kostenlose ",[22,36,38],{"href":37},"\u002Fdocs\u002Fapi\u002Feconomic-calendar","Wirtschaftskalender-API von ShowMyTrades",": kein Konto, kein API-Schlüssel, eine einzige URL, die du im Terminal freigibst, und eine Include-Datei, die in jeden EA passt.",[41,42,44],"h2",{"id":43},"das-baust-du","🧭 Das baust du",[46,47,52],"pre",{"className":48,"code":50,"language":51},[49],"language-text","alle 15 Minuten              bei jedem Tick\n┌──────────────────────┐     ┌─────────────────────────────────┐\n│ News der nächsten    │ ──► │ Liegt eine Veröffentlichung     │\n│ 2 Tage herunterladen │     │ im Fenster [-30 Min., +30 Min.] │\n│ (CSV, eine Anfrage)  │     │ um den aktuellen Zeitpunkt?     │\n└──────────────────────┘     │   ja   → keine neuen Einstiege  │\n                             │   nein → Strategie ausführen    │\n                             └─────────────────────────────────┘\n","text",[53,54,50],"code",{"__ignoreMap":55},"",[57,58,59,75],"table",{},[60,61,62],"thead",{},[63,64,65,69,72],"tr",{},[66,67,68],"th",{},"Entscheidung",[66,70,71],{},"Standard im Code",[66,73,74],{},"Warum",[76,77,78,92,108,119,129],"tbody",{},[63,79,80,84,89],{},[81,82,83],"td",{},"Welche Währungen",[81,85,86],{},[53,87,88],{},"EUR,USD",[81,90,91],{},"Die beiden Seiten des Paars, das du handelst. Leer heißt: alle neun Hauptwährungen",[63,93,94,97,102],{},[81,95,96],{},"Welche Wichtigkeit",[81,98,99],{},[53,100,101],{},"high",[81,103,104,107],{},[53,105,106],{},"high,medium"," für einen vorsichtigeren Filter",[63,109,110,113,116],{},[81,111,112],{},"Pause davor",[81,114,115],{},"30 Minuten",[81,117,118],{},"Vor der Zahl weiten sich die Spreads, und die Liquidität dünnt aus",[63,120,121,124,126],{},[81,122,123],{},"Pause danach",[81,125,115],{},[81,127,128],{},"In diese Zeit fallen die erste Reaktion und die Gegenbewegung",[63,130,131,134,137],{},[81,132,133],{},"Download-Intervall",[81,135,136],{},"15 Minuten",[81,138,139],{},"Der Kalender ändert sich nur wenige Male am Tag, und die API speichert ohnehin 15 Minuten zwischen",[41,141,143],{"id":142},"schritt-1-die-adresse-in-metatrader-freigeben","🔑 Schritt 1: Die Adresse in MetaTrader freigeben",[18,145,146,149,150,153,154,158],{},[53,147,148],{},"WebRequest()",", die MQL4-Funktion für Downloads aus dem Internet, spricht nur mit Adressen, die du freigegeben hast. Öffne im Terminal ",[31,151,152],{},"Extras → Optionen → Expert Advisors"," (Tools → Options → Expert Advisors), setze den Haken bei ",[155,156,157],"em",{},"WebRequest für die aufgeführten URLs erlauben"," (Allow WebRequest for listed URL) und trage ein:",[46,160,163],{"className":161,"code":162,"language":51,"meta":55},[49],"https:\u002F\u002Fshowmytrades.com\n",[53,164,162],{"__ignoreMap":55},[18,166,167,168,171,172,175],{},"Fehlt dieser Schritt, liefert der Download ",[53,169,170],{},"-1"," mit Fehler ",[53,173,174],{},"4060",". Die Include-Datei schreibt dann einen Hinweis in den Reiter „Experten“ (Experts), damit du nicht rätseln musst, warum der Filter stumm bleibt.",[41,177,179],{"id":178},"schritt-2-die-include-datei-speichern","📄 Schritt 2: Die Include-Datei speichern",[18,181,182,183,186,187,190,191,194],{},"Speichere den folgenden Code als ",[53,184,185],{},"SMT_NewsFilter.mqh"," im Ordner ",[53,188,189],{},"MQL4\\Include"," deines Terminals. Den Ordner öffnest du über Datei → Dateiordner öffnen (File → Open Data Folder). Es ist dieselbe Datei wie in der ",[22,192,193],{"href":37},"API-Referenz",", und sie lässt sich auch in MQL5 ohne jede Änderung kompilieren.",[46,196,200],{"className":197,"code":198,"filename":185,"language":199,"meta":55,"style":55},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F+------------------------------------------------------------------+\n\u002F\u002F| SMT_NewsFilter.mqh - News-Filter für MT4 und MT5                 |\n\u002F\u002F| Daten: https:\u002F\u002Fshowmytrades.com\u002Fapi\u002Fpublic\u002Fcalendar\u002Fv1 (gratis)  |\n\u002F\u002F| Doku: https:\u002F\u002Fshowmytrades.com\u002Fdocs\u002Fapi\u002Feconomic-calendar        |\n\u002F\u002F| Setup: Extras > Optionen > Expert Advisors > WebRequest für      |\n\u002F\u002F|        https:\u002F\u002Fshowmytrades.com erlauben                         |\n\u002F\u002F+------------------------------------------------------------------+\n#property strict\n\ninput string SMT_Currencies     = \"EUR,USD\"; \u002F\u002F News: Währungen (kommagetrennt, leer = alle)\ninput string SMT_Impact         = \"high\";    \u002F\u002F News: Wichtigkeit (high | high,medium | all)\ninput int    SMT_MinutesBefore  = 30;        \u002F\u002F News: Pause vor einer Veröffentlichung (Minuten)\ninput int    SMT_MinutesAfter   = 30;        \u002F\u002F News: Pause nach einer Veröffentlichung (Minuten)\ninput int    SMT_RefreshMinutes = 15;        \u002F\u002F News: Download-Intervall (Minuten, min. 15)\n\ndatetime smt_eventTime[];\nstring   smt_eventTitle[];\ndatetime smt_nextDownload = 0;\nlong     smt_serverTime   = 0;     \u002F\u002F UTC-Zeit des Servers (Unix-Sekunden) beim letzten Download\nuint     smt_syncTick     = 0;     \u002F\u002F GetTickCount() im selben Moment\nbool     smt_clockSynced  = false;\n\n\u002F\u002F--- die echte UTC-Zeit: die Uhr des Servers plus die seit dem Download vergangenen\n\u002F\u002F--- Millisekunden, gezählt mit GetTickCount(). Der Zähler kennt keine Zeitzonen, keine\n\u002F\u002F--- Sommerzeit und keine Uhrkorrekturen auf dem Rechner (die uint-Subtraktion übersteht\n\u002F\u002F--- auch seinen Überlauf). Vor dem ersten Download dient TimeGMT() als Ersatz. Nie\n\u002F\u002F--- TimeCurrent(): Der GMT-Offset des Brokers ist unbekannt und springt mit der Sommerzeit.\ndatetime SMT_Now()\n{\n   if(!smt_clockSynced) return TimeGMT();\n   uint elapsedMs = GetTickCount() - smt_syncTick;\n   return (datetime)(smt_serverTime + elapsedMs \u002F 1000);\n}\n\n\u002F\u002F--- Abstand der Broker-Uhr zu UTC in Sekunden (7200 = GMT+2). Auch für sich allein\n\u002F\u002F--- nützlich: Die meisten EAs kennen diesen Wert nie. TimeCurrent() ist die Zeit des\n\u002F\u002F--- letzten Ticks, also bei geöffnetem Markt auslesen, nicht am Wochenende.\nint SMT_BrokerGmtOffsetSeconds()\n{\n   return (int)(TimeCurrent() - SMT_Now());\n}\n\n\u002F\u002F--- alles nach dem n-ten Komma (der CSV-Titel, der selbst Kommas enthalten kann)\nstring SMT_AfterComma(const string line, const int n)\n{\n   int pos = -1;\n   for(int i = 0; i \u003C n; i++)\n   {\n      pos = StringFind(line, \",\", pos + 1);\n      if(pos \u003C 0) return \"\";\n   }\n   string rest = StringSubstr(line, pos + 1);\n   StringReplace(rest, \"\\\"\\\"\", \"\\\"\");\n   if(StringLen(rest) >= 2 && StringGetCharacter(rest, 0) == '\"')\n      rest = StringSubstr(rest, 1, StringLen(rest) - 2);\n   return rest;\n}\n\n\u002F\u002F--- lädt die nächsten 2 Tage herunter (das Fenster deckt auch die letzten 6 Stunden ab)\nbool SMT_Download()\n{\n   string url = \"https:\u002F\u002Fshowmytrades.com\u002Fapi\u002Fpublic\u002Fcalendar\u002Fv1?format=csv&days=2&impact=\" + SMT_Impact;\n   if(StringLen(SMT_Currencies) > 0) url += \"&currency=\" + SMT_Currencies;\n\n   char   post[], result[];\n   string headers;\n   ResetLastError();\n   int status = WebRequest(\"GET\", url, \"\", NULL, 10000, post, 0, result, headers);\n   if(status != 200)\n   {\n      Print(\"[SMT] calendar download failed: HTTP \", status, \", error \", GetLastError(),\n            \". Is https:\u002F\u002Fshowmytrades.com in Tools > Options > Expert Advisors > Allow WebRequest?\");\n      smt_nextDownload = TimeCurrent() + 60; \u002F\u002F neuer Versuch in einer Minute\n      return false;\n   }\n\n   string body = CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8);\n   string lines[];\n   int n = StringSplit(body, '\\n', lines);\n\n   ArrayResize(smt_eventTime, 0);\n   ArrayResize(smt_eventTitle, 0);\n   for(int i = 1; i \u003C n; i++) \u002F\u002F Zeile 0 ist die Kopfzeile\n   {\n      \u002F\u002F letzte Zeile \"# server_time=1760702400 server_time_iso=...\": die UTC-Uhr des Servers\n      if(StringFind(lines[i], \"# server_time=\") == 0)\n      {\n         long serverTime = StringToInteger(StringSubstr(lines[i], 14, 10));\n         if(serverTime > 0)\n         {\n            smt_serverTime  = serverTime;\n            smt_syncTick    = GetTickCount();\n            smt_clockSynced = true;\n         }\n         continue;\n      }\n      string f[];\n      if(StringSplit(lines[i], ',', f) \u003C 8) continue;\n      int k = ArraySize(smt_eventTime);\n      ArrayResize(smt_eventTime, k + 1);\n      ArrayResize(smt_eventTitle, k + 1);\n      smt_eventTime[k]  = (datetime)StringToInteger(f[0]);      \u002F\u002F Unix-Sekunden, UTC\n      smt_eventTitle[k] = f[2] + \" \" + f[3] + \": \" + SMT_AfterComma(lines[i], 7);\n   }\n   smt_nextDownload = TimeCurrent() + MathMax(SMT_RefreshMinutes, 15) * 60;\n   Print(\"[SMT] calendar: \", ArraySize(smt_eventTime), \" events loaded. UTC now \",\n         TimeToString(SMT_Now(), TIME_DATE|TIME_MINUTES), \", broker clock is GMT\",\n         (SMT_BrokerGmtOffsetSeconds() >= 0 ? \"+\" : \"\"), DoubleToString(SMT_BrokerGmtOffsetSeconds() \u002F 3600.0, 1));\n   return true;\n}\n\n\u002F\u002F--- true, solange eine Veröffentlichung im Pausenfenster liegt; reason sagt, welche\nbool SMT_IsNewsTime(string &reason)\n{\n   reason = \"\";\n   if(MQLInfoInteger(MQL_TESTER)) return false;   \u002F\u002F kein Netzwerk im Tester\n   if(TimeCurrent() >= smt_nextDownload) SMT_Download();\n\n   datetime now = SMT_Now();\n   for(int i = 0; i \u003C ArraySize(smt_eventTime); i++)\n   {\n      if(now >= smt_eventTime[i] - SMT_MinutesBefore * 60 && now \u003C= smt_eventTime[i] + SMT_MinutesAfter * 60)\n      {\n         reason = smt_eventTitle[i];\n         return true;\n      }\n   }\n   return false;\n}\n","cpp",[53,201,202,210,216,222,228,234,240,245,251,258,264,270,276,282,288,293,299,305,311,317,323,329,334,340,346,352,358,364,370,376,382,388,394,400,405,411,417,423,429,434,440,445,450,456,462,467,473,479,485,491,497,503,509,515,521,527,533,538,543,549,555,560,566,572,577,583,589,595,601,607,612,618,624,630,636,641,646,652,658,664,669,675,681,687,692,698,704,710,716,722,728,734,740,746,752,758,764,770,776,782,788,794,800,806,811,817,823,829,835,841,846,851,857,863,868,874,880,886,891,897,903,908,914,919,925,931,936,941,947],{"__ignoreMap":55},[203,204,207],"span",{"class":205,"line":206},"line",1,[203,208,209],{},"\u002F\u002F+------------------------------------------------------------------+\n",[203,211,213],{"class":205,"line":212},2,[203,214,215],{},"\u002F\u002F| SMT_NewsFilter.mqh - News-Filter für MT4 und MT5                 |\n",[203,217,219],{"class":205,"line":218},3,[203,220,221],{},"\u002F\u002F| Daten: https:\u002F\u002Fshowmytrades.com\u002Fapi\u002Fpublic\u002Fcalendar\u002Fv1 (gratis)  |\n",[203,223,225],{"class":205,"line":224},4,[203,226,227],{},"\u002F\u002F| Doku: https:\u002F\u002Fshowmytrades.com\u002Fdocs\u002Fapi\u002Feconomic-calendar        |\n",[203,229,231],{"class":205,"line":230},5,[203,232,233],{},"\u002F\u002F| Setup: Extras > Optionen > Expert Advisors > WebRequest für      |\n",[203,235,237],{"class":205,"line":236},6,[203,238,239],{},"\u002F\u002F|        https:\u002F\u002Fshowmytrades.com erlauben                         |\n",[203,241,243],{"class":205,"line":242},7,[203,244,209],{},[203,246,248],{"class":205,"line":247},8,[203,249,250],{},"#property strict\n",[203,252,254],{"class":205,"line":253},9,[203,255,257],{"emptyLinePlaceholder":256},true,"\n",[203,259,261],{"class":205,"line":260},10,[203,262,263],{},"input string SMT_Currencies     = \"EUR,USD\"; \u002F\u002F News: Währungen (kommagetrennt, leer = alle)\n",[203,265,267],{"class":205,"line":266},11,[203,268,269],{},"input string SMT_Impact         = \"high\";    \u002F\u002F News: Wichtigkeit (high | high,medium | all)\n",[203,271,273],{"class":205,"line":272},12,[203,274,275],{},"input int    SMT_MinutesBefore  = 30;        \u002F\u002F News: Pause vor einer Veröffentlichung (Minuten)\n",[203,277,279],{"class":205,"line":278},13,[203,280,281],{},"input int    SMT_MinutesAfter   = 30;        \u002F\u002F News: Pause nach einer Veröffentlichung (Minuten)\n",[203,283,285],{"class":205,"line":284},14,[203,286,287],{},"input int    SMT_RefreshMinutes = 15;        \u002F\u002F News: Download-Intervall (Minuten, min. 15)\n",[203,289,291],{"class":205,"line":290},15,[203,292,257],{"emptyLinePlaceholder":256},[203,294,296],{"class":205,"line":295},16,[203,297,298],{},"datetime smt_eventTime[];\n",[203,300,302],{"class":205,"line":301},17,[203,303,304],{},"string   smt_eventTitle[];\n",[203,306,308],{"class":205,"line":307},18,[203,309,310],{},"datetime smt_nextDownload = 0;\n",[203,312,314],{"class":205,"line":313},19,[203,315,316],{},"long     smt_serverTime   = 0;     \u002F\u002F UTC-Zeit des Servers (Unix-Sekunden) beim letzten Download\n",[203,318,320],{"class":205,"line":319},20,[203,321,322],{},"uint     smt_syncTick     = 0;     \u002F\u002F GetTickCount() im selben Moment\n",[203,324,326],{"class":205,"line":325},21,[203,327,328],{},"bool     smt_clockSynced  = false;\n",[203,330,332],{"class":205,"line":331},22,[203,333,257],{"emptyLinePlaceholder":256},[203,335,337],{"class":205,"line":336},23,[203,338,339],{},"\u002F\u002F--- die echte UTC-Zeit: die Uhr des Servers plus die seit dem Download vergangenen\n",[203,341,343],{"class":205,"line":342},24,[203,344,345],{},"\u002F\u002F--- Millisekunden, gezählt mit GetTickCount(). Der Zähler kennt keine Zeitzonen, keine\n",[203,347,349],{"class":205,"line":348},25,[203,350,351],{},"\u002F\u002F--- Sommerzeit und keine Uhrkorrekturen auf dem Rechner (die uint-Subtraktion übersteht\n",[203,353,355],{"class":205,"line":354},26,[203,356,357],{},"\u002F\u002F--- auch seinen Überlauf). Vor dem ersten Download dient TimeGMT() als Ersatz. Nie\n",[203,359,361],{"class":205,"line":360},27,[203,362,363],{},"\u002F\u002F--- TimeCurrent(): Der GMT-Offset des Brokers ist unbekannt und springt mit der Sommerzeit.\n",[203,365,367],{"class":205,"line":366},28,[203,368,369],{},"datetime SMT_Now()\n",[203,371,373],{"class":205,"line":372},29,[203,374,375],{},"{\n",[203,377,379],{"class":205,"line":378},30,[203,380,381],{},"   if(!smt_clockSynced) return TimeGMT();\n",[203,383,385],{"class":205,"line":384},31,[203,386,387],{},"   uint elapsedMs = GetTickCount() - smt_syncTick;\n",[203,389,391],{"class":205,"line":390},32,[203,392,393],{},"   return (datetime)(smt_serverTime + elapsedMs \u002F 1000);\n",[203,395,397],{"class":205,"line":396},33,[203,398,399],{},"}\n",[203,401,403],{"class":205,"line":402},34,[203,404,257],{"emptyLinePlaceholder":256},[203,406,408],{"class":205,"line":407},35,[203,409,410],{},"\u002F\u002F--- Abstand der Broker-Uhr zu UTC in Sekunden (7200 = GMT+2). Auch für sich allein\n",[203,412,414],{"class":205,"line":413},36,[203,415,416],{},"\u002F\u002F--- nützlich: Die meisten EAs kennen diesen Wert nie. TimeCurrent() ist die Zeit des\n",[203,418,420],{"class":205,"line":419},37,[203,421,422],{},"\u002F\u002F--- letzten Ticks, also bei geöffnetem Markt auslesen, nicht am Wochenende.\n",[203,424,426],{"class":205,"line":425},38,[203,427,428],{},"int SMT_BrokerGmtOffsetSeconds()\n",[203,430,432],{"class":205,"line":431},39,[203,433,375],{},[203,435,437],{"class":205,"line":436},40,[203,438,439],{},"   return (int)(TimeCurrent() - SMT_Now());\n",[203,441,443],{"class":205,"line":442},41,[203,444,399],{},[203,446,448],{"class":205,"line":447},42,[203,449,257],{"emptyLinePlaceholder":256},[203,451,453],{"class":205,"line":452},43,[203,454,455],{},"\u002F\u002F--- alles nach dem n-ten Komma (der CSV-Titel, der selbst Kommas enthalten kann)\n",[203,457,459],{"class":205,"line":458},44,[203,460,461],{},"string SMT_AfterComma(const string line, const int n)\n",[203,463,465],{"class":205,"line":464},45,[203,466,375],{},[203,468,470],{"class":205,"line":469},46,[203,471,472],{},"   int pos = -1;\n",[203,474,476],{"class":205,"line":475},47,[203,477,478],{},"   for(int i = 0; i \u003C n; i++)\n",[203,480,482],{"class":205,"line":481},48,[203,483,484],{},"   {\n",[203,486,488],{"class":205,"line":487},49,[203,489,490],{},"      pos = StringFind(line, \",\", pos + 1);\n",[203,492,494],{"class":205,"line":493},50,[203,495,496],{},"      if(pos \u003C 0) return \"\";\n",[203,498,500],{"class":205,"line":499},51,[203,501,502],{},"   }\n",[203,504,506],{"class":205,"line":505},52,[203,507,508],{},"   string rest = StringSubstr(line, pos + 1);\n",[203,510,512],{"class":205,"line":511},53,[203,513,514],{},"   StringReplace(rest, \"\\\"\\\"\", \"\\\"\");\n",[203,516,518],{"class":205,"line":517},54,[203,519,520],{},"   if(StringLen(rest) >= 2 && StringGetCharacter(rest, 0) == '\"')\n",[203,522,524],{"class":205,"line":523},55,[203,525,526],{},"      rest = StringSubstr(rest, 1, StringLen(rest) - 2);\n",[203,528,530],{"class":205,"line":529},56,[203,531,532],{},"   return rest;\n",[203,534,536],{"class":205,"line":535},57,[203,537,399],{},[203,539,541],{"class":205,"line":540},58,[203,542,257],{"emptyLinePlaceholder":256},[203,544,546],{"class":205,"line":545},59,[203,547,548],{},"\u002F\u002F--- lädt die nächsten 2 Tage herunter (das Fenster deckt auch die letzten 6 Stunden ab)\n",[203,550,552],{"class":205,"line":551},60,[203,553,554],{},"bool SMT_Download()\n",[203,556,558],{"class":205,"line":557},61,[203,559,375],{},[203,561,563],{"class":205,"line":562},62,[203,564,565],{},"   string url = \"https:\u002F\u002Fshowmytrades.com\u002Fapi\u002Fpublic\u002Fcalendar\u002Fv1?format=csv&days=2&impact=\" + SMT_Impact;\n",[203,567,569],{"class":205,"line":568},63,[203,570,571],{},"   if(StringLen(SMT_Currencies) > 0) url += \"&currency=\" + SMT_Currencies;\n",[203,573,575],{"class":205,"line":574},64,[203,576,257],{"emptyLinePlaceholder":256},[203,578,580],{"class":205,"line":579},65,[203,581,582],{},"   char   post[], result[];\n",[203,584,586],{"class":205,"line":585},66,[203,587,588],{},"   string headers;\n",[203,590,592],{"class":205,"line":591},67,[203,593,594],{},"   ResetLastError();\n",[203,596,598],{"class":205,"line":597},68,[203,599,600],{},"   int status = WebRequest(\"GET\", url, \"\", NULL, 10000, post, 0, result, headers);\n",[203,602,604],{"class":205,"line":603},69,[203,605,606],{},"   if(status != 200)\n",[203,608,610],{"class":205,"line":609},70,[203,611,484],{},[203,613,615],{"class":205,"line":614},71,[203,616,617],{},"      Print(\"[SMT] calendar download failed: HTTP \", status, \", error \", GetLastError(),\n",[203,619,621],{"class":205,"line":620},72,[203,622,623],{},"            \". Is https:\u002F\u002Fshowmytrades.com in Tools > Options > Expert Advisors > Allow WebRequest?\");\n",[203,625,627],{"class":205,"line":626},73,[203,628,629],{},"      smt_nextDownload = TimeCurrent() + 60; \u002F\u002F neuer Versuch in einer Minute\n",[203,631,633],{"class":205,"line":632},74,[203,634,635],{},"      return false;\n",[203,637,639],{"class":205,"line":638},75,[203,640,502],{},[203,642,644],{"class":205,"line":643},76,[203,645,257],{"emptyLinePlaceholder":256},[203,647,649],{"class":205,"line":648},77,[203,650,651],{},"   string body = CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8);\n",[203,653,655],{"class":205,"line":654},78,[203,656,657],{},"   string lines[];\n",[203,659,661],{"class":205,"line":660},79,[203,662,663],{},"   int n = StringSplit(body, '\\n', lines);\n",[203,665,667],{"class":205,"line":666},80,[203,668,257],{"emptyLinePlaceholder":256},[203,670,672],{"class":205,"line":671},81,[203,673,674],{},"   ArrayResize(smt_eventTime, 0);\n",[203,676,678],{"class":205,"line":677},82,[203,679,680],{},"   ArrayResize(smt_eventTitle, 0);\n",[203,682,684],{"class":205,"line":683},83,[203,685,686],{},"   for(int i = 1; i \u003C n; i++) \u002F\u002F Zeile 0 ist die Kopfzeile\n",[203,688,690],{"class":205,"line":689},84,[203,691,484],{},[203,693,695],{"class":205,"line":694},85,[203,696,697],{},"      \u002F\u002F letzte Zeile \"# server_time=1760702400 server_time_iso=...\": die UTC-Uhr des Servers\n",[203,699,701],{"class":205,"line":700},86,[203,702,703],{},"      if(StringFind(lines[i], \"# server_time=\") == 0)\n",[203,705,707],{"class":205,"line":706},87,[203,708,709],{},"      {\n",[203,711,713],{"class":205,"line":712},88,[203,714,715],{},"         long serverTime = StringToInteger(StringSubstr(lines[i], 14, 10));\n",[203,717,719],{"class":205,"line":718},89,[203,720,721],{},"         if(serverTime > 0)\n",[203,723,725],{"class":205,"line":724},90,[203,726,727],{},"         {\n",[203,729,731],{"class":205,"line":730},91,[203,732,733],{},"            smt_serverTime  = serverTime;\n",[203,735,737],{"class":205,"line":736},92,[203,738,739],{},"            smt_syncTick    = GetTickCount();\n",[203,741,743],{"class":205,"line":742},93,[203,744,745],{},"            smt_clockSynced = true;\n",[203,747,749],{"class":205,"line":748},94,[203,750,751],{},"         }\n",[203,753,755],{"class":205,"line":754},95,[203,756,757],{},"         continue;\n",[203,759,761],{"class":205,"line":760},96,[203,762,763],{},"      }\n",[203,765,767],{"class":205,"line":766},97,[203,768,769],{},"      string f[];\n",[203,771,773],{"class":205,"line":772},98,[203,774,775],{},"      if(StringSplit(lines[i], ',', f) \u003C 8) continue;\n",[203,777,779],{"class":205,"line":778},99,[203,780,781],{},"      int k = ArraySize(smt_eventTime);\n",[203,783,785],{"class":205,"line":784},100,[203,786,787],{},"      ArrayResize(smt_eventTime, k + 1);\n",[203,789,791],{"class":205,"line":790},101,[203,792,793],{},"      ArrayResize(smt_eventTitle, k + 1);\n",[203,795,797],{"class":205,"line":796},102,[203,798,799],{},"      smt_eventTime[k]  = (datetime)StringToInteger(f[0]);      \u002F\u002F Unix-Sekunden, UTC\n",[203,801,803],{"class":205,"line":802},103,[203,804,805],{},"      smt_eventTitle[k] = f[2] + \" \" + f[3] + \": \" + SMT_AfterComma(lines[i], 7);\n",[203,807,809],{"class":205,"line":808},104,[203,810,502],{},[203,812,814],{"class":205,"line":813},105,[203,815,816],{},"   smt_nextDownload = TimeCurrent() + MathMax(SMT_RefreshMinutes, 15) * 60;\n",[203,818,820],{"class":205,"line":819},106,[203,821,822],{},"   Print(\"[SMT] calendar: \", ArraySize(smt_eventTime), \" events loaded. UTC now \",\n",[203,824,826],{"class":205,"line":825},107,[203,827,828],{},"         TimeToString(SMT_Now(), TIME_DATE|TIME_MINUTES), \", broker clock is GMT\",\n",[203,830,832],{"class":205,"line":831},108,[203,833,834],{},"         (SMT_BrokerGmtOffsetSeconds() >= 0 ? \"+\" : \"\"), DoubleToString(SMT_BrokerGmtOffsetSeconds() \u002F 3600.0, 1));\n",[203,836,838],{"class":205,"line":837},109,[203,839,840],{},"   return true;\n",[203,842,844],{"class":205,"line":843},110,[203,845,399],{},[203,847,849],{"class":205,"line":848},111,[203,850,257],{"emptyLinePlaceholder":256},[203,852,854],{"class":205,"line":853},112,[203,855,856],{},"\u002F\u002F--- true, solange eine Veröffentlichung im Pausenfenster liegt; reason sagt, welche\n",[203,858,860],{"class":205,"line":859},113,[203,861,862],{},"bool SMT_IsNewsTime(string &reason)\n",[203,864,866],{"class":205,"line":865},114,[203,867,375],{},[203,869,871],{"class":205,"line":870},115,[203,872,873],{},"   reason = \"\";\n",[203,875,877],{"class":205,"line":876},116,[203,878,879],{},"   if(MQLInfoInteger(MQL_TESTER)) return false;   \u002F\u002F kein Netzwerk im Tester\n",[203,881,883],{"class":205,"line":882},117,[203,884,885],{},"   if(TimeCurrent() >= smt_nextDownload) SMT_Download();\n",[203,887,889],{"class":205,"line":888},118,[203,890,257],{"emptyLinePlaceholder":256},[203,892,894],{"class":205,"line":893},119,[203,895,896],{},"   datetime now = SMT_Now();\n",[203,898,900],{"class":205,"line":899},120,[203,901,902],{},"   for(int i = 0; i \u003C ArraySize(smt_eventTime); i++)\n",[203,904,906],{"class":205,"line":905},121,[203,907,484],{},[203,909,911],{"class":205,"line":910},122,[203,912,913],{},"      if(now >= smt_eventTime[i] - SMT_MinutesBefore * 60 && now \u003C= smt_eventTime[i] + SMT_MinutesAfter * 60)\n",[203,915,917],{"class":205,"line":916},123,[203,918,709],{},[203,920,922],{"class":205,"line":921},124,[203,923,924],{},"         reason = smt_eventTitle[i];\n",[203,926,928],{"class":205,"line":927},125,[203,929,930],{},"         return true;\n",[203,932,934],{"class":205,"line":933},126,[203,935,763],{},[203,937,939],{"class":205,"line":938},127,[203,940,502],{},[203,942,944],{"class":205,"line":943},128,[203,945,946],{},"   return false;\n",[203,948,950],{"class":205,"line":949},129,[203,951,399],{},[18,953,954,955],{},"Was die Datei der Reihe nach tut: Sie baut die Anfrage aus den Eingabeparametern zusammen, lädt die CSV-Datei herunter, merkt sich pro Termin einen Zeitstempel und eine Bezeichnung und beantwortet die einzige Frage, die den EA interessiert: ",[155,956,957],{},"Liegt gerade eine Veröffentlichung im Fenster?",[41,959,961],{"id":960},"schritt-3-vor-jedem-einstieg-abfragen","🔌 Schritt 3: Vor jedem Einstieg abfragen",[18,963,964],{},"Binde die Datei in deinen EA ein und lass ihn nachfragen, bevor er eine Position eröffnet:",[46,966,969],{"className":197,"code":967,"filename":968,"language":199,"meta":55,"style":55},"#include \u003CSMT_NewsFilter.mqh>\n\nvoid OnTick()\n{\n   string news;\n   if(SMT_IsNewsTime(news))\n   {\n      Comment(\"News filter active: \", news);\n      return;                       \u002F\u002F keine neuen Einstiege im News-Fenster\n   }\n   Comment(\"\");\n   \u002F\u002F ... deine Einstiegslogik ...\n}\n","YourEA.mq4",[53,970,971,976,980,985,989,994,999,1003,1008,1013,1017,1022,1027],{"__ignoreMap":55},[203,972,973],{"class":205,"line":206},[203,974,975],{},"#include \u003CSMT_NewsFilter.mqh>\n",[203,977,978],{"class":205,"line":212},[203,979,257],{"emptyLinePlaceholder":256},[203,981,982],{"class":205,"line":218},[203,983,984],{},"void OnTick()\n",[203,986,987],{"class":205,"line":224},[203,988,375],{},[203,990,991],{"class":205,"line":230},[203,992,993],{},"   string news;\n",[203,995,996],{"class":205,"line":236},[203,997,998],{},"   if(SMT_IsNewsTime(news))\n",[203,1000,1001],{"class":205,"line":242},[203,1002,484],{},[203,1004,1005],{"class":205,"line":247},[203,1006,1007],{},"      Comment(\"News filter active: \", news);\n",[203,1009,1010],{"class":205,"line":253},[203,1011,1012],{},"      return;                       \u002F\u002F keine neuen Einstiege im News-Fenster\n",[203,1014,1015],{"class":205,"line":260},[203,1016,502],{},[203,1018,1019],{"class":205,"line":266},[203,1020,1021],{},"   Comment(\"\");\n",[203,1023,1024],{"class":205,"line":272},[203,1025,1026],{},"   \u002F\u002F ... deine Einstiegslogik ...\n",[203,1028,1029],{"class":205,"line":278},[203,1030,399],{},[18,1032,1033,1034,1037,1038,1041],{},"Die fünf Eingabeparameter (",[53,1035,1036],{},"SMT_Currencies",", ",[53,1039,1040],{},"SMT_Impact"," und die drei Minutenwerte) erscheinen wie jede andere Einstellung im Eingabedialog des EA. Jeder Chart kann also eigene Werte haben.",[18,1043,1044,1045,1048,1049,1052],{},"Kompiliere neu, zieh den EA auf den Chart und sieh im Reiter „Experten“ nach: Die erste Zeile sollte ",[53,1046,1047],{},"[SMT] calendar: N events loaded"," lauten. An einem ruhigen Tag kann ",[53,1050,1051],{},"N"," null sein. Das ist richtig so und kein Fehler.",[41,1054,1056],{"id":1055},"️-zeiten-uhren-und-der-strategietester","⏱️ Zeiten, Uhren und der Strategietester",[18,1058,1059],{},"Ob der Filter zur richtigen Minute greift, hängt an drei Details.",[57,1061,1062,1070],{},[60,1063,1064],{},[63,1065,1066,1068],{},[66,1067],{},[66,1069],{},[76,1071,1072,1093,1110],{},[63,1073,1074,1079],{},[81,1075,1076],{},[31,1077,1078],{},"Die API rechnet in UTC und sagt, wie spät es ist",[81,1080,1081,1084,1085,1088,1089,1092],{},[53,1082,1083],{},"ts"," ist Unix-Zeit in Sekunden, UTC. Jeder Download endet mit der Uhrzeit des Servers (",[53,1086,1087],{},"# server_time=…","), und ",[53,1090,1091],{},"SMT_Now()"," schreibt sie mit dem Tick-Zähler des Rechners fort, der weder Zeitzonen noch Sommerzeit kennt. Nichts hängt von der Zeitzone des Brokers ab, von irgendeiner Sommerzeitumstellung oder davon, ob auf dem VPS die richtige Zeitzone eingestellt ist",[63,1094,1095,1103],{},[81,1096,1097],{},[31,1098,1099,1100],{},"Niemals ",[53,1101,1102],{},"TimeCurrent()",[81,1104,1105,1106,1109],{},"Die Broker-Zeit weicht von UTC um einen Betrag ab, den der EA nicht kennen kann und der sich zweimal im Jahr ändert. ",[53,1107,1108],{},"SMT_BrokerGmtOffsetSeconds()"," misst ihn für dich, was schon für sich nützlich ist; der Filter selbst verlässt sich nie darauf",[63,1111,1112,1117],{},[81,1113,1114],{},[31,1115,1116],{},"Der Strategietester hat kein Internet",[81,1118,1119,1121],{},[53,1120,148],{}," ist dort deaktiviert, im Backtest meldet die Funktion also „keine News“. Wer einen News-Filter auf historischen Daten testen will, braucht eine lokale Datei mit vergangenen Terminen, und das ist ein eigenes Projekt",[41,1123,1125],{"id":1124},"️-feinabstimmung","🎛️ Feinabstimmung",[1127,1128,1129,1144,1157,1167],"ul",{},[1130,1131,1132,1135,1136,1139,1140,1143],"li",{},[31,1133,1134],{},"Offene Positionen."," Der Code sperrt nur ",[155,1137,1138],{},"neue"," Einstiege. Ob du vor einer Veröffentlichung schließt, die Stops enger ziehst oder weiter setzt, ist eine Frage der Strategie; wann es so weit ist, sagt dir dasselbe ",[53,1141,1142],{},"SMT_IsNewsTime()",".",[1130,1145,1146,1149,1150,1152,1153,1156],{},[31,1147,1148],{},"Nur eine Seite des Paars."," Setze ",[53,1151,1036],{}," auf ",[53,1154,1155],{},"USD",", wenn für dich nur Dollar-News zählen.",[1130,1158,1159,1162,1163,1166],{},[31,1160,1161],{},"Auch mittlere Wichtigkeit."," Mit ",[53,1164,1165],{},"SMT_Impact = \"high,medium\""," kommen ungefähr dreimal so viele Termine zusammen. Gut für Scalper, für Swing-Systeme oft zu viel.",[1130,1168,1169,1172,1173,1176],{},[31,1170,1171],{},"Feiertage."," ",[53,1174,1175],{},"impact=all"," enthält Handelsfeiertage als ganztägige Termine. Die meisten Filter wollen sie nicht, deshalb lässt die Standardeinstellung sie weg.",[41,1178,1180],{"id":1179},"die-daten-prüfen","🔍 Die Daten prüfen",[18,1182,1183,1184,1188],{},"Denselben Kalender kannst du auch als Seite lesen: ",[22,1185,1187],{"href":1186},"\u002Ftools\u002Feconomic-calendar","Wirtschaftskalender",". Meldet der EA, dass er wegen „USD high: Nonfarm Payrolls“ pausiert hat, findest du den Termin dort mit der Prognose und, nach der Veröffentlichung, mit dem tatsächlichen Wert.",[41,1190,1192],{"id":1191},"häufige-fragen","❓ Häufige Fragen",[18,1194,1195,1198,1199,1203],{},[31,1196,1197],{},"Brauche ich dafür ein ShowMyTrades-Konto?","\nNein. Die Kalender-API ist kostenlos und offen, ganz ohne Schlüssel. Wenn du die ",[22,1200,1202],{"href":1201},"\u002Fguides\u002Fhow-to-verify-your-account","verifizierte öffentliche Seite"," haben willst, verfolge dein Konto auf ShowMyTrades; der News-Filter hängt aber nicht davon ab.",[18,1205,1206,1209],{},[31,1207,1208],{},"Wie viel Datenverkehr entsteht?","\nEine Anfrage alle 15 Minuten pro Chart, jeweils ein paar Kilobyte. Zehn EAs auf einem Terminal kommen auf 40 Anfragen pro Stunde. Das Limit liegt bei 600 pro Minute und IP-Adresse.",[18,1211,1212,1215,1216,1219],{},[31,1213,1214],{},"Warum nicht direkt Forex Factory auslesen?","\nDas geht, und viele EAs machen es so. Die Wochendatei von Forex Factory erlaubt aber nur zwei Downloads alle fünf Minuten pro IP-Adresse. Auf einem VPS mit vielen Terminals reicht das nicht, und ",[53,1217,1218],{},"actual","-Werte enthält die Datei auch nicht. Der Endpunkt von ShowMyTrades filtert schon auf dem Server nach Währung und Wichtigkeit, liefert ein paar Kilobyte und ist für regelmäßiges Abfragen gebaut.",[18,1221,1222,1225],{},[31,1223,1224],{},"Die Uhr oder die Zeitzone meines VPS stimmt nicht. Greift der Filter trotzdem zur richtigen Minute?","\nJa. Der Server teilt dem EA bei jedem Download die aktuelle UTC-Zeit mit, und der EA lässt diese Uhr mit seiner eigenen weiterlaufen. Eine falsch eingestellte Zeitzone auf dem VPS oder eine Uhr, die ein paar Minuten danebenliegt, ändert nichts. Nicht einmal eine Sommerzeitumstellung auf dem VPS: Der EA misst die vergangene Zeit mit dem Tick-Zähler, nicht mit der Uhr.",[18,1227,1228,1231,1232,1235],{},[31,1229,1230],{},"Was passiert, wenn der Download fehlschlägt?","\nDer Filter behält den zuletzt geladenen Kalender und versucht es nach einer Minute erneut. Hat er noch nie einen geladen (gerade gestartet, kein Internet), meldet er „keine News“, und der EA handelt. Wenn du das nicht willst, prüfe ",[53,1233,1234],{},"ArraySize(smt_eventTime) == 0"," und entscheide selbst.",[18,1237,1238,1241,1242,1246],{},[31,1239,1240],{},"Funktioniert dieselbe Datei in MT5?","\nJa, ohne Änderung. MT5 hat außerdem einen ",[22,1243,1245],{"href":1244},"\u002Fguides\u002Fnews-filter-mt5-expert-advisor-built-in-calendar-or-api","eigenen Kalender",". Nimm, was besser zu dir passt.",[41,1248,1250],{"id":1249},"weiterführende-artikel","🔗 Weiterführende Artikel",[1127,1252,1253,1259,1264,1271],{},[1130,1254,1255,1258],{},[22,1256,1257],{"href":37},"Referenz der Wirtschaftskalender-API",": alle Parameter, das JSON-Format, der WebSocket für cTrader",[1130,1260,1261],{},[22,1262,1263],{"href":1244},"News-Filter in MT5: eingebauter Kalender oder API",[1130,1265,1266,1270],{},[22,1267,1269],{"href":1268},"\u002Fguides\u002Fadd-a-news-filter-to-a-ctrader-cbot","News-Filter in einen cTrader-cBot einbauen",": dieselbe Idee, wo kein HTTP zur Verfügung steht",[1130,1272,1273,1277],{},[22,1274,1276],{"href":1275},"\u002Fguides\u002Flive-ea-results-on-your-sales-page","So zeigst du Live-Ergebnisse deines EA auf der Verkaufsseite",": Sobald der EA gut handelt, zeig es",[1279,1280],"hr",{},[18,1282,1283,1284,1288],{},"Der Filter ist eine Seite Code und eine URL. Wenn dein EA schon ",[22,1285,1287],{"href":1286},"\u002Fsignup","auf ShowMyTrades verfolgt wird",", zeigen sich die Trades, die er rund um die News auslässt, als Drawdown, der ausgeblieben ist.",[1290,1291,1292],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":55,"searchDepth":212,"depth":212,"links":1294},[1295,1296,1297,1298,1299,1300,1301,1302,1303],{"id":43,"depth":212,"text":44},{"id":142,"depth":212,"text":143},{"id":178,"depth":212,"text":179},{"id":960,"depth":212,"text":961},{"id":1055,"depth":212,"text":1056},{"id":1124,"depth":212,"text":1125},{"id":1179,"depth":212,"text":1180},{"id":1191,"depth":212,"text":1192},{"id":1249,"depth":212,"text":1250},"2026-10-17T00:00:00.000Z","MetaTrader 4 bietet Expert Advisors keinen Wirtschaftskalender. Mit dieser Anleitung rüstest du ihn in zehn Minuten nach: eine kostenlose Kalender-API, eine Include-Datei und eine Funktion, die du vor jedem Einstieg aufrufst. Vollständiger MQL4-Code, kein API-Schlüssel.",false,"md",{"src":1309},"\u002Fimages\u002Fblog\u002Fadd-a-news-filter-to-your-mt4-expert-advisor-hero.svg",{},"\u002Fde\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",{"title":5,"description":1305},"de\u002F3.guides\u002F41.add-a-news-filter-to-your-mt4-expert-advisor",null,"HiFp78BRqSrsHOR5w8jpGFSEgtPf1e8eZX5jfmN42Bw",[1317,1322],{"title":1318,"path":1319,"stem":1320,"description":1321,"children":-1},"So zeigst du mehrere Handelskonten auf einer Seite","\u002Fde\u002Fguides\u002Fshow-multiple-trading-accounts-on-one-page","de\u002F3.guides\u002F40.show-multiple-trading-accounts-on-one-page","Mehrere Konten, mehrere EAs oder mehrere Broker auf einer einzigen Webseite: eine Live-Vergleichstabelle mit einer Zeile pro Konto, Charts nebeneinander oder eine gemeinsame Kurve. Mit Code.",{"title":1323,"path":1324,"stem":1325,"description":1326,"children":-1},"News-Filter in MT5: eingebauter Kalender oder API?","\u002Fde\u002Fguides\u002Fnews-filter-mt5-expert-advisor-built-in-calendar-or-api","de\u002F3.guides\u002F42.news-filter-mt5-expert-advisor-built-in-calendar-or-api","MetaTrader 5 bringt einen Wirtschaftskalender mit, den Expert Advisors ohne Download auslesen können. Wann er reicht, wann nicht und wie du stattdessen eine kostenlose Kalender-API nutzt, mit MQL5-Code für beide Wege.",[1328,1330,1331,1333,1335],{"path":1329},"\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",{"path":1311},{"path":1332},"\u002Fes\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",{"path":1334},"\u002Fja\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",{"path":1336},"\u002Fzh\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",1794154059982]