Наверно это надо понимать так , что в этой функции надо задать код класса, код бумаги и код нужного параметра , что бы получить значение параметра для данной бумаги в текущей таблице. Но где посмотреть как правильно написать код требуемого параметра, где взять этот код? Например для акций по Лукойлу я хочу получить цену последней сделки. Не подскажете?
Андрей, Большинство параметров описаны в документации на терминал QUIK -Раздел 8. Алгоритмический язык QPILE --Функции для получения значений Таблицы текущих торгов ---Значения параметров функций
Кроме того существует возможность узнать имя любого параметра из таблицы текущих торгов. Достаточно вывести таблицу в Excel по DDE с установленной галкой "Формальные заголовки"
Пользователь
Сообщений: Регистрация: 03.12.2017
я новичек и тока учусь
22.02.2018 16:22:15
Цитата
Sergey Gorokhov написал: Раздел 8. Алгоритмический язык QPILE
Спасибо, но меня интересует Qlua, мне казалось это разные языки или один и тот же?
человек (не робот)
Пользователь
Сообщений: Регистрация: 03.12.2017
я новичек и тока учусь
22.02.2018 16:23:22
Цитата
Sergey Gorokhov написал: Достаточно вывести таблицу в Excel по DDE с установленной галкой "Формальные заголовки"
А вот это полезная информация, спасибо большое, буду пробовать
человек (не робот)
Пользователь
Сообщений: Регистрация: 03.12.2017
я новичек и тока учусь
22.02.2018 18:55:16
Вот нарыл как прочитать нужный мне параметр таблицы "текущие торги" , к примеру получить цену открытия по нужной бумаге, надо написать примерно следующее
Но я задачу себе поставил немного другую, мне нужно открыть всю таблицу целиком "Текущие торги" и последовательно ее перебрать всю сверху вниз и выбрать например в промежуточный массив бумаги определенного критерия. Как выбрать и записать в массив примерно представляю, а вот как перебрать всю текущую таблицу в произвольный момент времени пока не понял. Может подскажете?
человек (не робот)
Пользователь
Сообщений: Регистрация: 03.12.2017
я новичек и тока учусь
22.02.2018 22:34:50
Цитата
Sergey Gorokhov написал: Раздел 8. Алгоритмический язык QPILE
Спасибо, все нашел, именно это мне и нужно было.
человек (не робот)
Пользователь
Сообщений: Регистрация: 13.05.2017
14.03.2019 18:19:39
Здравствуйте!
Существует ли возможность обращаться из скрипта QLua к таблице Текущих торгов по номеру строки этой таблицы? Чтобы, например, можно было из скрипта определить какие бумаги представлены в таблице?
Пользователь
Сообщений: Регистрация: 23.01.2015
15.03.2019 05:18:44
Здравствуйте, Такой возможности нет Тем более что LUA не работает именно с таблицами интерфейса, а работает с данными в терминале, разница огромна. Допустим, в терминале Вы можете создать несколько таблиц с разным набором инструментов, к которой таблице должна обратиться LUA? Ответ сразу ко всем, и в LUA Вы будете видеть данные из всех таблиц сразу без разделения что в какой таблице.
Пользователь
Сообщений: Регистрация: 25.09.2020
25.09.2020 09:50:33
Добрый день. Парочка вопросов:
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), доступном на нашем сайте (.
Пользователь
Сообщений: Регистрация: 25.09.2020
28.09.2020 09:20:15
Спасибо, Роман, я понял. Просто мне было лень разбивать строку из файла (там как раз и код класса, и код инструмента) на несколько подстрок, а сразу вставить туда запятые, как будто это и есть три аргумента. Теперь разделил (примерно так, как Вы описали) - всё работает.
УХ ТЫ! А в описании языка (руководство пользователя) нет ни звука ни про unpack, ни про loadstring! А эти вещи, как я предполагаю, должны бы расширять функциональные возможности совершенно диким образом! Спасибо, на досуге попробую поискать, что это за звери, и с чем их едят...
Нет, похоже, здесь мы друг друга не поняли. Как я могу анализировать указанный бит, если тип данных не integer, а real? Там же, насколько я помню, мантисса с характеристикой, а не двоичное представление числа! Собственно, что я хочу: Вот тикает время (каждый раз в обработчике прерывания по таймеру я инкрементирую счётчик вызовов). Если он целого типа, то я по маске этого числа ловлю события 2, 4, 8, 16... тиков (маска, соответственно, 0x1, 0x3, 0x7, 0xF, 0x1F...)
Нет, с битами я работаю с закрытыми глазами - я 40 лет программистом, просто с Lua никогда прежде не сталкивался.
Ещё такой вопрос: если правильно понял, возможности объявить массив (одномерный или большей размерности) или таблицу (массив структур) с тем, чтобы адресоваться к его элементом по индексу, здесь не существует? Ведь конструкция вида: a={}; a[0]={}; a[0][0]="data"; подразумевает для последующего доступа к данным (b=a[i][j]) именно ПОИСК по таблице, но не доступ к её элементам по индексу? Если да, то это должно серьёзно замедлять выполнение скрипта...
Пользователь
Сообщений: Регистрация: 02.09.2020
29.09.2020 06:48:36
Владимир, Lua - не наша разработка. Именно поэтому, руководство пользователя по Lua, идущее с терминалом, не является полным описанием языка, в нем приведены разработанные нами функции для работы с терминалом QUIK.
Со всеми родными функциями и тонкостями языка можно ознакомиться на официальном сайте -
Цитата
Как я могу анализировать указанный бит, если тип данных не integer, а real?
Просим уточнить подробнее, о чем идет речь, желательно на конкретном примере. Все битовые флаги в терминале имеют целочисленный тип. Список с их описанием вы можете найти в руководстве "Интерпретатор языка Lua" (стр. 87).
Со структурами данных языка и особенностями работы с ними вы также можете ознакомиться самостоятельно в официальной документации. С вашим вопросом стоит обратить внимание на данный раздел книги "Программирование на Lua", посвященный как раз таки структурам данных -
Пользователь
Сообщений: Регистрация: 25.09.2020
29.09.2020 10:31:16
Ах, чёрт! А я надеялся, что ваша... ибо убрать тип integer из языка, на мой взгляд, есть самая большая дурость. Ладно, бог с ним, с никому не нужным boolean - пусть будет, если нравится, но с целочисленными переменными я за долгие годы программирования (а я уже пенсионер!) работал раз в 10 чаще, чем с вещественными! Если не во все сто...
Пример... ну, вот набросок, как я написал бы это дело на C (предполагаем, что это обработчик прерываний по таймеру или по совершению сделки (чтобы не опрашивать все тикеры по таймеру):
int iPer; // индекс текущего периода расчета int iData; // счётчик прерываний double Course; // последнее значение курса соответствующего тикера
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 интерпретировать строки как операторы языка (или, скажем, функции), то есть имеется ли здесь техническая возможность программирования данными.
Спасибо, Роман! Очень понравился ваш сервис общения с клиентами. Вы ведь сотрудник компании? Передайте руководству мою искреннюю благодарность.
Пользователь
Сообщений: Регистрация: 02.09.2020
29.09.2020 13:11:47
Владимир, еще раз просим вас уточнить, где конкретно вы нашли тип данных real? Повторюсь, что все флаги в терминале имеют целочисленный тип.
Все еще не можем понять, в чем заключается ваша проблема при работе с терминалом.
Пользователь
Сообщений: Регистрация: 25.09.2020
29.09.2020 18:25:00
В документации на lua указан только тип number, а он принимает значения с плавающей точкой. Иными словами это тип real (float, double) в других языках программирования, но никак не integer.
А что толку мне от флагов терминала? Мне нужен целочисленный тип ДЛЯ СВОИХ данных!
Да я решил уже все проблемы с терминалом, спасибо. На досуге попробую проверить, есть ли хотя бы теоретическая возможность программирования данными -- и всё (та сама loadstring). Ну, нет массивов, нет масок - придётся обходиться без них.
Пользователь
Сообщений: Регистрация: 25.09.2020
02.10.2020 09:05:29
Roman Azarov, Поигрался немного с Lua - вывод: программирование данными ВОЗМОЖНО! Только понадобился какой-то assert, про который в документации ни слуху ни духу - понятия не имею, что это за зверь, но почему-то работает.
Код: 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! И Гугл ничего по этому запросу не находит, кроме парочки древних тем на этом самом форуме! Это же САМОЕ ВАЖНОЕ расширение функциональности языка! Как же так? Почему нет документации и где её взять?
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 09:25:30
Странно... Ну да ладно. assert в С появился так давно, что даже не помню. В 90-х уже был.
А что касается документации, то:
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 09:28:13
И да, loadstring помимо того, что медленная, еще depricated.
Пользователь
Сообщений: Регистрация: 25.09.2020
02.10.2020 09:45:13
Nikolay, 40 лет программирую на С, но про assert впервые слышу. Наверняка это Страуструповские штучки!
Спасибо, почитаю!
Да плевать, что медленная 0 лишь бы работала! Интерпретатор вообще штука медленная, но тут, как я посмотрел, даже миллисекунды пытаются ловить!
Пользователь
Сообщений: Регистрация: 25.09.2020
02.10.2020 09:48:21
Nikolay, Ёлы-палы! Так если верить документации, assert вообще нафиг не нужен! А без него "просто не работает"!
Пользователь
Сообщений: Регистрация: 21.08.2015
02.10.2020 10:00:38
Цитата
Владимир написал: А без него "просто не работает"!
Потому что скобки после него не надо вместе с ним убирать.
Пользователь
Сообщений: Регистрация: 25.09.2020
02.10.2020 10:02:26
Anton, Да ладно! Скобки - моя любимая конструкция, я их на автопилоте считаю! Хорошо, проверю попозже - биржа открылась, надобно посмотреть, что там творится...
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2020 10:16:32
Имелось в виду, наверно, что функция loadstring вернет функцию, которую надо выполнить, т.е. вызвать через ().
Пользователь
Сообщений: Регистрация: 25.09.2020
02.10.2020 11:07:13
Хм... Похоже, я действительно что-то напутал:
assert(loadstring(string.sub(l,2,string.len(l))))() - работает
loadstring(string.sub(l,2,string.len(l)))() - ТОЖЕ работает!