Как получить значение Лимита открытых позиций по фьючерсам или как получить элемент из таблицы?

Страницы: 1
RSS
Как получить значение Лимита открытых позиций по фьючерсам или как получить элемент из таблицы?
 
FutLimit=getFuturesLimit("SPBFUT", "SPBFUT****", 0) -- получаем таблицу со значениями
как получить значение из таблицы с идентификатором "cbplimit"?

Можно получить простой пример?
 
FutLimit.cbplimit ?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Серж пишет:
FutLimit. cbplimit ?
нет, так не работает
 
Проверили все работает.
Скорее всего Вы неверно указали параметры, код фирмы или торговый счет.
Проверьте какие параметры указанны в таблице ограничений по счетам.
Первый параметр функции, будет указан в колонке Фирма
Второй в колонке Торговый счет.
Третий параметр, это тип лимита, он указан правильно.
Также проверьте версию терминала. Актуальная сейчас 6.16.1

Если разобраться не получится, пришлите нам для анализа архив с терминалом Quik (без ключей доступа) и файл с полным кодом программы на адрес quiksupport@arqatech.com
 
Цитата
Sergey Gorokhov пишет:
FutLimit=getFuturesLimit("SPBFUT", "SPBFUT****", 0
Я правилно понимаю, что строка должна иметь вид

FutLimit=getFuturesLimit.cbplimit("SPBFUT", "SPBFUT12345", 0) ?

или как то иначе?
 
Цитата
Vasraskolbas пишет:
Цитата
Sergey Gorokhov пишет:
FutLimit=getFuturesLimit("SPBFUT", "SPBFUT****", 0
Я правилно понимаю, что строка должна иметь вид

FutLimit=getFuturesLimit.cbplimit("SPBFUT", "SPBFUT12345", 0) ?

или как то иначе?
Нет не правильно.
Вам выше уже подсказали
Код
FutLimit=getFuturesLimit("SPBFUT", "SPBFUT****", 0) 
x=FutLimit.cbplimit
 
Или можно так
Код
FutLimit=getFuturesLimit("SPBFUT", "SPBFUT****", 0).cbplimit
 
 
Цитата
Sergey Gorokhov пишет:
Или можно так
Код
 FutLimit=getFuturesLimit("SPBFUT", "SPBFUT****", 0).cbplimit
  
Спасибо! Особенно за конкретные примеры, очень их не хватает в документации
 
Приветствую всех, спустя много лет, тот же вопрос поддержке, ошибка attempt to index a nil value (local 'FutLimit') при попытке взять данные из таблицы «Ограничения по клиентским счетам»
Демо версия Quik 9.3.3.3 отсюда https://arqatech.com/ru/support/demo/, код ниже
Код
FutLimit=getFuturesLimit("SPBFUT", "SPBFUT*****", 0, "SUR").cbplimit
 
Цитата
Иван Сергеевич написал:
Приветствую всех, спустя много лет, тот же вопрос поддержке, ошибка  attempt to index a nil value (local 'FutLimit  ')  при попытке взять данные из таблицы «Ограничения по клиентским счетам»
Демо версия Quik 9.3.3.3 отсюда  https://arqatech.com/ru/support/demo/ , код ниже
Код
  FutLimit =  getFuturesLimit ( "SPBFUT" ,  "SPBFUT*****" ,  0 ,  "SUR" ).cbplimit
  
поправка, эта ошибка при попытке торгов на учебном сервере, на реальном же счете у брокера все норм
 
Здравствуйте.

На QUIK Junior функция getFuturesLimit работает корректно (См. скриншот)

На основе этого предлагаем проверить корректность вводимых Вами параметров в функции getFuturesLimit()
 
Цитата
Иван Сергеевич написал:
Код
FutLimit =  getFuturesLimit ( "SPBFUT" ,  "SPBFUT*****" ,  0 ,  "SUR" ).cbplimit

При таком подходе к функциям QLUA Вы периодически будете сталкиваться с подобными ошибками.

Смотрите, в описании функции сказано:

Цитата
Функция предназначена для получения информации по фьючерсным лимитам. Функция возвращает таблицу Lua с параметрами Лимиты по фьючерсам. В случае ошибки функция возвращает «nil»

Вообще-то, из опыта, любая функция QLUA может вернуть nil. В этом случае обращение к несуществующему полю таблицы .cbplimit вызовет ошибку "attempt to index a nil value" .

Код
Мне приходится решать эту задачку так:
Table_getFuturesLimit = {} -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit

Table_getFuturesLimit = getFuturesLimit ( "SPBFUT" ,  "SPBFUT*****" ,  0 ,  "SUR" ) -- результат работы функции getFuturesLimit помещается в созданную таблицу 


if Table_getFuturesLimit and next(Table_getFuturesLimit) then -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю.

    FutLimit =  Table_getFuturesLimit.cbplimit -- получается значение интересующего поля

end -- end if
 
Цитата
Денис написал:
Код
  Мне приходится решать эту задачку так:
Table_ getFuturesLimit   =  {}  -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit 

Table_ getFuturesLimit   =   getFuturesLimit  (  "SPBFUT"  ,  "SPBFUT *  *  *  *  * " ,   0  ,  "SUR" )  -- результат работы функции getFuturesLimit помещается в созданную таблицу  


 if  Table_ getFuturesLimit   and  next(Table_ getFuturesLimit )  then   -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю. 

    FutLimit  =   Table_ getFuturesLimit .cbplimit  -- получается значение интересующего поля 

 end   -- end if   
Прокомментирую: Первая строка не нужна, Table_getFuturesLimit лучше залокалить, а next(Table_getFuturesLimit) заменить на проверку Table_getFuturesLimit.cbplimit. Если таблица пустая, то Table_getFuturesLimit.cbplimit будет nil без ошибки и условие не выполнится, но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.
 
Цитата
Игорь М написал:
Цитата
Денис написал:
 
Код
    Мне приходится решать эту задачку так:
Table_  getFuturesLimit     =   {}   -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit  

Table_  getFuturesLimit     =     getFuturesLimit   (  "SPBFUT"  ,  "SPBFUT  *    *    *    *    *   " ,   0  ,  " SUR" )   -- результат работы функции getFuturesLimit помещается в созданную таблицу   


  if   Table_  getFuturesLimit     and   next(Table_  getFuturesLimit  )   then     -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю.  

    FutLimit   =    Table_  getFuturesLimit  .cbplimit   -- получается значение интересующего поля  

  end     -- end if      
 
Прокомментирую: Первая строка не нужна, Table_getFuturesLimit лучше залокалить, а next(Table_getFuturesLimit) заменить на проверку Table_getFuturesLimit.cbplimit. Если таблица пустая, то Table_getFuturesLimit.cbplimit будет nil без ошибки и условие не выполнится, но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.

Здравствуйте, уважаемый Игорь М! Спасибо за Ваши комментарии.
К Вашим комментариям у меня тоже родились комментарии  :wink:

На счет первой строки - согласен. Я ее привел для того, чтобы обозначить желаемый от функции getFuturesLimit результат. На счет локальности - ну это, да - азбука  :lol:  

Цитата
но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.

В этом случае ничего страшного не происходит. Управление остается в скрипте, а контролировать содержимое FutLimit все-равно придется, также как и Table_getFuturesLimit.cbplimit, вопрос в том, что надо как-то на это реагировать. А вариантов реакции может быть несколько, все зависит от того, где FutLimit планируется использовать. То есть, то ли повторно запрашивать лимиты, а если повторно, то сколько раз? Или, отказаться от использования FutLimit, если она -  nil.

Главный момент, который я хотел отметить своим постом, это тот факт, что в функциях QLUA вредно использовать синтаксический сахар Lua для обращения к полям таблицы результатов без дополнительных проверок.
 
Цитата
Daniil Pozdnyakov написал:
Здравствуйте.

На QUIK Junior функция getFuturesLimit работает корректно (См. скриншот)

На основе этого предлагаем проверить корректность вводимых Вами параметров в функции getFuturesLimit()
Здравствуйте, в чем у меня с Вашим примером разница? У меня таблица пустая почему-то. См. скриншот и код:
Код
local p_classcode   = "SPBFUT"
local p_account      = "SPBFUT000up"
if getFuturesLimit(p_classcode, p_account, 0, "SUR") == true then
   message(debug.getinfo(1).currentline.." ++++ " )
else
   message(debug.getinfo(1).currentline.." ---- " )
end
 
Пройдитесь циклом по таблице futures_client_limits и посмотрите, что там. Чаще всего на этом этапе и находится проблема.
 
Цитата
Nikolay написал:
futures_client_limits
я самоучка с неглубокими знаниями :) вот так правильно? Результат тот же - второе сообщ. с "-" говорит о том, что таблица пуста, кстати пройдена за 4 цикла/итераций
Код
for i = 0,getNumberOf("futures_client_limits") - 1 do
   if getItem("futures_client_limits",i).cbplimit == true then
      message(debug.getinfo(1).currentline.." + " )
   else
      message(debug.getinfo(1).currentline.." - " )
   end
end
 
Нет. значение же не true, зачем с ним сравнивать. Зада же посмотреть, что в таблице. 4 - цикла, значит там 4 - записи

Лучше выводить не в сообщения, а в лог файл. Но раз через сообщения, то можно так:
Код
   local t
   for i=0,getNumberOf ("futures_client_limits")-1 do
      t = {}
      for k, v in pairs(getItem("futures_client_limits",i)) do
        t[#t+1] = tostring(k)..' = '..tostring(v)
      end
      message('i: '..tostring(i+1)..' : '..table.concat(t, '; '))
   end
 
Цитата
Nikolay написал:
Нет. значение же не true, зачем с ним сравнивать. Зада же посмотреть, что в таблице. 4 - цикла, значит там 4 - записи
Спасибо за совет, вот такой результат:
i: 1 : currcode =   SUR; limit_type = 0; cbplplanned = 217209.68; trdaccid = SPBFUT000up; firmid   = SPBFUT000000; cbp_prev_limit = 286111.0; varmargin = -8384.0;   cbplused_for_positions = 64403.72; cbplimit = 281613.4; accruedint = 0.0;   real_varmargin = 0.0; kgo = 1.0; options_premium = 0.0; ts_comission = 0.0;   liquidity_coef = 0.0; cbplused = 64403.72; cbplused_for_orders = 0.0
i: 2 : currcode = ; limit_type = 3;   cbplplanned = -113410.0; trdaccid = SPBFUT000up; firmid = SPBFUT000000;   cbp_prev_limit = 9.6; varmargin = -4488.0; cbplused_for_positions =   -44508.68; cbplimit = 0.0; accruedint = 0.0; real_varmargin = 0.0; kgo = 0.0;   options_premium = 9.6; ts_comission = 9.6; liquidity_coef = 0.0; cbplused =   0.0; cbplused_for_orders = 0.0
i: 3 : currcode = SUR; limit_type = 6;   cbplplanned = 0.0; trdaccid = SPBFUT000up; firmid = SPBFUT000000;   cbp_prev_limit = -49006.28; varmargin = 0.0; cbplused_for_positions = 0.0;   cbplimit = -49006.28; accruedint = 0.0; real_varmargin = 0.0; kgo = 0.0; options_premium   = 0.0; ts_comission = 0.0; liquidity_coef = 0.0; cbplused = 0.0;   cbplused_for_orders = 0.0
i: 4 : currcode = RUB; limit_type = 7;   cbplplanned = 0.0; trdaccid = SPBFUT000up; firmid = SPBFUT000000;   cbp_prev_limit = -49006.28; varmargin = 0.0; cbplused_for_positions = 0.0;   cbplimit = -49006.28; accruedint = 1.0; real_varmargin = 0.0; kgo = 0.0; options_premium   = 0.0; ts_comission = 0.0; liquidity_coef = 0.0; cbplused = 0.0;   cbplused_for_orders = 0.0
Как понимаю, если я у явно указывал "SUR", значит должен был получить значение cbplimit = 281613.4 (зачем/почему в таблице есть и другие варианты limit_type не понимаю)
При этом для "SUR" 2 варианта: c limit_type = 0 «Денежные средства» и 6 «Суммарные залоговые средства в иностранной валюте (в рублях)» (взято из актуального QLUA.chm)
Почему некорректно получаются данные из табл. не понимаю.
Что можете посоветовать, уважаемые?
 
Только сейчас обратил внимание.

Формат вызова функции такой getFuturesLimit(STRING firmid, STRING trdaccid, NUMBER limit_type, STRING currcode)                        

первым идет код фирмы, а не код класса. Это же лимиты всей срочной секции, а не одного класса.
А фирма firmid   = SPBFUT000000
 
Цитата
Nikolay написал:
первым идет код фирмы, а не код класса. Это же лимиты всей срочной секции, а не одного класса.А фирма firmid   = SPBFUT000000
Код
local p_firmid       = "SPBFUT000000"
local p_account      = "SPBFUT000up"
if getFuturesLimit(p_firmid, p_account, 0, "SUR") == true then
   message(debug.getinfo(1).currentline.." ++++ " )
else
   message(debug.getinfo(1).currentline.." ---- " )
end
исправил, результат тот же, таблица пуста, сообщение "---"
 
Зачем Вы сравниваете с true. Это булевый тип. А таблица - это table.

getFuturesLimit(p_firmid, p_account, 0, "SUR") возвращает таблицу. В ней есть поле cbplimit типа number.
 
Цитата
Nikolay написал:
getFuturesLimit(p_firmid, p_account, 0, "SUR") возвращает таблицу. В ней есть поле cbplimit типа number.
Спасибо, уважаемый, пятница трудного дня...
Вопрос решен, по вашему совету строка дает нужный результат, спасибо еще раз!
Код
hh = getFuturesLimit(p_firmid, p_account, 0, "SUR").cbplimit
Страницы: 1
Читают тему
Наверх