local status = getParamEx(class_code, sec_code, "tradingstatus")
message(status.param_value)
выводит "0.000000". Но мы уже наученные - понимаем, что ноль в QUIK - это не всегда ноль. Проверяем тип данных, чтобы не был равен 0:
Код
message(status.param_type)
выводит 2. Вроде, нормально. Ан, нет: для параметра "tradingstatus" тип должен быть 4. Значит данный параметр Квиком не получен. И так для многих параметров.
Но надо сделать так, чтобы можно было однозначно определить, без гаданий, получен ли параметр торговой системой или нет.
Надо делать так, как надо. А как не надо - делать не надо.
тот самый пишет: такое ощущение, что кто-то решил написать справку из вопросов и ответов форума по всей QLUA:)))))
Ну, если все зарегистрированные участники этого форума скинутся хотя бы по 100 руб./мес, то я напишу и буду поддерживать в актуальном состоянии расширенную справку по QLua с описаниями особенностей работы некоторых функций, с нормальными примерами по всем функциям и известными багами на сегодняшний день
Надо делать так, как надо. А как не надо - делать не надо.
1. Что-то не вижу в документации по QLua информации по полю result. Пропустили. У меня документация не самая последняя, но подозреваю, что и в последней этого описания нет.
2. Название параметра в каком регистре правильнее указывать? В QPILE написано, что требуется в верхнем регистре. В QLua все равно, как я вижу?
Constantin написал: 1. Что-то не вижу в документации по QLua информации по полю result. Пропустили. У меня документация не самая последняя, но подозреваю, что и в последней этого описания нет.
Информация получена, проблема изучается. Постараемся в ближайшее время дать ответ.
Цитата
Constantin написал: 2. Название параметра в каком регистре правильнее указывать? В QPILE написано, что требуется в верхнем регистре. В QLua все равно, как я вижу?
В QLUA все равно, однако это касается только параметров наших функций. Для Lua таблиц регистр имеет значение.
Извините, что не по теме, но этот топик выходит в первых строках результата Яндекса.
Я правильно понимаю, что список параметров, которые можно получить с помощью GetParamEx, до сих пор является тайной за семью печатями, и нигде-нигде официально не описан?
Владимир написал: Извините, что не по теме, но этот топик выходит в первых строках результата Яндекса.
Я правильно понимаю, что список параметров, которые можно получить с помощью GetParamEx, до сих пор является тайной за семью печатями, и нигде-нигде официально не описан?
Не совсем так, он не является тайной. Он есть в info.chm -Раздел 8. Алгоритмический язык QPILE --Функции для получения значений Таблицы текущих торгов ---Значения параметров функций
Если там какого-то параметра нет, его можно узнать выведя таблицу по DDE с установленной галкой "Формальные заголовки"
В качестве совета. чтобы не было мучительно больно при использовании значений X, которые должны быть числами, надо делать так: if type(X)=="number" then ... end чтобы не попадаться на nil при условии, что X может быть лишь числом надо делать так: Z=X or 0;
Владимир написал: Извините, что не по теме, но этот топик выходит в первых строках результата Яндекса.
Я правильно понимаю, что список параметров, которые можно получить с помощью GetParamEx, до сих пор является тайной за семью печатями, и нигде-нигде официально не описан?
Не совсем так, он не является тайной. Он есть в info.chm -Раздел 8. Алгоритмический язык QPILE --Функции для получения значений Таблицы текущих торгов ---Значения параметров функций
Если там какого-то параметра нет, его можно узнать выведя таблицу по DDE с установленной галкой "Формальные заголовки"
На мой взгляд совершенно не очевидно, что для того, чтобы писать скрипты на QLua необходимо сначала заглянуть в документацию по QPILE и внимательно её изучить. По крайней мере никаких ссылок такого плана на QPILE в документации на QLua не имеется.
Здравствуйте! Не подскажете почему во время приостановке торгов фьючерсами например сегодня в 11.17.55 LKH0 ф-ии getParamEx(class, name, "STATUS").param_value getParamEx(class, name, "TRADINGSTATUS").param_value возвращают 1? Кто ее ставит брокер или биржа? Какая функция в итоге показывает приостановку торгов инструментом?
Mikhail написал: Здравствуйте! Не подскажете почему во время приостановке торгов фьючерсами например сегодня в 11.17.55 LKH0 ф-ии getParamEx(class, name, "STATUS").param_value getParamEx(class, name, "TRADINGSTATUS").param_value возвращают 1? Кто ее ставит брокер или биржа? Какая функция в итоге показывает приостановку торгов инструментом?
Статус транслирует биржа. Если статус был некорректным, Вам следует обратиться к брокеру для проведения диагностики совместно со специалистами биржи.
Mikhail написал: Здравствуйте! Не подскажете почему во время приостановке торгов фьючерсами например сегодня в 11.17.55 LKH0 ф-ии getParamEx(class, name, "STATUS").param_value getParamEx(class, name, "TRADINGSTATUS").param_value возвращают 1? Кто ее ставит брокер или биржа? Какая функция в итоге показывает приостановку торгов инструментом?
Статус транслирует биржа. Если статус был некорректным, Вам следует обратиться к брокеру для проведения диагностики совместно со специалистами биржи.
По моему опыту, биржа не особенно следит за тем, что указано в статусе при приостановке торгов по инструменту.
Кто подскажет как выкрутиться? Вызов getParamEx по инструменту CHZ2(фьючерс на Северсталь) по "OFFER" Беру результат param_value(число), прибавляю к нему целое число. Отправляю транзакцию с этой суммой в цене(через tostring()). Транзакция не проходит. Не правильно указана цена "75941.0" Сообщение об ошибке: Число не может содержать знак разделителя дробной части. Пытаюсь использовать вместо param_value -> param_image(строка с числом без точки и знаков после неё). Но к стрингу не прибавляет число, прогоняю его через tonumber(), - возвращает ошибку nil. Как конкретно взять целое число, сложить и отправить стринг без дробной части? Неужели извращаться и обрезать строку? Вообще не понятно почему не работает tonumber() по параметру param_image? Если просто например написать tonumber("7777777"), то всё нормально - возвращает число. Просто бред какой-то.
Alexander написал: Кто подскажет как выкрутиться? Вызов getParamEx по инструменту CHZ2(фьючерс на Северсталь) по "OFFER" Беру результат param_value(число), прибавляю к нему целое число. Отправляю транзакцию с этой суммой в цене(через tostring()). Транзакция не проходит. Не правильно указана цена "75941.0" Сообщение об ошибке: Число не может содержать знак разделителя дробной части. Пытаюсь использовать вместо param_value -> param_image(строка с числом без точки и знаков после неё). Но к стрингу не прибавляет число, прогоняю его через tonumber(), - возвращает ошибку nil. Как конкретно взять целое число, сложить и отправить стринг без дробной части? Неужели извращаться и обрезать строку? Вообще не понятно почему не работает tonumber() по параметру param_image? Если просто например написать tonumber("7777777"), то всё нормально - возвращает число. Просто бред какой-то.
Написал тестовый код: PriceBaseSell = tonumber(getParamEx(ClassCodeBase, SecCodeBase, "BID").param_image) - SpredOnSellBase PriceFutBuy = tonumber(getParamEx(ClassCodeFutures, SecCodeFutures, "OFFER").param_image) + SpredOnBuyFut local row = InsertRow (tbl.t_id, - 1 ) SetCell (tbl.t_id, row, 1 , tostring(PriceBaseSell), PriceBaseSell) SetCell (tbl.t_id, row, 2 , tostring(PriceFutBuy), PriceFutBuy) Результат с ошибкой: scripts\test2.lua:56: attempt to perform arithmetic on a nil value
Если поменять param_image на param_value то будеn работать, но в таблицу выводит числа с дробной часть после точки.
Alexander, Во-первых, никаких целых чисел тут вообще нет - эти идиоты отменили тип integer. Во-вторых, проблема обрезки концевых нулей здесь не раз обсуждалась, и только я несколько раз приводил код этой функции, так что в моих сообщениях это точно есть. Самому искать лень.
Alexander написал: Кто подскажет как выкрутиться? Вызов getParamEx по инструменту CHZ2(фьючерс на Северсталь) по "OFFER" Беру результат param_value(число), прибавляю к нему целое число. Отправляю транзакцию с этой суммой в цене(через tostring()). Транзакция не проходит. Не правильно указана цена "75941.0" Сообщение об ошибке: Число не может содержать знак разделителя дробной части. Пытаюсь использовать вместо param_value -> param_image(строка с числом без точки и знаков после неё). Но к стрингу не прибавляет число, прогоняю его через tonumber(), - возвращает ошибку nil. Как конкретно взять целое число, сложить и отправить стринг без дробной части? Неужели извращаться и обрезать строку? Вообще не понятно почему не работает tonumber() по параметру param_image? Если просто например написать tonumber("7777777"), то всё нормально - возвращает число. Просто бред какой-то.
так подойдет?
Код
local x=75941.0
local a=math.modf (x)
print("x="..x,"a="..a)
результат:
Код
x=75941.0 a=75941
---------------- для справки 1) есть еще куча способов. 2) начиная с версии 5.3, в луа есть тип integer.
Владимир написал: nikolz, Нет в луа никакого integer. Нет, не было и не будет. Торкаешь носом торкаешь... умолкает, потом снова всплывает и снова начинает вонять.
Владимир, Я понимаю, что дебил и без говна не можете общаться. --------------------- Но уже надоела Ваша чушь. ------------ Приведу Вам доказательство, надеюсь что заткнетесь на время . ----------------- вот Вам фрагменты из кода виртуальной машины LUA версия 5.3. Хотя фрагменты на СИ, но специально для Вас поясняю что и зачем: Фрагмент 1 функция которая проверяет является ли значение стеке целым(integer) ---------------------------------------- LUA_API int lua_isinteger (lua_State *L, int idx) { StkId o = index2addr(L, idx); return ttisinteger(o); } ----------------------------------- Фрагмент 2 Это функция которая помещает в стек возвращаемое из функции значение типа Integer
nikolz, Лапуль, уже не первый раз повторяю для особо одарённых: Нет в луа никакого integer. Нет, не было и не будет. Я уже не молчу, что у этого говна по кличке "динамическая типизация" вообще никаких типов нет, и глюкам, с этим связанных, посвящена чуть не половина здешних веток. Я ещё в самом первом своём сообщении на этом форуме писал: Я не нашёл тип данных integer ВООБЩЕ! И как же мне работать с битовыми масками? Как на Lua реализуется конструкция вида: if (iData & 0x80) { blah-blah-blah }?
Владимир написал: Я не нашёл тип данных integer ВООБЩЕ! И как же мне работать с битовыми масками? Как на Lua реализуется конструкция вида:if (iData & 0x80) { blah-blah-blah }?
Прямо из коробки. lua 5.3
3.4.2 – Bitwise Operators
Lua supports the following bitwise operators:
&: bitwise AND
|: bitwise OR
~: bitwise exclusive OR
>>: right shift
<<: left shift
~: unary bitwise NOT
All bitwise operations convert its operands to integers (see §3.4.3), operate on all bits of those integers, and result in an integer.
Both right and left shifts fill the vacant bits with zeros. Negative displacements shift to the other direction; displacements with absolute values equal to or higher than the number of bits in an integer result in zero (as all bits are shifted out).
Nikolay, Да не надо мне ничего из коробки. Это ЕДИНСТВЕННЫЙ язык, который мне повстречался в жизни, у которого спи&дили целочисленный тип данных, и никакими костылями это не поправить.
Владимир написал: Я не нашёл тип данных integer ВООБЩЕ! И как же мне работать с битовыми масками? Как на Lua реализуется конструкция вида:if (iData & 0x80) { blah-blah-blah }?
Элементарно, "Ватсон" . Пример:
Код
local a =129.0
if (math.tointeger(a) & 0x80) == 128 then --- 0x80 это 128 в десятичном исчислении
message ("С битами можно работать.")
end
TGB, ЗА КАКИМ ХЕРОМ "с битами работать", если нет целочисленных переменных ВААПЩЕ? Эта Ваша "local a" - она КАКОГО типа? Сам факт, что следом стоит "math.tointeger(a)" АДНАЗНАЧНА говорит, что какого угодно, только не целочисленного. Кстати, не нужно указывать, что "0x80 это 128 в десятичном исчислении" - язык, слава богу, прекрасно воспринимает и 16-ричные числа. И анализируемых битов в маске может быть более одного, и сама маска не обязана быть константой. Простейший пример из ассемблера: xor AX, AX - это то же самое, что и mov AX, 0, только работает быстрее и хранится компактнее.
Смешно, но именно тот долбодятел, который здесь утверждает, что целочисленный тип данных в языке имеется и делится потрясающими открытиями вроде "целое хранится иначе чем number" в 2020 году на мою фразу: В 64-разрядный integer спокойно влезают даже 20-значные числа - более 18 квинтиллионов! реагировал так: Разрядность мантиссы в 64 битном вещественном числе составляет 52 бита, что позволяет точно отобразить лишь 16 разрядное десятичное целое число, а не 18 квинтиллионов, как наивно полагает Владимир".
Наконец, эта долбаная динамическая типизация угробит любые типы, даже если бы они там и были. На заре своего появления здесь я описывал работу своего парсера: входные данные, которые все до единого были строками, он заносил в некую структуру, а в этой структуре более половины из них "волшебным образом" превратились в числа. А потому, чтобы не сильно зависеть от того, какая моча вдарит в головожопу интерпретатору в следующую секунду, приходится постоянно заворачивать эти переменные в tostring или tonumber. Тут не только типа integer - тут ваще никаких типов нет!
Mikhail написал: Перед подачей заявки на бирже у мен стоит такая функция, работает как часы.
Код
local tostring_ = tostring
local math_tointeger = math.tointeger
function t_ (x)
return tostring_(math_tointeger(x) or x)
end
Этот код будет работать. Но... 1) Зачем здесь вводить переменную tostring_ и загонять в неё адрес функции tostring и потом вызывать косвенно tostring через tostring_, когда можно сразу вызвать напрямую саму tostring? 2) Если в используемой версии Lua есть функция math.tointeger, то проблем не будет, адрес функции будет и присвоится переменной, а если нет? Косяк... Функция появилась в 5.3 версии.
На смартлабе нашёл вот такой код;
local tointeger = math.tointeger or (function(x) return x end)
function tryInt(x) return tointeger(x) or x end
Работает чётко. Мой разбор синтаксиса такой: в tointeger присваивается адрес либо math.tointeger(если таковая есть в используемой версии), либо адрес безымянной функции, возвращающей то же число, что ей передано(имени нет, но адрес то есть, только он и нужен по сути) на этапе интерпретации скрипта. return косвенно вызывает либо math.tonteger либо безымянную функции в зависимости что попало в переменную tointeger. В случае косвенного вызова через tointeger безымянной функции ошибок не будет и в любом случае вызов tointeger(x) вернёт целое значение, оно и вернётся при любом x, а вторая часть "or x" в return не сработает. В случае же косвенного вызова через tointeger функции math.tointeger если без ошибок сработает, то вернётся целое число и так же вторая часть "or x" не сработает, но если вернёт ошибку, то сработает как раз вторая часть "or x" и она вернёт исходное x. Думаю, что этот вариант лучше и надёжнее. Дальнейшее преобразование в строку через tostring() это уже по надобности.
Что касаемо типов данных в Lua, то считаю, что Владимир прав. На сайте Lua по этому поводу так прямо и написано: "Lua is a dynamically typed language. This means that variables do not have types; only values do. There are no type definitions in the language. All values carry their own type." Так что никаких integer в природе у него нет. Как он там конкретно хранит целые и вещественные и как он их преобразует из одних в другие - только ему и известно. Всё это типа для "упрощения" программирования замутили.
Mikhail написал: Перед подачей заявки на бирже у мен стоит такая функция, работает как часы.
Код
local tostring_ = tostring
local math_tointeger = math.tointeger
function t_ (x)
return tostring_(math_tointeger(x) or x)
end
Этот код будет работать. Но... 1) Зачем здесь вводить переменную tostring_ и загонять в неё адрес функции tostring и потом вызывать косвенно tostring через tostring_, когда можно сразу вызвать напрямую саму tostring? 2) Если в используемой версии Lua есть функция math.tointeger, то проблем не будет, адрес функции будет и присвоится переменной, а если нет? Косяк... Функция появилась в 5.3 версии.
На смартлабе нашёл вот такой код;
local tointeger = math.tointeger or (function(x) return x end)
function tryInt(x) return tointeger(x) or x end
Работает чётко. Мой разбор синтаксиса такой: в tointeger присваивается адрес либо math.tointeger (если таковая есть в используемой версии), либо адрес безымянной функции, возвращающей то же число, что ей передано(имени нет, но адрес то есть, только он и нужен по сути) на этапе интерпретации скрипта. return косвенно вызывает либо math.tonteger либо безымянную функции в зависимости что попало в переменную tointeger . В случае косвенного вызова через tointeger безымянной функции ошибок не будет и в любом случае вызов tointeger(x) вернёт целое значение, оно и вернётся при любом x , а вторая часть " or x " в return не сработает. В случае же косвенного вызова через tointeger функции math.tointeger если без ошибок сработает, то вернётся целое число и так же вторая часть " or x " не сработает, но если вернёт ошибку, то сработает как раз вторая часть " or x " и она вернёт исходное x . Думаю, что этот вариант лучше и надёжнее. Дальнейшее преобразование в строку через tostring() это уже по надобности.
А...да. Тут ещё добавлю, что если вызов tryInt в выражении, то ничего более не надо, а если в чистом виде, то пришлось добавлять в качестве выражения ещё +0(ноль число), тогда чётко работает. Это придётся учитывать.
Динамичность типов языка - это особенность, а не обязательство. Никто не заставляет это использовать. И даже вполне естественно в сложных скриптах не использовать вовсе, если даже не контролировать и запрещать.
Подскажите кто знает если. С помощью getParamEx есть ли параметры в ТТТ такие, чтобы отсортировать фьючерсы на акции от остальных фьючерсов. В квике по названию вроде ничего не подходит. Или как-то такое сделать по другому. Т.е. я получаю: sec_list = getClassSecurities("SPBFUT") и потом мне из всей этой кучи надо выделить только фьючерсы на акции. По класскоду у всех "SPBFUT", что у индексных, что у товарных, что у акционных. Пока вижу только вариант через string.gmatch и шаблон, но тогда для каждого варианта(смотрим на мосбирже все фьючи на акции) надо указать шаблон. Так пока делаю, но это длинно, для каждой акции свой шаблон. И спиок на бирже могут поменять и придётся менять код. Типа бы какого-нибудь не только класскоде, а ещё бы и подкласса иметь на фьючерсы на акции.