В таблице QUIK depo_limits согласно документации QLUA по инструменту представлен только "код инструмента" sec_code. Как мне проще и быстрее вычислить "код класса" для инструмента, представленного в таблице лимитов по бумагам depo_limits? Код класса требуется, например, для вызова функции getSecurityInfo.
Андрей написал: В таблице QUIK depo_limits согласно документации QLUA по инструменту представлен только "код инструмента" sec_code. Как мне проще и быстрее вычислить "код класса" для инструмента, представленного в таблице лимитов по бумагам depo_limits? Код класса требуется, например, для вызова функции getSecurityInfo.
Один инструмент может торговаться в нескольких классах. getSecurityInfo при отсутствии кода класса, вернет параметры инструмента из первого попавшегося класса, но не факт что нужного. В связи с чем, правильно самому указывать нужный класс
Если правильно понял, ответ на вопрос "Как определить Код класса (CLASSCODE) по коду инструмента (SECCODE)?" - никак. Тогда вопрос, как получить список инструментов портфеля с кодом класса, если не из таблицы depo_limits?
Андрей написал: Если правильно понял, ответ на вопрос "Как определить Код класса (CLASSCODE) по коду инструмента (SECCODE)?" - никак. Тогда вопрос, как получить список инструментов портфеля с кодом класса, если не из таблицы depo_limits?
получить список доступных классов, в каждом из них поискать требуемый инструмент. Если он найдется в нескольких классах - чесать репу и выбирать нужный. Как выбирать - это исключительно ваши предпочтения и правила.
Sergey Gorokhov написал: Один инструмент может торговаться в нескольких классах.
А как тогда определяется текущая цена инструмента в таблице "Состояние счёта"? Хотелось бы получить именно вот эту цену. Наверное, для каждой бумаги в портфеле прописан и класс. Иначе, можно было бы купить бумагу в одном классе по одной цене, и продать её в другом классе по другой.
Какие вообще бывают случаи, когда один инструмент торгуется в разных классах? Я такое видел только когда облигации переводят в Д-список, но тогда они уже как обычные не торгуются.
Василий написал: Какие вообще бывают случаи, когда один инструмент торгуется в разных классах? Я такое видел только когда облигации переводят в Д-список, но тогда они уже как обычные не торгуются.
Плохо значит смотрели:
Скрытый текст
LKOH;RPMO;РЕПО-М - адрес.;201;3;repo;1;stock;1;4;2019-04-22;2020-05-22;2019-04-22;2020-05-22;0;RUB LKOH;TQBR;Т+: Акции и ДР - безадрес.;57;1;shares;1;stock;1;1;2013-03-25;2020-05-22;2013-03-25;2020-05-22;1;RUB LKOH;EQBR;Основной режим: А1-Акции и паи - безадрес.;6;1;shares;1;stock;0;1;2003-08-20;2013-08-30;2003-08-20;2013-08-30;0;RUB LKOH;SPEQ;Поставка по СК (акции);125;1;shares;1;stock;1;2;2018-06-29;2020-05-22;2018-06-29;2020-05-22;0;RUB LKOH;SOTC;Внебиржевые сделки;71;29;otc;1;stock;1;5;2014-02-24;2020-05-21;2009-09-01;2020-05-24;0; LKOH;TQDP;Крупные пакеты - Акции - безадрес.;42;1;shares;1;stock;1;1;;;2019-03-04;2020-05-22;0;RUB LKOH;EQDP;Крупные пакеты - Акции - безадрес.;42;1;shares;1;stock;0;1;2011-12-12;2019-03-01;2011-12-12;2019-03-01;0;RUB LKOH;PTEQ;РПС с ЦК: Акции и ДР - адрес.;59;4;ndm;1;stock;1;1;2013-03-26;2020-05-22;2013-03-25;2020-05-22;0;RUB LKOH;MXBD;MOEX Board;72;33;moexboard;1;stock;0;4;2015-08-03;2020-05-22;2015-08-03;2020-05-22;0; LKOH;CLMR;Classica - безадрес.;43;25;classica;1;stock;0;1;2012-02-13;2015-07-31;2011-12-19;2015-07-31;0;RUB LKOH;CLAD;Classica - адрес.;44;25;classica;1;stock;0;1;2012-01-10;2013-08-05;2011-12-19;2013-08-05;0;RUB LKOH;STMR;Standard: дневная сессия - безадрес.;36;23;standard;1;stock;0;1;2011-12-19;2015-07-31;2011-12-19;2015-07-31;0;RUB LKOH;SDMR;Standard: вечерняя сессия - безадрес.;36;23;standard;1;stock;0;1;2011-12-19;2015-07-31;2011-12-19;2015-07-31;0;RUB LKOH;STAD;Standard: дневная сессия - адрес.;41;23;standard;1;stock;0;1;2011-12-19;2015-07-31;2011-12-19;2015-07-31;0;RUB LKOH;SDAD;Standard: вечерняя сессия - адрес.;41;23;standard;1;stock;0;1;2011-12-19;2014-02-17;2011-12-19;2014-02-17;0;RUB LKOH;STRP;Standard: сделки репо, дневная сессия - адрес.;40;23;standard;1;stock;0;1;2011-12-19;2015-07-31;2011-12-19;2015-07-31;0;RUB LKOH;SDRP;Standard: сделки репо, вечерняя сессия - адрес.;40;23;standard;1;stock;0;1;2011-12-19;2013-12-25;2011-12-19;2013-12-25;0;RUB LKOH;PSEQ;РПС: Акции - адрес.;8;4;ndm;1;stock;1;1;2003-08-20;2020-05-20;2003-08-20;2020-05-22;0;RUB LKOH;RPEQ;РЕПО: Акции и паи - адрес.;1;3;repo;1;stock;0;4;2003-08-20;2008-11-21;2003-08-20;2008-11-21;0;RUB LKOH;RPMA;РЕПО c акциями - адрес.;95;3;repo;1;stock;0;4;2006-10-02;2019-04-19;2006-10-02;2020-03-04;0;RUB LKOH;RPEU;РЕПО в ин. валюте (USD) - адрес.;94;3;repo;1;stock;1;4;2019-07-22;2020-04-29;2019-04-22;2020-05-22;0;USD LKOH;RPUA;РЕПО c акциями (USD) - адрес.;94;3;repo;1;stock;0;4;;;2013-09-02;2019-05-31;0;USD LKOH;RPEO;РЕПО в ин. валюте (EUR) - адрес.;90;3;repo;1;stock;1;4;2019-12-20;2020-04-03;2019-04-22;2020-05-22;0;EUR LKOH;EQRD;РЕПО с ЦК 1 день (USD) - безадрес.;92;27;ccp;1;stock;1;4;2019-07-15;2020-05-21;2015-06-01;2020-05-22;0;USD LKOH;EQRE;РЕПО с ЦК 1 день (EUR) - безадрес.;93;27;ccp;1;stock;1;4;2019-04-02;2019-04-02;2015-06-01;2020-05-22;0;EUR LKOH;EQWP;РЕПО с ЦК 7 дн. - безадрес.;76;27;ccp;1;stock;1;2;2015-06-08;2020-04-30;2015-06-01;2020-05-22;0;RUB LKOH;EQWD;РЕПО с ЦК 7 дней (USD) - безадрес.;78;27;ccp;1;stock;1;4;2019-12-24;2020-02-28;2016-01-26;2020-05-22;0;USD LKOH;EQWE;РЕПО с ЦК 7 дней (EUR) - безадрес.;79;27;ccp;1;stock;1;4;;;2016-01-26;2020-05-22;0;EUR LKOH;EQRP;РЕПО с ЦК 1 день - безадрес.;50;27;ccp;1;stock;1;2;2013-09-02;2020-05-22;2013-09-02;2020-05-22;0;RUB LKOH;LIQR;РЕПО с ЦК: Урегулирование - безадрес.;148;27;ccp;1;stock;1;2;2019-08-21;2020-03-02;2019-03-04;2020-05-22;0; LKOH;EQRY;РЕПО с ЦК 1 день (CNY) - безадрес.;152;27;ccp;1;stock;1;4;;;2019-03-07;2020-05-22;0;CNY LKOH;PSRY;РЕПО с ЦК (CNY) - адрес.;153;27;ccp;1;stock;1;4;;;2019-03-07;2020-05-22;0;CNY LKOH;PSRP;РЕПО с ЦК - адрес.;65;27;ccp;1;stock;1;2;2013-07-16;2020-05-22;2013-07-08;2020-05-22;0;RUB LKOH;PSRD;РЕПО с ЦК (USD) - адрес.;91;27;ccp;1;stock;1;4;2019-08-06;2020-04-08;2015-06-01;2020-05-22;0;USD LKOH;PSRE;РЕПО с ЦК (EUR) - адрес.;96;27;ccp;1;stock;1;4;2019-04-24;2020-04-20;2015-06-01;2020-05-22;0;EUR LKOH;LIQB;Продажа обеспечения бирж.рынок - безадрес.;120;36;mamc;1;stock;1;1;2018-07-11;2018-07-11;2018-05-21;2020-05-22;0; LKOH;PSCC;РПС с ЦК - адрес.;32;4;ndm;1;stock;0;2;2010-02-15;2011-05-27;2010-02-15;2011-05-27;0;RUB LKOH;RPCC;РЕПО с ЦК - адрес.;31;3;repo;1;stock;0;2;2010-02-15;2011-05-27;2010-02-15;2011-05-27;0;RUB LKOH;EQCC;ЦК - режим основных торгов - безадрес.;30;1;shares;1;stock;0;1;2010-02-15;2011-05-27;2010-02-15;2011-05-27;0;RUB
И здесь же ответ на второй вопрос, откуда берется "официальная" котировка для оценки. Предпоследняя циферка в приведенном списке у всех 0, а у TQBR 1, вот значит отсюда официальная цена и проистекает, все остальные классы "просто торгуются".
Текущая цена инструмента таблицы "Состояние счёта" берётся из параметров таблицы текущих торгов для данного класса/инструмента. Для данного показателя позиции используются следующие параметры ТТТ:
1. Цена последней сделки по инструменту из таблицы «Текущие торги». Если такой цены нет, то цена закрытия. 2. Для срочного рынка – цена последней сделки. Если такой цены нет, то указывается расчетная цена. 3. Для облигаций значение указывается в % от номинала, для срочных контрактов – в пунктах. 4. Для клиентов типа «МП»: лучшая цена спроса / предложения из таблицы «Текущие торги»
То, из какого именно класса берутся данные параметры - настраивается на стороне сервера QUIK. Получить эту цену, Вы можете обратившись к таблице текущих торгов с указанием класса и инструмента при помощи функций getParamEx и getParamEx2.
function GetClassBySec(sec_code) -- Функция возвращает код класса по коду инструмента
for class_code in string_gmatch("QJSIM,TQBR,SPBFUT,SPBOPT,CETS,OPTW,", "(%P*),") do -- Добавить код если надо
for sec in string_gmatch(getClassSecurities(class_code), "(%P*_*%P*_*%P*),") do
if sec == sec_code then return class_code end
end
end
end
Константин Рейм, вернете первый найденный класс. У меня, например, для сбера это будет EQRP, не совсем то, что ожидалось, правда? Надо искать все классы, содержащие бумагу, типа так
Код
function getSecClasses(seccode)
local result = {}
for cls in string.gmatch(getClassesList(), "[^,]+") do
for sec in string.gmatch(getClassSecurities(cls), "[^,]+") do
if sec == seccode then
table.insert(result, cls)
break
end
end
end
return result
end
Anton написал: Константин Рейм , вернете первый найденный класс.
Так в этом и состоит вопрос: как найти ОДИН подходящий класс. А не список. И подход в сообщении Константин Рейм совершенно и единственно правильный: задать свой порядок приоритета для поиска класса среди общего списка, и уже основываясь на этом списке искать первый класс, куда входит инструмент, чтобы исключить "неподходящие" классы.
В крайнем случае, можно сделать справочник классов как таблицу, где ключ -- код инструмента, значение -- код класса. Будет такой справочник, скорее всего, один, заполнить его несложно и потом везде применять.
SPBOPT - класс опционов, месяц, неделя OPTW - класс недельного опциона у некоторых брокеров А по большому счету эта функция нужна для корректного ввода инструмента из меню. Есть инструмент - все работает - нет инструмента - класс - nil - подсветка о ошибке ввода и ничего не работает.
Константин Рейм написал: А по большому счету эта функция нужна для корректного ввода инструмента из меню.
В таком раскладе да. Хотя я бы вывалил юзеру окошко с выбором класса-инструмента по типу квиковского, консоль-стайл "введите" меня печалят. Сидит юзер и чешет репу, чего туда вводить-то? Идет гуглить, какие вообще классы существуют, какие бумаги, потом идет спрашивать у брокера, почему у него того нет сего нет, потом здесь пишет арка где мои бумаги, гуголь говорит должны быть, поддержка идет рыть сорцы квика, где бумаги, пишет вопросы брокеру, там отвечают, что-то путают, затевается переписка, юзер на форуме вопит вы чо на простой вопрос три дня ответить не можете. Все при деле в общем, автор скрипта хитро ухмыляется.
Текущая цена инструмента таблицы "Состояние счёта" берётся из параметров таблицы текущих торгов для данного класса/инструмента. Для данного показателя позиции используются следующие параметры ТТТ:
1. Цена последней сделки по инструменту из таблицы «Текущие торги». Если такой цены нет, то цена закрытия. 2. Для срочного рынка – цена последней сделки. Если такой цены нет, то указывается расчетная цена. 3. Для облигаций значение указывается в % от номинала, для срочных контрактов – в пунктах. 4. Для клиентов типа «МП»: лучшая цена спроса / предложения из таблицы «Текущие торги»
То, из какого именно класса берутся данные параметры - настраивается на стороне сервера QUIK. Получить эту цену, Вы можете обратившись к таблице текущих торгов с указанием класса и инструмента при помощи функций getParamEx и getParamEx2.
Вопрос актуальный - как именно этот класс, настроенный на стороне сервера, получить? Я нажимаю alt-I (информация об инструменте) в таблице "Состояние счёта" и вижу один конкретный класс. Как его получить в lua? Три дня назад у LQDT ETF был класс TQTF, а сегодня у ВТБ стал класс TQTF_F, а у другого брокера по прежнему TQTF. Поэтому вариант "зафиксировать класс где-то в настройках" не рабочий, класс может меняться.
Ну так уточните у брокера ВТБ, что это за класс, противоречащий спецификации. Впрочем, это может быть какой-то специфический класс, типа неполный лот, заблокированные и т.д.
Повторю свой вопрос. Я нажимаю alt-I в таблице "Состояние счёта" и вижу информацию об инструменте по конкретному классу. Как мне получить этот класс в lua? getSecurityInfo('', 'тикер') дает другой класс. Вряд ли на этот вопрос может ответить брокер.
SearchItems по таблице securities даст инфу. В остальных таблицах и функциях типа getDepoEx (возвращающей инфу по таблице "4.15 Позиции по инструментам") будет sec_code только. Ну и из индикатора ещё можно получить...
Спросите своего брокера почему такой код класса. По крайней мере будет ясно, что это за класс, противоречащий спецификации. Разработчики терминала вряд ли подскажут, почему в базе данных брокера такое значение.
Отдельного метода именно для таблицы depo_limits нет.