程序库: 日历 - 页 14

 
mbjen #:

您好。有没有可能将日历移动到某个时间?

关于交易、自动交易系统和测试交易策略的论坛。

图书馆:日历

fxsaber, 2023.04.13 11:46 am.

只需一行就可以解决这个问题。

Calendar += 3600.


我不记得所有功能了。ALT+M 有帮助。

 
fxsaber # :


我不记得所有功能了。ALT+M 有帮助。

我有一个不错的建议:
On Save():
减去 Calendar -= Server_GMT_Offset;
这将以 UTC 时间存储日历时间。

On Load():
添加 Calendar += Server_GMT_Offset;
这样就可以在使用不同经纪商 gmt_offset 的另一台终端上重新使用从一台终端保存的文件(在不同终端上进行 EA 测试)。

我建议将此功能添加到类的 Save() 和 Load() 方法中。此外,添加一个用户选项(类属性)以允许在保存/加载时校正日历时间也会很有用。


 
amrali #:
我建议在类的 Save() 和 Load() 方法中添加这一功能。此外,添加一个用户选项(类属性)以允许在保存/加载时校正日历时间也会很有用。

这是合理的。遗憾的是,我还没有做好准备。

 
您好 - 我刚刚使用了您的日历 EA 示例,它似乎无法下载日历数据。在 5.0 版本 5200 发布之前,它运行得很好。有什么问题或解决方法吗?谢谢
 
v88 #:
您好 - 我刚刚使用了您的日历 EA 示例,但它似乎无法加载日历数据。在版本 5.0 build 5200 之前,它工作正常。您知道问题出在哪里吗?谢谢

已检查 - 正常。


这些文件为所有终端存储一个日历。

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

已检查 - 正常。


这些文件存储了所有终端的单一日历。

在你的测试 EA 中,有 2 个不同的终端,在这里肯定是不行的。一个直接来自 metaquotes,一个通过我的经纪人。见下图,都显示代码 1 错误:



I see 3 files at \AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, events, countries and descriptions.


你的测试 EA 中的行显示,calendar.bin 文件应该保存为 "Calendar.bin",位于 "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files" 文件夹中,但它不在那里。在第 5200 版之前,它们会正确地放在那里。有什么问题吗?


#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";        // 货币
input string inFilterName = "payrolls"; // 过滤器名称

input group "EA"
input int inTP = 1000; // TakeProfit
input int inSL = 1000; // 止损
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!");    // сообщили, что нужно их получить запуском советника в MT5-Терминале.
  }
#ifdef __MQL5__
  // Работаем в Терминале.
  else if (Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, 0) && // Загрузили абсолютно все события (история + будущее) из MT5-Терминала。
           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 #:

在您的测试 EA 中,用两个不同的终端肯定是不行的。一个直接来自 metaquotes,一个通过我的经纪人。见下图,都显示代码 1 错误:



I see 3 files at \AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, events, countries and descriptions.


你的测试 EA 中的行显示,calendar.bin 文件应该保存为 "Calendar.bin",位于 "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files" 文件夹中,但它不在那里。在第 5200 版之前,它们会正确地放在那里。有什么问题吗?


为了确保这不是我的设置问题,我在自己的网络外安装了一个 Windows VM,一切都很干净。下载了终端,安装了包含文件和 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 秒,然后由于超时而崩溃。然而,同样的调用,如果只短一天,执行时间却小于 70 毫秒,并能完美保存约 5000 个日历事件。其中肯定有什么变化。

版主自动翻译。如果您想用俄语发帖,请在俄语论坛发帖,不要在英语论坛发帖。这是一个多语言主题,因此请在正确的论坛发帖,否则自动翻译将无法正常工作。