Получаю данные из терминала следующим образ: 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, Прям уж "такого значения быть не может". У меня "вот прям ща" у одного брокера два таких значения и у другого ещё одно. А перед началом торгов на Мосбирже там и ваще одни нули. А в СПб все данные с виду нормальные, но торгов-то всё равно нет.
Владимир написал: BlaZed, Прям уж "такого значения быть не может". У меня "вот прям ща" у одного брокера два таких значения и у другого ещё одно. А перед началом торгов на Мосбирже там и ваще одни нули. А в СПб все данные с виду нормальные, но торгов-то всё равно нет. ::
Владимир, а разве может, вот прям торгуется по нулевой цене?
Вы же понимаете, что если на каком-либо инструменте вдруг видим цену 0, то это либо торгов нет, либо косяк какой с данными. В любом случае таким инструментом не торгуем, пока не увидим ненулевую цену.
BlaZed меня волнует в основном входящий остаток по бумаге, могу получить любое число даже тогда, когда ордеров нет пишет в остатке например два, то есть совсем любое( похоже хвататет из соседних строк)
BlaZed, Вообще-то, был и такой случай (у моего друга): именно сделка по нулевой цене. Мы, ессно, охренели, но потом брокер разъяснил, что всё было правильно.
Я-то понимаю, что если на каком-либо инструменте вдруг видим цену 0, то это либо торгов нет, либо косяк какой с данными. А вот скрипт мой НЕ понимает, и я не очень понимаю, как ему это втолковать. Я также понимаю, что если там не 0, это всё равно ещё ничего не значит. Я когда-то поймал (писал здесь об этом) хороший индикатор: если не цена, а BID/OFFER в нуле, но оказалось, что и это не всегда так.
А мне пофиг, нулевая там цена или нет - у меня все заявки лимитированные.Так что по нулевой цене не продаст, а если купит - не обижусь.
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND)
if tblTotalLot==nil then TotalLots=0 else TotalLots=tonumber(tblTotalLot.currentbal) end
а тут вы пишете про входящий остаток.
Цитата
Сирануш написал: меня волнует в основном входящий остаток по бумаге
Сирануш, откройте в квике таблицу "Позиции по инструментам", и определите какие данные оттуда вы все же хотите видеть. Потом прочитайте http://luaq.ru/getDepoEx.html чтобы понять какой столбец таблицы какому параметру getDepoEx соответствует
BlaZed запусти скрипт в цикл и создай переменную в которую сохрани значение полученное кол-во бумаг по инструменты, а если переменная и получаемые данные из терминала будут различаться то выведи сообщение, просто ради спортивного интереса у меня одного такой косяк
BlaZed, я смотрю по таблице "Состояние счета" столбец "Позиция, что вроде как должно соответствовать столбику "Текущий остаток " в таблице "Позиции по инструментам"
Сирануш написал: BlaZed запусти скрипт в цикл и создай переменную в которую сохрани значение полученное кол-во бумаг по инструменты, а если переменная и получаемые данные из терминала будут различаться то выведи сообщение, просто ради спортивного интереса у меня одного такой косяк
Предлагаю вам следующее. Напишите сами вышеупомянутый код. Только не теоретический, а тот что реально запустите и он покажет что есть расхождения.
Только учтите один момент, что в нерабочее время и во времена клирингов, брокер может транслировать некорректные данные. Поэтому скрипт должен это либо учитывать, либо пускай время расхождения так же фиксирует.
А потом покажите код и вывод скрипта. И мы посмотрим где в нем ошибка, потому как ну просто не могу поверить, что у вас цифры в таблице своей жизнью живут.
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 написал: если приведением к числу проверять корректность?
Вы скобочку не там поставили. tonumber(getParamEx(class, sec, param).param_value) всегда число, даже если такой бумаги/параметра в природе не существует.
Надо делать так, как надо. А как не надо - делать не надо.
Не очень понята проблема. Вам никто не мешает прежде чем получать данные, проверить, что эти данные есть. Т.к. getParamEx возращает таблицу, то легко проверить есть ли данные, сравнив поле result этой таблицы с литералом '1'. Если не равно "1", то данных нет, по какой-то причине. Вы их можете привести к 0, через tonumber(...) or 0, но этот 0 будет иметь смысл - данных нет.
Руководство по языку qLua говорит нам: result STRING Результат выполнения операции.
Возможные значения: «0» – ошибка;
«1» – параметр найден Можно, конечно, интерпретировать по разному, но, по факту, раз не равно "1", то какой-бы ни был результат в param_value, параметр не найден или не получен. Либо надо провести дополнительную проверку на корректность ввода параметров инструмента, либо не пытаться угадать что этот 0 будет значить.
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 ошибок не выдавал.
Возможные значения: положительные целые числа, начиная с «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 Хотелось бы увидеть комментарии разработчиков
Nikolay, не совсем понимаю смысл этого действия. Вроде как правильно вызываю, ошибка не постоянно, но проскальзывает, переберу я таблицы баг от этого не пропадет.
Смысл в том, что в таблице есть много полей. Когда у Вас меняется позиция, зачастую это связано с изменением других полей. Вы и увидите или не увидите эти изменения. Как минимум больше информации для анализа.
В конечном итоге, разработчик терминала не отвечает за транслируемую информацию.
Nikolay,а по поводу трансляции данных вы так утверждаете как будто точно знаете, что это не терминал сбоит, а брокер котирует криво, откуда такая уверенность?
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 написал: Либо Вы приводите не все сообщения, либо не полный код. Но даже если у Вас это происходит, то на тестовом сервере нет.
Код целиком, и то что был разово запущен и тут же выключен в попыхах, чтобы ничего не случилось вдруг и не задеть ваше самолюбие не значит что нет бага. Вы кто разработчик почему вы пытаетесь меня разубедить в том что есть? Вы пртвели свой код который точно получает те переменные, что я хочу получать без ошибок и чтоб я смог проверить и сказать вам спасибо, НЕТ. Вы пытаетесь мне, что то доказать но уходите от темы. Нет инета вижу баг, а вы мне это брокер виновать, как у вас с логикой вообще?