Наверно это надо понимать так , что в этой функции надо задать код класса, код бумаги и код нужного параметра , что бы получить значение параметра для данной бумаги в текущей таблице. Но где посмотреть как правильно написать код требуемого параметра, где взять этот код? Например для акций по Лукойлу я хочу получить цену последней сделки. Не подскажете?
Андрей, Большинство параметров описаны в документации на терминал QUIK -Раздел 8. Алгоритмический язык QPILE --Функции для получения значений Таблицы текущих торгов ---Значения параметров функций
Кроме того существует возможность узнать имя любого параметра из таблицы текущих торгов. Достаточно вывести таблицу в Excel по DDE с установленной галкой "Формальные заголовки"
Вот нарыл как прочитать нужный мне параметр таблицы "текущие торги" , к примеру получить цену открытия по нужной бумаге, надо написать примерно следующее
Но я задачу себе поставил немного другую, мне нужно открыть всю таблицу целиком "Текущие торги" и последовательно ее перебрать всю сверху вниз и выбрать например в промежуточный массив бумаги определенного критерия. Как выбрать и записать в массив примерно представляю, а вот как перебрать всю текущую таблицу в произвольный момент времени пока не понял. Может подскажете?
Существует ли возможность обращаться из скрипта 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
Спасибо, Роман, я понял. Просто мне было лень разбивать строку из файла (там как раз и код класса, и код инструмента) на несколько подстрок, а сразу вставить туда запятые, как будто это и есть три аргумента. Теперь разделил (примерно так, как Вы описали) - всё работает.
УХ ТЫ! А в описании языка (руководство пользователя) нет ни звука ни про 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]) именно ПОИСК по таблице, но не доступ к её элементам по индексу? Если да, то это должно серьёзно замедлять выполнение скрипта...
Владимир, 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; // последнее значение курса соответствующего тикера
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 интерпретировать строки как операторы языка (или, скажем, функции), то есть имеется ли здесь техническая возможность программирования данными.
Спасибо, Роман! Очень понравился ваш сервис общения с клиентами. Вы ведь сотрудник компании? Передайте руководству мою искреннюю благодарность.
В документации на lua указан только тип number, а он принимает значения с плавающей точкой. Иными словами это тип real (float, double) в других языках программирования, но никак не integer.
А что толку мне от флагов терминала? Мне нужен целочисленный тип ДЛЯ СВОИХ данных!
Да я решил уже все проблемы с терминалом, спасибо. На досуге попробую проверить, есть ли хотя бы теоретическая возможность программирования данными -- и всё (та сама loadstring). Ну, нет массивов, нет масок - придётся обходиться без них.
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! И Гугл ничего по этому запросу не находит, кроме парочки древних тем на этом самом форуме! Это же САМОЕ ВАЖНОЕ расширение функциональности языка! Как же так? Почему нет документации и где её взять?
Anton, Да ладно! Скобки - моя любимая конструкция, я их на автопилоте считаю! Хорошо, проверю попозже - биржа открылась, надобно посмотреть, что там творится...