[Библиотека] Работа с новостями

От Rigal, 4 января, 2020 в Лаборатория ProfitFX

Автор#1

Намедни занялся я подключением новостного индикатора к одному из советников.

Выбрал urdala_news, зарекомендовавший себя в Генерике.

 

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

И возвращает он одно значение: новости в интервале, или нет.

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

Заглянул я в код и ужаснулся - на вызов основной функции индикатора он что только не делает.

А потом еще, чтобы поделиться этим советником, нужно поделиться индикатором...

 

В общем, написал я подключаемый модуль, который делает все то же самое, но эффективно - и можно позвать его напрямую из советника и получить структуру вида

struct NewsCheckStatus {
   int minutesSinceLastNews;
   int minutesToNextNews;
};

Соответственно, объект этот можно получать не чаще раза в минуту и повсеместно переиспользовать.

 

Технические детали:

Для использования библиотеки нужно ее подключить и создать экземпляр класса NewsLoader:

   NewsLoader(int _serverGMTOffset, string _currencies = "", bool _high = true,
               bool _medium = true, bool _low = true, bool _drawLines = true, bool _onlyDrawFutureNews = false,
               color _colorHigh = clrRed, color _colorMedium = clrLime, color _colorLow = clrBlue,
               int _refreshPeriodSeconds = 86400)

Параметры конструктора:

  • serverGMTOffset - сдвиг брокера от GMT. Этот параметр может меняться за время жизни советника из-за DST, ниже я объясню, как с этим бороться
  • currencies - строка с набором валют через запятую. Определяет, по каким валютам вы хотите фильтровать новости. Если строка пустая, используются две валюты текущего символа
  • high, medium, low - фильтрация по волатильности новости: если вы не хотите учитывать малозначимые новости, например, поставьте low в false
  • drawLines - рисовать ли вертикальные линии на чарте
  • onlyDrawFutureLines - рисовать только линии в будущем
  • colorHigh, colorMedium, colorLow - цвета соответствующих линий
  • refreshPeriodSeconds - как часто перекачивать новости с сервера. Не злоупотребляйте, эта операция занимает несколько секунд и будет выполнена на одном из обращений из основной программы, запросто может притормозить торговый процесс в важный момент

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

Если ваша программа умеет обрабатывать DST (например, вы используете мою библиотеку для работы с планировщиком), то достаточно оповестить NewsLoader о новом GMT:

   void SetGMTOffset(int _offset)

Он все пересчитает и перерисует (только грядущие новости).

Операция незатратная, можно просто отсылать оффсет на каждом тике, например, так:

   NewsCheckStatus newsCheckStatus;
   tradeTimeStatus = tradeTimeManager.GetTradeTimeStatus();
   if (UseNewsFilter) { 
      newsLoader.SetGMTOffset(tradeTimeManager.GetLiveGMTOffset());
      newsLoader.CheckNewsStatus(newsCheckStatus);
   }

 

Опросить библиотеку можно двумя способами:

   void CheckNewsStatus(NewsCheckStatus &newsCheckStatus)

Эта функция вернет вышеупомянутую структуру, которую можно использовать, например, так:

 if (newsCheckStatus.minutesSinceLastNews >= TimeAfterNews
    && newsCheckStatus.minutesToNextNews > TimeBeforeNews)
      isOrderOpened = CheckOpen();

 Или так:

 if (UseNewsFilter && CloseTimeBeforeNews != 0 && newsCheckStatus.minutesToNextNews <= CloseTimeBeforeNews) //фильтр новостей
      CloseAll(IntegerToString(CloseTimeBeforeNews) + " minutes before news");

А можно просто спросить, нет ли новостей в интервале:

   bool IsNews(int _minutesBefore, int _minutesAfter)

Подключение новостей в тестере:

Скачиваем скрипт с маркета: https://www.mql5.com/ru/market/product/23961

Запускаем его с выбранными датами.

Когда закончит, заходим в папочку MQL4/files и копируем файл Calendar.txt в папочку tester/files

Все, новости работают на истории (не забываем выставить правильный  GMT offset)

 

 

Всем профитов!

 

 

UrdalaNewsLoader.mqh47 скач.

Изменено 19 июля, 2020 пользователем Rigal

#2

to @Rigal
Ошибки нет? Это не старая версия?
В тестере не работает, файлик Calendar.txt есть, в mqh его никто не пытается открыть.

3    17:34:40.064    TestGenerator: symbol EURUSD period 5 model 0 from 2015.01.01 to 2020.07.02
2    17:34:40.084    2015.01.01 00:00:00  SandboxTime inputs: BrokerGMTOffsetWinter=2; BrokerDstMode=1; TargetGMTOffsetWinter=-5; TargetDSTMode=2; OpenOrdersInRollover=1; CloseOrdersInRollover=1; FreezeMinutesBeforeRollover=5; FreezeMinutesAfterRollover=15; 

...

0    17:34:40.150    2015.01.01 22:00:01  SandboxTime EURUSD,M5: Новости загружены, всего: 69, вычищаем старые...
...
0    17:34:40.150    2015.01.01 22:00:01  SandboxTime EURUSD,M5: Курсор установлен в позицию 0, ближайшая новость выходит в 2020.07.13 09:30:00 по GMT, 2020.07.13 11:30:00 по брокеру
 

bash-3.2$ grep 2015.01 Calendar.txt |grep "USD;H;" |head -n3

2015.01.02 15:00;USD;H;ISM Manufacturing PMI

2015.01.06 15:00;USD;H;ISM Non-Manufacturing PMI

2015.01.07 13:15;USD;H;ADP Non-Farm Employment Change

 

bash-3.2$ grep -c Calendar UrdalaNewsLoader.mqh 

UrdalaNewsLoader.mqh:0

