getParamEx

Страницы: 1
RSS
getParamEx
 
Вот такой код:
Код
local status = getParamEx(class_code, sec_code, "tradingstatus")
message(status.param_value)
выводит "0.000000".
Но мы уже наученные - понимаем, что ноль в QUIK - это не всегда ноль. Проверяем тип данных, чтобы не был равен 0:
Код
message(status.param_type)
выводит 2.
Вроде, нормально. Ан, нет: для параметра "tradingstatus" тип должен быть 4. Значит данный параметр Квиком не получен. И так для многих параметров.

Но надо сделать так, чтобы можно было однозначно определить, без гаданий, получен ли параметр торговой системой или нет.
Надо делать так, как надо. А как не надо - делать не надо.
 
http://forum-archive.quik.ru/forum/lua/115526/115556/#m115556
 
является ли выполнение условия
Код
result=="1" and param_image~="" and param_type~="0"
необходимым и достаточным, чтобы быть уверенным, что значение параметра получено?
Надо делать так, как надо. А как не надо - делать не надо.
 
с такими выражениями - надо быть аккуратным в QLUA с его "ленивыми вычислениями"

а вообще, надо полный пример для теста и разбора. т.е. с указанием класса и кода бумаги и т. и т. п.
 
такое ощущение, что кто-то решил написать справку из вопросов и ответов форума по всей QLUA:)))))
 
Цитата
тот самый пишет:
с такими выражениями - надо быть аккуратным в QLUA с его "ленивыми вычислениями"
Именно, с учётом "ленивого" правильного вычисления это выражение является корректным.
Цитата
тот самый пишет:
а вообще, надо полный пример для теста и разбора. т.е. с указанием класса и кода бумаги и т. и т. п.
Зачем? Любой код бумаги подставляете.

Вот так выглядит таблица, возвращаемая getParamEx, если искомый параметр ("tradingstatus") не задан в списках:
Код
{param_type="2", param_value="0.000000", result="1", param_image=""}
А вот так, если параметр получен:
Код
{param_type="4", param_value="1.000000", result="1", param_image="открыта"}
Надо делать так, как надо. А как не надо - делать не надо.
 
полный пример в студию.
 
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
 
я - так и знал...
:)))))
 
тогда, предлагаю совместный проект. подробности вконтакте.
 
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
 
Скрытый текст
 
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
 
ну и замечательно))
 
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
 
нет смысла. я общаюсь только через озвученный источник.
если заинтересует детальный анализ любой из QLUA-функций - обращайтесь.
 
Вот такой код:
Код
local status = getParamEx(class_code, sec_code, "tradingstatus")
message(status.param_value)
выводит "0.000000".

У меня постоянна такая ситуация. Можно ли как-то с ней бороться?
 
Добрый день.

Можете полный код выложить и уточните, что в самой таблице текущих параметров в поле
tradingstatus отображается?
 
1. Что-то не вижу в документации по QLua информации по полю result. Пропустили. У меня документация не самая последняя, но подозреваю, что и в последней этого описания нет.

2. Название параметра в каком регистре правильнее указывать? В QPILE написано, что требуется в верхнем регистре. В QLua все равно, как я вижу?
 
Цитата
Constantin написал:
1. Что-то не вижу в документации по QLua информации по полю result. Пропустили. У меня документация не самая последняя, но подозреваю, что и в последней этого описания нет.
Информация получена, проблема изучается. Постараемся в ближайшее время дать ответ.

Цитата
Constantin написал:
2. Название параметра в каком регистре правильнее указывать? В QPILE написано, что требуется в верхнем регистре. В QLua все равно, как я вижу?
В QLUA все равно, однако это касается только параметров наших функций.
Для Lua таблиц регистр имеет значение.
 
Constantin,      Добрый день,
   
    Документация будет исправлена в одной из очередных версий программы.
    Приносим извинения за причиненные неудобства.
 
Constantin,      Добрый день,
   
    Описаннная в данном инциденте проблема была устранена в версии 7.2.0     терминала QUIK.
    Рекомендуем Вам обновить версию программы.
   
    Приносим извинения за причиненные неудобства.
 
Извините, что не по теме, но этот топик выходит в первых строках результата Яндекса.

Я правильно понимаю, что список параметров, которые можно получить с помощью GetParamEx, до сих пор является тайной за семью печатями, и нигде-нигде официально не описан?
 
