Помнится, я уже спрашивал об уточнении док-ции по getQuoteLevel2... Надо, наконец уточнить: что возвращается в случае, если отсутствуют bid/offer? Это таблицы, поэтому логично возвращать nil. А в док-ции написано, что возвращается пустая строка. Если это так, то это бардак... Только что посмотрел описание этой функции в QLUA.chm (дата файла аж 2023 г.!) последней версии Quik. А между тем, ещё в 2016 г. запрос, якобы, начал рассматриваться:https://forum.quik.ru/forum10/topic1502/
Видимо, придётся самостоятельно проверять, что там возвращается: nil (NULL или 0 на Си) или ссылка на "". Но чтобы это проверить, нужно ждать конца вечерней сессии в 23:50. Он выглядит так (2 варианта):
В последних строках как раз надо выяснить, что именно возвращает getQuoteLevel2.
По идее, с этой целью можно также проверять строки bid_count, offer_count на символьный 0.
И ещё: моя программка на обработку
Код
static int forLua_OnAllTrade(lua_State *L)
тратит 6500 тактов ЦП, а на вызов
Код
static int forLua_OnQuote(lua_State *L)
{ ...
lua_getglobal(L, "getQuoteLevel2");
lua_insert(L, 1); // Используем код класса и тикер, которые уже сидят в стеке
lua_pcall(L, 2, 1, 0);
тратит 202 000 тактов!! Нельзя ли как-то ускорить работу getQuoteLevel2?
Может быть, кто-то из программистов предложит ускорение? Я склоняюсь к тому, чтобы во время большой нагрузки на Quik не вызывать getQuoteLevel2, если с момента предыд. её вызова прошло мало времени.
Serge123 написал: Помнится, я уже спрашивал об уточнении док-ции по getQuoteLevel2... Надо, наконец уточнить: что возвращается в случае, если отсутствуют bid/offer? Это таблицы, поэтому логично возвращать nil. А в док-ции написано, что возвращается пустая строка. Если это так, то это бардак... Только что посмотрел описание этой функции в QLUA.chm (дата файла аж 2023 г.!) последней версии Quik. А между тем, ещё в 2016 г. запрос, якобы, начал рассматриваться: https://forum.quik.ru/forum10/topic1502/
Видимо, придётся самостоятельно проверять, что там возвращается: nil (NULL или 0 на Си) или ссылка на "". Но чтобы это проверить, нужно ждать конца вечерней сессии в 23:50. Он выглядит так (2 варианта):
В последних строках как раз надо выяснить, что именно возвращает getQuoteLevel2.
По идее, с этой целью можно также проверять строки bid_count, offer_count на символьный 0.
И ещё: моя программка на обработку
Код
static int forLua_OnAllTrade(lua_State * L)
тратит 6500 тактов ЦП, а на вызов
Код
static int forLua_OnQuote(lua_State * L)
{ .. .
lua_getglobal(L, "getQuoteLevel2" );
lua_insert(L, 1 ); // Используем код класса и тикер, которые уже сидят в стеке
lua_pcall(L, 2 , 1 , 0 );
тратит 202 000 тактов!! Нельзя ли как-то ускорить работу getQuoteLevel2?
Может быть, кто-то из программистов предложит ускорение? Я склоняюсь к тому, чтобы во время большой нагрузки на Quik не вызывать getQuoteLevel2, если с момента предыд. её вызова прошло мало времени.
Измерьте сколько затрачивает время каждый из операторов lua_getglobal(L, "getQuoteLevel2" ); lua_insert(L, 1 ); // Используем код класса и тикер, которые уже сидят в стеке lua_pcall(L, 2 , 1 , 0 ); а также пустая функция static int forLua_OnQuote(lua_State * L) Тогда можно сказать как ускорить и на сколько.
Сегодня попробую выяснить, что там getQuoteLevel2 выдаёт/не выдаёт.
Я ещё заметил противоречие в самой справке QLUA.chm: сначала там говорится, что
Код
При отсутствии и спроса и предложения функция возвращает таблицу без параметров bid и offer.
А потом, что
Код
bid TABLE Котировки спроса (покупки). При отсутствии спроса возвращается пустая строка.
offer TABLE Котировки предложений (продажи). При отсутствии предложения возвращается пустая строка.
Насколько я помню, bid и offer - таблицы, которые состоят из массива таблиц, каждый элемент массива - таблица, которая содержит 2 строки - price и quantity.
Я почему-то уверен, что при отсутствии спроса (bid_count == "0") таблица bid будет отсутствовать, а при отсутствии предложения (offer_count == "0") таблица offer будет отсутствовать.
Сейчас смотрел свои исходники, вспоминал, что там давно уже делал и пришёл к выводу, что на том тикере, с которым я работаю, не получится узнать, что там возвращается, nil или "", потому что при вызове OnQuote всегда есть спрос и предложение в стакане. За исключением последней строки, что я приводил выше:
Код
LQDT 23:50:02.061765
В этом последнем вызове перед окончанием вечерней сессии, по моему мнению, getQuoteLevel2 возвращает nil.
Сегодня в конце раб. дня мосбиржа выдала ответ на getQuoteLevel2 не такой, как всегда (как будто они там прочитали то, что я сегодня здесь написал ). Моя программка выдала отладочное сообщение, что вернулось не nil. Остаётся считать, что вернулось bid_count == '0' и offer_count == '0'. В этом случае моя программка не проверяет, что там с таблицами bid и offer.
При работе с таблицей, возвращаемой функцией getQuoteLevel2 в первую очередь необходимо смотреть на значение строк "bid_count" и "offer_count". В случае, если какое-либо значение "bid_count"/"offer_count" соответствует "0.000000", рекомендуется считать, что соответствующее поле "bid"/"offer" отсутствует в таблице, и обращаться к нему не следует.
А вообще в текущей реализации в зависимости от значений строк "bid_count" и "offer_count", поля "bid" и "offer" могут быть nil, пустыми строками либо таблицами со полями "price" и "quantity" строкового типа.
В случае, если оба поля "bid_count" и "offer_count" имеют значение "0.000000", поля "bid" и "offer" будут отсутствовать в таблице, и, соответственно, иметь значение nil. В случае, если одно из полей "bid_count"/"offer_count" будет иметь значение, отличное от "0.000000", соответствующее поле будет таблицей таблиц со строками "price" и "quantity". Если при этом другое поле "bid_count"/"offer_count" будет равно "0.000000", то соответствующее ему поле "bid"/"offer" будет пустой строкой.
Ivan Sizykh написал: В случае, если одно из полей "bid_count"/"offer_count" будет иметь значение, отличное от "0.000000", соответствующее поле будет таблицей таблиц со строками "price" и "quantity". Если при этом другое поле "bid_count"/"offer_count" будет равно "0.000000", то соответствующее ему поле "bid"/"offer" будет пустой строкой.
Но зачем? Ведь чтобы получить пустую строку, нужно это значение умышленно выставлять после каких-то проверок. А если делать "как проще", должно получиться либо nil, либо пустая таблица.
Serge123 написал: Помнится, я уже спрашивал об уточнении док-ции по getQuoteLevel2... Надо, наконец уточнить: что возвращается в случае, если отсутствуют bid/offer? Это таблицы, поэтому логично возвращать nil. А в док-ции написано, что возвращается пустая строка. Если это так, то это бардак... Только что посмотрел описание этой функции в QLUA.chm (дата файла аж 2023 г.!) последней версии Quik. А между тем, ещё в 2016 г. запрос, якобы, начал рассматриваться: https://forum.quik.ru/forum10/topic1502/
Видимо, придётся самостоятельно проверять, что там возвращается: nil (NULL или 0 на Си) или ссылка на "". Но чтобы это проверить, нужно ждать конца вечерней сессии в 23:50. Он выглядит так (2 варианта):
В последних строках как раз надо выяснить, что именно возвращает getQuoteLevel2. Кстати, если вы занимаетесь ставками и интересуетесь экспресс-ставками, рекомендую заглянуть на https://sportreytingi.uz/ru/articles/express-betting — там есть много полезной информации и аналитики по экспресс-беттингу, что может быть полезно как для профи, так и для новичков.
По идее, с этой целью можно также проверять строки bid_count, offer_count на символьный 0.
И ещё: моя программка на обработку
Код
static int forLua_OnAllTrade(lua_State * L)
тратит 6500 тактов ЦП, а на вызов
Код
static int forLua_OnQuote(lua_State * L)
{ .. .
lua_getglobal(L, "getQuoteLevel2" );
lua_insert(L, 1 ); // Используем код класса и тикер, которые уже сидят в стеке
lua_pcall(L, 2 , 1 , 0 );
тратит 202 000 тактов!! Нельзя ли как-то ускорить работу getQuoteLevel2?
Может быть, кто-то из программистов предложит ускорение? Я склоняюсь к тому, чтобы во время большой нагрузки на Quik не вызывать getQuoteLevel2, если с момента предыд. её вызова прошло мало времени.
Понимаю вашу ситуацию с getQuoteLevel2 — действительно, непоследовательность в документации и реальном поведении функции создаёт сложности при обработке данных. На практике часто встречается, что в случае отсутствия bid/offer возвращается либо nil, либо пустая строка, и это, к сожалению, зависит от версии и контекста.
Проверять bid_count и offer_count на "0" — хорошая идея для надежной фильтрации. Также разумно минимизировать вызовы getQuoteLevel2 при высокой нагрузке, например, ставить таймаут между запросами — так вы сможете существенно снизить нагрузку на CPU и не потерять актуальность данных.
Что касается оптимизации скорости, к сожалению, getQuoteLevel2 — внутренняя функция Quik, и сильно ускорить её вызов с Lua сложно. Можно рассмотреть вариант кэширования данных и их обновления с определённым интервалом, а не при каждом событии.
В целом, ваш подход — адаптировать логику обработки под поведение функции, тщательно проверять возвращаемые значения и минимизировать лишние вызовы — наиболее практичный путь при работе с Quik и getQuoteLevel2.