Bibliotheken: Kalender - Seite 4

 
fxsaber:

Dies ist nicht der Fall. Wenden Sie sich an einen Spezialisten.

Sicher, ich habe gerade erkannt, was Sie meinen. Danke
 
Mir ist aufgefallen, dass das Backtesting auf etwa 5 Jahre (ab 2017) begrenzt zu sein scheint, obwohl alle Nachrichtenereignisse korrekt heruntergeladen werden (BIN-Datei ist 67mb). Gibt es eine Grenze, wie viele Ereignisse MT5 im Speicher für Backtesting verarbeiten kann?
 
mqtrader #:
Mir ist aufgefallen, dass das Backtesting auf etwa 5 Jahre(ab 2017) begrenzt zu sein scheint, obwohl alle Nachrichtenereignisse korrekt heruntergeladen werden (BIN-Datei ist 67mb). Gibt es eine Grenze, wie viele Ereignisse MT5 im Speicher für Backtesting verarbeiten kann?
#property script_show_inputs

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/de/code/32430

input bool inFromFile = false;

#define  CALENDAR_FILENAME "Calendar.bin" // Dateiname zum Lesen/Schreiben des Kalenders.

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Nahm den GANZEN Kalender.
    Calendar.Save(CALENDAR_FILENAME); > > 65 MB.
  }
  
  Print(Calendar[0].ToString());
}


Ergebnis.

2007.01.06 23:30 USD 1 CFTC Crude Oil Non-Commercial Net Positions(cftc-crude-oil-non-commercial-net-positions), United States(US) | 2.2 K |  | 19.8 K | 

Das erste Ereignis in der Kalenderdatenbank ist Januar 2007.

 
Ich habe gerade festgestellt, dass die "Forecast"-Werte ab dem 05.05.2017 beginnen, weshalb der Backtest bei der Ausführung des Beispiels nur ab diesem Datum starten kann. Andere Werte können vor diesem Datum verwendet werden.

Nochmals vielen Dank an fxsaber für diese sehr nützliche Bibliothek!
 

Terminkalender ist weit in die Zukunft vorgeschrieben. Deshalb kann man im MT4 eine Erinnerung nutzen, indem man vorher eine Datei aus MT5-Daten speichert (z.B. einen Monat vorher).

Das ist es, was ich für MT4 mache.

Schritte für die Arbeit mit dem Kalender in MT4.


1. Führen Sie ein Skript in MT5 aus, das den Kalender in einer Common-Datei speichert.

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/de/code/32430

#define  CALENDAR_FILENAME "Calendar.bin" // Dateiname zum Lesen/Schreiben des Kalenders.

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Nahm den GANZEN Kalender.
  Calendar.Save(CALENDAR_FILENAME, true); // Aufgezeichneter Kalender. > 65 MB.
}


2. Laden Sie den Kalender aus der Common-Datei in den MT4.


Nachfolgend sehen Sie ein Beispiel für eine Erinnerung an wichtige Ereignisse in den Währungen des aktuellen Symbols, die in MT4 funktioniert.

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/de/code/32430

#define  CALENDAR_FILENAME "Calendar.bin" // Dateiname zum Lesen/Schreiben des Kalenders.

int OnInit()
{
  return(!EventSetTimer(1));
}

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // Wenn der Kalender nicht leer ist.
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Found Future Events.
    
    Comment(Calendar.ToString(Pos, 5, true)); // Sie wurden ausgedruckt.
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // Lädt den Kalender aus einer Datei.
  {
    string Currencies[2];
    
    // Ermittelt die Währungen des aktuellen Zeichens.
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // Links die Ereignisse auf den Währungen des Symbols.
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // Nur die wichtigen Ereignisse wurden zurückgelassen.
  }    
}


Nach dem Start des Kalenders haben wir einen aktualisierten Chart (Countdown), der an wichtige Ereignisse in den Währungen des Symbols direkt im MT4 erinnert.


Ähnlich kann der Kalender in MT4-Tester funktionieren.

 
Mark Taylor #:

Ich stoße jedoch immer wieder auf ein Problem, wenn ich den Standard-Download der Kalenderdatei durchführe

dann setze ich eine Startzeit und erhalte Ereignisse nach dieser Zeit in einer Schleife für jede Währung.

Versuchen Sie, die Quellen einzufügen, so dass sie gelesen werden können.

 

Vielen Dank für die starke Arbeit und die nützlichen Informationen.

Natürlich sollten solche Arbeiten entwickelt und korrigiert werden und beschreiben die Dokumentation, die ganze Gemeinschaft und nicht nur eine Person. Aber aus irgendeinem Grund die Verwaltung selbst nicht geben solche Bestimmungen sowie nicht einen Link zu den gleichen GitHub einfügen, für die richtige Organisation. Obwohl es Projekte gibt, ihre Verwendung, fast die gleiche GitHub.

Danke! für den Code, es ist sehr interessant, solchen Code zu lesen, ehrlich: Überladen Vorlagen Mangel an Kommentaren )), was ist diese Kreativität wert, 5 Minuten gedacht, was es ist? eine Instanz einer Klasse oder ein Array mit Daten. Im Allgemeinen, alles für die Entwicklung des Gehirns.
CALENDAR Calendar;
Calendar[i].time
Natürlich ist die Arbeit cool, man sollte nur verstehen, wie es funktioniert
 

Es wäre schön, wenn die Funktion das gesamte Array nach dem Zusammenführen nach Zeit sortieren würde

int operator +=( const CALENDAR &Value )
  {
    const int Size1 = this.GetAmount();
    const int Size2 = Value.GetAmount();

    if (!Size1)
      for (int i = ::ArrayResize(this.Events, Size2) - 1; i >= 0; i--)
        this.Events[i] = Value.Events[i];
    else if (Size2)
    {
      EVENT Array[];

      ::ArrayResize(Array, Size1 + Size2);

      int i = 0;
      int j = 0;
      int k = 0;

      while ((i < Size1) && (j < Size2))
        Array[k++] = (this.Events[i] < Value.Events[j]) ? this.Events[i++] : Value.Events[j++];

      while (i < Size1)
        Array[k++] = this.Events[i++];

      while (j < Size2)
        Array[k++] = Value.Events[j++];

    #ifdef __MQL5__
      ::ArraySwap(this.Events, Array);
    #else // #ifdef __MQL5__
      ::ArrayFree(this.Events);

      ::ArrayCopy(this.Events, Array);
    #endif // #ifdef __MQL5__ #else
    }

    return(this.GetAmount());
  }
bool operator <( const EVENT &Value ) const
  {
    return(!Value.time || (this.time < Value.time));
  }
 
BillionerClub #:

Es wäre schön, wenn die Funktion das gesamte Array nach dem Zusammenführen nach Zeit sortieren würde

Nennen Sie ein Beispiel, in dem das nicht der Fall ist.

 
fxsaber #:

Nennen Sie mir ein Beispiel, bei dem dies nicht der Fall ist.

Ihr Code ist schwer zu verstehen, aber ich gehe davon aus, dass es eine endgültige Sortierung im obigen Code gibt, aber der Code ist wahrscheinlich fehlerhaft. Es kommt nicht oft vor, dass beim Zusammenführen von Arrays das endgültige Array einen Fehler in Form einer fehlenden Sortierung aufweist, da die jüngsten Elemente im Array einen längeren Zeitraum haben sollten.

2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 08:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 13:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 16:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 20:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.05 00:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.07 00:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
   int totall = Calendar+=Calendar3;

for(int i=0;i<totall;i++)
  {
   Print(TimeToString(Calendar[i].time));
  }