Отображение новостного календаря
Введение

- Индикатор должен сам (без вмешательства пользователя) скачивать необходимый файл календаря с событиями на текущую неделю
- Индикатор должен отображать все события (как прошедшие, так и будущие) из этого файла в виде вертикальных линий с подписями названий новостей
- Индикатор должен следить за обновлением событий на внешнем
ресурсе
Техническая Часть
Обратимся теперь непосредственно к вопросу процесса скачивания файла из Интернета. Для этого мы будем использовать известную программу GetRight. Скачать ее можно здесь: http://www.getright.com/get.html или в списке файлов в конце статьи.
После того как Вы установите эту программу, Вам необходимо настроить GetRight на скачивание файлов в необходимую директорию. Это будет директория \files\html\ в папке вашего торгового терминала. Для этого просто нажмите F8 и измените значение в поле как это указано на рисунке:

Написание Индикатора
Теперь, после того как все преграды на пути разработки нашего индикатора разрушены, можно смело приступать к его написанию!
extern string HtmlAdress = "http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv"; extern string GetrightAdress = "c:\progra~1\getright\getright.exe"; #include <Time.mqh> #import "kernel32.dll" int WinExec(string NameEx, int dwFlags);
Внешних переменных будет всего 2, это адрес внешнего ресурса (в принципе менять этот параметр не надо) и адрес программы GetRight (по хорошему, чтобы не менять постоянно значение этой переменной при запуске индикатора, если вы установили GetRight в другую директорию, советую один раз поменять начальное значение в самом индикаторе). Для, непосредственно, запуска екзешника (GetRight.exe) нам потребуется воскользоваться функцией WinExec, которую мы импортируем из библиотеки Kernel32.dll. В библиотеке Time.mqh находятся функции для работы со временем в GMT поясе.
void DownloadCalendar() { Print("Downloading "+HtmlAdress+" to experts\files\html\Calendar.csv"); WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0); }
Как вы можете видеть благодаря использованию GetRight’а функция скачивания файла с внешнего ресурса выглядит очень просто. Параметр /W означает, что процесс не будет возвращен обратно в программу до полного скачивания файла, а /O, что при наличии файла с таким же именем, он будет перезаписан (overwrite). Напомню, что если Вы правильно изменили настройки GetRight’а, то календарь будет скачан по адресу \files\html\. Далее показаны две вспомогательные функции:
datetime PerviousMonday(datetime d) { datetime res = d - (TimeDayOfWeek(d)-1)*24*60*60; return(res); } datetime ToDate(string stDate,string stTime) { string WeekDay = StringSubstr(stDate,0,3); int WeekPlus = 0; if (WeekDay=="Mon") WeekPlus=0; if (WeekDay=="Tue") WeekPlus=1; if (WeekDay=="Wed") WeekPlus=2; if (WeekDay=="Thu") WeekPlus=3; if (WeekDay=="Fri") WeekPlus=4; if (WeekDay=="Sat") WeekPlus=5; if (WeekDay=="Sun") WeekPlus=-1; datetime Res = PerviousMonday(GetTimeGMT())+WeekPlus*24*60*60; datetime Tm = StrToTime(stTime); Res=Res+TimeHour(Tm )*60*60+TimeMinute(Tm )*60+TimeSeconds(Tm ) -TimeHour(Res)*60*60-TimeMinute(Res)*60-TimeSeconds(Res); if (StringFind(stTime,"PM")>=0) Res+=12*60*60; Res=Res-GetShiftGMT(); return (Res); }
Функция PerviousMonday() возвращает дату начала текущей недели. А функция ToDate() переводит дату и время из формата календаря в datetime.
void GrabNews() { int file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,','); if (file==-1||FileSize(file)==0) return; int i=0; while (!FileIsEnding(file)) { string stDate=""; while (!FileIsEnding(file)&&stDate=="") stDate = FileReadString(file); string stTime = FileReadString(file); string stTimeZone = FileReadString(file); string stCurrency = FileReadString(file); string stDescription = FileReadString(file); string stImportance = FileReadString(file); string stActual = FileReadString(file); string stForecast = FileReadString(file); string stPrevious = FileReadString(file); datetime Date = ToDate(stDate,stTime); color c=Green; if (stImportance=="Low") c = Yellow; if (stImportance=="Medium") c = Orange; if (stImportance=="High") c = Red; ObjectCreate("CalendarText"+i, OBJ_TEXT, 0, Date, Close[0]); ObjectSet("CalendarText"+i, OBJPROP_COLOR, c); ObjectSetText("CalendarText"+i, stDate + " : "+ stDescription, 8); ObjectSet("CalendarText"+i, OBJPROP_ANGLE, 90); ObjectCreate("CalendarLine"+i, OBJ_VLINE, 0, Date, Close[0]); ObjectSet("CalendarLine"+i, OBJPROP_COLOR, c); ObjectSet("CalendarLine"+i, OBJPROP_STYLE, STYLE_DOT); ObjectSet("CalendarLine"+i, OBJPROP_BACK, true); ObjectSetText("CalendarLine"+i, stDescription, 8); i++; } Max = i; if (file!=-1) FileClose(file); }
Основная процедура GrabNews() открывает уже скачанный файл \Html\Calendar. csv, считывает все параметры события и создает два объекта для каждой новости: вертикальную линию и текст. При этом календарь с событиями обновляется каждые 15 минут:
int start() { int counted_bars=IndicatorCounted(); //---- if (TimeCurrent()>LastTimeDownloading+15*60) { DeleteObjects(); DownloadCalendar(); LastTimeDownloading = TimeCurrent(); int file=-1; while (file==-1) file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,','); FileClose(file); GrabNews(); } //---- return(0); }
Выводы
P.S. Хочу отметить замеченную ошибку в работе календаря /go?link=https://www.dailyfx.com/calendar. Имейте ввиду, что иногда события из файла .csv с адреса http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv не совпадают со страничкой http://www.dailyfx.com/calendar/. Происходит это с новостями со временем выхода от 00:00 до 01:00 по GMT. В файле .csv эти новости указываются на 12 часов позже.
P.S.S. Так же хочу заметить, что индикатор пользуется внешними dll (kernell32.dll) поэтому необходимо во время запуска индикатора поставить соотеветствующую галочку в настройках.
Файл CalendarArticle.mq4 должен лежать в папке \experts\indicators. Time.mq4 - expers\library, Time.mqh - experts\include.
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Язык MQL4 для "чайников". Пользовательские индикаторы (часть 2)
Язык MQL4 для "чайников". Пользовательские индикаторы (часть 1)
Моделирование беттинга как средство развития "чувства рынка"
Индикатор Taichi - простая идея формализации показаний Ichimoku Kinko Hyo
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Может код продемонстрируете? Когда Вы использовали индикатор в оригинале, был сдвиг новостей что ли?
Ничего особенного просто пояс задается вручную там все новости все равно относительно гривича. У меня только так хоть что-то прорисовалось.
Индикатор судя по алертам зависал где то в области поиска времени со сдвигом.
у меня ошибка #include <Time.mqh>поиогите исправить..
Внимание 19 октября 2009 Daily смели ссылку на новости
прежняя
http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv
новая
http://www.dailyfx.com/files/Calendar-10-18-2009.csv
пользуюсь индикатором news.mq4 Булагина Андрея, прошу подсказать как заставить его работать с новой ссылкой ?
Рабочая версия
https://www.mql5.com/ru/code/9306
Спасибо! Всё работает, всё отлично..Но!
Небольшая лажа, после загрузки новостей, когда в одно и то же время выходят несколько новостных событий, они накладываются один на один! И прочитать почти невозможно.., приходится в ручную разъединять ..
Никак исправить нельзя?
Зараннее благодарен!