Экспортирует часовые свечи и обезличенные сделки из терминала QUIK по группе инструментов. Отправляет данные по протоколу JSON-RPC 2.0 через jsonrpc-fsproxy. Не требует установки дополнительных Lua библиотек. Есть функционал оповещения о возникающих в работе скрипта проблемах
Отправляет информацию с последней доступной свечи на сервере до текущей в том случае, если есть не отправленные на сервер свечи. Проверяет данное условие с периодичности раз в минуту
После запуска единоразово отправляет все сделки, которые есть на данный момент в таблице обезличенных сделок. Подписывается на обновление по обезличенным сделкам и отправляет их пачкой раз в минуту.
При проблемах с отправкой данных о торговых свечах делает 3 попытки с интервалом 15 секунд, если отправить не удалось, сообщает о проблеме и пытается отправить данные в следующем цикле отправки (в начале следующего часа).
При проблемах с отправкой обезличенных сделок делает 3 попытки с интервалом 15 секунд, если отправить не удалось, сообщает о проблеме и завершает работу.
- Переименовать
config.lua.dist
вconfig.lua
и сконфигурировать - Запустить jsonrpc-fsproxy с указанием корректного адреса JSON-RPC сервера и файлов обмена данными
- Открыть в терминале QUIK окно "Доступные скрипты" (в главном меню перейти в "Сервисы" и выбрать "Lua скрипты...")
- Добавить файл main.lua и запустить
local QuikQuotesExporter = require('src/quik_quotes_exporter')
return {
rpcClient = {
-- Файл для отправки запроса.
-- Переменная окружения INPUT_FILE_PATH, заданная при запуске jsonrpc-fsproxy.
requestFilePath = 'Z:\\dev\\rpcin',
-- Файл для получения ответа.
-- Переменная окружения OUTPUT_FILE_PATH, заданная при запуске jsonrpc-fsproxy.
responseFilePath = 'Z:\\dev\\rpcout',
-- Префикс идентификатора RPC запроса (по умолчанию пустая строка).
-- Требуется только в случае, когда указанные выше файлы используются
-- для работы других скриптов, чтобы различать ответы сервера.
idPrefix = 'qe'
},
instruments = {
{
-- Идентификатор биржи.
-- Требуется для разделения по биржам на стороне сервера.
market = 1,
-- Идентификатор режима торгов и код ценной бумаги.
-- Можно найти на странице конкретного торгового инструмента
-- на сайте Московской биржи или в таблице котировок QUIK (параметр "Код класса").
classCode = 'TQBR',
secCode = 'SBER',
-- Опционально. По умолчанию равно secCode
-- Название символа на стороне сервера, если оно отличается от secCode
symbol = 'SBER',
-- Интервал
interval = INTERVAL_H1,
}
},
-- Часы работы скрипта (включительно).
-- Если не задан, то время работы неограничено.
workingHours = {
start = 10,
finish = 23,
}
}
Константа | Значение | Описание |
---|---|---|
INTERVAL_M1 | 1 | 1 минута |
INTERVAL_M5 | 2 | 5 минут |
INTERVAL_M10 | 3 | 10 минут |
INTERVAL_M15 | 4 | 15 минут |
INTERVAL_M30 | 5 | 30 минут |
INTERVAL_H1 | 6 | 1 час |
INTERVAL_D1 | 7 | 1 день |
INTERVAL_W1 | 8 | 1 неделя |
INTERVAL_MN1 | 9 | 1 месяц |
JSON-RPC сервер для корректной работы скрипта должен реализовывать следующие методы:
Метод | Описание |
---|---|
Quotes.GetLastCandle | Получение последней известной свечи |
Quotes.AddCandle | Добавление свечи |
Quotes.AddTicks | Добавление обезличенных сделок |
Notification.Notify | Оповещение |
Используется для получения последней известной свечи. Если свечей по указанному инструменту нет, то должен возвращать null
Параметры
Ключ | Описание |
---|---|
market | Рынок. Значение заданное при конфигурации инструмента instruments.*.market |
symbol | Код ценной бумаги. Значение заданное при конфигурации инструмента instruments.*.secCode |
interval | Интервал. Значение заданное при конфигурации инструмента instruments.*.interval |
Запрос:
{
"jsonrpc": "2.0",
"method": "Quotes.GetLastCandle",
"params": {
"market": 1,
"symbol": "SBER",
"interval": 7
},
"id":"1"
}
curl -H "Content-Type: application/json" -X POST -d '{"jsonrpc": "2.0", "method": "Quotes.GetLastCandle", "params":{"market":1, "symbol":"SBER", "period": 7}, "id": "1"}' http://127.0.0.1:8080/rpc
Ответ:
{
"jsonrpc": "2.0",
"id": "1",
"result": {
"time": 1613340425,
"open": 270.1,
"close": 275.01,
"high": 276,
"low": 269.5,
"volume": 320750
}
}
Используется для отправки данных по свечам. Данные по известным серверу свечам должны перезаписываться.
Параметры
Ключ | Описание |
---|---|
market | Рынок. Значение заданное при конфигурации инструмента instruments.*.market |
symbol | Код ценной бумаги. Значение заданное при конфигурации инструмента instruments.*.secCode |
interval | Интервал. Значение заданное при конфигурации инструмента instruments.*.interval |
candle | Свеча |
candle.time | Время в Unix time |
candle.open | Открытие |
candle.close | Закрытие |
candle.high | Максимум |
candle.low | Минимум |
candle.volume | Объем |
Запрос:
{
"jsonrpc": "2.0",
"method": "Quotes.AddCandle",
"params": {
"market": 1,
"symbol": "SBER",
"period": 7,
"candle":{
"time": 1613340425,
"open": 270.1,
"close": 275.01,
"high": 276,
"low": 269.5,
"volume": 320750
}
},
"id": "1"
}
curl -H "Content-Type: application/json" -X POST -d '{"jsonrpc": "2.0", "method": "Quotes.AddCandle", "params":{"market":1, "symbol":"SBER", "period": 7, "candle":{"time": 1613340425, "open": 270.1, "close": 275.01, "high": 276, "low": 269.5, "volume": 320750}}, "id": "1"}' http://127.0.0.1:8080/rpc
Ответ:
{
"jsonrpc": "2.0",
"id": "1",
"result": {}
}
Используется для отправки данных по обезличенным сделками. Данные по известным сделкам должны игнорироваться или перезаписываться.
Параметры
Ключ | Описание |
---|---|
market | Рынок. Значение заданное при конфигурации инструмента instruments.*.market |
symbol | Код ценной бумаги. Значение заданное при конфигурации инструмента instruments.*.secCode |
ticks | Список с обезличенными сделками |
ticks[].id | Идентификатор сделки |
ticks[].time | Время в Unix time |
ticks[].price | Цена |
ticks[].volume | Объем в акциях |
ticks[].operation | Одно из двух значений: 1 - покупка, 2 - продажа |
Запрос:
{
"jsonrpc": "2.0",
"method": "Quotes.AddTicks",
"params": {
"market": 1,
"symbol": "SBER",
"ticks":[
{
"id": 2683497839,
"time": 1613340425,
"price": 162.41,
"volume": 10,
"operation": 2
},
{
"id": 2683497840,
"time": 1613340426,
"price": 162.42,
"volume": 400,
"operation": 1
}
]
},
"id": "1"
}
curl -H "Content-Type: application/json" -X POST -d '{"jsonrpc": "2.0", "method": "Quotes.AddTicks", "params":{"market":1, "symbol":"SBER", "ticks": [{"id": 2683497839, "time": 1613340425, "price": 162.41, "volume": 10, "operation":2},{"id": 2683497840, "time": 1613340426, "price": 162.42, "volume": 400, "operation":1}]}, "id": "1"}' http://127.0.0.1:8080/rpc
Ответ:
{
"jsonrpc": "2.0",
"id": "1",
"result": {}
}
Используется для оповещения о запуске и возникающих ошибках в работе скрипта
Запрос:
{
"jsonrpc": "2.0",
"method": "Notification.Notify",
"params": {
"message": "2021-02-22 10:09:57: QuikQuotesExporter has been started successfully"
},
"id": "1"
}
curl -H "Content-Type: application/json" -X POST -d '{"jsonrpc": "2.0", "method": "Notification.Notify", "params":{"message":"2021-02-22 10:09:57: QuikQuotesExporter has been started successfully"}, "id": "1"}' http://127.0.0.1:8080/rpc```
Ответ:
{
"jsonrpc": "2.0",
"id": "1",
"result": {}
}
Для работы с обезличенными сделками требуется заказать их у брокера. По умолчанию QUIK не загружает их. Убедитесь, что обезличенные сделки подгружаются, создав таблицу обезличенных сделок и выбрав необходимые инструменты.
- Реализовать пример принимающего данные сервера