Блог им. elektroyar

Библиотека С++ для загрузки экономических новостей

Есть один хороший сайт www.investing.com с экономическими новостями, которым пользуются многие трейдеры на Форексе. И решил я как-то раз попробовать посмотреть, что будет на бэктестинге торговли по новостям. Поковырявшись в страничке экономического календаря сделал в итоге С++ библиотеку для загрузки новостей. Для http запросов библиотека использует curl. Новости загружаются по UTC времени, загрузить их можно со времен начала эпохи UNIX

Класс для хранения одной новости:
/** \brief Класс Новостей
*/
class News
{
public:
	std::string name;          /**< Имя новости */
	std::string currency;      /**< Валюта новости */
	std::string country;       /**< Страна новости */
	int level_volatility = -1; /**< Уровень волатильности (-1 не инициализировано,  низкий уровень = 0, средний 1, высокий 2) */
	double previous;           /**< Предыдущее значение */
	double actual;             /**< Актуальное значение */
	double forecast;           /**< Предсказанное значение */
	bool is_previous = false;  /**< Наличие предыдущего значения */
	bool is_actual = false;    /**< Наличие актуального значения */
	bool is_forecast = false;  /**< Наличие предсказанного значения */
	uint64_t timestamp = 0;    /**< Метка времени новости */

	News() {};
};
Для хранения массива исторических данных новостей используется библиотека  xquotes_history, которая первоначально была разработана для хранения котировок. Массив новостей разделяется по торговым дням, каждый день можно выгрузить по метке времени начала дня. Для поиска новости внутри дня есть специальные методы. Для работы с меткой времени применяется библиотека xtime.

Пример программы

#include <iostream>
#include <ForexprostoolsApi.hpp>

int main()
{
	std::cout << "Hello world!" << std::endl;

	std::string path_database = "..//..//storage//forexprostools.dat"; // путь к базе данных новостей
	ForexprostoolsDataStore::DataStore iDataStore(path_database);

	/* получим минимальную и максимальную даты новостей
	 */
	xtime::timestamp_t min_timestamp = 0, max_timestamp = 0;
	iDataStore.get_min_max_timestamp(min_timestamp, max_timestamp);
	std::cout 
		<< "date: " 
		<< xtime::get_str_date(min_timestamp) 
		<< " - " 
		<< xtime::get_str_date(max_timestamp) 
		<< std::endl;

	/* получим новости за один день */
	std::vector<ForexprostoolsApiEasy::News> day_list_news;
	iDataStore.get(
		xtime::get_timestamp(15,11,2019), 
		0, 
		xtime::SECONDS_IN_DAY, day_list_news);

	for(size_t i = 0; i < day_list_news.size(); ++i) {
		std::cout << "news: " << i << std::endl;
		std::cout << xtime::get_str_date_time(day_list_news[i].timestamp) << std::endl;
		std::cout << "name: " << day_list_news[i].name << std::endl;
		std::cout << "currency: " << day_list_news[i].currency << std::endl;
		std::cout << "country: " << day_list_news[i].country << std::endl;
		std::cout << "level_volatility: " << day_list_news[i].level_volatility << std::endl;
		std::cout << "previous: " << day_list_news[i].previous << std::endl;
		std::cout << "actual: " << day_list_news[i].actual << std::endl;
		std::cout << "forecast: " << day_list_news[i].forecast << std::endl;
	}

	/* найдем новость с заданным уровнем волатильности в пределах 20 минут от метки времени */
	for(xtime::timestamp_t t = min_timestamp; t <= max_timestamp; t += xtime::SECONDS_IN_MINUTE) {
		int news_state = ForexprostoolsApiEasy::NO_NEWS;
		iDataStore.filter(
			"EURUSD", 
			t, 
			xtime::SECONDS_IN_HOUR/3, 
			xtime::SECONDS_IN_HOUR/3, 
			true, // искать новости только с указанным уровнем волатильности
			true, // низкая волатильность
			false,// средняя волатильность
			false,// высокая волатильность
			news_state);
		if(news_state == ForexprostoolsApiEasy::NEWS_FOUND) {
			std::cout 
				<< "news_state: " 
				<< news_state 
				<< " date " 
				<< xtime::get_str_date_time(t) 
				<< std::endl;
			break;
		}
	}

	/* грузим ... историю */
	ForexprostoolsApi api; // класс API для работы с экономическим календарем
	std::vector<ForexprostoolsApiEasy::News> list_news; // список новостей
	// загружаем новости
	int err = api.download_all_news(
		xtime::get_unix_timestamp(1, 11, 2018, 0, 0, 0), 
		xtime::get_unix_timestamp(30, 11, 2018, 0, 0, 0), 
		list_news);
	return 0;
}
Для загрузки исторических данных есть готовая программа forexprostools-downloader.exe в репозитории в папке bin. Программа загрузит все новости, в том числе за текущий день, в хранилище данных. При повторном вызове программа перезапишет те торговые дни, где могли появиться новые данные, остальные дни не трогает. 


Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
2.2К | ★16
14 комментариев
Ivanka, это не весь функционал вируса. Еще программа с веб-камеры снимает пользователя, потом раздевает при помощи нейросетей, потом чат-бот шантажирует выложить видео в соцсети в популярные паблики. 
avatar
Ivanka, всегда можно собрать свой экзешник, чтобы быть защищенным
avatar
Ivanka, ТС разместил прямые ссылки на гитхаб — исходный код, екзешник как альтернатива для упрощения попытки попробовать новичку
согласен что нужно соблюдать бдительность, верно упомянули возможность потери из-за неразборчивого запуска программ
avatar
А можете привести пример запроса curl для всех новостей за 15.10.2019?
avatar
Евгений Шибаев, это сделать самому не сложно. Воткните в браузере http сниффер. Отследить трафф на инвестинг.

