Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

EcLib - библиотека для MetaTrader 4

Просмотров:
5250
Рейтинг:
(20)
Опубликован:
2016.04.06 16:17
Обновлен:
2016.11.22 07:32
\MQL4\Experts\ \MQL4\Include\ \MQL4\Libraries\ \MQL4\Scripts\
Files.zip (329.98 KB)
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

About

Библиотека EcLib для языка MQL4 предназначена для работы с экономическим календарем и позволяет:

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

ВАЖНО

  • Перед применением библиотеки на реальных счетах проведите ее проверку на демо-счете или вручную.
  • При ручном изменении справочника значения нужно добавлять в конце, чтобы не нарушить кодировку существующей базы данных
  • для обеспечения целостности и сохранности данных дата и время всех событий в базе данных совпадает с внутренним временем сайта ec.forexprostools.com, а именно: GMT универсальное (+00:00). Используйте приведение к местному времени и/или времени сервера по необходимости
  • Библиотека использует некоторое количество глобальных переменных терминала. Не удаляйте и не изменяйте их
  • Для текущего автоматического недельного обновления сайт ec.forexprostools.com должен быть добавлен в список разрешенных url
  • дата праздников указана по местному времени страны праздника; время 00:00 добавляется программно


Структура файлов

Для обеспечения совместимости библиотеки с терминалом MT5 и обеспечения работы в режиме тестирования стратегий неисполняемые файлы (бд, справочник и проч.) должны быть расположены в общей папке всех клиентских терминалов \Terminal\Common\Files\ в выделенном для работы библиотеки подкаталоге \ec; итоговое расположение файлов должно быть следующим (жирным шрифтом выделены обязательные файлы):

\MQL4\

Libraries\

EcLib.ex4

Experts\

EcExpert.ex4

Scripts\

WeekUpdate.ex4

Include\

EcHeaders.ex4

\Terminal\Common\Files\ec\

ec0_db.txt

ref.txt

EcLib.chm

DB\

ec.ini

ref.csv

ref00.csv

words.csv

ec0_db.dat

HTML\

ec.forexprostools.com.html

Economic Currency Calendar & Forex Calendar - Yahoo! Finance.html

 

Файлы .ex4 должны быть скомпилированы в .mq4

Путь к папке \Terminal\Common\Files\ можно узнать в том числе программно:

= TerminalInfoString(TERMINAL_COMMONDATA_PATH)

База данных календаря хранится в бинарном формате в файле ec0_db.dat в виде набора событий. Событие представляет собой переменную структуры ec_struct


Файл настроек (ec.ini)

Файл настроек библиотеки содержит ряд параметров, используемых разнличными функциями. Указание на параметр заключается в квадратные скобки [] и следующей строкой идет само значение (либо набор значений) параметра. В случае набора значений они перечисляются через ‘;’

[GMT2serverShiftMin]

120

Временной сдвиг между временем GMT и временем сервера в минутах.

По умолчанию для МСК установлен на 2 часа

[EcExpert]

Параметры служебного эксперта

2015.12.01 00:00:00

Начальные и

2016.04.01 00:00:00

конечные дата/время для выгрузки базы данных в .csv файл

[FetchWeek]

Параметры функции FetchWeek()

[source]

Источники данных

1

В текущей версии используется только ec.forexprostools.com, так как Yahoo не дает полные данные на текущую неделю

[country]

Коды стран ref[3], новости по которым надо загружать.

1;2;3;4;7;8;9;10;11;12;16

[volatility]

Важность новостей

3;2;1

[Source1]

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

[html]

Имя .html файла, содержащего выгрузку новостей (ручную или автоматическую)

ec.forexprostools.com.html

[folder]

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

DB

[modified]

Дата/время изменения файла выгрузки. Функция EcUpdate() сверяет этот параметр с временем .html файла источника и если они не совпадают (.html был обновлен вручную или автоматически) принимает решение обновить базу данных

 


Справочник (ref)

