На самом деле, хотелось бы обратиться к читающим эту ветку, чтобы вы запустили у себя код( заменив вопросики на соответсвующие значеиния) из 71 поста и если подобное всплывет отписали сюда.
Egor Zaytsev, не знаю странно все это, но я бы увеличил кол-во наблюдаемых инструментов и длительность мониторинга( было бы хорошо чтоб повисели пару неделек без остановок и максимально много скриптов на разных инструментах). У меня в районе 50 скриптов висят и не на каждом всплывает этот баг и не не каждый день.
Скрипт в 71 посте есть, только вместо вопросов вставить нужные значения. Там же есть проблема отражена, то что выводится в сообщении. Не думаю, что я смогу за секунду все это проделать пока значения вернуться в правильное состояние. У вас нет такой проблемы или вы не запускали?
BlaZed, с 45 по 48 посты писал уже, что отключился от интернета и это была суббота, все равно всплывало. Я если честно для себя решил проблему(частично) с помощью контроля переменных. Проблему обрисовал, код, версию предстваил. Если есть желание подловить с помощью колбэков можешь у себя запустить, заодно посмотишь есть ли у тебя такой баг.
TGB написал: Если вы работаете с QUIK версии >= 8.5 и < 8.13.1.16, то в них есть ошибка синхронизации, которая может проявляться в виде сбоев (смотрите ветку Отладка QUIK 8.13 ...).
Между этими версиями наверное десятиление и в них есть ошибка синхронизации, которая может проявляться в виде сбоев ( и приводить к потере денег клиентов ), это вообще как, нормально???!!! Это все равно, что продавать самовозгарающиеся авто.
Добрый день, получается что из getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND).currentbal пытаюсь получить данные в TotalLots. Для сравнеия и выявления ошибки использую memoryLots. Код выше.
memoryLots = 0 -- сюда запоминаем кол-во лотов полученных из терминала, если не равно TotalLots и не было сделок то...
function main() while true do
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND) if tblTotalLot==nil then TotalLots=0 else TotalLots=tonumber(tblTotalLot.currentbal) end
if( memoryLots~=TotalLots ) then message(SEC_CODE.." date - time "..tostring(os.date()).." TotalLots "..tostring(TotalLots).." memoryLots "..tostring(memoryLots),3 ) memoryLots=TotalLots end
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND) if tblTotalLot==nil then TotalLots=0 else TotalLots=tonumber(tblTotalLot.currentbal) end
x= TotalLots
if( mLots~=TotalLots ) then message(SEC_CODE.." date - time "..tostring(os.date()).." TotalLots "..tostring(TotalLots).." mLots "..tostring(mLots).." x "..tostring(x),3 ) mLots=TotalLots end
Старатель, ну вот уже что то, если еще и мой скрипт запустить и оставить поработать то можно и разные циферки получить, что может привести к продаже/покупке( в зависимости от ситуации), а потом к обратной покупке/продаже)
Nikolay, код есть, логика ясна, где у меня возникает глюк привел, больше информации кому надо сам для анализа наковыряет, разрабы не ответили что у них все идет как по маслу и вообще ничего не ответили. У тебя тоже работает все как часы, проверял? Я больше ниче писать в пустоту не буду, есть желание пожалуйста, нет желания понятно)
Старатель, даже при переподключении между серверами не должно быть никаких ошибок это же понятно. Ошибка всплывает даже при отключенном интернете и при включенном и без совершения торговых действий не до не после ошибки на достаточном интервале времени. Перебирать таблицы за разработчиков смысла особого не вижу, даже если и найду что то исправить не смогу, пишу суда что у меня баг и где они? Если есть желание поковыряться код есть, логику изложил.
Старатель, я не правильно пытаюсь получить значения через local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND) if tblTotalLot==nil then TotalLots=0 else TotalLots=tonumber(tblTotalLot.currentbal) end ? Зачем мне обязательно
Старатель, а почему бы не запустить все же код даже который выложил в предыдущем посте и самому посмотреть есть ли баг или нет. А если все же всплывет, то уж потом разбираться почему
Цитата
Старатель написал: Не может. tonumber не меняет вещественное на целое.
Может message округлил до целого, а может как раз и получил целое число из таблиц( как раз об этом я и пытаюсь докричаться). Я не понимаю почему вы пытаетесь меня уличить в каком то сокрытиии хотя есть код который можно запустить самому и проверить. Зачем все эти бодания вокруг да около, если проблема то не в этом? Вроде код не содержит ничего криминального и не занимает много машиноресурсов, торговых действий не содержит и не может помешать торговле основного скрипта( просто берет данные из таблиц и если видит несоответсвие выводит сообщение для анализа), код уже представлен, чтобы никого не напрягать с программированием.
Nikolay, думаю даже можно такой код поставить на реал, он просто будет брать данные с реального счета, но делать то ничего не будет( кроме как брать данные и караулить баг) и мешать основному торговому роботу, если всплывет ошибка то засимафорит. Но это по желанию.
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND) if tblTotalLot==nil then TotalLots=0 else TotalLots=tonumber(tblTotalLot.currentbal) end
x= TotalLots
if( mLots~=TotalLots ) then message(SEC_CODE.." TotalLots "..tostring(TotalLots).." mLots "..tostring(mLots).." x "..tostring(x),3 ) mLots=TotalLots end
Старатель написал: Цитата Сирануш написал:запустил терминал( сегодня суббота) и отключился от интернета вот что получилось: 10:48:01CORR_SPB TotalLots 2.0 mLots 1.0 x 2.010:48:01CORR_SPB TotalLots 1.0 mLots 2.0 x 1.0 А где строка с первоначальным mLots = 0 ?
баг плавающий, то есть то есть то нет, скрипт был запущен и принял нормальны данные, а потом получил корявые по этому никаких mLots = 0
Цитата
Старатель написал: Далее, обратите внимание на эту строку Цитата Сирануш написал:10:54:40 CORR_SPB TotalLotsРєРѕРїРёСЏ 0 mLots 1.0 x 0 Почему вдруг TotalLots стал integer в то время, как getDepoEx возвращает currentbal во float?
может потому что:
Цитата
Сирануш написал: if tblMinLot==nil then MinLot=0 else MinLot=tonumber(tblMinLot.param_value) end if tblTotalLot==nil then TotalLots=0 else TotalLots=tonumber(tblTotalLot.currentbal) end
Старатель написал: Напрашивается вывод:Цитата Nikolay написал:Либо Вы приводите не все сообщения, либо не полный код.
код полный и без всяких вырезок/врезок , можно просто выводить переменные для контроля и TotalLots думаю эффект будет тот же . Проще наверное запустить у себя код и посмотреть, есть такой косяк или нет, если нет желания я не настаиваю. Просто пытаюсь донести, что у меня всплывает баг, который может приводить к потере денег из-за корявого получения данных и продажи или покупку роботом крупного лота, если торговля пляшет от объема позиции. Если тебе говорят, что у машины которую ты водишь время от времени могут отказывать тормоза и тебя это не смущает, то тут уже дело хозяйское. Не понимаю почему разроботчики отмалчиваютя, либо пофиг, либо выгодно такое поведение, либо у них нету такого косяка?
Nikolay, поставь мой код на все свои инструменты, что есть в портфеле, не меняя строк не добавляя ничего кроме ( тех данных SEC_CODE . CLASS_CODE и тд) и не убирая ничего от себя для чистоты эксперимента и посмотри недельку что будет, а потом уже пытайся меня обвинить что я не прав.
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 написал: Либо Вы приводите не все сообщения, либо не полный код. Но даже если у Вас это происходит, то на тестовом сервере нет.
Код целиком, и то что был разово запущен и тут же выключен в попыхах, чтобы ничего не случилось вдруг и не задеть ваше самолюбие не значит что нет бага. Вы кто разработчик почему вы пытаетесь меня разубедить в том что есть? Вы пртвели свой код который точно получает те переменные, что я хочу получать без ошибок и чтоб я смог проверить и сказать вам спасибо, НЕТ. Вы пытаетесь мне, что то доказать но уходите от темы. Нет инета вижу баг, а вы мне это брокер виновать, как у вас с логикой вообще?
Nikolay, причем тут брокер, если от интернета отключен был компьютер? Как может он транслировать данные когда нет интернета в субботу??? Тикер бумаги указан в СООБЩЕНИИ там же и биржа, какие колбэки, если вы этого не видите, посты из разряда я все сказал сам дурак. Простое упорство и не признание очевидных вещей, зачем этот дискут вы просто доказываете свою правоту вместо того чтобы докапываться до истины.
вот аналогичный робот, но уже со включенным интерентом 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, ну что специально для тебя запустил терминал( сегодня суббота) и отключился от интернета вот что получилось: 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 Что теперь будешь предлагать, какую таблицу смотреть?
Вот я и хочу, чтобы не мы пользователи пытались решить проблему, а разработчик. Вы бы тоже могли запустить код и повесить в поток на пару тройку инструментов и отписаться если проблема всплыла. А если говорить, что дальше будет, если проблемы не будет, то можно тогда вообще ничего не делать, а зачем.
Nikolay, опять же залез в таблицы увидел, что есть проблема, что дальше, после того как я увидел она сама по себе исчезнет навсегда, как узнаем это брокер подсунул и терминал, и даже если мы узнаем откуда все это дело берется, чтодальше то?
Nikolay,а по поводу трансляции данных вы так утверждаете как будто точно знаете, что это не терминал сбоит, а брокер котирует криво, откуда такая уверенность?
Nikolay, не совсем понимаю смысл этого действия. Вроде как правильно вызываю, ошибка не постоянно, но проскальзывает, переберу я таблицы баг от этого не пропадет.
только что по второму роботу 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.сделки по акциям СПБ, там вроде как Т+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
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 ошибок не выдавал.
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, я смотрю по таблице "Состояние счета" столбец "Позиция, что вроде как должно соответствовать столбику "Текущий остаток " в таблице "Позиции по инструментам"
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
Если я не правильно получаю эти данные поправьте меня, чтоб было правильно. Потому как время от времени в переменные транслируются сосвсем левые данные, из-за чего робот начинает тупо набирать или продавать. Тема уже была такая( https://forum.quik.ru/messages/forum10/message45769/topic5506/#message45769) и видимо ниче не поменялось.