Опять ошибка получения кол-ва ордеров скриптом

Страницы: 1 2 3 След.
RSS
Опять ошибка получения кол-ва ордеров скриптом
 
Получаю данные из терминала следующим образ:
    local tblAsk =          getParamEx(CLASS_CODE,  SEC_CODE, "OFFER")
    local tblBid =          getParamEx(CLASS_CODE,  SEC_CODE, "BID")
    local tblStatus =       getParamEx(CLASS_CODE,  SEC_CODE, "STATUS")  
    local tblMinLot =       getParamEx(CLASS_CODE,  SEC_CODE, "LOTSIZE")
    local tblBalance =      getMoneyEx(FIRM_ID, CLIENT_CODE, TAG, CURR_CODE,LIMIT_KIND)
    local tblTotalLot =     getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND)
    local tblMinStepPrice = getParamEx(CLASS_CODE,  SEC_CODE, "SEC_PRICE_STEP")
                     
    if tblAsk==nil          then Ask=0          else Ask=tonumber(tblAsk.param_value)                   end  
    if tblBid==nil          then Bid=0          else Bid=tonumber(tblBid.param_value)                   end  
    if tblStatus==nil       then Status=0       else Status=tonumber(tblStatus.param_value)             end  
    if tblMinLot==nil       then MinLot=0       else MinLot=tonumber(tblMinLot.param_value)             end    
    if tblBalance==nil      then Balance=0      else Balance=tonumber(tblBalance.currentbal)            end  
    if tblTotalLot==nil     then TotalLots=0    else TotalLots=tonumber(tblTotalLot.currentbal)         end    
    if tblMinStepPrice==nil then MinStepPrice=0 else MinStepPrice=tonumber(tblMinStepPrice.param_value) end  


