Как прочитать таблицу Текущие торги?

Страницы: 1
RSS
Как прочитать таблицу Текущие торги?
 
На демо счете в Квике эта таблица имеет много полей, картинку прилагаю, а в функции чтения Таблицы торгов в "руководстве пользователя QLUa" написано
Код
ParamRequest
Функция заказывает получение параметров Таблицы текущих торгов.  
BOOLEAN ParamRequest(STRING class_code, STRING sec_code, STRING  db_name)
Наверно это надо понимать так , что в этой функции надо задать код класса, код бумаги и код нужного параметра , что бы получить значение параметра для данной бумаги в текущей таблице. Но где посмотреть как правильно написать код требуемого параметра, где взять этот код? Например для акций по Лукойлу я хочу получить цену последней сделки. Не подскажете?
человек (не робот)
 
Андрей,
Большинство параметров описаны в документации на терминал QUIK
-Раздел 8. Алгоритмический язык QPILE
--Функции для получения значений Таблицы текущих торгов
---Значения параметров функций

Кроме того существует возможность узнать имя любого параметра из таблицы текущих торгов.
Достаточно вывести таблицу в Excel по DDE с установленной галкой "Формальные заголовки"
 
Цитата
Sergey Gorokhov написал:
Раздел 8. Алгоритмический язык QPILE
Спасибо, но меня интересует Qlua, мне казалось это разные языки или один и тот же?
человек (не робот)
 
Цитата
Sergey Gorokhov написал:
Достаточно вывести таблицу в Excel по DDE с установленной галкой "Формальные заголовки"
А вот это полезная информация, спасибо большое, буду пробовать
человек (не робот)
 
Вот нарыл как прочитать нужный мне параметр таблицы "текущие торги" , к примеру получить цену открытия по нужной бумаге, надо написать примерно следующее
Код
CenaOtkr=tonumber(getParamEx("TQBR","LKOH","OPEN").param_value);
Но я задачу себе поставил немного другую, мне нужно открыть всю таблицу целиком "Текущие торги" и последовательно ее перебрать всю сверху вниз и выбрать например в промежуточный массив бумаги определенного критерия. Как выбрать и записать в массив примерно представляю, а вот как перебрать всю текущую таблицу в произвольный момент времени пока не понял. Может подскажете?
человек (не робот)
 
Цитата
Sergey Gorokhov написал:
Раздел 8. Алгоритмический язык QPILE
Спасибо, все нашел, именно это мне и нужно было.
человек (не робот)
 
Здравствуйте!

Существует ли возможность обращаться из скрипта QLua к таблице Текущих торгов по номеру строки этой таблицы?
Чтобы, например, можно было из скрипта определить какие бумаги представлены в таблице?
 
Здравствуйте,
Такой возможности нет
Тем более что LUA не работает именно с таблицами интерфейса, а работает с данными в терминале, разница огромна.
Допустим, в терминале Вы можете создать несколько таблиц с разным набором инструментов, к которой таблице должна обратиться LUA?
Ответ сразу ко всем, и в LUA Вы будете видеть данные из всех таблиц сразу без разделения что в какой таблице.
 
Добрый день. Парочка вопросов:

1. По документации Lua, доступ к таблице текущих торгов осуществляется через функцию getParamEx, примерно так:
s=getParamEx("FQBR","AAPL-RM","LAST").param_value;
Если  пишу это тупым кодом в теле функции. то всё вроде как работает, возвращается цена последней сделки.
Но если я формирую строку
s=\"FQBR\",\"AAPL-RM\",\"LAST\"
а затем вызываю
getParamEx(s).param_value;
то возвращается nil
Что я не так елаю и есть ли возможность динамически создавать строку аргументов (что-то типа функции eval в JavaScript)?

2. Я не нашёл тип данных integer ВООБЩЕ! И как же мне работать с битовыми масками? Как на Lua реализуется конструкция вида:
if (iData & 0x80) { blah-blah-blah }?
 
Владимир, здравствуйте!

Ответим на ваши вопросы по порядку:

1) Дело в том, что функция getParamEx принимает 3 аргумента, а вы пытаетесь передать в нее одну строку.

Динамически изменяемые параметры в функцию можно передать следующим образом:
   class = "код класса"
   sec = "код инструмента"
   param = "параметр"
   s = getParamEx(class, sec, param).parav_value

Также, можно воспользоваться функцией unpack
   arg = {}
   arg[1] = "код класса"
   arg[2] = "код инструмента"
   arg[3] = "параметр"
   s = getParamEx(unpack(arg)).param_value

Помимо этого, в Lua действительно есть функция идентичная eval в JS - loadstring
Пример ее использования:
   s = loadstring("return 'код класса', 'код инструмента', 'параметр'")
   getParamEx(s()).param_value)


2) Если мы вас правильно поняли, для вашей задачи подойдут две функции:
bit.test - проверяет состояние указанного бита в значении. Возвращает true, если бит равен "1", и false, если бит равен "0".
Пример:
   if bit.test(х, n) then
   ---
   end
