Sergey Pavlov
Sergey Pavlov личный блог
30 сентября 2022, 17:17

moex+quik+lua+candles

Коллеги!
Есть два варианта как получать данные в квике в рамках луа-скриптов.
1. getCandlesByIndex
2. CreateDataSource

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

Второй вариант неудобен тем, что не всегда источники данных создаются, нужно выжидать тайм-ауты и всякое такое.

Подскажите, какой из вариантов вы считаете наиболее правильным/оптимальным или какой используете сами?
Если накидаете пример кода как это используете, буду премного благодарен!
12 Комментариев
  • robot_bsk
    30 сентября 2022, 17:30

    function main()
    while IsRun do
    sleep(1000)
    for j= 1, 1 do
    if IsWindowClosed(t_id) then --Если окно робота закрыто, то выключить робота
    IsRun=false
    break
    end
    — ========= КОНТРОЛЬ ВРЕМЕНИ СЕССИИ И СОЕДИНЕНИЯ С СЕРВЕРОМ
    if isConnected()~=1 then
    is=isConnected()
    FIRSTRUN=0
    break
    end
    — ========= ПЕРВЫЙ ЗАПУСК
    if FIRSTRUN==0 then
    ds15, error = CreateDataSource(CLASSCODE, INSTRUMENT, INTERVAL_M15)
    if ds15 == nil or ds15:Size()<500 then
    if error~=nil then
    message('OHLC Si15: '..error,3)
    else
    message('OHLC Si15: error',3)
    end
    break
    end
    ds15: SetEmptyCallback()

    FIRSTRUN=1
    end
    end --end FOR GLOBAL
    end --end while
    ds15:Close()
    end --main

    • Ramil Shahattudinov
      30 сентября 2022, 21:24
      robot_bsk, что-то не удалось его запустить, выдало ошибку
      test.lua:33: attempt to index a nil value (global 'ds15')
      • robot_bsk
        30 сентября 2022, 21:31
        Rid, это же пример. Надо кодкласса и инструмент задать. Потом, если запуститься на выходе будет поток OHLCV с которым надо что-то делать
        • Ramil Shahattudinov
          30 сентября 2022, 22:56
          robot_bsk, предположим мы задали инструменты

          aTickerList = {«SBER», «GMKN», «GAZP», «NVTK», «ALRS»};
          как построить таблицу с колонками, что бы получить OHLCV по инструментам? Возможно ли в таблицу вывести значение средней, без построения на графиках, что бы скажем сравнить выше цена или ниже MA.? Параметр средней одинаков для всех и сравнение произвести каждого инструмента.

          • robot_bsk
            30 сентября 2022, 22:59
            Rid, да возможно
  • Андрей Иванов
    30 сентября 2022, 17:32
    2. CreateDataSource этот вариант самый лучший, не было не разу чтобы не создало источник данных, если не создало значит его в квике нет. По таймаутам, да зависит от скорости интернета и нагружености сервера брокера сколько ждать когда придет график, поэтому я делаю подписку на график CreateDataSource за несколько минут до начала торгов этого вполне хватает, либо можно контролировать по времени в последней свече(загрузился график или нет) но способ не универсален для неликвида не подойдет.
  • nicknh
    30 сентября 2022, 17:34
    Если речь про данные баров, то только CreateDataSource.
    Надежней много раз.

    Небольшой пример: luaq.ru/CreateDataSource.html


  • wrmngr
    30 сентября 2022, 21:13
    зачем это все? лей таблицу обезличенных сделок в sql и строй свечи сам. Ну понятно лучше задублировать потоки и мерджить дату с двух квиков от разных брокеров
  • Некто
    01 октября 2022, 14:14
    CreateDataSource не является синхронным, т.е. polling с проверкой что datasource.count > 0 единственный способ узнать, что в quik пришли эти данные, результат при этом не гарантируется, особенно в ~10 утра.
  • Kot_Begemot
    02 октября 2022, 02:46
    Не понмю такого, чтобы не работало. Пример :

    открываем источник данных
    local ds, error_desc;
    ds, error_desc = CreateDataSource(class,name,period);
    — Ограничиваем количество попыток (времени) ожидания получения данных от сервера
    local try_count = 0;
    if ds==nil then
    message(name..' '..class..' data source error :\n'..error_desc);
    return {0},0;
    end
    — Ждем пока не получим данные от сервера, либо пока не закончится время ожидания (количество попыток)
    while ds:Size() == 0 and try_count < 100 do
    sleep(100);
    try_count = try_count + 1
    end
    — Если от сервера пришла ошибка, то выведем ее и прервем выполнение
    if try_count>99 or error_desc ~= nil then
    message('Error loading data for '..name..', '..class..' — can not open data source ');
    return;
    end

  • Dmitriy Dmitrich
    04 октября 2022, 19:31
    Всем доброго дня! Как раз на днях столкнулся ситуацией и тут появился этот пост! У меня вопрос не совсем по теме поста, хотя ...
    Как то раз использовал это QPILE скрипт (редактировал под нужные мне инструменты рынки и таймфремы) из этого старого поста для экспорта свечек из Квика smart-lab.ru/blog/203956.php
    К сожалению я не владею LUA на данный момент. Подскажите, есть ли какой нибудь готовый скрипт LUA, можно ли каким то способом, доступным не только программистам, экспортировать по-отдельности или вместе не только свечи по сделкам, но и данные по опционам:
    — Спрос. Предложение, Теоретическая цена, Открытый Интерес, Волатильность?
    Про ручной способ «Правая кнопка — Сохранить как», но хотелось сохранить не «один-два» страйка опционов, а несколько и поэтому желательна автоматизация ...
    Заранее спасибо за любую помощь и дополнительные источники информации
    UPD: отредактировал вопрос — понял что тот старый скрипт не lua а ещё qpile даже))

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн