Bibliothèque: Calendrier - page 4

 
fxsaber:

Ce n'est pas le cas. Contactez un spécialiste.

Bien sûr, je viens de comprendre ce que vous voulez dire. Merci de votre compréhension.
 
J'ai remarqué que le backtesting semble être limité à environ 5 ans (à partir de 2017), même si tous les événements sont téléchargés correctement (le fichier BIN est de 67mb). Y a-t-il une limite au nombre d'événements que MT5 peut gérer en mémoire pour le backtesting ?
 
mqtrader #:
J'ai remarqué que le backtesting semble être limité à environ 5 ans(à partir de 2017), même si tous les événements sont téléchargés correctement (le fichier BIN est de 67mb). Y a-t-il une limite au nombre d'événements que MT5 peut gérer en mémoire pour le backtesting ?
#property script_show_inputs

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

input bool inFromFile = false;

#define  CALENDAR_FILENAME "Calendar.bin" // Nom du fichier pour la lecture/écriture du calendrier.

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // A pris tout le calendrier.
    Calendar.Save(CALENDAR_FILENAME); // > > 65 MB.
  }
  
  Print(Calendar[0].ToString());
}


Résultat.

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 | 

Le premier événement dans la base de données du calendrier est janvier 2007.

 
Je viens de réaliser que les valeurs "Forecast" commencent à partir du 2017.05.05, ce qui explique pourquoi le backtest ne peut commencer qu'à partir de cette date lors de l'exécution de l'exemple. D'autres valeurs peuvent être utilisées avant cette date.

Merci encore une fois fxsaber pour cette bibliothèque très utile !
 

calendrier des événements est prescrit de manière significative dans le futur. C'est pourquoi vous pouvez utiliser un rappel dans MT4, en ayant préalablement sauvegardé un fichier de données MT5 (un mois avant, par exemple).

C'est ce que je fais pour MT4.

Marche à suivre pour travailler avec le calendrier dans MT4.


1. Exécuter un script dans MT5 qui va sauvegarder le calendrier dans un fichier Common.

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

#define  CALENDAR_FILENAME "Calendar.bin" // Nom du fichier pour la lecture/écriture du calendrier.

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // A pris tout le calendrier.
  Calendar.Save(CALENDAR_FILENAME, true); // Calendrier enregistré. > 65 MB.
}


2. Chargez le calendrier du fichier commun dans MT4.


A titre d'exemple, voici un rappel des événements importants sur les devises du symbole actuel, fonctionnant dans MT4.

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

#define  CALENDAR_FILENAME "Calendar.bin" // Nom du fichier pour la lecture/écriture du calendrier.

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

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // Si le calendrier n'est pas vide.
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Found Future Events (événements futurs fondés).
    
    Comment(Calendar.ToString(Pos, 5, true)); // Les a imprimées.
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // Chargement du calendrier à partir d'un fichier.
  {
    string Currencies[2];
    
    // Obtenir les devises du caractère courant.
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // Laisser les événements sur les monnaies du symbole.
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // Seuls les événements importants ont été oubliés.
  }    
}


Après le lancement, nous disposons d'un rappel actualisé (compte à rebours) des événements importants sur les devises du symbole directement dans MT4.


De la même manière, le calendrier peut fonctionner dans MT4-Tester.

 
Mark Taylor #:

Je rencontre toujours un problème, j'effectue le téléchargement standard du fichier du calendrier.

puis je définis une heure de début et je récupère les événements après cette heure dans une boucle pour chaque devise.

Essayez de coller les sources pour qu'elles puissent être lues.

 

Merci pour ce travail solide et utile.

Bien sûr, de tels travaux devraient être développés et corrigés et décrire la documentation, l'ensemble de la communauté et pas seulement une personne. Mais pour une raison quelconque, l'administration elle-même ne donne pas de telles dispositions et n'insère pas de lien vers le même GitHub, pour une organisation appropriée. Bien qu'il y ait des projets, leur utilisation, presque le même GitHub.

Merci ! pour le code, c'est très intéressant de lire un tel code, honnêtement : surcharge des templates manque de commentaires )) qu'est-ce qui vaut cette créativité, 5 minutes de réflexion qu'est-ce que c'est ? une instance d'une classe ou un tableau avec des données. En général, tout pour le développement du cerveau.
CALENDAR Calendar;
Calendar[i].time
Bien sûr, le travail est cool, il faut seulement comprendre comment ça marche
 

Il serait intéressant que la fonction trie par ordre chronologique l'ensemble du tableau après la fusion.

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 #:

Il serait intéressant que la fonction trie par ordre chronologique l'ensemble du tableau après la fusion.

Donnez un exemple où ce n'est pas le cas.

 
fxsaber #:

Donnez-moi un exemple où ce n'est pas le cas.

Votre code est difficile à comprendre, mais je suppose qu'il y a un tri final dans le code ci-dessus, mais le code est probablement erroné. Ce n'est pas fréquent, mais lorsque l'on fusionne des tableaux, le tableau final contient des erreurs sous la forme d'un manque de tri, parce que les éléments les plus récents du tableau devraient avoir une période de temps plus longue.

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));
  }