Вопрос ко всем, кто знает: какую таблицу возвращает getQuoteLevel2 если нет bid или ask?

Страницы: 1
RSS
Вопрос ко всем, кто знает: какую таблицу возвращает getQuoteLevel2 если нет bid или ask?
 
Напр., бывает так, что запампленная акция выросла до потолка и её все хотят продать, но никто не хочет купить. Какова структура таблицы, если, к примеру, bid_count == 0 (на самом деле там вопреки документации будет строка "0.000000")?
1. Таблица bid отсутствует (нет ноды с именем "bid").
2. Есть нода с именем "bid" и её тип nil.
3. Тип этой ноды "table" и эта таблица пустая?
4. Или, как сказано в документации, вместо таблицы bid "возвращается пустая строка"?

На днях я посмотрел, какую последнюю таблицу по разным акциям возвращает getQuoteLevel2 в конце вечерней сессии примерно в 23:50: в ней общее количество нод две: bid_count == offer_count == "0.000000". Причём, по одним акциям биржа возвращает последнюю таблицу до 23:50, а после этого по другим акциям биржа ещё может вернуть полноценные таблицы с 4-мя нодами.
 
Добрый день.

Если определить параметры bid и offer, то функция вернет таблицу без этих параметров. Пример:
Код
{'bid_count': '0.000000',
'offer_count': '0.000000'
}
 
Цитата
Oleg Kuzembaev написал:
Добрый день.

Если определить параметры bid и offer, то функция вернет таблицу без этих параметров. Пример:
Код
  {'bid_count':  '0.000000' ,
 'offer_count' :  '0.000000' 
}  
Вот что написано в последней версии справки QLUA.chm за 23.10.25:
Цитата


При отсутствии и спроса и предложения функция возвращает таблицу без параметров bid и offer.

ПараметрТипОписание
bid_countSTRINGКоличество котировок покупки. При отсутствии спроса возвращается значение  «0»
offer_countSTRINGКоличество котировок продажи. При отсутствии предложения возвращается  значение «0»
bidTABLEКотировки спроса (покупки). При отсутствии спроса возвращается пустая  строка
offerTABLEКотировки предложений (продажи). При отсутствии предложения возвращается  пустая строка

1. Здесь, к примеру, неправильно написано, что при отсутствии спроса возвращается значение "0": возвращается "0.000000". Я ещё в прошлом году писал об этом на форуме. Сказали, что исправят, но так и не сделали.

2. Это описание противоречит само себе. При отсутствии спроса и предложения нет параметров с именами "bid" и "offer", или они есть, но имеют тип STRING и длину строки == 0?

3. Что возвращается, если, к примеру, есть offer, но нет bid? bid будет пустой строкой или не будет параметра с именем "bid" (вместо него будет нода с типом NIL?)
 
Нормальному человеку трудно представить, как можно написать в док-ции, что bid имеет тип TABLE, но может возвращать пустую строку...

Из армейского фольклора: "В военное время величина синуса может достигать четырёх".
 
Стакан евротранса сейчас:
Код
{
 bid = "",
 bid_count = "0.000000",
 offer = {
  {
   price = "68.10",
   quantity = "38643",
  }, {
   price = "68.15",
   quantity = "10711",
  }, {
   price = "68.20",
   quantity = "21390",
  }, {
   price = "68.25",
   quantity = "17142",
  }, {
   price = "68.30",
   quantity = "24280",
  }, {
   price = "68.35",
   quantity = "9463",
  }, {
   price = "68.40",
   quantity = "27935",
  }, {
   price = "68.45",
   quantity = "17828",
  }, {
   price = "68.50",
   quantity = "32589",
  }, {
   price = "68.55",
   quantity = "81864",
  }, 
 },
 offer_count = "10.000000",
}

 
Цитата
Serge123 написал:
Нормальному человеку трудно представить, как можно написать в док-ции, что bid имеет тип TABLE, но может возвращать пустую строку...

Из армейского фольклора: "В военное время величина синуса может достигать четырёх".
Возможно это потому, что это LUA.
и строка и таблица это TValue содержащий тип и указатель.  
Когда таблицы нет,
то надо что-то верную .
Лучше полагаю вернуть nil,
но почему-то рушили возвращать пустую строку.
 
Serge123, здравствуйте.

