Получение данных из стакана

Страницы: 1
RSS
Получение данных из стакана, Subscribe_Level_II_Quotes
 
Добрый день.
В связи с очень небольшим опытом работы LUA+QUICK прошу помощи и пояснений.

Задача:  получить данные таблицы из стакана котировок (опционов), при условии, что стакан не должен быть открытым в терминале QUICK.

Воспользовался функцией getQuoteLevel2() - простая, удобная и понятная, при открытом стакане работает отлично.
Мне не принципиально для того скрипта, над котором сейчас работаю (могу и открыть нужный стакан), но наткнулся на функцию:
Subscribe_Level_II_Quotes(STRING class_code, STRING sec_code)

и например, если делаю так:

function OnInit()
--Subscribe_Level_II_Quotes(CLASS_CODE_OPT, TICKER_OPT)  --переменные инициализируются данными, после второго запуска скрипта
LEVEL2_BID_COUNT = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).bid_count
LEVEL2_OFFER_COUNT = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).offer_count
end

то таблица пустая (при закрытом стакане!)
повторяю скрипт - всё нормально и значения присваиваются.

В чём может быть причина и возможно ли без лишнего геморроя устранить эту проблему? В ином случае придётся без этой функции, в ручную открывать стакан.
 
https://forum.quik.ru/messages/forum10/message13780/topic1502/#message13780
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Цитата
Старатель написал:
https://forum.quik.ru/messages/forum10/message13780/topic1502/#message13780
Спасибо. Конечно документацию проще исправить, чем функцию, и получать от функции то что нужно пользователям.
В целом всё понятно.
 
В целом, задача это - автоматизировать торговлю.
открывать/закрывать позиции на основании некого алгоритма условий.
Да, много разных функций полезных и не очень, а написание скрипта
похоже на сборку. И всё таки не понимаю, почему не упрощают, в этом весь смысл.

Ну запросил пользователь стакан (ладно с идентификатором графиков и индикаторов понятно),
почему бы не исполнить в нём функцию subscribe и просто выдать нужную таблицу,
в конце концов если хранить данные, их можно записывать в обычный текстовой файл и работать уже с ним.

Возможно я не прав, но пока сталкиваюсь с непонятными вещами, которые можно и нужно упрощать.
 
Вот пример работы со стаканом, проще некуда:
https://forum.quik.ru/messages/forum10/message46822/topic5631/#message46822
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Цитата
Старатель написал:
Вот пример работы со стаканом, проще некуда:
https://forum.quik.ru/messages/forum10/message46822/topic5631/#message46822
Спасибо. Всё понятно и доступно.

Я не понимаю другое, почему реализовано "так, а не иначе", приходится лишние строчки в скрипт добавлять и лишние действия.
Допустим заказу котировок и обнуление это понять можно, но вот например:

getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).bid[1].quantity
getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).offer[1].quantity

заявки читаются снизу вверх. offer с индексом 1 это ближайшая рыночная, а bid с индексом 1 это последняя заявка в стакане и рыночная у bid последний индекс.
почему так, не понятно.
Это если открыть позицию из количества заявок в штук 5 - охватит объём, то вот закрыть позицию - надо обрабатывать с последнего индекса и писать для этого отдельную функцию.
В итоге, наверное проще выставлять лимитированные заявки. У опционов стаканы специфические, не всякий объём "скушают".  
 
[QUOTE]ddonny написал:
и например, если делаю так:

function OnInit()
--Subscribe_Level_II_Quotes(CLASS_CODE_OPT, TICKER_OPT)  --переменные инициализируются данными, после второго запуска скрипта
LEVEL2_BID_COUNT = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).bid_count
LEVEL2_OFFER_COUNT = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).offer_count
end
[QUOTE]

Данные не мгновенно же появляются.
Subscribe_Level_II_Quotes <-- происходит подписка, данные приедут позже (причем только после выхода из обработчика Lua! это надо учитывать)

[QUOTE]ddonny написал:
LEVEL2_BID_COUNT = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).bid_count
LEVEL2_OFFER_COUNT = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).offer_count
[QUOTE]

1) Нет смысла делать это OnInit().
"размер" стакана - меняется. Надо брать количество каждый раз, когда идет обращение к стакану.

2) Данные, как сказано выше, появятся не раньше, чем произойдёт выход из обработчика (в данном случае - OnInit()). Это особенность работы QLua.

3) Так будет лучше во многих смыслах:

local quote = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT)
quote.offer_count
quote.bid_count
quote.offer[1].quantity
и т.д.
 
Цитата
swerg написал
Это особенность работы QLua

Да, спасибо что хоть это сделали.
Лет 10 назад изучал C под linux, забросил это дело, думал ничего не вспомню, а нет - помогает.
в целом всё решаемо, если понять архитектуру QLUA (таблицы и т.д.) и очень много информации, хорошо развитый форум,
хочется поблагодарить разработчиков и всех неравнодушных!
Страницы: 1
Читают тему (гостей: 1)
Наверх