Календарь Форекс, а точнее бесплатный экономический календарь Forex

Дорогие друзья, самое важное при торговле на рынке Форекс – уметь управлять потерями. Если вы обладаете способностью управлять потерями на Forex, вы легко станете успешным трейдером. Успех Forex трейдера кроется именно в умении концентрироваться на защите того, что уже заработано.

Календарь Форекс, бесплатный экономический календарь Forex

Если с концепцией мы разобрались, давайте поговорим о таком инструменте как экономический календарь Форекс. Ежедневно по наиболее значимым для международного валютного рынка странам публикуется масса макроэкономической статистики, происходят значимые выступления официальных лиц и т.д. Понятно, что Forex трендерам необходимо быть в курсе этих событий. Именно для этого и нужен экономический календарь Форекс.


Календарь Форекс обычно состоит из самых важных событий на рынке Forex. Это своего рода компас на валютном рынке Форес. Проблема в том, что подобные данные зачастую не являются общедоступными. Точнее говоря, вы всегда можете воспользоваться экономическим календарём форекс на том же RoboForex. Выполнен он там очень красиво, хотя и работает несколько коряво. Можете добавить на свой сайт экономический календарь ForexPros. Достаточно динамическая штука, которую легко настроить и оформить должным образом. Но всё это не то.

Всё выше перечисленное не позволит вам собрать и проанализировать нужную вам информацию по рынку Forex. По крайней мере, в полном объёме. Конечно, существуют сервисы позволяющие получить всё выше перечисленное, но не бесплатно. Парадокс, но то за что на западе никто даже не задумается брать деньги, у нас продают втридорого. И ведь находятся те, кто всем этим пользуется, платит и т.д. Экономический календарь Форекс - это мощный инструмент в умелых руках!

В данном посте я хочу рассказать вам о том, как получить всю необходимую информацию бесплатно. Для этого я написал простой PHP-парсер CSV данных экономического календаря Forex с сайта DailyFX. Проблема в том, что эти данные не содержат примечания (Note), а также даны на английском языке. В тоже время, и эту проблему очень легко решить, но об этом я расскажу, как ни будь потом. Подпишитесь на RSS-ленту блога и вы узнаете много нового и интересного. Сейчас же давайте разбираться с моим php-парсером.

PHP-парсер CSV данных экономического календаря Форекс с DailyFX

И так. Для работы нам понадобится функция считывания CSV данных по указному URL. По сути, здесь достаточно много вариантов. Например, можно использовать php-функцию file_get_contents(). Это хороший вариант, особенно если использовать её совместно с php-функцией stream_context_create(). Я же буду использовать свою функцию get_curl_contents(), которую уже упоминал в посте Бесплатный информер Евро 2012. Если что, ищите её код там.

А теперь от слов к делу. Для начала определим переменную $url, значение которой является URL-адрес фала данных экономического календаря Форекс. К сожалению, нужный нам файл не имеет статичного адреса. Например, на момент написания поста, последний файл экономического календаря на DaileFX имел адрес:

http://www.dailyfx.com/files/Calendar-06-10-2012.csv

Это не значит, что данные в нём настолько устарели. Просто они начинаются с 10 июня 2012 года и заканчиваются, по всей видимости, прогнозом на следующий день, т.е. 15 июня 2012 года. Попытка обратиться к данным за текущий день 14 июня 2012 года по адресу:

http://www.dailyfx.com/files/Calendar-06-14-2012.csv

Приведёт к ошибке «Page not found». Имеем два варианта решения проблемы. Прописывать нужный адрес вручную, или воспользоваться парсером. Я выбрал второе. Конечно, это лишний запрос к серверу, но те не менее.

$url = 'http://www.dailyfx.com/calendar/';
$data = get_curl_contents($url);
if ( preg_match('/<a href=\"\/files\/Calendar-([0-9-]{1,10})\.csv\">/isUm', $data, $m) ) {
  $url = 'http://www.dailyfx.com/files/Calendar-' . $m[1] . '.csv';
}

Всё просто. Я скачал страницу содержание страницы с экономическим календарём и нашёл в нём нужный мне адрес, а точнее его фрагмент, из которого сформировал полный адрес CSV файла данных.

Осталось считать данные и привести их в удобный для обработки вид. Благо CSV формат очень прост. Он представляет собой строки данных, первая из которых это название полей. Сами же данные разделены символом запятой (,), но всё по порядку.

Для начала давайте скачаем CSV данные в переменную $data, я это делаю так:

$data = get_curl_contents($url);

Далее разбиваем строковое значение в массив строк данных по символу переноса строки. Для этого я использовал следующий код:

$data = preg_split('/((?<!\\\|\r)\n)|((?<!\\\)\r\n)/', $data, -1, PREG_SPLIT_NO_EMPTY);

По идее он должен учитывать разные комбинации символов \r и \n. К тому же в массив не попадут пустые строки, за что отвечает константа PREG_SPLIT_NO_EMPTY

