Bibliothèque: Calendrier - page 14

 
mbjen #:

Bonjour. Est-il possible de déplacer le calendrier à une certaine heure ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading.

Bibliothèques : Calendrier

fxsaber, 2023.04.13 11:46 am.

Il n'y a qu'une ligne pour résoudre ce problème.

Calendar += 3600.


Je ne me souviens pas de toutes les fonctionnalités. ALT+M aide.

 
fxsaber # :


Je ne me souviens pas de toutes les fonctionnalités. ALT+M aide.

J'ai une suggestion intéressante :
Sur Save() :
Soustraire Calendar -= Server_GMT_Offset ;
Cela permet de stocker les heures du calendrier en heure UTC.

Lors du chargement () :
Ajouter Calendar += Server_GMT_Offset ;
Cela permet de réutiliser le fichier sauvegardé d'un terminal dans un autre terminal avec un gmt_offset différent (EA testing on different terminals).

Je suggère d'ajouter cette fonctionnalité aux méthodes Save() et Load() de la classe. Il serait également utile d'ajouter une option utilisateur (propriété de classe) pour permettre la correction des heures calendaires lors de la sauvegarde/du chargement.


 
amrali #:
Je suggère d'ajouter cette fonctionnalité aux méthodes Save() et Load() de la classe. Il serait également utile d'ajouter une option utilisateur (propriété de la classe) permettant de corriger les heures du calendrier lors de la sauvegarde/du chargement.

C'est raisonnable. Malheureusement, je ne suis pas encore prêt à le faire.

 
Bonjour - Je viens d'utiliser votre exemple de Calendar EA et il semble qu'il ne télécharge pas les données du calendrier. Il fonctionnait très bien avant la sortie de la version 5.0 build 5200. Avez-vous une idée de ce qui ne va pas, ou des solutions ? Je vous remercie.
 
v88 #:
Bonjour - Je viens d'utiliser votre exemple Calendar EA et il ne semble pas charger les données du calendrier. Avant la version 5.0 build 5200, il fonctionnait correctement. Avez-vous une idée de ce qui ne va pas ou une solution ? Merci de votre compréhension.

Vérifié - cela fonctionne.


Ces fichiers stockent un calendrier unique pour tous les terminaux.

...\AppData\Roaming\MetaQuotes\Terminal\Community\Calendar\*.dat
 
fxsaber #:

Vérifié - il fonctionne.


Ces fichiers stockent un calendrier unique pour tous les terminaux.

Cela ne fonctionne absolument pas avec votre EA de test, avec 2 terminaux différents. L'un directement à partir de metaquotes et l'autre par l'intermédiaire de mon courtier. Voir ci-dessous, les deux montrent une erreur de code 1 :



Je vois 3 fichiers à l'adresse suivante : AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, events, countries and descriptions.


Les lignes de votre test EA montrent que le fichier calendar.bin devrait être enregistré en tant que "Calendar.bin" dans le dossier "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files", mais il ne s'y trouve pas. Avant la version 5200, ils y étaient placés correctement. Une idée de ce qui pourrait se passer ?


#define  FAKE // Уберите эту строку, чтобы советник заработал. Нужно для прохождения автоматической проверки КБ.

#ifndef  FAKE

// Советник для торговли в MT4/5-Тестере на истории фундаментальных даных.

#define  CALENDAR_FILENAME "Calendar.bin" // Название файла для чтения/записи Календаря.
#property tester_file CALENDAR_FILENAME  // Указание, чтобы MT5-Тестер подхватывал даный файл.

#include <fxsaber\Calendar\Calendar.mqh> // Календарь - фундаментальный анализ на истории и в реал-тайме.

input group "Calendar"
input string inCurrency = "USD";        // Monnaie
input string inFilterName = "payrolls"; // Nom du filtre

input group "EA"
input int inTP = 1000; // TakeProfit
input int inSL = 1000; // StopLoss
input bool inReverse = true; // Sens de l'échange

CALENDAR Calendar; // Объект с данными календаря.

int OnInit()
{
  bool Res = false;

  if (MQLInfoInteger(MQL_TESTER)) // Если работаем в Тестере
  {
    Res = Calendar.Load(CALENDAR_FILENAME) &&      // Загрузили события из файла.
          Calendar.FilterByCurrency(inCurrency) && // Применили фильтр по валюте.
          Calendar.FilterByName(inFilterName);     // Применили фильтр по названию события.

    if (!Res)                                      // Если проблемы с загруженными данными,
      Print("Run the EA in the MT5-Terminal!");    // сообщили, что нужно их получить запуском советника в5-Терминале.
  }
#ifdef __MQL5__
  // Работаем в Терминале.
  else if (Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, 0) && // Загрузили абсолютно все события (история + будущее) из5-Терминала.
           Calendar.AutoDST() &&                                 // Синхронизировали календарь с котировками.
           Calendar.Save(CALENDAR_FILENAME))                     // Сохранили их в файл.
    MessageBox("You can run the EA in the MT4/5-Tester.");       // Сообщили, что можем теперь работать в MT4/5-Тестере.