Если я не правильно получаю эти данные поправьте меня, чтоб было правильно. Потому как время от времени в переменные транслируются сосвсем левые данные, из-за чего робот начинает тупо набирать или продавать. Тема уже была такая( https://forum.quik.ru/messages/forum10/message45769/topic5506/#message45769) и видимо ниче не поменялось.  
 
Цитата
Сирануш написал:
Если я не правильно получаю эти данные поправьте меня, чтоб было правильно. Потому как время от времени в переменные транслируются сосвсем левые данные, из-за чего робот начинает тупо набирать или продавать. Тема уже была такая(  https://forum.quik.ru/messages/forum10/message45769/topic5506/#message45769 ) и видимо ниче не поменялось.  
Вам же в прошлой теме подсказывали как лучше сделать, год как прошел, а вы так ничего и не исправили.

Я, например, подобные проверки делаю так:
Код
    params["LAST"] = tonumber(getParamEx2(class_code,sec_code,"LAST").param_value) or 0 -- Последняя цена
В результате, либо правильное число у меня в таблицу запишется, либо в случае каких проблем с данными, записываем 0, а такого значения быть не может.
Ну и тупо проверку в код добавляю, если у меня вдруг в таблице обнаружится 0, то не торгуем.
Код
    if(Тут_мои_условия)and(Тут_мои_условия)and(params["LAST"]~=0)then Trading(trading_lots,i) end
И так по всем параметрам, которые критичны для работы робота.
 
BlaZed,  Прям уж "такого значения быть не может". У меня "вот прям ща" у одного брокера два таких значения и у другого ещё одно. А перед началом торгов на Мосбирже там и ваще одни нули. А в СПб все данные с виду нормальные, но торгов-то всё равно нет. :smile:  
 
Цитата
Владимир написал:
BlaZed,  Прям уж "такого значения быть не может". У меня "вот прям ща" у одного брокера два таких значения и у другого ещё одно. А перед началом торгов на Мосбирже там и ваще одни нули. А в СПб все данные с виду нормальные, но торгов-то всё равно нет. ::  
Владимир, а разве может, вот прям торгуется по нулевой цене?

Вы же понимаете, что если на каком-либо инструменте вдруг видим цену 0, то это либо торгов нет, либо косяк какой с данными.
В любом случае таким инструментом не торгуем, пока не увидим ненулевую цену.
 
BlaZed меня волнует в основном входящий остаток по бумаге, могу получить любое число  даже тогда, когда ордеров нет пишет в остатке например два, то есть совсем любое( похоже хвататет из соседних строк)
 
BlaZed, Вообще-то, был и такой случай (у моего друга): именно сделка по нулевой цене. Мы, ессно, охренели, но потом брокер разъяснил, что всё было правильно. :smile:

Я-то понимаю, что если на каком-либо инструменте вдруг видим цену 0, то это либо торгов нет, либо косяк какой с данными. А вот скрипт мой НЕ понимает, и я не очень понимаю, как ему это втолковать. Я также понимаю, что если там не 0, это всё равно ещё ничего не значит. Я когда-то поймал (писал здесь об этом) хороший индикатор: если не цена, а BID/OFFER в нуле, но оказалось, что и это не всегда так.

А мне пофиг, нулевая там цена или нет - у меня все заявки лимитированные.Так что по нулевой цене не продаст, а если купит - не обижусь. :smile:  
 
В коде у вас ищется текущий остаток
Код
    local tblTotalLot =     getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND)    
    if tblTotalLot==nil     then TotalLots=0    else TotalLots=tonumber(tblTotalLot.currentbal)         end   
а тут вы пишете про входящий остаток.
Цитата
Сирануш написал:
меня волнует в основном входящий остаток по бумаге
не в этом ли дело?
 
BlaZed, может неточно выразился, но мне нужно получать что имеется сейчас в портфеле, то есть то кол-во бумаг что сейчас есть
 
Сирануш, Одуреть! Кто лучше знает состояние Вашего портфеля: брокер или Вы сами?  :smile:  
 
Сирануш, откройте в квике таблицу "Позиции по инструментам", и определите какие данные оттуда вы все же хотите видеть.
Потом прочитайте http://luaq.ru/getDepoEx.html чтобы понять какой столбец таблицы какому параметру getDepoEx соответствует
 
BlaZed запусти скрипт в цикл и создай переменную в которую сохрани значение полученное кол-во бумаг по инструменты, а если переменная и получаемые данные из терминала будут различаться то выведи  сообщение, просто ради спортивного интереса у меня одного такой косяк
 
BlaZed, я смотрю по таблице "Состояние счета" столбец "Позиция, что вроде как должно соответствовать столбику "Текущий остаток "  в таблице "Позиции по инструментам"
 
Сирануш, не могу, у меня позиции по бумагам пустые, я на фьючерсах работаю
 
Разработчики, что нет такой проблемы или все же я криво что то пытаюсь получить???
 
Цитата
Сирануш написал:
BlaZed  запусти скрипт в цикл и создай переменную в которую сохрани значение полученное кол-во бумаг по инструменты, а если переменная и получаемые данные из терминала будут различаться то выведи  сообщение, просто ради спортивного интереса у меня одного такой косяк
Предлагаю вам следующее.
Напишите сами вышеупомянутый код.
Только не теоретический, а тот что реально запустите и он покажет что есть расхождения.

Только учтите один момент, что в нерабочее время и во времена клирингов, брокер может транслировать некорректные данные.
Поэтому скрипт должен это либо учитывать, либо пускай время расхождения так же фиксирует.

А потом покажите код и вывод скрипта.
И мы посмотрим где в нем ошибка, потому как ну просто не могу поверить, что у вас цифры в таблице своей жизнью живут.
 
BlaZed, вот код:



SEC_CODE          = ????????          
CLASS_CODE        = ????????                  
CURR_CODE         = ????????                
ACCOUNT           =  ????????              
CLIENT_CODE       =????????                  
TAG               =  ????????                  
FIRM_ID           =  ????????        
LIMIT_KIND        = 365                    

var=0

function main()
 while true do          

    local tblAsk =          getParamEx(CLASS_CODE,  SEC_CODE, "OFFER")
    local tblBid =          getParamEx(CLASS_CODE,  SEC_CODE, "BID")
local tblStatus =       getParamEx(CLASS_CODE,  SEC_CODE, "STATUS")  
    local tblMinLot =       getParamEx(CLASS_CODE,  SEC_CODE, "LOTSIZE")
    local tblBalance =      getMoneyEx(FIRM_ID, CLIENT_CODE, TAG, CURR_CODE,LIMIT_KIND)
    local tblTotalLot =     getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND)