1. Актуальная документация к QLua находится по ссылке: https://arqatech.com/upload/iblock/114/quik_lua.zip В нее внесены изменения, о которых вы говорите.
2. Если спрос и предложения будут отсутствовать, то действительно будет возвращена пустая строка. Таков дизайн QLua.
3. Указанный вами случай описан в документации в п. 3.9.1
 
Цитата
Oleg Kuzembaev написал:
2. Если спрос и предложения будут отсутствовать, то действительно будет возвращена пустая строка. Таков дизайн QLua.
Нет, в этом случае не будет параметров bid и offer согласно вашей же док-ции.
Оказывается, ещё в октябре прошлого года, похоже, после того, как я на форуме об этом написал, эту док-цию исправили в файле "Интерпретатор языка Lua.pdf", но почему-то не исправили в файле QLUA.chm, который входит в Квик, поэтому я об этом узнал только сейчас.
 
Цитата
nikolz написал:
Возможно это потому, что это LUA.
Мне кажется, Квик формирует эти таблицы от коллбэков в коде на Си++, а на стороне клиента тоже ведь могут работать длл на Си.

Я ещё в прошлом году предлагал вместо этой таблицы от getQuoteLevel2, на построение которой тратится куча времени, передавать параметры в строке через разделители. Сделать для этого getQuoteLevel2Ex. getQuoteLevel2 в длл является бутылочным горлышком, которое тормозит работу: надо создавать строки, интернировать их, считать хеши... Но, конечно, этого, как всегда, не сделают.
 
Цитата
Serge123 написал:
Цитата
nikolz написал:
Возможно это потому, что это LUA.
Мне кажется, Квик формирует эти таблицы от коллбэков в коде на Си++, а на стороне клиента тоже ведь могут работать длл на Си.

Я ещё в прошлом году предлагал вместо этой таблицы от getQuoteLevel2, на построение которой тратится куча времени, передавать параметры в строке через разделители. Сделать для этого getQuoteLevel2Ex. getQuoteLevel2 в длл является бутылочным горлышком, которое тормозит работу: надо создавать строки, интернировать их, считать хеши... Но, конечно, этого, как всегда, не сделают.
Уу финама есть такая штука называется TRANSAQ
Когда-то делал на ней робота.
Вещь хорошая но тогда была еще сырая и было много глюков
Потом ушел от них а TRANSAQ только их.
Так вот в TRANSAQ передаются  лишь изменения стакана.
т е хотите сами стройте что угодно или не стройте.
--------------------
В QUIK создали библиотку QLUA как мост бежду VMLUA и терминалом.
Это не библиотека для написания роботов
а скорее библиотека для написания отображения каких -то не сложных вычислений на экране.
Поэтому все так.
 
Цитата
Serge123 написал:
Мне кажется, Квик формирует эти таблицы от коллбэков в коде на Си++, а на стороне клиента тоже ведь могут работать длл на Си.

Я ещё в прошлом году предлагал вместо этой таблицы от getQuoteLevel2, на построение которой тратится куча времени, передавать параметры в строке через разделители. Сделать для этого getQuoteLevel2Ex. getQuoteLevel2 в длл является бутылочным горлышком, которое тормозит работу: надо создавать строки, интернировать их, считать хеши... Но, конечно, этого, как всегда, не сделают.

Правильно понимаем, что вы уже регистрировали пожелание на доработку будущих версий? Если нет, то предлагаем сделать это сейчас.
 
Цитата
Oleg Kuzembaev написал:
Правильно понимаем, что вы уже регистрировали пожелание на доработку будущих версий? Если нет, то предлагаем сделать это сейчас.
Я только помню, что давно высказал такое пожелание. Поэтому, на всякий случай (а вдруг сделают) зарегистрируйте пожелание: сделать функцию getQuoteLevel2Ex аналогичную getQuoteLevel2, но чтобы она возвращала результат в строке. Напр., пусть в настройках Квика глубина стакана = 4. Тогда, к примеру, по тикеру LKOH возвращалось бы
Код
bids=4 5391.0/252 5390.5/1 5390.0/843 5389.5/25 offers=4 5391.5/66 5392.0/79 5392.5/6 5393.0/806
Колич. цифр после десятичной точки = параметру "точность" в таблице инструментов. Если, скажем, бидов нет, то
Код
bids=0 offers=4 5391.5/66 5392.0/79 5392.5/6 5393.0/806
Вообще-то аналогично можно также таблицу alltrade для ускорения обработки возвращать тоже в виде строки, но там много параметров (которые нужны не все).
 
Serge123, здравствуйте.

Ваше пожелание зарегистрировано.  Мы постараемся рассмотреть его и  сообщить Вам результаты анализа. Впоследствии, по результатам анализа,  будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
Вот ещё вопрос возник: что по правилам Квика возвращает getQuoteLevel2, если
1) вызвать его с ошибочными данными,
2) если пришёл OnQuote перед окончанием вечерней сессии, а getQuoteLevel2 по этому коллбэку был вызван уже после её окончания?
В документации этого нет.
Возвращает ли в каких-то случаях getQuoteLevel2 вместо таблицы nil, или всегда возвращается таблица, но в этом случае в ней будет одна dummy нода (нода типа nil)?
 
Кстати, в глобальной таблице _G уже есть недокументированная функция getQuoteLevel2Ex.
 
Serge123, добрый день.

1. В этом случае ответ придет таким же, как при отсутствии данных.
2. Если терминал успеет получить информацию о котировках после вызова OnQuote, то вызов getQuoteLevel2 выдаст актуальные данные. В противном случае - как в п.1
 
Цитата
Serge123 написал:
Нормальному человеку трудно представить, как можно написать в док-ции, что bid имеет тип TABLE, но может возвращать пустую строку...

Из армейского фольклора: "В военное время величина синуса может достигать четырёх".
Это вы конечно смешно написали) Тоже удивлялся такому подходу с возвращением пустой строки. Но может по их внутренней логике так было проще, чем специально нилить поля таблицы. Да это же и не критично на самом деле. Достаточно же просто проверить варианты на пустую стоку, каунты на ноль, Ну и на nil проверьте если что. А вот зачем вариант со строками, где все цены и лоты в одну строку? Потом самому парсить эту строку в цикле? Потом из цикла всё это распихивать по своим таблицам или переменным? Зачем? Вам дана уже готовая таблица. Пользуйтесь. Если вам нужна компактность, сохранение, ну так кто мешает написать свои функции и из готовых таблиц слепить себе нужные строки? Ваш вариант будет ещё хуже, так как надо будет разбирать строки на отдельные данные через регулярки, это ещё дольше, чем у них на сях там всё уже по полочкам разложено.
 
Цитата
Serge123 написал:
Цитата
nikolz написал:
Возможно это потому, что это LUA.
Мне кажется, Квик формирует эти таблицы от коллбэков в коде на Си++, а на стороне клиента тоже ведь могут работать длл на Си.

Я ещё в прошлом году предлагал вместо этой таблицы от getQuoteLevel2, на построение которой тратится куча времени, передавать параметры в строке через разделители. Сделать для этого getQuoteLevel2Ex. getQuoteLevel2 в длл является бутылочным горлышком, которое тормозит работу: надо создавать строки, интернировать их, считать хеши... Но, конечно, этого, как всегда, не сделают.
Я конечно не знаю внутреннюю кухню организации работы getQuoteLevel2 внутри qlua. Но думаю, что всё там организовано именно так, как надо. Есть некий буфер, куда валятся данные котировок с сервера. Построена таблица, со ссылками на элементы таблицы. Вам возвращается ссылка на эту таблицу. Что вам ещё нужно? Какое узкое горлышко? Вам нужно внутри dll? Создавайте цикл, к примеру так:
Код
static int l_getAverageVol(lua_State *L) {
   lua_Number Vol = 0;
   lua_Integer PricesLen = luaL_len(L, 1);
   for (lua_Integer i = 1; i <= PricesLen; i++)
   {
      lua_rawgeti(L, 1, i); // prices
      lua_getfield(L, -1, "price");
      lua_Number price = luaL_checknumber(L, -1);
      lua_pop(L, 1); // price
      lua_getfield(L, -1, "qty");
      lua_Integer qty = luaL_checkinteger(L, -1); // количество в лотах
      lua_pop(L, 2); // qty, prices
      Vol += price * qty;
   }
   lua_pushnumber(L, Vol);
   return 1;
}
Фактически и на стороне квика всё просто, у них идёт поток данных в буфер, и вы просто берёте нужные данные и делаете с ними что хотите, они уже в чистом виде вам даны. А так вам надо будет ещё дополнительно функции писать на разбор строк!
Страницы: 1
Читают тему
Наверх