Bibliotheken: Kalender - Seite 14

 
mbjen #:

Hallo. Gibt es eine Möglichkeit, den Kalender auf eine bestimmte Zeit zu verschieben?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Bibliotheken: Kalender

fxsaber, 2023.04.13 11:46 Uhr.

Das ist mit einer Zeile gelöst.

Calendar += 3600.


Ich kann mich nicht mehr an die ganze Funktionalität erinnern. ALT+M hilft.

 
fxsaber # :


Ich kann mich nicht mehr an alle Funktionen erinnern. ALT+M hilft.

Ich habe einen netten Vorschlag:
On Save():
Kalender -= Server_GMT_Offset subtrahieren;
Dies speichert die Kalenderzeiten in UTC-Zeit.

On Load():
Addiere Kalender += Server_GMT_Offset;
Dies ermöglicht die Wiederverwendung der gespeicherten Datei von einem Terminal in einem anderen Terminal mit einem anderen gmt_offset des Brokers (EA-Test auf verschiedenen Terminals).

Ich schlage vor, diese Funktionalität in die Methoden Save() und Load() der Klasse aufzunehmen. Außerdem wäre es nützlich, eine Benutzeroption (Klasseneigenschaft) hinzuzufügen, um die Korrektur der Kalenderzeiten beim Speichern/Laden zu ermöglichen.


 
amrali #:
Ich schlage vor, diese Funktionalität in die Methoden Save() und Load() der Klasse aufzunehmen. Auch das Hinzufügen einer Benutzeroption (Klasseneigenschaft), um die Korrektur von Kalenderzeiten beim Speichern/Laden zu ermöglichen, wäre nützlich.

Dies ist vernünftig. Leider bin ich noch nicht bereit, dies zu tun.

 
Hallo - Ich habe gerade Ihr Beispiel Kalender EA verwendet und es scheint nicht zum Herunterladen der Kalenderdaten. Es funktionierte großartig, bevor die 5.0 Build 5200 Release. Irgendwelche Ideen, was falsch ist, oder Korrekturen? Vielen Dank
 
v88 #:
Hallo - ich habe gerade Ihr Kalender-EA-Beispiel verwendet und es scheint die Kalenderdaten nicht zu laden. Vor der Version 5.0 Build 5200 funktionierte es einwandfrei. Haben Sie eine Idee, was falsch ist, oder können Sie es beheben? Vielen Dank

Überprüft - es funktioniert.


Diese Dateien speichern einen einzigen Kalender für alle Terminals.

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

Überprüft - es funktioniert.


Diese Dateien speichern einen einzigen Kalender für alle Terminals.

Es ist definitiv nicht funktioniert hier mit Ihrem Test EA, mit 2 verschiedenen Terminals. Eine direkt von metaquotes und eine durch meinen Broker. Siehe unten, beide zeigen Code 1 Fehler:



Ich sehe 3 Dateien unter \AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, events, countries und descriptions.


Die Zeilen in Ihrem Test-EA zeigen, dass die Datei calendar.bin als "Calendar.bin" im Ordner "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files" gespeichert werden sollte, aber sie ist nicht dort. Vor Build 5200 wurden sie dort korrekt abgelegt. Irgendwelche Ideen, was falsch sein könnte?


#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";        // Währung
input string inFilterName = "payrolls"; // FilterName

input group "EA"
input int inTP = 1000; // TakeProfit
input int inSL = 1000; // StopLoss
input bool inReverse = true; // Handelsrichtung

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

Es ist definitiv nicht funktioniert hier mit Ihrem Test EA, mit 2 verschiedenen Terminals. Eine direkt von metaquotes und eine durch meinen Broker. Siehe unten, beide zeigen Code 1 Fehler:



Ich sehe 3 Dateien unter \AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, events, countries und descriptions.


Die Zeilen in Ihrem Test-EA zeigen, dass die Datei calendar.bin als "Calendar.bin" im Ordner "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files" gespeichert werden sollte, aber sie ist nicht dort. Vor Build 5200 wurden sie dort korrekt abgelegt. Irgendwelche Ideen, was falsch sein könnte?


Um sicherzugehen, dass es nicht an meinem Setup liegt, habe ich eine Windows-VM außerhalb meines eigenen Netzwerks installiert, alles sauber. Ich lud das Terminal herunter, installierte die Include-Dateien und den Calendar_Example EA. Immer noch das gleiche Problem, Fehlercode 1, calendar.bin wird nicht heruntergeladen:


 
v88 #:

Haben Sie eine Idee, woran das liegen könnte?

Solange die Änderungen in MQL5 nicht behoben sind, sehe ich keinen Sinn darin, das zu untersuchen. Versuchen Sie den Build unten.

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

Kürzlich habe ich festgestellt, dass das Speichern des gesamten Kalenders in eine Datei für die Arbeit mit dem Tester nach etwa 50 Sekunden abbricht.

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

Zuvor funktionierte alles einwandfrei und der gesamte Kalender wurde ohne Probleme in eine Datei heruntergeladen. Ich vermute, dass mit einer der Terminalversionen die Zeitüberschreitung für CalendarValueHistory verringert wurde.

Ich habe das auf verschiedenen Terminals und verschiedenen Servern überprüft, obwohl das Terminal überall b5327 ist. Ich habe auch versucht, den Zeitraum zu verkürzen. Also, für ein Jahr gibt es auch eine Zeitüberschreitung. Aber ein paar Tage lang wird normal heruntergeladen.

Gibt es irgendwelche Umgehungsmöglichkeiten, um die Aufteilung der Aufrufe in kurze Zeiträume zu vermeiden?

 
Denis Kislicyn CalendarValueHistory verringert wurde.

Ich habe das auf verschiedenen Terminals und verschiedenen Servern überprüft, obwohl das Terminal überall b5327 ist. Ich habe auch versucht, den Zeitraum zu verkürzen. Also, für ein Jahr gibt es auch eine Zeitüberschreitung. Aber ein paar Tage lang wird normal heruntergeladen.

Gibt es irgendwelche Umgehungsmöglichkeiten, um die Aufteilung der Aufrufe in kurze Zeiträume zu vermeiden?

Ich habe ein wenig recherchiert. Wenn man CalendarValueHistory einen Zeitraum übergibt, der länger als ein Monat ist, hängt sich die Funktion für etwa 50 Sekunden auf und stürzt dann wegen einer Zeitüberschreitung ab. Dagegen wird derselbe Aufruf, der jedoch nur einen Tag kürzer ist, in <70ms ausgeführt und speichert etwa 5.000 Kalenderereignisse perfekt. Da hat sich definitiv etwas geändert.

Automatische Übersetzung durch einen Moderator. Wenn Sie einen Beitrag auf Russisch verfassen möchten, tun Sie dies bitte im russischen Forum und nicht im englischen Forum. Dies ist ein mehrsprachiges Thema, also posten Sie bitte im richtigen Forum, sonst funktioniert die automatische Übersetzung nicht richtig.