Перейти к содержанию

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


Rigal

Рекомендуемые сообщения

[Библиотека] Работа с новостями Опубликовано (изменено)

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

Выбрал 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.mqh

Изменено пользователем Rigal
добавил как подключить новости в тестере
  • Лайк 11
  • Спасибо 2
  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

  • 3 months later...
[Библиотека] Работа с новостями Опубликовано (изменено)

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

Изменено пользователем x25bg
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Работа с новостями Опубликовано
В 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

  • Лайк 3
  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

  • 6 months later...
[Библиотека] Работа с новостями Опубликовано
В 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 загрузки

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

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

А нужно

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • 1 year later...
[Библиотека] Работа с новостями Опубликовано
В 04.01.2020 в 21:37, Rigal сказал:

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Работа с новостями Опубликовано
В 01.08.2022 в 23:17, Mikhail321 сказал:

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

https://www.mql5.com/ru/search#!keyword=Pro download news

 

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Работа с новостями Опубликовано
11 часов назад, Mikhail321 сказал:

 

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

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

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

image.thumb.png.846c8a59928ba9191a9caec6bc8bda20.png

  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Работа с новостями Опубликовано (изменено)
6 часов назад, Rigal сказал:

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

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

image.thumb.png.846c8a59928ba9191a9caec6bc8bda20.png

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

Изменено пользователем Mikhail321
Ссылка на сообщение
Поделиться на другие сайты

[Библиотека] Работа с новостями Опубликовано
1 час назад, Mikhail321 сказал:

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

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

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

Вот они:

 

Calendar.rar

 

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

 

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

  • Лайк 1
  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...