Где x - значение, а n - порядковый номер бита, начинающийся с 0 (1й бит имеет порядковый номер 0, 2й - 1 и т.д.)

Если же вы хотите задавать бит именно числом, то можно воспользоваться функцией bit.band.
Пример (проверка бита с порядковым номером 1):
   if bit.band(x,0x2) ~= 0 then
   ---
   end

Подробнее о работе с битовыми масками вы можете прочесть в руководстве пользователя "Интерпретатор языка Lua" (стр. 90), доступном на нашем сайте (https://arqatech.com/upload/iblock/194/quik_lua.zip).
 
Спасибо, Роман, я понял. Просто мне было лень разбивать строку из файла (там как раз и код класса, и код инструмента) на несколько подстрок, а сразу вставить туда запятые, как будто это и есть три аргумента. Теперь разделил (примерно так, как Вы описали) - всё работает.

УХ ТЫ! А в описании языка (руководство пользователя) нет ни звука ни про unpack, ни про loadstring! А эти вещи, как я предполагаю, должны бы расширять функциональные возможности совершенно диким образом! Спасибо, на досуге попробую поискать, что это за звери, и с чем их едят...

Нет, похоже, здесь мы друг друга не поняли. Как я могу анализировать указанный бит, если тип данных не integer, а real? Там же, насколько я помню, мантисса с характеристикой, а не двоичное представление числа! Собственно, что я хочу:
Вот тикает время (каждый раз в обработчике прерывания по таймеру я инкрементирую счётчик вызовов). Если он целого типа, то я по маске этого числа ловлю события  2, 4, 8, 16... тиков (маска, соответственно, 0x1, 0x3, 0x7, 0xF, 0x1F...)

Нет, с битами я работаю с закрытыми глазами - я 40 лет программистом, просто с Lua никогда прежде не сталкивался.  :smile:

Ещё такой вопрос: если  правильно понял, возможности объявить массив (одномерный или большей размерности) или таблицу (массив структур) с тем, чтобы адресоваться к его элементом по индексу, здесь не существует? Ведь конструкция вида:
a={}; a[0]={}; a[0][0]="data";
подразумевает для последующего доступа к данным (b=a[i][j]) именно ПОИСК по таблице, но не доступ к её элементам по индексу? Если да, то это должно серьёзно замедлять выполнение скрипта...
 
Владимир, Lua - не наша разработка. Именно поэтому, руководство пользователя по Lua, идущее с терминалом, не является полным описанием языка, в нем приведены разработанные нами функции для работы с терминалом QUIK.

Со всеми родными функциями и тонкостями языка можно ознакомиться на официальном сайте - https://www.lua.org/

Цитата
Как я могу анализировать указанный бит, если тип данных не integer, а real?
Просим уточнить подробнее, о чем идет речь, желательно на конкретном примере. Все битовые флаги в терминале имеют целочисленный тип.
Список с их описанием вы можете найти в руководстве "Интерпретатор языка Lua" (стр. 87).

Со структурами данных языка и особенностями работы с ними вы также можете ознакомиться самостоятельно в официальной документации. С вашим вопросом стоит обратить внимание на данный раздел книги "Программирование на Lua", посвященный как раз таки структурам данных - https://www.lua.org/pil/11.html
 
Ах, чёрт! А я надеялся, что ваша... ибо убрать тип integer из языка, на мой взгляд, есть самая большая дурость. Ладно, бог с ним, с никому не нужным boolean - пусть будет, если нравится, но с целочисленными переменными я за долгие годы программирования (а я уже пенсионер!) работал раз в 10 чаще, чем с вещественными! Если не во все сто...

Пример... ну, вот набросок, как я написал бы это дело на C (предполагаем, что это обработчик прерываний по таймеру или по совершению сделки (чтобы не опрашивать все тикеры по таймеру):

int iPer; // индекс текущего периода расчета
int iData; // счётчик прерываний
double Course; // последнее значение курса соответствующего тикера

static UI16 MaskPer[] = // маски свечей по периодам
{ 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF };

for (_iData = 1;;_iData++) // цикл приёма внешних данных от QUIK
{ // (текущие значения инструментов)
 Course = ReadValue (); // новое значение курса для выбранного тикера
 for (iPer = 0; iPer < N_PER; iPer++)
 { // цикл набора статистики по периодам
  MO[iPer][0] += Course; // набираем свечу за период
  if (iData & _MaskPer[iPer]) // свеча по данному периоду ещё набирается
   continue; // ждём события "пришла новая свеча"
  MO[iPer][0] /= _MaskPer[iPer] + 1;
  for (i = N_CANDLES - 1; i > 0; i--)
   MO[iPer][i] = MO[iPer][i - 1];
  MO[iPer][0] = 0; // обнуляем последнюю свечу, сдвигая уже набранные
 } // конец цикла набора статистики

Младший уровень лично я собираюсь установить по прерываниям каждые 15 секунд, Таким образом, мы в любой момент времени имеем полные данные по каждому инструменту по всем периодам расчёта (в данном примере, от 15-секундных до часовых свечей). Вуаля! Остальное, как говорится, "дело техники".

Ну вот, по Вашей ссылке, первым же предложением: "Tables in Lua are not a data structure; they are the data structure. All structures that other languages offer---arrays, records, lists, queues, sets---are represented with tables in Lua". Иными словами, никаких структур данных просто НЕТ! Печально... А уж "обоснование" и вообще курам на смех: "Хотя мы МОЖЕМ (!) реализовать массивы и списки, таблицы мощнее. Многие алгоритмы упрощаются до тривиальности с использованием таблиц". И дальше вообще издевательство: "Например, вы редко пишете поиск в Lua, потому что таблицы предлагают прямой (!!!) доступ к любому типу". Ребятки, доступ по ключу - это не прямой, а как раз КРИВОЙ доступ к данным! Даже если обозвать ключи "индексами". Уши бы надрать этому "Роберто Иерусалимскому!

В общем, с языком почти всё ясно: граф (точнее, дерево) объектов построить можно, а простейшую таблицу или даже массив - нельзя. Остаётся разобраться со строковыми переменными: способна ли эта loadstring интерпретировать строки как операторы языка (или, скажем, функции), то есть имеется ли здесь техническая возможность программирования данными.

Спасибо, Роман! Очень понравился ваш сервис общения с клиентами. Вы ведь сотрудник компании? Передайте руководству мою искреннюю благодарность.
 
Владимир, еще раз просим вас уточнить, где конкретно вы нашли тип данных real?
Повторюсь, что все флаги в терминале имеют целочисленный тип.

Все еще не можем понять, в чем заключается ваша проблема при работе с терминалом.
 
В документации на lua указан только тип number, а он принимает значения с плавающей точкой. Иными словами это тип real (float, double) в других языках программирования, но никак не integer.

А что толку мне от флагов терминала? Мне нужен целочисленный тип ДЛЯ СВОИХ данных!  :smile:

Да я решил уже все проблемы с терминалом, спасибо. На досуге попробую проверить, есть ли хотя бы теоретическая возможность программирования данными -- и всё (та сама loadstring). Ну, нет массивов, нет масок - придётся обходиться без них.
 
Roman Azarov, Поигрался немного с Lua - вывод: программирование данными ВОЗМОЖНО! Только понадобился какой-то assert, про который в документации ни слуху ни духу - понятия не имею, что это за зверь, но почему-то работает.  :smile:

Код:
for l in F:lines() do -- цикл по строкам файла данных
 s=string.sub(l,0,1) -- первый символ строки может быть командой
 if s=="_" then -- команда задания суммы доступной валюты
  assert(loadstring(string.sub(l,2,string.len(l))))()
end

Таким образом, я пишу команды для Lua В ФАЙЛЕ, а исполняются они, как будто набиты В ТЕЛЕ ПРОГРАММЫ. Но без assert это дело не работает, а с ним... убей, не понимаю, что делает assert, а что loadstring! И Гугл ничего по этому запросу не находит, кроме парочки древних тем на этом самом форуме! Это же САМОЕ ВАЖНОЕ расширение функциональности языка! Как же так? Почему нет документации и где её взять?
 
Странно...
Ну да ладно. assert в С появился так давно, что даже не помню. В 90-х уже был.

А что касается документации, то:
http://lua-users.org/
https://lua.org.ru/contents_ru.html
https://www.litres.ru/robertu-ieruzalimski/programmirovanie-na-yazyke-lua-9998731/
 
И да, loadstring помимо того, что медленная, еще depricated.
 
Nikolay, 40 лет программирую на С, но про assert впервые слышу. Наверняка это Страуструповские штучки!  :smile:

Спасибо, почитаю!

Да плевать, что медленная 0 лишь бы работала! Интерпретатор вообще штука медленная, но тут, как я посмотрел, даже миллисекунды пытаются ловить!  :smile:  
 
Nikolay, Ёлы-палы! Так если верить документации, assert вообще нафиг не нужен! А без него "просто не работает"!  :shock:  
 
Цитата
Владимир написал:
А без него "просто не работает"!
Потому что скобки после него не надо вместе с ним убирать.
 
Anton, Да ладно! Скобки - моя любимая конструкция, я их на автопилоте считаю!  :smile: Хорошо, проверю попозже - биржа открылась, надобно посмотреть, что там творится...
 
Имелось в виду, наверно, что функция loadstring вернет функцию, которую надо выполнить, т.е. вызвать через ().
 
Хм... Похоже, я действительно что-то напутал:

assert(loadstring(string.sub(l,2,string.len(l))))() - работает

loadstring(string.sub(l,2,string.len(l)))() - ТОЖЕ работает!
Страницы: 1
Читают тему (гостей: 1)
Наверх