local tblMinStepPrice = getParamEx(CLASS_CODE,  SEC_CODE, "SEC_PRICE_STEP")
                     
    if tblAsk==nil          then Ask=0          else Ask=tonumber(tblAsk.param_value)                   end  
    if tblBid==nil          then Bid=0          else Bid=tonumber(tblBid.param_value)                   end  
if tblStatus==nil       then Status=0       else Status=tonumber(tblStatus.param_value)             end  
    if tblMinLot==nil       then MinLot=0       else MinLot=tonumber(tblMinLot.param_value)             end    
    if tblBalance==nil      then Balance=0      else Balance=tonumber(tblBalance.currentbal)            end  
    if tblTotalLot==nil     then TotalLots=0    else TotalLots=tonumber(tblTotalLot.currentbal)         end    
if tblMinStepPrice==nil then MinStepPrice=0 else MinStepPrice=tonumber(tblMinStepPrice.param_value) end
 
 -- впвапвп
if( var~=TotalLots ) then
       message("TotalLots  "..tostring(TotalLots).."   var   "..tostring(var),3 )
       var=TotalLots
    end

   
  sleep(1000)
  end
end

вместо вопросиков ставим значения своих инструментов. Если скрипт увидит расхождения выдаст сообщение, более ничего не делает.Поставил на тот инструмент, что писал об ошибке пока тишина, понаблюдаю)
 
Цитата
BlaZed написал:
а разве может, вот прям торгуется по нулевой цене?

Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Старатель, офигеть, я даже и не подумал о спредах.
Благодарю, учту такой момент.
 
Кто-то и о фьючерсах не думал
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Старатель,  действительно.

В любом случае, nil специально и существует для таких моментов - когда данных просто нет. Проверяйте величину на nil да и все.
 
Цитата
Артем написал:
nil специально и существует для таких моментов - когда данных просто нет. Проверяйте величину на nil да и все.

Ну-ну, проверяйте.
Код
getParamEx("", "", "")
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Артем, и правда надо nil использовать

Старатель, а если приведением к числу проверять корректность?
Код
test = tonumber(getParamEx(class_code,sec_code,"LAST").param_value) -- test=число
test = tonumber(getParamEx("", "", "")).param_value)                -- test=nil
 
Цитата
BlaZed написал:
если приведением к числу проверять корректность?

Вы скобочку не там поставили.
tonumber(getParamEx(class, sec, param).param_value) всегда число, даже если такой бумаги/параметра в природе не существует.
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Не очень понята проблема. Вам никто не мешает прежде чем получать данные, проверить, что эти данные есть.
Т.к. getParamEx возращает таблицу, то легко проверить есть ли данные, сравнив поле result этой таблицы с литералом '1'.
Если не равно "1", то данных нет, по какой-то причине. Вы их можете привести к 0, через tonumber(...) or 0, но этот 0 будет иметь смысл - данных нет.
 
Цитата
Nikolay написал:
легко проверить есть ли данные, сравнив поле result этой таблицы с литералом '1'.
result не совсем про это. В этом можно убедиться, запросив getParamEx в оффлайн.

Цитата
Nikolay написал:
Не очень понята проблема.
Проблемы нет. Проверяйте param_image, в отсутствии данных там будет путая строка.
А вот честный ли ноль в param_value - это другая история.
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Руководство по языку qLua говорит нам:
result STRING Результат выполнения операции.

