Встречайте учебник «Программирование на MQL5 для трейдеров» - страница 10

 
fxsaber #:

Можно ли рассчитывать, что будущие правки исходников Учебника буду совместимы с тем, что сейчас?

Это вопрос к MQ, но на моей памяти было много таких правок самого MQL5, которые нарушали обратную совместимость, так что я бы закладывался на необходимость периодической ревизии кодов (т.е. как оно сейчас).

 
К сожалению, в исходниках редко используется прописывание private/protected. Поэтому не всегда получается получить эффект от такого.
#define private public
 
#include <MQL5Book/CalendarCache.mqh> // https://www.mql5.com/ru/code/45596

input string inFileName = "CalendarCache.bin";

void OnStart()
{
  CalendarCache cache;

  cache.save(inFileName);
}


Почему такая большая разница в размерах файлов?

Path Size (MB)
MQL5\Files\CalendarCache.bin 22.9
AppData\Roaming\MetaQuotes\Terminal\Community\Calendar\events.dat  854.9


ЗЫ Похоже, дело в новостях на разных языках.

 
Что сделать, чтобы  эти функции возвращали подобные события?
2024.07.12 AllDay EUR 2 Eurogroup Meeting (eurogroup-meeting), European Union (EU)
 
fxsaber #:
К сожалению, в исходниках редко используется прописывание private/protected. Поэтому не всегда получается получить эффект от такого.

Это мой недочет в этом классе (причем даже ре-#define private на protected не поможет, потому что спецификатор доступа просто опущен). Обычно всегда пытаюсь прописывать protected для будущего расширения.

 
fxsaber #:
Что сделать, чтобы  эти функции возвращали подобные события?

В этих функциях такие запросы не были предусмотрены (все таки учебник не резиновый - и так превысили объем в 2 раза от плана). Для более сложных фильтров существует класс CalendarFilter, в котором можно прописать условие вроде f.let(CALENDAR_TIMEMODE_DATE), т.е. в данном конкретном случае по ENUM_CALENDAR_EVENT_TIMEMODE, как одному из многих поддерживаемых фильтром стандартных перечислений.

Вы же имеете собственную библиотеку для работы с календарем - зачем учебник?

ЗЫ. Вот сюда продублирую из учебника, какие поля поддерживаются фильтром:

enum ENUM_CALENDAR_PROPERTY
{                                      // +/- означает поддержку фильтрации по полю
   CALENDAR_PROPERTY_COUNTRY_ID,       // -ulong
   CALENDAR_PROPERTY_COUNTRY_NAME,     // -string
   CALENDAR_PROPERTY_COUNTRY_CODE,     // +string (2 символа)
   CALENDAR_PROPERTY_COUNTRY_CURRENCY, // +string (3 символа)
   CALENDAR_PROPERTY_COUNTRY_GLYPH,    // -string (1 символ)
   CALENDAR_PROPERTY_COUNTRY_URL,      // -string
   
   CALENDAR_PROPERTY_EVENT_ID,         // +ulong (ID вида события)
   CALENDAR_PROPERTY_EVENT_TYPE,       // +ENUM_CALENDAR_EVENT_TYPE
   CALENDAR_PROPERTY_EVENT_SECTOR,     // +ENUM_CALENDAR_EVENT_SECTOR
   CALENDAR_PROPERTY_EVENT_FREQUENCY,  // +ENUM_CALENDAR_EVENT_FREQUENCY
   CALENDAR_PROPERTY_EVENT_TIMEMODE,   // +ENUM_CALENDAR_EVENT_TIMEMODE
   CALENDAR_PROPERTY_EVENT_UNIT,       // +ENUM_CALENDAR_EVENT_UNIT
   CALENDAR_PROPERTY_EVENT_IMPORTANCE, // +ENUM_CALENDAR_EVENT_IMPORTANCE
   CALENDAR_PROPERTY_EVENT_MULTIPLIER, // +ENUM_CALENDAR_EVENT_MULTIPLIER
   CALENDAR_PROPERTY_EVENT_DIGITS,     // -uint
   CALENDAR_PROPERTY_EVENT_SOURCE,     // +string ("http[s]://")
   CALENDAR_PROPERTY_EVENT_CODE,       // -string
   CALENDAR_PROPERTY_EVENT_NAME,       // +string (4+ символов или с символом подстановки '*')
   
   CALENDAR_PROPERTY_RECORD_ID,        // -ulong
   CALENDAR_PROPERTY_RECORD_TIME,      // +datetime
   CALENDAR_PROPERTY_RECORD_PERIOD,    // +datetime (как long)
   CALENDAR_PROPERTY_RECORD_REVISION,  // +int
   CALENDAR_PROPERTY_RECORD_ACTUAL,    // +long
   CALENDAR_PROPERTY_RECORD_PREVIOUS,  // +long
   CALENDAR_PROPERTY_RECORD_REVISED,   // +long
   CALENDAR_PROPERTY_RECORD_FORECAST,  // +long
   CALENDAR_PROPERTY_RECORD_IMPACT,    // +ENUM_CALENDAR_EVENT_IMPACT
   
   CALENDAR_PROPERTY_RECORD_PREVISED,  // +нестандарное (previous или revised если есть)
   
   CALENDAR_PROPERTY_CHANGE_ID,        // -ulong (зарезервировано)
};
Учебник по MQL5: Расширенные средства языка / Экономический календарь / Фильтрация событий по множеству условий
Учебник по MQL5: Расширенные средства языка / Экономический календарь / Фильтрация событий по множеству условий
  • www.mql5.com
Как мы знаем из предыдущих разделов этой главы, MQL5 API позволяет запрашивать события календаря по нескольким условиям: странам (...
 
Stanislav Korotky #:

Вы же имеете собственную библиотеку для работы с календарем - зачем учебник?

Совместил Ваш кэш календаря со своей библиотекой таким образом.

#include <MQL5Book/CalendarCache.mqh> // https://www.mql5.com/ru/code/45596

input string inFileName = "CalendarCache.bin";

CalendarCache cache(inFileName, true);

#define CalendarCountryById         cache.calendarCountryById
#define CalendarEventById           cache.calendarEventById
#define CalendarValueHistoryByEvent cache.calendarValueHistoryByEvent
#define CalendarValueHistory        cache.calendarValueHistory
#define CalendarValueLast           cache.calendarValueLast
#define CalendarValueLastByEvent    cache.calendarValueLastByEvent

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

void OnStart()
{
/*
  CalendarCache cache;
  cache.save(inFileName);
*/  
  
  CALENDAR Calendar;
  
  // Взяли события по всем (NULL) валютам начиная с самой низкой (NONE) важности.
  const int Size = Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, TimeTradeServer(), TimeTradeServer() + 3600);
  
  // Распечатали их.
  for (int i = 0; i < Size; i++)
    Print(Calendar[i].ToString());
}

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

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структуры экономического календаря
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структуры экономического календаря
  • www.mql5.com
В этом разделе описываются структуры для работы с Экономическим календарем , который доступен прямо в платформе MetaTrader. Экономический календарь...
 
Stanislav Korotky #:

В этих функциях такие запросы не были предусмотрены (все таки учебник не резиновый - и так превысили объем в 2 раза от плана).

Круто получилось на самом деле.

Для более сложных фильтров существует класс CalendarFilter, в котором можно прописать условие вроде f.let(CALENDAR_TIMEMODE_DATE), т.е. в данном конкретном случае по ENUM_CALENDAR_EVENT_TIMEMODE, как одному из многих поддерживаемых фильтром стандартных перечислений.

Сразу изучил эту тему у Вас. Там предлагаете уже свой API работы с календарем. Технически интересно.
 
Сколь сильно отличие производительности json-решения из данной книги и json-библиотек из КБ?
Учебник по MQL5: Расширенные средства языка / Проекты / Клиентская программа сигнального сервиса на MQL5
Учебник по MQL5: Расширенные средства языка / Проекты / Клиентская программа сигнального сервиса на MQL5
  • www.mql5.com
Итак, мы решили, что текст в сообщениях сервиса будет в формате JSON. В наиболее распространенном варианте, JSON представляет собой текстовое...
 
fxsaber #:
Сколь сильно отличие производительности json-решения из данной книги и json-библиотек из КБ?

В книге упрощенный пример, на производительность не оптимизировался. Я его постоянно допиливаю в разных направлениях для текущих проектов, но целенаправленно по производительности не менял, за исключением того что в stringify убрал большие тормоза (проявлялись на очень больших объектах под десятки Мб). Могу скинуть текущую рабочую версию в личку.