bash-3.2$ grep -c txt UrdalaNewsLoader.mqh 

UrdalaNewsLoader.mqh:0

Изменено 17 июля, 2020 пользователем x25bg

Автор#3
В 17.07.2020 в 22:45, x25bg сказал:

to @Rigal
Ошибки нет? Это не старая версия?
В тестере не работает, файлик Calendar.txt есть, в mqh его никто не пытается открыть.

3    17:34:40.064    TestGenerator: symbol EURUSD period 5 model 0 from 2015.01.01 to 2020.07.02
2    17:34:40.084    2015.01.01 00:00:00  SandboxTime inputs: BrokerGMTOffsetWinter=2; BrokerDstMode=1; TargetGMTOffsetWinter=-5; TargetDSTMode=2; OpenOrdersInRollover=1; CloseOrdersInRollover=1; FreezeMinutesBeforeRollover=5; FreezeMinutesAfterRollover=15; 

...

0    17:34:40.150    2015.01.01 22:00:01  SandboxTime EURUSD,M5: Новости загружены, всего: 69, вычищаем старые...
...
0    17:34:40.150    2015.01.01 22:00:01  SandboxTime EURUSD,M5: Курсор установлен в позицию 0, ближайшая новость выходит в 2020.07.13 09:30:00 по GMT, 2020.07.13 11:30:00 по брокеру
 

bash-3.2$ grep 2015.01 Calendar.txt |grep "USD;H;" |head -n3

2015.01.02 15:00;USD;H;ISM Manufacturing PMI

2015.01.06 15:00;USD;H;ISM Non-Manufacturing PMI

2015.01.07 13:15;USD;H;ADP Non-Farm Employment Change

 

bash-3.2$ grep -c Calendar UrdalaNewsLoader.mqh 

UrdalaNewsLoader.mqh:0

bash-3.2$ grep -c txt UrdalaNewsLoader.mqh 

UrdalaNewsLoader.mqh:0

Я, откровенно говоря, не очень внимательно следил за состоянием библиотеки vs заявленный функционал - и очевидно,  версия была старовата.
Перезалил, в том числе чтение Calendar.txt

#4

to @Rigal

 

Спасибо!


Стало сильно лучше, работает, но...

 

2020.07.20 21:17:08.784    EURUSD,M5: 162784120 tick events (411383 bars, 162784120 bar states) processed in 0:20:28.829 (total time 0:20:28.829)
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 221424 bytes of leaked memory
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 6634 leaked strings left
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 2211 objects of type NewsEntry left
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 1 object of type CArrayObj left
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 1 object of type NewsLoader left
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 2213 undeleted objects left
 

Может подчистим, доведем до ума? 
 

Честно признаюсь, библиотека  выше моего уровня программирования, сам исправить не могу, как минимум, быстро.

 

SandboxTime.mq417 скач.

Автор#5
В 21.07.2020 в 03:16, x25bg сказал:

to @Rigal

 

Спасибо!


Стало сильно лучше, работает, но...

 

2020.07.20 21:17:08.784    EURUSD,M5: 162784120 tick events (411383 bars, 162784120 bar states) processed in 0:20:28.829 (total time 0:20:28.829)
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 221424 bytes of leaked memory
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 6634 leaked strings left
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 2211 objects of type NewsEntry left
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 1 object of type CArrayObj left
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 1 object of type NewsLoader left
2020.07.20 21:17:08.784    2020.07.02 23:59:59  SandboxTime EURUSD,M5: 2213 undeleted objects left
 

Может подчистим, доведем до ума? 
 

Честно признаюсь, библиотека  выше моего уровня программирования, сам исправить не могу, как минимум, быстро.

 

SandboxTime.mq4 3 \u043a\u0411 · 3 загрузки

А я что-то все пропустил

В сэндбоксе просто не удалялись объекты.

А нужно

#6
В 04.01.2020 в 21:37, Rigal сказал:

Подключение новостей в тестере:

Скачиваем скрипт с маркета: https://www.mql5.com/ru/market/product/23961

Файл остался у кого-нибудь? по ссылке уже нет(

Автор#9
11 часов назад, Mikhail321 сказал:

 

Screenshot_2022-08-06-08-17-50-339_com.android.chrome.jpg

Прекрасный скриншот, спасибо, очень познавательно.

а на мою ссылку не пробовали кликнуть? Это функция «поиск», много интересного можно обнаружить ;)

image.thumb.png.846c8a59928ba9191a9caec6bc8bda20.png

#10
6 часов назад, Rigal сказал:

Прекрасный скриншот, спасибо, очень познавательно.

а на мою ссылку не пробовали кликнуть? Это функция «поиск», много интересного можно обнаружить ;)

image.thumb.png.846c8a59928ba9191a9caec6bc8bda20.png

Очень странное у нас с Вами недопонимание. Свой скриншот я сделал последовав по вашей ссылки - по той ,что Вы обвели в последнем скриншоте. Похоже,к сожалению, Вы не удосужились даже перейти сами по ссылке которую мне присылаете в очередной раз.

Изменено 7 августа, 2022 пользователем Mikhail321

Автор#11
1 час назад, Mikhail321 сказал:

Очень странное у нас с Вами недопонимание. Свой скриншот я сделал последовав по вашей ссылки - по той ,что Вы обвели в последнем скриншоте. Похоже,к сожалению, Вы не удосужились даже перейти сами по ссылке которую мне присылаете в очередной раз.

действительно, забавный казус.

У меня продукт нашелся и поставился. И файлы загрузились.

Вот они:

 

Calendar.rar25 скач.

 

Возможно, потому, что я им уже пользовался? Я не знаю. 

 

PS. и да, я воспроизвел в браузере, отсутствует продукт

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025