Возможные значения:
«0» – ошибка;

«1» – параметр найден
Можно, конечно, интерпретировать по разному, но, по факту, раз не равно "1", то какой-бы ни был результат в param_value, параметр не найден или не получен.
Либо надо провести дополнительную проверку на корректность ввода параметров инструмента, либо не пытаться угадать что этот 0 будет значить.
 
Цитата
Nikolay написал:
«1» – параметр найден
Буквально это означает, что в списках доступных параметров для данной бумаги есть параметр с заданным именем.

Получено ли само значение проверяю:
Код
result=="1" and param_image~="" and param_type~="0"
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
SEC_CODE          =   ?????????            
CLASS_CODE        = ??????????  
CURR_CODE         = ???????          
ACCOUNT           =?????????        
CLIENT_CODE       =??????????          
TAG               = ????????????            
FIRM_ID           =?????????      
LIMIT_KIND        = 365                    

mLots = 0
L=0

function main()
 while true do          

    local tblAsk =          getParamEx(CLASS_CODE,  SEC_CODE, "OFFER")
    local tblBid =          getParamEx(CLASS_CODE,  SEC_CODE, "BID")
local tblStatus =       getParamEx(CLASS_CODE,  SEC_CODE, "STATUS")  
    local tblMinLot =       getParamEx(CLASS_CODE,  SEC_CODE, "LOTSIZE")
    local tblBalance =      getMoneyEx(FIRM_ID, CLIENT_CODE, TAG, CURR_CODE,LIMIT_KIND)
    local tblTotalLot =     getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND)
local tblMinStepPrice = getParamEx(CLASS_CODE,  SEC_CODE, "SEC_PRICE_STEP")
                     
    if tblAsk==nil          then Ask=0          else Ask=tonumber(tblAsk.param_value)                   end  
    if tblBid==nil          then Bid=0          else Bid=tonumber(tblBid.param_value)                   end  
if tblStatus==nil       then Status=0       else Status=tonumber(tblStatus.param_value)             end  
    if tblMinLot==nil       then MinLot=0       else MinLot=tonumber(tblMinLot.param_value)             end    
    if tblBalance==nil      then Balance=0      else Balance=tonumber(tblBalance.currentbal)            end  
    if tblTotalLot==nil     then TotalLots=0    else TotalLots=tonumber(tblTotalLot.currentbal)         end    
if tblMinStepPrice==nil then MinStepPrice=0 else MinStepPrice=tonumber(tblMinStepPrice.param_value) end
 
x=  TotalLots
 
    if( Ask>0 and Bid>0 and Ask>Bid ) then

   L       = TotalLots / MinLot
       -- впвапвп
   if( mLots~=TotalLots ) then
           message(SEC_CODE.."   TotalLots  "..tostring(TotalLots).."   mLots   "..tostring(mLots).."   x   "..tostring(x),3 )
           mLots=TotalLots
       end

end
   
  sleep(1000)
  end
end


Вот код который выдавал сегодня ошибки
15:08:03 CORR_SPB   CORR_SPB   TotalLots  3.0   mLots   1.0   x   3.0
15:08:04 CORR_SPB   CORR_SPB   TotalLots  1.0   mLots   3.0   x   1.0

поставил в поток крутиться аналогичный, но без конструкции  
 if( Ask>0 and Bid>0 and Ask>Bid ) then
    ...
 end
ошибок не выдавал.  
 
А зачем у Вас Limit_kind = 365?
 
Nikola, при Limit_kind = 2 та же самая песня
 
limit_kind NUMBER Срок расчётов.

Возможные значения: положительные целые числа,  начиная с «0», соответствующие срокам расчётов из таблицы  «Позиции по инструментам»: «0» – T0, «1» – T1, «2» – T2 и т.д.

Для получения значений параметров таблицы «Клиентский портфель» для клиентов срочного рынка без единой денежной позиции необходимо  указать в качестве «client_code» – торговый счет на срочном рынке,  а в качестве «limit_kind» – 0.

Вы для своего инструмента уточните срок расчетов, тот и задайте.

Можете также вывести из таблицы depo_limits все строки и посмотреть значения. Позиция для Т2 и Т0 - это могут быть разные значения.
 
Nikolay.сделки по акциям СПБ, там вроде как Т+2, но это не суть, потому как при отсутсвии сделок через секунду получает разные значения  см:
15:08:03 CORR_SPB   CORR_SPB   TotalLots  3.0   mLots   1.0   x   3.0
15:08:04 CORR_SPB   CORR_SPB   TotalLots  1.0   mLots   3.0   x   1.0
 
Сирануш, непонятно. Как будто и правда в таблице значения прыгали.
Проверьте для гарантии еще через коллбек OnDepoLimit какие значения прилетают в таблицу
 
Ну по поводу значений возвращаемых именно функциями, а не простым перебором таблицы была тема https://forum.quik.ru/messages/forum10/message47344/topic5697
Вы вывели бы все значения из таблицы и было бы видно для каких сочетаний параметров происходят изменения.
 
только что по второму роботу
18:47:51 CORR_SPB   TotalLotsРєРѕРїРёСЏ  1.0   mLots   2.0   x   1.0
18:47:52 CORR_SPB   TotalLotsРєРѕРїРёСЏ  2.0   mLots   1.0   x   2.0
Хотелось бы увидеть комментарии разработчиков
 
Я все же советую сделать цикл по строкам таблицы depo_limits и вывести все ее поля в такие моменты, чтобы было понятно что в ней меняется.

Данные транслирует биржа, терминал просто получает и предоставляет информацию.
 
Nikolay, не совсем понимаю смысл этого действия. Вроде как правильно вызываю, ошибка не постоянно, но проскальзывает, переберу я таблицы баг от этого не пропадет.
 
Смысл в том, что в таблице есть много полей. Когда у Вас меняется позиция, зачастую это связано с изменением других полей. Вы и увидите или не увидите эти изменения.
Как минимум больше информации для анализа.

В конечном итоге, разработчик терминала не отвечает за транслируемую информацию.
 
Nikolay, команда вроде как вызывает одно и то же поле, что там может меняться, вызов статичен. Вы бы сами попробовали, код выше есть.  
 
Nikolay,а по поводу трансляции данных вы так утверждаете как будто точно знаете, что это не терминал сбоит, а брокер котирует криво, откуда такая уверенность?
 
Nikolay, опять же, если брокер криво котирует, смысл лезть в таблицы depo_limits , если там будут те же кривые данные что подсунул брокер?
 
Nikolay, опять же залез в таблицы увидел, что есть проблема, что дальше, после того как я увидел она сама по себе исчезнет навсегда, как узнаем это брокер подсунул и терминал, и даже если мы узнаем откуда все это дело берется, чтодальше то?
 
Да, чаще всего это проблема трансляции данных или их интерпретации.
А если Вы увидите, что есть проблема в данных, то далее ее можно будет классифицировать: технологические изменения данных при трансляции, проблема в данных, поступающих от брокера и т.д.

Далее можно уже предполагать кто виноват (или не виноват): брокер, серверная часть терминала у брокера, сам терминал.

А просто сказать - вот есть проблема. Как ее воспроизвести? Ваш код будет работать корректно на тестовом контуре разработчика терминала. И что в итоге?
 
Вот я и хочу, чтобы не мы пользователи пытались решить проблему, а разработчик. Вы бы тоже могли запустить код и повесить в поток на пару тройку инструментов и отписаться если проблема всплыла. А если говорить, что дальше будет, если проблемы не будет, то можно тогда вообще ничего не делать, а зачем.  
 
