Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Twitter!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Ansichten:
43
Rating:
(30)
Veröffentlicht:
2025.04.03 11:16
\MQL5\Include\fxsaber\Calendar\
String.mqh (1.77 KB) ansehen
Event.mqh (20.88 KB) ansehen
Calendar.mqh (30.15 KB) ansehen
DST.mqh (11.46 KB) ansehen
\MQL5\Experts\
MQL5 Freelance Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

MetaTrader5 verfügt über eine aktualisierte volumetrische Historie der fundamentalen Kalenderereignisse, auf deren Daten programmatisch zugegriffen werden kann.


Diese Bibliothek ermöglicht es Ihnen, bequem mit diesen Daten zu arbeiten. Insbesondere, um sie im Tester und im realen Handel zu verwenden.


Die Arbeit mit der Bibliothek wird in Form von Kommentaren im Quellcode der Beispiele gezeigt.


Beschaffung historischer Daten.

// Das Skript gibt historische Daten aus.

#include <fxsaber\Calendar\Calendar.mqh> // Kalender - Fundamentalanalyse in Geschichte und Echtzeit.

void OnStart()
{
  CALENDAR Calendar;
  
  // Nimmt Ereignisse für alle (NULL) Währungen, beginnend mit der niedrigsten (NONE) Bedeutung.
  const int Size = Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, D'2020.12.07', D'2020.12.08');
  
  // Sie wurden ausgedruckt.
  for (int i = 0; i < Size; i++)
    Print(Calendar[i].ToString());
}


Ergebnis.

