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

 
fxsaber:

This is not done. Contact a specialist.

Sure, I just realized what you mean. Thanks
 
I noticed backtesting seems to be limited to about 5 years (from 2017 onwards), even though all news events are dowloaded correcly (BIN file is 67mb). Is there a limit to how many events MT5 can handle in memory for backtesting?
 
mqtrader #:
I noticed backtesting seems to be limited to about 5 years (from 2017 onwards), even though all news events are dowloaded correcly (BIN file is 67mb). Is there a limit to how many events MT5 can handle in memory for backtesting?
#property script_show_inputs

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

input bool inFromFile = false;

#define CALENDAR_FILENAME "Calendar.bin" // Название файла для чтения/записи Календаря.

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Взяли ВЕСЬ календарь.
    Calendar.Save(CALENDAR_FILENAME); // > 65 MB.
  }
  
  Print(Calendar[0].ToString());
}


Результат.

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 | 

Первое событие в БД календаря - январь 2007 года.

 
I just realized that the "Forecast" values start from 2017.05.05, which is why the backtest can only start from that date when running the example. Other values can be used prior to that date.

Thank you once more fxsaber for this very useful library!
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Calendar

fxsaber, 2020.12.12 14:18

Календарь событий прописан значительно вперед в будущее. Поэтому можно и в MT4 использовать напоминалку, предварительно (за месяц до этого, например) сохранив файл из данных MT5.

Для MT4 так и делаю.

Шаги для работы с календарем в MT4.


1. Запустить в MT5 скрипт, который сохранит календарь в Common-файл.

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

#define CALENDAR_FILENAME "Calendar.bin" // Название файла для чтения/записи Календаря.

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Взяли ВЕСЬ календарь.
  Calendar.Save(CALENDAR_FILENAME, true); // Записали календарь. > 65 MB.
}


2. Загрузить в MT4 календарь из Common-файла.


В качестве примера ниже напоминалка по важным событиям на валютах текущего символа, работающая в MT4.

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

#define CALENDAR_FILENAME "Calendar.bin" // Название файла для чтения/записи Календаря.

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

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // Если календарь не пустой.
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Нашли будущие события.
    
    Comment(Calendar.ToString(Pos, 5, true)); // Распечатали их.
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // Загрузили календарь из файла.
  {
    string Currencies[2];
    
    // Получили валюты текущего символа.
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // Оставили события по валютам символа.
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // Оставили только важные события.
  }    
}


После запуска имеем на чарте обновляемую (обратный отсчет) напоминалку по важным событиям на валютах символа прямо в MT4.


Аналогично Календарь может работать и в MT4-Тестере.

 
Mark Taylor #:

I keep hitting an issue though, I do the standard download of the calendar file

then set a starttime and get events after this time in a loop for each currency.

Try to paste the sources so that they can be read.

 

Спасибо за сильные труды полезная вещь.

Конечно такие труды надо разрабатывать и исправлять и описывать документацию, всем сообществом а не одному человеку. Но почему то администрация и сама не дает таких условии как и не вставляет ссылку на тот же ГитХаб, для правильной организации. Хотя есть же проекты, их использование, почти тот же ГитХаб. 

Спасибо! за код, очень интересно читать такой код, честно: перегрузки шаблоны отсутствие комментариев ))  чего стоит это творчество, 5 минут думал что это? экземпляр класса или массив с данными. В общем все для развития мозга.
CALENDAR Calendar;
Calendar[i].time
Работы, конечно крутые, стоит только понять, как работает
 

Неплохо бы если функция сортировала по времени весь массив после слияния 

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

Неплохо бы если функция сортировала по времени весь массив после слияния 

Приведите пример, где так не происходит.

 
fxsaber #:

Приведите пример, где так не происходит.

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

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));
  }
Причина обращения: