//+------------------------------------------------------------------+ //| ExportCalendar.mq5 - dump the economic calendar to Common\Files | //| | //| MUST RUN ON A LIVE CHART, not in the tester: | //| tester -> CalendarValueHistory() returns -1, err=4014 | //| ("function not allowed") | //| live chart -> works, BUT on this install it returned 0 with | //| err=0: the terminal has NO calendar database | //| (there is no bases/*/calendar directory). | //| Open the Calendar tab in MT5 once so the terminal downloads it, | //| then re-attach this. | //| | //| Auto-attach without touching the GUI via an ini [StartUp] block: | //| [StartUp] | //| Expert=_claude_build\ExportCalendar | //| Symbol=EURUSD | //| Period=H1 | //| Work is done in OnInit so a single attach is enough. | //+------------------------------------------------------------------+ #property copyright "claude" #property version "1.00" int OnInit(void) { MqlCalendarValue vals[]; datetime from = D'1998.01.01'; datetime to = D'2027.01.01'; int got = CalendarValueHistory(vals, from, to, NULL, NULL); if(got <= 0) { PrintFormat("ExportCalendar: CalendarValueHistory returned %d (err=%d)", got, GetLastError()); return(INIT_SUCCEEDED); } int h = FileOpen("calendar.csv", FILE_WRITE | FILE_CSV | FILE_ANSI | FILE_COMMON, ','); if(h == INVALID_HANDLE) { PrintFormat("ExportCalendar: FileOpen failed (err=%d)", GetLastError()); return(INIT_SUCCEEDED); } FileWrite(h, "time", "currency", "importance", "event_id", "name", "actual", "forecast", "previous"); int written = 0; for(int i = 0; i < got; i++) { MqlCalendarEvent ev; if(!CalendarEventById(vals[i].event_id, ev)) continue; MqlCalendarCountry cty; string cur = ""; if(CalendarCountryById(ev.country_id, cty)) cur = cty.currency; //--- the name is the one free-text column, so it is sanitised rather //--- than trusted not to contain the delimiter. string nm = ev.name; StringReplace(nm, ",", ";"); FileWrite(h, TimeToString(vals[i].time, TIME_DATE | TIME_MINUTES), cur, (string)(int)ev.importance, (string)vals[i].event_id, nm, (vals[i].HasActualValue() ? DoubleToString(vals[i].GetActualValue(), 4) : ""), (vals[i].HasForecastValue() ? DoubleToString(vals[i].GetForecastValue(), 4) : ""), (vals[i].HasPreviousValue() ? DoubleToString(vals[i].GetPreviousValue(), 4) : "")); written++; } FileClose(h); PrintFormat("ExportCalendar: wrote %d of %d values", written, got); return(INIT_SUCCEEDED); } void OnTick(void) { } void OnDeinit(const int reason) { }