Фильтрация списка инструментов и склейка фьючерсов через MOEX ISS API

5 февраля 2025, 14:56
Stanislav Korotky
0
66

В данной публикации приводятся дополнительные примеры работы с биржей MOEX через ISS API, интеграция с которой была описана в статье.

Оба примера связаны со срочным рынком, а точнее - с фьючерсами. Для компиляции потребуются заголовочные файлы из статьи.


moexfuts.mq5

Скрипт moexfuts.mq5 позволяет запрашивать списки инструментов (по умолчанию - товарных фьючерсов) с фильтрацией по заданной коллекции и для заданного перечня кодов ценных бумаг (AssetCodes).

Основные входные параметры:

input MOEX_MARKETS Market = futures·forts; // Market (forts by default)
input MOEX_BOARDS Board = forts·RFUD; // Board (for selected Market only!)
input MOEX_SECURITYCOLLECTIONS Collection = MOEX_SECURITYCOLLECTIONS::futures_forts_commodity; // Collection (for selected Market only!)
input string SortByColumn = "openposition"; // SortByColumn (hint:lasttradedate,openposition)
input bool DescendingOrder = true;
input string AssetCodes = "GOLD,SILV,PLT,PLD";
input string DefaultCurrency = "USD";
input datetime From = 0; // From (1970 = very beginning)
input MOEX_INTERVAL Timeframe = M1; // Timeframe (M1 recommended)

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

Настройки демонстрационного скрипта для MOEX

Колонки в данных, получаемых с разных рынков, могут отличаться, так что заполняйте SortByColumn валидным именем или введите пустую строку. Имеющие смысл примеры для фьючерсов подсказаны в комментариях: при сортировке по "openposition" оставьте DescendingOrder = true, при сортировке по "lasttradedate" замените DescendingOrder на false.

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

Глубина истории определяется параметром From.

Таймфрейм рекомендуется оставить равным M1.

Полученные данные - спецификации и бары - скрипт сохранит в папку MQL5/Files/MOEX.

При заполненном перечне AssetCodes скрипт дополнительно создаст соответствующие кастом-инструменты.

moex-forts-splice.mq5

Скрипт moex-forts-splice.mq5 демонстрирует склейку товарных фьючерсов - рынок (Market = futures·forts) и режим торгов (Board = forts·RFUD) прописаны константами. Большинство параметров аналогично предыдущим.

Режим склейки задается следующими входными параметрами:

enum ENUM_SPLICING
{
   NEXT_EXPIRING,   // Nearest expiring
   VOLUME_WEIGHTED, // Volume weighted
   TIME_WEIGHTED,   // Remaining days weighted
};

input ENUM_SPLICING SplicingAlgorithm = NEXT_EXPIRING;
input uint AveragingPeriod = 0; // AveragingPeriod (min)
Доступно 3 алгоритма на выбор: серия с ближайшей экспирацией, взвешенная сумма серий по объемам или взвешенная сумма серий по длительности оставшегося срока в обращении. Для двух последних имеет смысл включить усреднение (AveragingPeriod > 1, задается в минутах, так что на M1 величина 10 дает усреднение по 10 барам).

Сопутствующие обновления

Скрипты используют множество заголовочных файлов из статьи, два из которых были обновлены и также прилагаются здесь: ToyJson2.mqh и MapArray.mqh. В частности, MapArray ускорен на порядки.


Файлы: