Библиотеки: Calendar - страница 14

 
mbjen #:

Здравствуйте. Есть ли возможность сдвинуть календарь на определенное время?


Не помню весь функционал. Помогает ALT+M.

 
fxsaber # :


I don't remember all the functionality. ALT+M helps.

I have a nice suggestion:
On Save():
Subtract Calendar -= Server_GMT_Offset;
This will store calendar times in UTC time.

On Load():
Add Calendar += Server_GMT_Offset;
This allows using re-use saved file from one terminal in another terminal with a different broker's gmt_offset (EA testing on different terminals)

I suggest to add this functionality to the Save() and Load() methods of the class. Also, adding a user option (class property) to allow correcting calendar times on save/load would be also useful.


 
amrali #:
I suggest to add this functionality to the Save() and Load() methods of the class. Also, adding a user option (class property) to allow correcting calendar times on save/load would be also useful.

Это разумно. К сожалению, пока не готов этим заниматься.

 
Здравствуйте - Я только что использовал ваш пример советника Calendar EA и, похоже, он не загружает данные календаря. До выхода версии 5.0 build 5200 он работал отлично. Есть идеи, что не так, или какие-нибудь исправления? Спасибо
 
v88 #:
Здравствуйте - Я только что использовал ваш пример советника Calendar EA и, похоже, он не загружает данные календаря. До выхода версии 5.0 build 5200 он работал отлично. Есть идеи, что не так, или какие-нибудь исправления? Спасибо

Проверил - работает.


В этих файлах хранится единый для всех терминалов календарь.

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

Проверил - работает.


В этих файлах хранится единый календарь для всех терминалов.

Это определенно не работает здесь с вашим тестовым советником, с 2 различными терминалами. Один напрямую из metaquotes и один через моего брокера. Смотрите ниже, оба показывают ошибку с кодом 1:



Я вижу 3 файла в \AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, events, countries and descriptions.


Строки в вашем тестовом советнике показывают, что файл calendar.bin должен быть сохранен как "Calendar.bin" в папке "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files", но его там нет. До сборки 5200 они помещались туда правильно. Есть идеи, что может быть не так?


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

#ifndef  FAKE

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

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

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

input group "Calendar"
input string inCurrency = "USD";        // Валюта
input string inFilterName = "payrolls"; // FilterName

input group "EA"
input int inTP = 1000; // TakeProfit
input int inSL = 1000; // StopLoss
input bool inReverse = true; // Направление торговли

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

Это определенно не работает здесь с вашим тестовым советником, с 2 разными терминалами. Один напрямую из metaquotes и один через моего брокера. Смотрите ниже, оба показывают ошибку с кодом 1:



Я вижу 3 файла в \AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, events, countries and descriptions.


Строки в вашем тестовом советнике показывают, что файл calendar.bin должен быть сохранен как "Calendar.bin" в папке "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files", но его там нет. До сборки 5200 они помещались туда правильно. Есть идеи, что может быть не так?


Чтобы убедиться, что это не моя настройка, я установил виртуальную машину windows вне своей сети, все чисто. Скачал терминал, установил Include Files плюс Calendar_Example EA. Все та же проблема, код ошибки 1, calendar.bin не загружается:


 
v88 #:

Есть идеи, что может быть не так?

До устаканивания изменений в MQL5 не вижу смысла разбираться. Попробуйте билд ниже.

Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Проверил логин во вкладке Сообщество в MetaEditor
Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Проверил логин во вкладке Сообщество в MetaEditor
  • 2025.08.04
  • www.mql5.com
----------------- Открываю Метатрейдер, который давно вообще не открывал. Иду в MetaEditor - там не подключено к Git - ----------------- Проверил логин во вкладке Сообщество. То есть - пока я глядел на вкладку Сообщество в MetaEditor е - этот MetaEditor сам все сделал
 
Недавно заметил, что сохранение всего календаря в файле для работы с ним в тестере стала падать по таймауту, где-то через 50 сек.
Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, 0); // <-- тут падает на 5401 - ERR_CALENDAR_TIMEOUT (превышен лимит времени запроса),

Раньше все работало нормально и весь календарь спокойно выгружался в файл. Подозреваю, что с каким-то из релизов терминалов, таймаут уменьшили для CalendarValueHistory.

Я проверил на разных терминалах и разных серверах, правда терминал везде b5327. Также пробовал уменьшить период. Так за год тоже таймаут. А за несколько дней выгружает нормально

Есть ли варианты обхода, чтобы не дробить вызовы по коротким периодам?

 
Denis Kislicyn CalendarValueHistory был уменьшен.

Я проверял на разных терминалах и разных серверах, хотя везде стоит терминал b5327. Также я пробовал уменьшать период. Так вот, за год тоже есть таймаут. Но в течение нескольких дней все загружается нормально.

Есть ли какие-нибудь обходные пути, чтобы не разбивать звонки на короткие периоды?

Сделал небольшое исследование. Если передавать в CalendarValueHistory период больше месяца, то функция начинает висеть около 50 сек и дальше падает по таймауту. Причем такой же вызов но всего на 1 день короче выполняется <70 мс и отличное сохраняет около 5000 событий календаря. Точно что-то изменилось в ней.

Автоперевод применен модератором. Если вы хотите написать сообщение на русском языке, пожалуйста, сделайте это в русском форуме, а не в английском. Это мультиязычная тема, поэтому, пожалуйста, пишите в правильном форуме, иначе автоперевод будет работать некорректно.