Цитата
Владимир написал:
Извините, что не по теме, но этот топик выходит в первых строках результата Яндекса.

Я правильно понимаю, что список параметров, которые можно получить с помощью GetParamEx, до сих пор является тайной за семью печатями, и нигде-нигде официально не описан?

Не совсем так, он не является тайной.
Он есть в info.chm
-Раздел 8. Алгоритмический язык QPILE
--Функции для получения значений Таблицы текущих торгов
---Значения параметров функций

Если там какого-то параметра нет, его можно узнать выведя таблицу по DDE с установленной галкой "Формальные заголовки"
 
В качестве совета.
чтобы не было мучительно больно при использовании значений X, которые должны быть числами, надо делать так:
if type(X)=="number" then
...
end
чтобы не попадаться на nil при условии, что X может быть лишь числом надо делать так:
Z=X or 0;
 
Цитата
Sergey Gorokhov написал:
Цитата
Владимир написал:
Извините, что не по теме, но этот топик выходит в первых строках результата Яндекса.

Я правильно понимаю, что список параметров, которые можно получить с помощью 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? Кто ее ставит брокер или биржа?
Какая функция в итоге показывает приостановку торгов инструментом?

Статус транслирует биржа.
Если статус был некорректным, Вам следует обратиться к брокеру для проведения диагностики совместно со специалистами биржи.
 
Цитата
Sergey Gorokhov написал:
Цитата
Mikhail написал:
Здравствуйте! Не подскажете почему во время приостановке торгов фьючерсами например сегодня в 11.17.55 LKH0
ф-ии
getParamEx(class, name, "STATUS").param_value
getParamEx(class, name, "TRADINGSTATUS").param_value
возвращают 1? Кто ее ставит брокер или биржа?
Какая функция в итоге показывает приостановку торгов инструментом?

Статус транслирует биржа.
Если статус был некорректным, Вам следует обратиться к брокеру для проведения диагностики совместно со специалистами биржи.
По моему опыту, биржа не особенно следит за тем, что указано в статусе при приостановке торгов по инструменту.
 
Цитата
Старатель написал:
Вот так выглядит таблица, возвращаемая getParamEx, если искомый параметр ("tradingstatus") не задан в списках:
Код
  {param_type =  "2" , param_value =  "0.000000" , result =  "1" , param_image =  "" }  
А вот так, если параметр получен:
Код
  {param_type =  "4" , param_value =  "1.000000" , result =  "1" , param_image =  "открыта" }  
Спасибо! Коротко, ясно, чётко и всё по делу!
 
Цитата
Старатель написал:
А вот так, если параметр получен:
Код
  {param_type =  "4" , param_value =  "1.000000" , result =  "1" , param_image =  "открыта" }  
А если в США премаркет, то будет param_image = 'открытие' на NASDAQ_BEST
А если биржа и у нас и в США работает, то у меня param_image = 'открыта'
 
А если биржа и у нас и в США не работает, то у меня param_image = 'закрыта'
 
Кто подскажет как выкрутиться? Вызов 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.
 
Перед подачей заявки на бирже у мен стоит такая функция, работает как часы.
Код
local tostring_=tostring
local math_tointeger=math.tointeger

function t_(x)
return tostring_(math_tointeger(x) or x)
end
 
nikolz, Нет в луа никакого  integer. Нет, не было и не будет. Торкаешь носом торкаешь... умолкает, потом снова всплывает и снова начинает вонять. :cry:  
 
Цитата
Владимир написал:
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

LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
 lua_lock(L);
 setivalue(L->top, n);
 api_incr_top(L);
 lua_unlock(L);
}
--------------------------------
Более того, целое хранится иначе чем number, которое по умолчанию double.
==============
 
Возможно стоит добавить, что с версии 5.3, есть и целочисленное деление //
 
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 }?
  Элементарно, "Ватсон"  :smile: .
Пример:
Код
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 в природе у него нет. Как он там конкретно хранит целые и вещественные и как он их преобразует из одних в другие - только ему и известно. Всё это типа для "упрощения" программирования замутили.
 
Цитата
Alexander написал:
Цитата
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(ноль число), тогда чётко работает. Это придётся учитывать.
 
Динамичность типов языка - это особенность, а не обязательство. Никто не заставляет это использовать. И даже вполне естественно в сложных скриптах не использовать вовсе, если даже не контролировать и запрещать.
Страницы: 1
Читают тему (гостей: 1)
Наверх