29 июня 2013 г.

RVL + RVL Server. Как это работает

Связка RVL + RVL Server прошла путь от первых тестовых версий до стабильных релизов. Появление существенных изменений не предполагается, поэтому теперь можно описать то, как всё это работает и будет работать. Понимание процесса поможет найти решение проблем, возникающих при установке и эксплуатации.

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

Каждый день после полуночи по местному времени (Чикаго) CME Group публикует на своем FTP-сервере отчеты по совершенным за день сделкам. RVL Server загружает отчеты типа volprice (Volume by Price) с электронной площадки Globex, которые находятся в папке volprice/globex сервера в запакованном виде (формат GZip). Отчеты разбиты по трем биржам: CME, CBOT и NYMEX. Из отчетов CME берутся валюты и индексы, из CBOT - товары и индексы, из NYMEX - металлы и нефть. Отчеты для всех бирж имеют одинаковый формат, но одновременно на сервере есть отчеты в двух форматах - старом и новом (new в имени файла). Итого шесть файлов для каждого торгового дня. RVL Server загружает и обрабатывает только новые, так как в них больше инструментов (на момент написания загрузчика RVL Server).

3 октября CME Group прекратила публиковать данные, на основе которых работали сервисы объёмов и RVL Server. Программа не может загружать новые данные. Подробнее...

Отчет - это текстовый файл, данные в котором представлены в виде таблицы со столбцами фиксированной ширины. Формат отчета можно найти на сайте биржи (см. категорию Volume by Price, файл Excel File Layout). В отчетах сгруппированы сразу все торговые инструменты и их типы (фьючерсы и опционы). Для RVL были отобраны только популярные и ликвидные инструменты, для которых есть большое число данных.

Фрагмент отчета CME Globex, показано несколько ценовых уровней фьючерса EUR/USD, контракт 12/06, дата 2012-05-01):

.CME    LD      211438.EC        0620125           20120501GBX000000000132180000 000005104141.000003679.00003.00000001281.0000CDEIJ                                             .EC                     
.CME    LD      211438.EC        0620125           20120501GBX000000000132190000 000005414156.000003734.00000.00000001524.0000CDEIJK                                            .EC                     
.CME    LD      211438.EC        0620125           20120501GBX000000000132200000 000005592197.000003711.00001.00000001683.0000CDEIJK                                            .EC                     
.CME    LD      211438.EC        0620125           20120501GBX000000000132210000 000005582162.000003614.00001.00000001805.0000CDEIJK                                            .EC                     

Каждый инструмент в отчете может иметь свои масштабы цен и объемов. Для некоторых инструментов объем представлен в двойном размере, если сравнивать с другими источниками данных, это учитывается при загрузке в RVL Server. При разработке данных по нефти обнаружилось, что существует несколько инструментов с одинаковым кодом, из-за чего в эти отчеты данные попадают в смешанном виде. Для нефти это даёт заметное искажение распределения объемов, но данные все равно читаются, поэтому было решено оставить этот популярный инструмент. Цены некоторых инструментов могут быть представлены не в десятичном виде, а в дробном, такие инструменты в RVL Server не поддерживаются. Кроме того, есть такие инструменты, контракты по которым торгуются несколько лет. Например, золото. Данные по нему появились в отчетах только 17 сентября 2010 года, но уже в те дни в них были сделки по контрактам 2016 года. Это может исказить распределение за длительный период, например, за весь контракт.

Формат отчетов может измениться в любой день без предупреждения. За период существования программы и сервисов объема такое происходило дважды или трижды, во всех случаях это давало ошибки при загрузке данных. А еще есть данные с нулевой ценой, но ненулевым объемом, обычно такое происходит на дальних контрактах, такие данные в RVL Server не попадают.

Проблемы есть, но работать можно.

Загрузка и обработка данных, кэширование

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

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

Дневной отчет на сервере CMEЛокальная папкаБаза данных RVL Server

При запросе данных от индикатора RVL к RVL Server:

База данных RVL ServerКэш запроса RVL Server в той же БДФайловый кэш индикатораИндикатор RVL

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

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

Данные на сервере CME хранятся всего 3 месяца, поэтому был создан резервный сервер (см. RVL Server / Проблемы и решения), который также можно назвать кэшем. Цепочка загрузки данных может выглядеть теперь вот так:

Дневной отчет на сервере CMEРезервный серверЛокальная папкаБаза данных RVL Server

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

Взаимодействие RVL и RVL Server

Клиент (RVL) и сервер (RVL Server) общаются по стандартному сетевому протоколу HTTP, он используется для передачи запросов от клиента к серверу и получения ответов. Набор возможных запросов и ответов составляют собственный API. Это позволяет работать с сервером с любым клиентом, поддерживающим загрузку данных по HTTP.

Основное ограничение такого подхода состоит в том, что работа с сетью в MetaTrader (4 и 5) возможна только через внешнюю подключаемую библиотеку (DLL), поэтому приходится либо разрешать вызов DLL для всех скриптов, либо только для каждого экземпляра, возможность разрешить вызов DLL для всех экземпляров скрипта на всех графиках в MetaTrader отсутствует.

Особенности индикатора RVL

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

Чаще всего индикатор применяется на спотовых инструментах, например данные фьючерсного контракта EUR/USD накладываются на спотовый график EUR/USD. Но у этих типов инструментов почти всегда есть небольшой сдвиг, меняющийся каждый день. Автоматическое определение сдвига в индикаторе не реализовано, есть только параметр VerticalShift, с помощью которого можно вручную сдвинуть все гистограммы индикатора вертикально вдоль оси цены.

Некоторые техники анализа, основанные на распределениях объемов, используют так называемую Volume Area (иногда Volume Zone). К сожалению, определение этой зоны слишком спорное. В индикаторе реализованы вычисления только объективных параметров, имеющих четкое определение.

См. также

Комментариев нет:

Отправка комментария