Увидите, что надо послать post запрос на /economic-calendar/Service/getCalendarFilteredData

и заполнить 7 полей. (country, timezone, dateFrom, dateTo...)
avatar
и чего получил то в итоге?
какой вывод?
Тимофей Мартынов, Если сюрприз на данных в три коровы больше стандартного отклонения, то вход в направлении сюрприза через минуту после выхода данных со стопом/профитом в 10-20 пунктов по 4-х знаку даст 10-20% годовых.
avatar
Негоциант, а новости из АПИ мы уже обработанные получаем? Извиняюсь за уточнение, но из статьи не понятно. Что такое волатильность новости, прогноз и прочие поля?
avatar
Dmitryy, Не знаю, какие получает новости топикстартер, я тупо ручками собрал в эксельку данные за несколько лет и уже из файла их тестил. Не грааль, из разных вариантов стратегий хоть что-то показывает то, что описал выше.

Волатильность новости, очевидно — ее важность, то насколько сильно она влияет на курс (важные данные/ второстепенные данные/ малозначимые данные). Критерий весьма условный, нестабильный.

Прогноз — известный заранее для большинства данных, консенсус аналитиков относительно того, какое значение данных будет опубликовано. Соответственно, сюрприз — это отклонение фактического значения от прогнозного.

Откройте экономический календарь на investing.com, будут понятны все прочие поля.
avatar
А там сайт (страничка календаря) парсится или интерфейс какой-то есть человеческий у них?
avatar
А в чем прикол? Что с этими новостями потом делать?
avatar
Dmitryy, выше Негоциант написал, можно у него уточнить, тема мало изучена
avatar

Читайте на SMART-LAB:
Фото
Эпоха дивидендов под вопросом. Что теперь делать инвесторам?
Привычный мир российского инвестора, похоже, уходит в прошлое. Если до сих пор для него главным аргументом в пользу покупки бумаг...
Фото
Мировой страховой рынок покажет рост в 2,3% в 2027 году – Swiss Re Institute
Swiss Re, одна из крупнейших и старейших в мире перестраховочных компаний, поделилась своим прогнозов в отношении мирового страхового рынка....
Фото
Записки инвестора. Ключевые тренды и события на рынке
«Записки инвестора» — еженедельная рубрика для быстрого погружения в рынок. Мы выделяем самые важные события, за которыми стоит следить — и...
Фото
Сбер РПБУ 6 мес. 2026 г. - кому нужны 30% доходности?
Сбер опубликовал финансовые результаты по РСБУ за 6 месяцев 2026 года. Чистая прибыль за полгода работы составила 995 млрд руб. (+20,4%). За...

теги блога elektroyar

....все тэги



UPDONW
Новый дизайн