#endif // #ifdef __MQL5__

  return(!Res);
}

void OnTick()
{
  static int Pos = Calendar.GetPosAfter(TimeCurrent()); // Получили позицию события в Календаре, которая стоит сразу за текущим временем.

  if ((Pos < Calendar.GetAmount()) &&       // Если не вышли за границы Календаря
      (Calendar[Pos].time < TimeCurrent())) // и текущее время перешагнуло событие.
  {
    const EVENT Event = Calendar[Pos];      // Получили соответствующее событие.

    if ((Event.Actual != LONG_MIN) && (Event.Forecast != LONG_MIN)) // Если текущее и прогнозное значения события заданы
    {
      Print(Event.ToString()); // Распечатываем полностью это событие.

      if (Event.Actual > Event.Forecast)                                                                          // Если текущее значение больше прогнозного,
        PositionOpen(inReverse, "Act.(" + Event.ActualToString() + ")>(" + Event.ForecastToString() + ")For.");   // открываем позицию одного направления.
      else
        PositionOpen(!inReverse, "Act.(" + Event.ActualToString() + ")<=(" + Event.ForecastToString() + ")For."); // Иначе - другого направления.
    }

    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Получили позицию события в Календаре, которая стоит сразу за текущим временем.
  }
}

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

// Открывает позицию с заданным комментарием.
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));
}

#else // #ifndef FAKE
  int OnInit() { return(INIT_FAILED); }
#endif // #ifndef FAKE #else
 
v88 #:

Cela ne fonctionne absolument pas ici avec votre EA de test, avec 2 terminaux différents. L'un directement à partir de metaquotes et l'autre par l'intermédiaire de mon courtier. Voir ci-dessous, les deux montrent l'erreur code 1 :



Je vois 3 fichiers à l'adresse suivante : AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, events, countries and descriptions.


Les lignes de votre test EA montrent que le fichier calendar.bin devrait être enregistré en tant que "Calendar.bin" dans le dossier "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files", mais il ne s'y trouve pas. Avant la version 5200, ils y étaient placés correctement. Une idée de ce qui pourrait se passer ?


Pour m'assurer qu'il ne s'agit pas de ma configuration, j'ai installé une VM Windows en dehors de mon propre réseau, tout est propre. J'ai téléchargé le terminal, installé les fichiers inclus et l'EA Calendar_Example. Toujours le même problème, code d'erreur 1, calendar.bin n'est pas téléchargé :


 
v88 #:

Une idée de ce qui pourrait se passer ?

Jusqu'à ce que les changements dans MQL5 soient corrigés, je ne vois pas l'intérêt de chercher. Essayez la version ci-dessous.

Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Проверил логин во вкладке Сообщество в MetaEditor
Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Проверил логин во вкладке Сообщество в MetaEditor
  • 2025.08.04
  • www.mql5.com
----------------- Открываю Метатрейдер, который давно вообще не открывал. Иду в MetaEditor - там не подключено к Git - ----------------- Проверил логин во вкладке Сообщество. То есть - пока я глядел на вкладку Сообщество в MetaEditor е - этот MetaEditor сам все сделал
 

J'ai récemment remarqué que l'enregistrement du calendrier entier dans un fichier pour le travailler dans le testeur commençait à dépasser le temps imparti après environ 50 secondes.

Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, 0); // <-- тут падает на 5401 - ERR_CALENDAR_TIMEOUT (превышен лимит времени запроса),

Auparavant, tout fonctionnait bien et le calendrier entier était téléchargé dans un fichier sans aucun problème. Je soupçonne qu'avec l'une des versions du terminal, le délai d'attente pour CalendarValueHistory a été réduit.

J'ai vérifié sur différents terminaux et différents serveurs, bien que le terminal soit b5327 partout. J'ai également essayé de réduire la période. Donc, pour un an, il y a aussi un timeout. Mais pendant quelques jours, le téléchargement se fait normalement.

Existe-t-il des solutions de contournement pour éviter de diviser les appels en courtes périodes ?

 
Denis Kislicyn CalendarValueHistory a été réduit.

J'ai vérifié sur différents terminaux et différents serveurs, bien que le terminal soit b5327 partout. J'ai également essayé de réduire la période. Donc, pour un an, il y a aussi un timeout. Mais pour quelques jours, le téléchargement se fait normalement.

Existe-t-il des solutions de contournement pour éviter de diviser les appels en courtes périodes ?

J'ai fait quelques recherches. Si vous passez une période de plus d'un mois à CalendarValueHistory, la fonction commence à se bloquer pendant environ 50 secondes, puis s'arrête à cause d'un dépassement de délai. Cependant, le même appel, mais pour un jour de moins, s'exécute en moins de 70 ms et enregistre parfaitement environ 5 000 événements du calendrier. Il y a donc bien quelque chose qui a changé.

Traduction automatique appliquée par le modérateur. Si vous souhaitez poster en russe, veuillez le faire dans le forum russe, et non dans le forum anglais. Il s'agit d'un sujet multilingue, veuillez donc poster dans le bon forum, sinon la traduction automatique ne fonctionnera pas correctement.