Блог им. _sk_ |Ограничитель количества транзакций на чистом QLua

    • 21 декабря 2022, 13:37
    • |
    • _sk_
  • Еще
При торговле с помощью роботов в терминале QUIK рано или поздно встаёт вопрос об ограничении количества отправляемых в секунду транзакций, чтобы не начинались ошибки вида: «Превышен лимит отправки транзакций для данного логина».

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

Создаётся некая папка D:\throttle\, где работает ограничитель интенсивности. Во время работы QLua-скрипты формируют в этой папке столько файлов, сколько транзакций в секунду разрешено, например 10. При каждой попытке послать транзакцию скрипты, грубо говоря, конкурируют за эти файлы. Если ресурса хватило, то транзакция отправляется, если нет, то скрипт ждёт 10 мс и повторяет попытку заново.

( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Блог им. _sk_ |QLua: таблица крупных "склеенных" обезличенных сделок - 2

    • 25 января 2022, 09:43
    • |
    • _sk_
  • Еще
Недавно ко мне обратился один из смартлабовцев с просьбой доработать скрипт из поста https://smart-lab.ru/blog/610116.php, чтобы можно было более гибко подходить к раскраске выводимой там таблицы крупных «склеенных» сделок. Я решил проделать эту работу и выложить сюда модернизированный скрипт.

Настройки раскраски таблицы производятся в самом скрипте. Я сделал какие-то настройки для светлой темы терминала, может быть, весьма далёкие от ваших идеалов. Каждый пользователь пусть настраивает сам на свой вкус через палитру RGB (для каждого из трёх основных цветов нужно выбрать интенсивности от 0 до 255), редактируя строки в начале основного скрипта.

Для работы скрипта нужен собственно сам скрипт и один или несколько файлов настроек для ваших наборов инструментов. Границы крупных и очень крупных сделок, проскальзывания и «многосоставности» сделок также пользователи настраивают под себя. В терминале QUIK запускается файл с настройками, а он в свою очередь запускает основной скрипт.

( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Блог им. _sk_ |Опыт доработки QLua-скриптов для QUIK 8.5.2

    • 15 мая 2020, 16:29
    • |
    • _sk_
  • Еще
В новой версии терминала QUIK 8.5.2 произведён апгрейд языка Lua для написания торговых скриптов с версии 5.1 до версии 5.3. Это нужно для того, чтобы корректно обрабатывать 19-значные номера заявок и сделок на срочном рынке МосБиржи. Типа number в Lua 5.1 не подходит: там все числа хранятся как double, соответственно целые числа до 2^53 = 9 007 199 254 740 992 записываются без потери точности, а 19-значные номера заявок и сделок будут больше этой границы.

Версия Lua 5.3 обратно несовместима с Lua 5.1. Я почти не использовал внешние библиотеки и для меня было два важных изменения: отказ от module (это было сделано в версии 5.2) и введение целочисленной арифметики (версия 5.3).

Для избавления от использования module пришлось переработать много кода, хотя изменения были несложные. Приведу пример. Раньше был такой код Arrays.lua для работы с массивами:

--
-- Выполнение действий с массивами.
--

local pairs = pairs
local type = type

module(...)

--- Создать копию массива (таблицы)
-- @return копию массива (таблицы)
function copy(array)
    local copy_array = {}
    if type(array) ~= "table" then
        return array
    end
    for k, v in pairs(array) do
        if type(v) == "table" then
            copy_array[k] = copy(v)
        else
            copy_array[k] = v
        end
    end
    return copy_array
end

--- Узнать, начинается ли индексация в массиве с нуля или с единицы.
-- @return 0 или 1
function base(array)
    if array[0] ~= nil then
        return 0
    else
        return 1
    end
end

--- Вычислить число элементов в массиве.
-- @return число элементов в массиве
function size(array)
    local n = 0
    for _, _ in pairs(array) do
        n = n + 1
    end
    return n
end

--- Проверить пустой или нет массив.
-- @return true/false
function isEmpty(array)
    for _, _ in pairs(array) do
        return false
    end
    return true
end

--- Получить первый индекс массива, где ничего не записано. Поиск начинается с 1.
-- @return первый индекс массива, где ничего не записано
function firstEmptyIndex(array)
    local i = 1
    while array[i] ~= nil do
        i = i + 1
    end
    return i
end


( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Блог им. _sk_ |QLua: таблица крупных "склеенных" обезличенных сделок

    • 03 апреля 2020, 15:06
    • |
    • _sk_
  • Еще
Иногда хочется наблюдать за ситуациями, когда участники торгов исполняют по рынку крупные заявки. Конечно, можно смотреть на обычную ленту обезличенных сделок с настроенными фильтрами на размер сделки, но ведь можно написать специальный QLua-скрипт, который будет отбирать сделки, являющиеся результатом исполнения.

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

Если суммарный объём не менее какой-то границы, которую можно задать для каждого инструмента индивидуально, такие «склеенные» сделки выводятся в таблице. В ней указаны:
— суммарный объём;
— количество обезличенных сделок, которые были склеены;
— начальная цена и конечная цена;

( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Блог им. _sk_ |QLua: формирование свечных данных для робота

    • 31 марта 2020, 13:37
    • |
    • _sk_
  • Еще
Поделюсь своим опытом, который может быть полезен начинающим алготрейдерам, пишущим своего робота на QLua.

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

Пример 1. Мы торгуем акции на 30-минутках и при этом не хотим учитывать свечу, которая получается в 9:30 из-за аукциона открытия, и не хотим, чтобы аукцион закрытия портил последнюю свечу дня в 18:30. Хотим только нужные свечи в одном массиве.

Пример 2. Мы торгуем фьючерсы только в дневную сессию, а вечернюю сессию выбрасываем, поскольку наша стратегия в этом случае даёт более приличный график эквити. Хочется иметь «отфильтрованный» свечной ряд.

Пример 3. Мы торгуем американские акции на Санкт-Петербургской бирже и хотим, чтобы время свечей было как в Америке, а не как на бирже, и хотим оставить только основные торги с 9:30 до 16:00 по буржуйскому времени.

( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

....все тэги
UPDONW
Новый дизайн