Nikolay, ну что специально для тебя запустил терминал( сегодня суббота) и отключился от интернета вот что получилось:
10:48:01CORR_SPB   TotalLots  2.0   mLots   1.0   x   2.0
10:48:01CORR_SPB   TotalLots  1.0   mLots   2.0   x   1.0
Что теперь будешь предлагать, какую таблицу смотреть?
 
вот аналогичный робот, но уже со включенным интерентом
10:54:39 CORR_SPB   TotalLotsРєРѕРїРёСЏ  1.0   mLots   0   x   1.0
10:54:40 CORR_SPB   TotalLotsРєРѕРїРёСЏ  0   mLots   1.0   x   0
 
Я уже все предложил. У меня достаточно запущенных скриптов содержащих близкие по смыслу строки.
Когда возникала такого рода проблема, она исследовалась всесторонне: получалось содержание колбеков, содержание таблиц и т.д. И, в конечном итоге, проблема решалась с брокером, транслирующим данные.

А глядя на эти сообщения, где не ясно что это за бумага, какой брокер, версия терминала, разработчик, "конечно", сможет сразу определить проблему.
 
Nikolay, причем тут брокер, если от интернета отключен был компьютер? Как может он транслировать данные когда нет интернета в субботу??? Тикер бумаги указан в СООБЩЕНИИ там же и биржа, какие колбэки, если вы этого не видите, посты из разряда я все сказал сам дурак. Простое упорство и не признание очевидных вещей, зачем этот дискут вы просто доказываете свою правоту вместо того чтобы докапываться до истины.
 
Ок. Смотрим на Ваш код.

Я даже специально перенес его в редактор и привел к нормальному виду. Даже запустил на тестовом сервере ARQA

Нет такого поведения - это раз. Не при подключении к серверу, ни при отсутствии оного.

Второе, даже просто глядя на код, возникает вопрос: почему у Вас первое сообщение содержит mLots не 0?

При инициализации значение переменной  = 0. После первого сообщения произойдет присвоение некому значению, отличному от 0.
У меня так и выводится одно единственное сообщение, и более ничего.

SBER   TotalLots  10.0   mLots   0   x   10.0

Как и должно быть mLots = 0.

Либо Вы приводите не все сообщения, либо не полный код. Но даже если у Вас это происходит, то на тестовом сервере нет.
 
Цитата
Nikolay написал:
Второе, даже просто глядя на код, возникает вопрос: почему у Вас первое сообщение содержит mLots не 0?При инициализации значение переменной  = 0. После первого сообщения произойдет присвоение некому значению, отличному от 0.У меня так и выводится одно единственное сообщение, и более ничего.

Цитата
Сирануш написал:
10:54:39 CORR_SPB   TotalLotsРєРѕРїРёСЏ  1.0   mLots   0   x   1.0    
10:54:40 CORR_SPB   TotalLotsРєРѕРїРёСЏ  0   mLots   1.0   x   0
где тут первое сообщение и где тут не mLots не 0?



Цитата
Nikolay написал:
Нет такого поведения - это раз. Не при подключении к серверу, ни при отсутствии оного.
это плавающий косяк, может слышали о таком, то есть то нет? может весь день барабанить, а потом внезапно появиться.

Цитата
Nikolay написал:
Либо Вы приводите не все сообщения, либо не полный код. Но даже если у Вас это происходит, то на тестовом сервере нет.
Код целиком, и то что был разово запущен и тут же выключен в попыхах, чтобы ничего не случилось вдруг и не задеть ваше самолюбие не значит что нет бага. Вы кто разработчик почему вы пытаетесь меня разубедить в том что есть? Вы пртвели свой код который точно получает те переменные, что я хочу получать без ошибок и чтоб я смог проверить и сказать вам спасибо, НЕТ. Вы пытаетесь мне, что то доказать но уходите от темы. Нет инета вижу баг, а вы мне это брокер виновать, как у вас с логикой вообще?
Страницы: 1 2 3 След.
Читают тему (гостей: 1)
Наверх