2020.12.07 AllDay EUR 0 День Конституции(constitution-day), Испания(ES) |  |  |  | 
2020.12.07 00:00 AUD 3 Выступление председателя Резервного Банка Австралии Лоу(rba-governor-lowe-speech), Австралия(AU) |  |  |  | 
2020.12.07 01:50 JPY 1 Международные резервы(jp-foreign-reserves), Япония(JP) | $1384.6 B |  | $1384.4 B | 
2020.12.07 02:30 AUD 1 Количество объявлений о вакансиях от ANZ м/м(anz-job-advertisements-mm), Австралия(AU) | 13.9% | 0.8% | 9.4% | 
2020.12.0705:00 CNY 1 Объем импорта USD г/г(imports-usd-yy), Китай(CN) | 4.5% | 4.4% | 4.7% | 
2020.12.0705:00 CNY 1 Объем экспорта USD г/г(exports-usd-yy), Китай(CN) | 21.1% | 3.6% | 11.4% | 
2020.12.0705:00 CNY 2 Торговый баланс(trade-balance), Китай(CN) | ¥507.1 B | ¥271.31 B | ¥401.75 B | 
2020.12.0705:00 CNY 2 Торговый баланс USD(trade-balance-usd), Китай(CN) | $75.42 B | $52.55 B | $58.44 B | 
2020.12.0705:00 CNY 1 Объем импорта г/г(imports-yy), Китай(CN) | -0.8% | -0.6% | 0.9% | 
2020.12.0705:00 CNY 1 Объем экспорта г/г(exports-yy), Китай(CN) | 14.9% | 2.2% | 7.6% | 
2020.12.07 07:00 JPY 1 Индекс совпадающих индикаторов(coincident-index), Япония(JP) | 89.7 | 81.8 | 81.1 | 84.8
2020.12.07 07:00 JPY 1 Индекс ведущих экономических индикаторов(leading-index), Япония(JP) | 93.8 | 92.7 | 92.5 | 93.3
2020.12.07 07:00 JPY 1 Индекс совпадающих индикаторов Японии м/м(coincident-index-mm), Япония(JP) | 4.9% |  | 1.7% | 2.4%
2020.12.07 07:00 JPY 1 Индекс ведущих экономических индикаторов м/м(leading-index-mm), Япония(JP) | 0.5% |  | 4.0% | 4.2%
2020.12.07 08:00 ZAR 1 Валовые международные резервы(gross-international-reserves), Южно-Африканская Республика(ZA) | $53.76 B | $54.129 B | $53.658 B | 
2020.12.07 08:00 ZAR 1 Чистые международные резервы(net-international-reserves), Южно-Африканская Республика(ZA) | $51.257 B | $52.719 B | $51.364 B | 
2020.12.07 09:00 EUR 2 Промышленное производство г/г(industrial-production-yy), Германия(DE) | -3.0% | -11.4% | -7.3% | -6.7%
2020.12.07 09:00 EUR 2 Промышленное производство м/м(industrial-production-mm), Германия(DE) | 3.2% | 7.7% | 1.6% | 2.3%
2020.12.07 09:00 NOK 1 Производство в обрабатывающей промышленности м/м(manufacturing-production-mm), Норвегия(NO) | 0.6% | 0.1% | -0.5% | 
2020.12.07 09:00 NOK 1 Производство в обрабатывающей промышленности г/г(manufacturing-production-yy), Норвегия(NO) | -2.7% | -3.3% | -3.4% | 
2020.12.07 09:00 NOK 1 Промышленное производство м/м(industrial-production-mm), Норвегия(NO) | -3.5% | 0.0% | -1.7% | -1.6%
2020.12.07 09:00 NOK 1 Промышленное производство г/г(industrial-production-yy), Норвегия(NO) | 0.0% | 6.9% | 6.3% | 

    Sie können es mit dem MT5-Terminal selbst vergleichen.


    Abrufen anstehender Ereignisse.

    // Das Skript zeigt anstehende Ereignisse an.
    
    #include <fxsaber\Calendar\Calendar.mqh> // Kalender - Fundamentalanalyse in Geschichte und Echtzeit.
    
    void OnStart()
    {
      CALENDAR Calendar;
      
      string Currencies[2];
      
      // Ermittelt die Währungen des aktuellen Zeichens.
      Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
      Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
        
      // Nimmt anstehende wichtige Ereignisse nach Symbolwährungen auf.
      Calendar.Set(Currencies);
      
      Print(Calendar.ToString()); // Sie wurden ausgedruckt.
    }

    Eine solche Einbettung in Informationssysteme ermöglicht es, über wichtige anstehende Kalenderereignisse in Expert Advisors/Indikatoren zu informieren.


    Backtest auf Fundamentaldaten.


    Nachfolgend sehen Sie einen Expert Advisor, der die NonFarm Payrolls handelt, indem er aktuelle und prognostizierte Werte vergleicht.

    // Expert Advisor für den Handel in MT4/5-Tester auf die Geschichte der fundamentalen Daten.
    
    #define  CALENDAR_FILENAME "Calendar.bin" // Dateiname zum Lesen/Schreiben des Kalenders.
    #property tester_file CALENDAR_FILENAME  // Gibt an, dass MT5-Tester diese Datei abholt.
    
    #include <fxsaber\Calendar\Calendar.mqh> // Kalender - Fundamentalanalyse in Geschichte und Echtzeit.
    
    input group "Calendar"
    input string inCurrency = "USD";        // Währung
    input string inFilterName = "payrolls"; // FilterName
    
    input group "EA"
    input int inTP = 1000; // TakeProfit
    input int inSL = 1000; // StopLoss
    input bool inReverse = true; // Handelsrichtung
    
    CALENDAR Calendar; // Objekt mit Kalenderdaten.
    
    int OnInit()
    {      
      bool Res = false;
      
      if (MQLInfoInteger(MQL_TESTER)) // Wenn Sie im Tester arbeiten
      {
        Res = Calendar.Load(CALENDAR_FILENAME) &&      // Lädt die Ereignisse aus der Datei.
              Calendar.FilterByCurrency(inCurrency) && // Anwendung eines Währungsfilters.
              Calendar.FilterByName(inFilterName);     // Anwendung eines Filters auf den Ereignisnamen.
        
        if (!Res)                                      // Wenn es Probleme mit den geladenen Daten gibt,
          Print("Run the EA in the MT5-Terminal!");    // berichtet, dass Sie sie erhalten müssen, indem Sie den EA im MT5-Terminal ausführen.
      }
    #ifdef __MQL5__
      // Arbeiten im Terminal.
      else if (Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, 0) && // Lädt absolut alle Ereignisse (Historie + Zukunft) vom MT5-Terminal.
               Calendar.Save(CALENDAR_FILENAME))                     // Speichern Sie sie in einer Datei.
        MessageBox("You can run the EA in the MT4/5-Tester.");       // Berichtet, dass wir jetzt in MT4/5-Tester arbeiten können.
    #endif // #ifdef __MQL5__
    
      return(!Res);
    }
    
    void OnTick()
    {
      static int Pos = Calendar.GetPosAfter(TimeCurrent()); // Ermittelt die Position des Ereignisses im Kalender, die direkt nach der aktuellen Zeit liegt.
      
      if ((Pos < Calendar.GetAmount()) &&       // Wenn Sie noch nicht über den Kalender hinausgegangen sind
          (Calendar[Pos].time < TimeCurrent())) // und die aktuelle Zeit hat das Ereignis überschritten.
      {        
        const EVENT Event = Calendar[Pos];      // Das entsprechende Ereignis wurde empfangen.
        
        if ((Event.Actual != LONG_MIN) && (Event.Forecast != LONG_MIN)) // Wenn die aktuellen und prognostizierten Werte des Ereignisses gesetzt sind
        {
          Print(Event.ToString()); // Drucken Sie dieses Ereignis in seiner Gesamtheit.
    
          if (Event.Actual > Event.Forecast)                                                                          // Wenn der aktuelle Wert größer ist als der prognostizierte Wert,
            PositionOpen(inReverse, "Act.(" + Event.ActualToString() + ")>(" + Event.ForecastToString() + ")For.");   // Öffnen Sie eine Position in einer Richtung.
          else
            PositionOpen(!inReverse, "Act.(" + Event.ActualToString() + ")<=(" + Event.ForecastToString() + ")For."); // Andernfalls eine andere Richtung.
        }
                
        Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Ermittelt die Position des Ereignisses im Kalender, die direkt nach der aktuellen Zeit liegt.
      }
    }
    
    #include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006
    
    #define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
    #define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
    
    // Öffnet eine Position mit dem angegebenen Kommentar.
    TICKET_TYPE PositionOpen( const int Type, const string comment )
    {
      return(Type ? OrderSend(_Symbol, OP_SELL, 1, Bid, 0, Bid + inSL * _Point, Bid - inTP * _Point, comment)
                  : OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Ask - inSL * _Point, Ask + inTP * _Point, comment));
    }

    Führen Sie ihn einmal im MT5-Terminal aus, um alle historischen Daten zu speichern (~60 Mb). Danach werden sie im Tester verfügbar sein.


    Ergebnis (für sechs Jahre zu H1-Eröffnungskursen).


    Merkmale.

    • Verwendet keine DLLs, kann im Marketplace laufen.
    • Plattformübergreifender Betrieb: im MT4 werden die Daten aus der Datei geholt.

    Übersetzt aus dem Russischen von MetaQuotes Ltd.
    Originalpublikation: https://www.mql5.com/ru/code/32430

    SingleTesterCache SingleTesterCache

    Daten des Prüfers in einem Durchgang.

    BBMA ZoneZeroLoss (ZZL) Oma Ally BBMA ZoneZeroLoss (ZZL) Oma Ally

    BBMA ZoneZeroLoss Histogram zeigt Handelsbereiche z.b. für "Reentry"-Setup für Risiko Minimierung

    Erkennung des Beginns eines neuen Balkens oder einer neuen Kerze Erkennung des Beginns eines neuen Balkens oder einer neuen Kerze

    Erkennung des Beginns eines neuen Balkens oder einer neuen Kerze im OnTick()-Ereignishandler eines Expert Advisors.

    Rückstoß Rückstoß

    Algorithmuszyklus: Wenn es keine offenen Positionen gibt, öffnen Sie zwei entgegengesetzte Positionen. Warten Sie, bis beide Positionen geschlossen sind.