Справочник содержит описание параметров события (страна, валюта и проч.) и коды этих параметров. В базе данных события хранятся в закодированном, соответственно, виде. Файл справочника - ref.csv – представляет собой набор слов, где каждая строка – перечисление значений одной статьи справочника, разделенные ‘;’. Каждая новая строка – новая статья. В самой первой строке хранится перечисление самих статей справочника так же через ‘;’

При работе библиотеки справочник загружается в двумерный массив, где первое измерение соответствует статье (например, «страна»), а второе – элементу данной категории (например, «Франция»). Кодировка в явном виде не хранится, она получается из порядкового номера элемента, причем начинается всегда с 1. Нулевой код (индекс) не используется (зарезервирован). Соответственно при изменении справочника элементы нужно добавлять строго в конце, нельзя удалять элементы или менять их порядок тем или иным способом, поскольку это нарушит работу базы данных (на самом деле можно, но не желательно. При реиндексации, которая последует за изменением справочника, все будет нормализовано)

Обновляться Справочник может как в ручном, так и в полуавтоматическом режиме в процессе обновления базы данных. Если функция EcUpdate() вызвана не из индикатора и не в режиме тестера стратегий и в новых данных обнаружены новые страны и/или валюты, она запросит разрешения на добавление элемента в Справочник. Если пользователь уверен, что страна/валюта правильные, он принимает предложение и обновление продолжается; в противном случае обновление прерывается и в созданный файл ec\ERROR.txt будет записано описание ошибки. В этом случае необходимо вручную добавить в файл ref.csv недостающие данные (см. раздел ВАЖНО! выше в этом документе)

При каждом вызове функции ref_load() (вызывается она почти всегда другими функциями библиотеки) справочник выгружается в текстовый файл ref.txt, где в явном виде перечислены все категории и элементы справочника с указанием кодов.

Строго говоря, функция ref_load() обычно обращается не напрямую к ref.csv а к его точной копии – ref00.csv. Если же ref.csv был изменен процедура обновления начинает переиндексацию базы, в ходе которой используюся оба этих файла; по окончании переиндексации ref00.csv снова содержит точную копию ref.csv.


Каталог слов (words)

Обычно любое событие, как мы его видим, например, на сайтах, содержит минимум одну текстовую строку-описание события (Title), например

Caixin Manufacturing PMI (Dec) бла-бла-бла

Данная строка содержит как структурированную информацию, так и обычную. Структурированная информация здесь – во-первых - Manufacturing PMI - что представляет собой экономический показатель, во-вторых – (Dec) - что означает период, за который данный показатель представлен. Указание на источник данных (издатель новости) – Caixin. При кодировании базы данных библиотека анализирует подобные строки (описания) и вычленяет из них структурированную информацию. Например, Manufacturing PMI будет выделен как экономический показатель, закодирован и записан в поле .Cat_ID структуры события; также будет выделено слово (Dec) как период и записано в поле .Period_ID. Источник информации – агенство/институт или иное - Caixin - будет записан в поле .EventSource - старший байт составного поля .SOURCE_ID, а оставшиеся от исходной строки слова бла-бла-бла будут закодированы в поле .Words_ID события.

Поле .Words_ID служит для сохранения всей произвольной информации, которая осталась после вычленения из строки-описания структурированных данных, для которых предусмотрен Справочник. Представляет собой тип Ushort. Данный подход позволяет избавиться от текстовых строк и полностью перевести базу данных в числовой вид, что позволяет использовать бинарный формат хранения данных и значительно ускоряет работу всей библиотеки, равно как и снижает размер базы данных.

Каталог слов, соответственно, это хранилище подобных бла-бла-бла строк, организованное в файле words.csv. Индексация производится с нуля, подобно Справочнику в явном виде не хранится и рассчитывается автоматически при загрузке каталога в массив через позицию элемента (номер строки файла). Когда нужно распаковать базу данных в текстовый файл, например, программа сопоставляет полю .Word_ID строку из каталога, используя его код.