Как я и говорил, в первой строке содержатся названия полей (столбцов) данных. В частности: Date (день недели, месяц и день месяца), Time (время), Time Zone (часовой пояс, у меня везде GMT), Currency (валюта), Description (событие), Importance (важность или волатильность), Actual (фактическое значение), Forecast (прогноз) и Previous (предыдущее значение). Очевидно, что ориентироваться по таким ключам массива куда как удобней цифровых индексов. Поэтому прежде чем удалить эту строку из данных, присвоим ее (уже в виде массива) переменной $fields.

$fields = preg_split('/,/', $data[0]);
unset($data[0]);

Пока не слишком понятно, куда это приткнуть, но наберитесь чуть-чуть терпения, и вам воздастся по заслугам.

А теперь приступаем непосредственно к обработке строк в переменной $data.

foreach ( $data as $k=>$v ) {
  $v = trim($v);
  $v = preg_split('/,/', $v);
  foreach ( $v as $i=>$j ) {
    $v[$fields[$i]] = $j;
    unset($v[$i]);
  }
  $data[$k] = $v;
}

Всё просто. Каждая строка это набор данных разделённых символом запятой (,). Мы преобразовали строку в массив, а потом перебрали его элементы. Сделано это для того, чтобы создать новые с названием полей из переменной $fields и убрать старые с индексами в виде целочисленных значений. Таким образом, в переменной $data мы получаем многомерный массив. Например:

array(151) {
  [1]=>
  array(9) {
    ["Date"] => "Sun Jun 10"
    ["Time"] => "02:55"
    ["Time Zone"] => "GMT"
    ["Currency"] => "cny"
    ["Description"] => "CNY Exports (YoY)"
    ["Importance"] => "Low"
    ["Actual"] => "15.3%"
    ["Forecast"] => "7.1%"
    ["Previous"] => "4.9%"
  }
}

Ещё раз обращаю ваше внимание на то, что после Date содержит только день недели, месяц и день месяца. Там отсутствует год. Его мы можем получить из фрагмента файла, который легко можно преобразовать в метку времени UNIX. Например, так:

$url = 'http://www.dailyfx.com/calendar/';
$data = get_curl_contents($url);
if ( preg_match('/<a href=\"\/files\/Calendar-([0-9-]{1,10})\.csv\">/isUm', $data, $m) ) {
  $pubdate = strtotime($m[1]);
  $url = 'http://www.dailyfx.com/files/Calendar-' . $m[1] . '.csv';
}

В дальнейшем, чтобы получить день, месяц и/или год используйте функцию date(). Например, вот как я получил год публикации CSV файла экономического календаря Форекс так:

$pubdate_year = date('Y', $pubdate);

Также стоит отметить, что здесь используется GMT время. Для того чтобы получить нужную дату, например, для Киева (GMT +02:00) надо прибавить к имеющейся дате два часа. Например.

$offset = 2*60*60;
echo strtotime($v['Date'].' '.date('Y', $pubdate). ' '.$v['Time']) + $offset;

Надеюсь, что суть вы уловили.

Послесловие

В принципе играть с данными экономического календаря Форекс с DailyFX можно как угодно. Так мне представляется интересным забивать данные в базу и накапливать их для дальнейшего анализа. В качестве идентификатора можно использовать значение md5() строки. Это позволит избежать дублей. Впрочем, это совсем другая тема. Того же, что сказано более чем достаточно для написания простенького, но столь нужного Forex трейдеру скрипта экономического календаря. Удачи!

С уважением, Константин

Коротакая ссылка: http://goo.gl/DQy3q

Twitter Facebook ВКонтакте Одноклассники Google+

2 комментария:

Анатолий Галкин
Доброго времени суток.

Хотел бы задать вопрос по экономическому календарю, а именно..
Пытаюсь торговать на Forex на новостях, к сожалению ничего не выходит, так как
в момент выхода новости, происходит сильное проскальзование цены, в плоть до того,
что цена после скачка начинает откатываться обратно.
Вопрос решился бы если бы у меня было 2 секунды, т.е. я бы узнал новость за 2 секунды
до того как мой браузер покажет данные с сайта.
Решений вижу несколько:
1) Ускоренный парсинг в пару минут перед выходом новости;
2) Парсинг первоистока, т.е. кто-то же раздает данные новости для всех сайтов?!
3) Парсить не сайт с эконом.календарем, а сам первоисточник.

Вот такие у меня умозаключения, скажите есть какие-то советы по этой теме?

Спасибо.
Константин Кирилюк
2Анатолий Галкин Парсить можно с любой периодичностью и когда угодно. Здесь всё зависит лишь от того насколько серьёзный у первоисточника канал. Иногда, если создаётся слишком сильная нагрузка некоторые сайты просто блокируют доступ по IP и т.п.

Про первоисточник мне ничего не известно. Я нашел вот только такой с dailyfx.com.
Отправить комментарий