Следует также отметить, что строка-описание может хранить, помимо названных, еще и такие структурированные данные, как «сравнение». Сравнение представляет собой общепринятый экономический термин, показывающий как именно следует читать заявленный показатель, например YoY (Year over Year) означает, что показатель рассчитан за некий текущий период по отношению к такому же периоду предыдущего года, MoM – прирост по отношению к такому же периоду прошлого месяца.

Например

Retail Sales (YoY) (Nov)

Следует читать как «розничные продажи в ноябре по отношению к ноябрю прошлого года составили…» в процентах, а строка

Industrial Production (MoM) (Nov)

Содержит данные по промышленному производству за ноябрь по отношению к прошедшему месяцу (октябрю).

MoM или YoY будут выделены в категорию «сравнение» справочника, закодированы и записаны в поле .Compare_ID составного поля .PACK структуры события. Таким образом в структуре события наряду со «словесной» песочницей хранятся структурированные данные в отдельных полях, что позволяет организовать к ним доступ, выбрав, например, все данные за ноябрь по отношению к предыдущему году по определенному показателю.

Поскольку каталог слов хранит произвольную информацию – он обновляется автоматически и не требует ручного вмешательства.


Обновление базы данных

В текущей версии библиотеки доступны два способа обновления базы данных:

1. Вручную - произвольный интервал, доступный на сайте - через выгрузку .html страницы:
  • зайдите на сайт-источник (например, http://ec.forexprostools.com):
  • настройте календарь;
  • сохраните .html файл в папку \Terminal\Common\Files\ec\HTML
  • вызовите функцию EcUpdate(). Функция проверяет наличие базы данных, наличие .html файла и его актуальность. При соблюдении всех условий происходит обновление базы данных. При отсутствии базы данных она создается
  • Программа использует стандартную структуру календаря на сайте (количество столбцов и проч.). Проверка работоспособности с другими форматами не проводилась. Настоятельно рекомендуется использовать универсальное время (GMT +00:00) для выгрузок с сайта.

2. Автоматически, используя функцию FetchWeek(), которая загружает данные текущей недели в виде .html файла, затем надо вызвать функцию EcUpdate().


Подключение библиотеки

Функции библиотеки делятся на внешние и внутренние. Внутренние - это служебные (технические) части программы; внешние доступны для вызова из других программ при подключении библиотеки. Внешние функции в коде библиотеке имеют ключ export, соответственно можно функции внутренние сделать внешними.

Подключение (импорт) функций библиотеки в пользовательской программе в языке MQL4 осуществляется с помощью открывающей и закрывающей директивы #import, например:

#import     "EcLib.ex4"
int         EcUpdate(   uchar       Source);
void        error2log(  string      error_str);
bool        FetchWeek(  uchar       Source); 
void        dat2txt(    string      FileName,
                        datetime    TimeStart,
                        datetime    TimeEnd,
                        int         TimeShift,
                        int         PathFlag,
                        bool        Shrt);
void        ref_load(   string      &ref_array[][150],
                        string      &words_array[]);
#import

Можно подключать не все функции, а только те, которые будут использоваться. Функции необходимо объявлять полностью, с указанием параметров. Импорт функций начинается и заканчивается директивой #import, в первой строке указывается имя исполняемого файла библиотеки в папке MQL4\Libraries

Большинство функций не требуют описания структуры ec_struct в пользовательской программе; если потребность в этом возникла необходимо включить файл описания директивой #include <EcHeaders.mqh>

#include  <EcHeaders.mqh>

Функции

Внешние функции

EcUpdate

bool      EcUpdate(
uchar     Source)

Обновляет базу данных календаря и возвращает количество обновленных событий. Функция проверяет наличие .html выгрузок и, если такая выгрузка есть и/или обновлена, запускает процедуру обновления. Если база данных не существует – она будет создана. Предусмотрено полуавтоматическое обновление Справочника в процессе обновления базы данных. Если функция вызвана не из индикатора и не в режиме тестера стратегий и в новых данных обнаружены новые страны и/или валюты, функция запросит разрешения на добавление элемента в Справочник. Если пользователь уверен, что страна/валюта правильные, он принимает предложение и обновление продолжается; в противном случае обновление прервется и в созданный файл ec\ERROR.txt будет записано описание ошибки

1. Инициализация

  • По умолчанию устанавливает режим обновления ADD_NONE (обновление не требуется)
  • Проверяет настройки ec.ini в разделе [SourceSource] и если .html выгрузка по источнику изменилась включает режим обновления ADD_MIX
  • Если база данных не найдена включает режим ADD_CREATE
  • Если изменился ref.csv по отношению к своей зеркальной копии – ref00.csv – запускает реиндексацию базы данных

2. Загрузка

  • Если обновление требуется, база данных найдена и .html выгрузка существует читает базу данных 0 (исходную) в память
  • Запускает преобразования из .html выгрузки в базу данных 1 (новая)
  • читает базу данных 1 (новая) в память
  • При чтении обеих баз данных вычисляет их временные границы и по умолчанию устанавливает бит обновления .Upd_bit для всех событий

3. Обновление в режиме ADD_MIX

  • Разбивает процесс обновления на три этапа:
  • I. Копируются все ранние события из одной из двух баз (в зависимости от того, чей временной интервал начинается раньше) до начала пересечения временных интервалов
  • II. Попарно сравнивает события двух баз по ряду параметров в интервале плюс минус сутки (чтобы найти событие даже если время изменилось). Если обнаруживает совпадение то, в зависимости от того, где содержатся более свежие данные, выключает бит обновления .Upd_bit для устаревшего события в одной из двух баз. Таким образом событие не попадет в обновленную базу данных. Записывает событие в обновленную базу данных
  • III. Копируются все поздние события из одной из двух баз (в зависимости от того, чей временной интервал простирается дальше) после окончания пересечения временных интервалов
4. Обновление в режиме ADD_CREATE
  • Просто создает базу данных 0 и копирует в нее базу данных 1


FetchWeek

bool      FetchWeek(uchar Source)

Подключается к заданному источнику и загружает .html страницу с данными текущей недели. Использует функцию WebRequest языка MQL4, поэтому ее нельзя использовать в индикаторах и в режиме тестера стратегий. Функция настраивается в файле ec.ini в разделе [FetchWeek] (можно указать источники, страны и важность событий, которые надо загружать).

В текущей версии библиотеки не рекомендуется использовать другие источники кроме 1. Возможны ошибки

int Source

Код источника данных (сайт)

1 forexprostools

2 yahoo

 


EcCopy

int        EcCopy(
datetime   TimeStart,
datetime   TimeEnd,
ec_struct  &ec_array[])

Копирует из базы данных события (включая праздники) в массив структур типа ec_struct; возвращает количество скопированных событий.

datetime TimeStart

datetime TimeEnd

Начальная и

конечная дата/время

(включительно)

ec_struct &ec_array[]

 


EcNewsCount

int        EcNewsCount(
datetime   TimeStart,
datetime   TimeEnd,
uchar      DaysAhead,
uchar      Currency_ID,
uchar      Volatility_ID,
uint       &EventTime[],
uchar      &EventCurrency[],
uchar      &EventVolatility[])

Возвращает количество событий новостного типа (EventType_ID = 2) по указанной валюте указанной значимости за указанный интервал. Использует упреждающее чтение бд для минимизации обращений к файлам (задается пользователем через параметр DaysAhead). При каждом вызове функция проверяет наличие в буферных массивах нужных данных и если не находит – производит чтение бд и добавляет данные, в противном случае сразу вычисляет результат через буферные массивы в памяти.

Принудительно обнуляет буферные массивы и заполняет их заново в следующих случаях:

  1. При обновлении бд
  2. при Currency_ID = NULL
  3. Если интервал (TimeStart, TimeEnd) за пределами временного интервала ранее прочитанного в бд и сохраненного в EventTime[0] и EventTime[1]

При очередном чтении бд функция будет заполнять буферные массивы событиями в интервале:

  • от TimeStart до TimeEnd+DaysAhead (в секундах), если буферные массивы были пустые (при первом вызове функции или принудительном обнулении (см. выше)
  • от EventTime[0] до EventTime[1], если в буферных массивах уже были данные и проверка на временной интервал пройдена, т.е. (TimeStart, TimeEnd) внутри (EventTime[0], EventTime[1])

datetime TimeStart

datetime TimeEnd

Начальная и конечная дата/время (включительно) для подсчета новостей

uchar DaysAhead

Количество дней вперед. Параметр нужен для оптимизации работы функции (память/скорость). Если функция вызывается часто (например, в тестере стратегий) установите большое значение параметра. Максимальное значение = 255.

uchar Currency_ID

Код валюты

1 USD

2 EUR

3 GBP

NULL все

uchar Volatility_ID

Код значимости события (волатильности)

1 low

2 moderate

3 high

NULL все

uint &EventTime[]
uchar &EventCurrency[]
uchar &EventVolatility[]

Динамические массивы (буферные), в которые функция выгружает определенные поля базы данных календаря за определенный период. При повторных вызовах поиск производится в этих массивах в памяти, что значительно ускоряет работу функции

Первые два элемента этих массивов – служебные. EventTime[0] и EventTime[1], если массивы не пустые, содержат временной интервал, который был прочитан из бд на предыдущем вызове, т.е. от TimeStart до TimeEnd+DaysAhead

Данный подход гарантирует, что если в массивы добавлялись данные, временной интервал событий в массивах всегда одинаковый

 


dat2txt

void      dat2txt(
string    FileName,
datetime  TimeStart,
datetime  TimeEnd),
int       TimeShift,
int       PathFlag
bool      Shrt)

Выгружает базу данных из файла FileName.dat за указанный интервал в текстовый файл; в качестве разделителя по умолчанию используется знак ‘;’ (можно исправить в коде функции, переменная uchar delimiter). Вывод производится в файл с расширением .csv и легко открывается в MS Excel.

string FileName

Имя базы данных (без расширения)

datetime TimeStart

datetime TimeEnd

Начальная

и конечная дата/время

(включительно; GMT)

int TimeShift

Положительный временной сдвиг (+) в секундах: в текстовом файле дата/время события будут указаны с учетом сдвига, кроме праздников (останутся по местному дате/времени страны происхождения)

int PathFlag

Флаг пути для сохранения текстового файла:

0 \MQL4\Files\ec

FILE_COMMON \Terminal\Common\Files\ec

bool Shrt

Краткая (true) или полная (false) версия

 


ref_load

void      ref_load(
string    &ref_array[][150],
string    &words_array[])

Читает файлы справочника и каталога слов; загружает их в массивы; выгружает справочник в текстовый файл ref.txt.

string &ref_array[][150]

Двумерный массив справочника; индексация начинается с 1.

string &words_array[]

Массив для каталога слов

 


Внутренние функции

EcDbReIndex

int        EcDbReIndex()

Поскольку справочник со временем может обновляться (например, добавляются новые экономические показатели или периоды показателей или единицы измерения), может возникнуть потребность в переиндексации всей базы. Данная функция вызывается автоматически во время процедуры обновления, если файл ref.csv был изменен. Реиндексация всей базы может занять какое-то время.


Структура данных (события)

База данных календаря хранится в бинарном формате в файле ec0_db.dat в виде набора событий. Событие – в файле или в памяти – хранится в виде структуры:

struct

ec struct

{

uint

DT

uint

Modified

uint

ID

uint

Event_ID

float

Actual

float

Forecast

float

Previous

ushort

PACK

[0000 0000 0000 0011]

Volatility_ID

[0000 0000 0000 1100]

Duration_ID

[0000 0000 1111 0000]

Compare_ID

[0000 1111 0000 0000]

Measure_ID

ushort

CAT_ID

[0000 0000 1111 1111]

Cat3

[1111 1111 0000 0000]

Cat2

ushort

SOURCE_ID

[0000 0000 1111 1111]

DataSource

[1111 1111 0000 0000]

EventSource

ushort

Words_ID

uchar

FLAGS

[0000 0011]

EventType_ID

[0000 1100]

(N.)S.A.

[0001 0000]

Revised

[0010 0000]

Preliminary

[0100 0000]

Country’s

[1000 0000]

Upd_bit

uchar

Country_ID

uchar

Currency_ID

uchar

Period_ID

}

 


Структура спроектирована таким образом, чтобы обеспечить максимальное быстродействие и минимальное использование ресурсов компьютера (памяти, дискового пространства); например, одно поле размером 1 байт может использоваться для хранения нескольких параметров (таких как bool). Такие поля называются составными, их имена состоят из заглавных букв и выделены жирным выше. Все элементы структуры представляют собой числовой тип. Для преобразования в текстовый вид (например, для чтения новостей напрямую или для преобразования исходного html файла) используется Справочник. Далее перечислены поля структуры, в скобках [] указана категория справочника, если поле к нему привязано (см. ref.txt); порядок полей определяется их размером (это связано с оптимизацией размера структуры) – от большего к меньшему.

uint DT

Дата/время события в виде секунд, прошедших с DTSTART = 2000.01.01 00:00:00, вместо полноразмерного типа datetime использован вдвое меньший тип uint, который позволяет хранить информацию в диапазоне до 136 лет. Специальная константа DTSTART используется для приведения поля .DT к типу datetime

uint Modified

Дата/время последнего изменения события, равно времени html выгрузки, из которой получены данные. Используется в ходе обновления базы данных

uint ID

Внутренний уникальный код события. Присваивается программно при обновлении бд или любых других манипуляциях с последней. Работает аналогично любым СУБД, т.е. при удалении события код тоже удаляется и новое событие получает новый код

uint Event_ID

Внутренний код события сайта-источника

float Actual

float Forecast

float Previous

[00] Volatility_ID

Значимость события (предполагаемая волатильность) [9]. Устанавливается сайтом-источником

1 low

2 moderate

3 high

[00] Duration_ID

Длительность события [7]

1 allday. Событие не имеет точного указания времени и длится целый день (например, праздники)

2 exact. Точное (точечное) указание времени

3 tentatitive. Плавающее время

[0000] Compare_ID

Метод сравнения [6] - представляет собой общепринятый экономический термин, показывающий как именно следует читать заявленный показатель, например YoY (Year over Year) означает, что показатель рассчитан за некий текущий период по отношению к такому же периоду предыдущего года, MoM – прирост по отношению к такому же периоду прошлого месяца.

1 MoM

2 QoQ

3 YoY

4 WoW

[0000] Measure_ID

Единица измерения показателя (полей Actual, Forecast, Previous)

1 %

2 N

3 K

4 M

5 B

6 T

ushort CAT_ID

Экономический показатель (категория новостей)

[00000000] Cat3

Подкатегория.

[00000000] Cat2

Показатель верхнего уровня [4].

ushort SOURCE_ID

Источник

[00000000] DataSource

[12] Источник данных. Сайт, с которого непосредственно были загружены данные, например, Yahoo

[00000000] EventSource

[12] Источник события, издатель новости. Если новость была загружена с сайта издателя новости, EventSource = DataSource

[00] EventType_ID

Тип события [8]

1 holiday. Праздник/выходной

2 news. Новость (выступления, публикация статистики и проч.)

[0] Country’s

Когда этот бит включен, функция dat2txt() добавляет страновую принадлежность в начало строки-описания, например, Italian. Сделано исключительно для сохранения аутентичности исходной информации, полезной нагрузки не несет, так как страна уже указана в соответствующем поле

[0] Upd_bit

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

uchar Country_ID

Страна-источник события [3]

uchar Currency_ID

Валюта страны-источника события. Одна из двух составляющих валютной пары

Int Period_ID

 

GRID_ORDERS GRID_ORDERS

Выставляет сетку отложенных ордеров.

Pivot_BOX Pivot_BOX

Дневные уровни поддержки и сопротивления.

Calendar + Market Hours Calendar + Market Hours

Использует библиотеку Eclib. На графике отображает новости недели (страны, важность, валюты - настраиваются) и часы работы рынков.

TickSpeed TickSpeed

Измеритель скорости движения цены с записью в файл для дальнейшей обработки.