[ Закрыто ] Опять ошибка получения кол-ва ордеров скриптом
Пользователь
Сообщений: Регистрация: 29.05.2020
29.05.2021 15:27:41
, поставь мой код на все свои инструменты, что есть в портфеле, не меняя строк не добавляя ничего кроме ( тех данных SEC_CODE . CLASS_CODE и тд) и не убирая ничего от себя для чистоты эксперимента и посмотри недельку что будет, а потом уже пытайся меня обвинить что я не прав.
Пользователь
Сообщений: Регистрация: 27.01.2017
29.05.2021 15:50:39
В Ваших сообщениях №28, 32, 35, 45 первое выводимое значение mLots не 0, впрочем, это не важно.
Я Вас ни в чем не обвиняю, даже не пытаюсь. Просто взял Ваш код и запустил на тестовом сервере. Не надо искать скрытых смыслов в сообщениях.Вот что я запустил:
Код
SEC_CODE = 'SBER'
CLASS_CODE = 'QJSIM'
ACCOUNT = 'NL0011100043'
CLIENT_CODE = '11609'
FIRM_ID = 'NC0011100000'
LIMIT_KIND = 0
mLots = 0
L=0
function main()
while true do
local tblMinLot = getParamEx(CLASS_CODE, SEC_CODE, "LOTSIZE")
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND)
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
x= TotalLots
L = TotalLots / MinLot
-- впвапвп
if( mLots~=TotalLots ) then
message(SEC_CODE.." TotalLots "..tostring(TotalLots).." mLots "..tostring(mLots).." x "..tostring(x),3 )
mLots=TotalLots
end
sleep(1000)
end
end
Убраны переменные, не влияющие на вывод сообщений. На демо-сервере, на данный момент торгуется только несколько инструментов.
Впрочем, ждите ответов от разарботчиков.
Пользователь
Сообщений: Регистрация: 29.05.2020
29.05.2021 15:55:57
, поставь на реал на хотябы на пару деньков и понаблюдай. LIMIT_KIND = 0 почему равен 0? Если есть желание поставь посмотри, нет то нет
Пользователь
Сообщений: Регистрация: 27.01.2017
29.05.2021 16:07:55
Потому что на демо сервере лимит = 0. А в реале у меня годами работаю свои скрипты. Где как используются функции getDepoEx, getFuturesHolding, так и без них. Чаще без них, но это не важно. И в сообщение я тоже указывал на похожее поведение.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.05.2021 16:44:53
Цитата
Сирануш написал: запустил терминал( сегодня суббота) и отключился от интернета вот что получилось: 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
А где строка с первоначальным mLots = 0 ?
Далее, обратите внимание на эту строку
Цитата
Сирануш написал: 10:54:40 CORR_SPB TotalLotsРєРѕРїРёСЏ 0 mLots 1.0 x 0
Почему вдруг TotalLots стал integer в то время, как getDepoEx возвращает currentbal во float?
Напрашивается вывод:
Цитата
Nikolay написал: Либо Вы приводите не все сообщения, либо не полный код.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 29.05.2020
30.05.2021 22:50:10
Цитата
Старатель написал: Цитата Сирануш написал:запустил терминал( сегодня суббота) и отключился от интернета вот что получилось: 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
выделил красным в коде( tonumber ).
Цитата
Старатель написал: Напрашивается вывод:Цитата Nikolay написал:Либо Вы приводите не все сообщения, либо не полный код.
код полный и без всяких вырезок/врезок , можно просто выводить переменные для контроля и TotalLots думаю эффект будет тот же . Проще наверное запустить у себя код и посмотреть, есть такой косяк или нет, если нет желания я не настаиваю. Просто пытаюсь донести, что у меня всплывает баг, который может приводить к потере денег из-за корявого получения данных и продажи или покупку роботом крупного лота, если торговля пляшет от объема позиции. Если тебе говорят, что у машины которую ты водишь время от времени могут отказывать тормоза и тебя это не смущает, то тут уже дело хозяйское. Не понимаю почему разроботчики отмалчиваютя, либо пофиг, либо выгодно такое поведение, либо у них нету такого косяка?
Пользователь
Сообщений: Регистрация: 29.05.2020
30.05.2021 23:49:55
, думаю даже можно такой код поставить на реал, он просто будет брать данные с реального счета, но делать то ничего не будет( кроме как брать данные и караулить баг) и мешать основному торговому роботу, если всплывет ошибка то засимафорит. Но это по желанию.
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
Не может. tonumber не меняет вещественное на целое.
Смотрите таблицу, возвращаемую getDepoEx, сравнивайте, какие поля поменялись
Скрытый текст
Код
local run = true
function OnStop()
run = nil
end
function main()
local mLots
while run do
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT, LIMIT_KIND)
if type(tblTotalLot) == "table" then
local TotalLots = tblTotalLot.currentbal
if mLots ~= TotalLots then
local t = {}
for k, v in pairs(tblTotalLot) do
t[#t+1] = tostring(k) .. "=" .. tostring(v)
end
message("mLots = " .. tostring(mLots) .. "\n" .. table.concat(t, ", "), 3)
mLots = TotalLots
end
end
sleep(1)
end
end
Заодно можете и всю таблицу depo_limits вывести, как раннее вам советовали.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
31.05.2021 10:22:02
Цитата
Старатель написал: Смотрите таблицу, возвращаемую getDepoEx, сравнивайте, какие поля поменялись
Скрытый текст
Код
local run = true
function OnStop()
run = nil
end
function main()
local mLots
while run do
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT, LIMIT_KIND)
if type(tblTotalLot) == "table" then
local TotalLots = tblTotalLot.currentbal
if mLots ~= TotalLots then
local t = {}
for k, v in pairs(tblTotalLot) do
t[#t+1] = tostring(k) .. "=" .. tostring(v)
end
message("mLots = " .. tostring(mLots) .. "\n" .. table.concat(t, ", "), 3)
mLots = TotalLots
end
else
message("getDepoEx error", 3)
return
end
sleep(1)
end
end
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 29.05.2020
31.05.2021 10:30:24
, а почему бы не запустить все же код даже который выложил в предыдущем посте и самому посмотреть есть ли баг или нет. А если все же всплывет, то уж потом разбираться почему
Цитата
Старатель написал: Не может. tonumber не меняет вещественное на целое.
Может message округлил до целого, а может как раз и получил целое число из таблиц( как раз об этом я и пытаюсь докричаться). Я не понимаю почему вы пытаетесь меня уличить в каком то сокрытиии хотя есть код который можно запустить самому и проверить. Зачем все эти бодания вокруг да около, если проблема то не в этом? Вроде код не содержит ничего криминального и не занимает много машиноресурсов, торговых действий не содержит и не может помешать торговле основного скрипта( просто берет данные из таблиц и если видит несоответсвие выводит сообщение для анализа), код уже представлен, чтобы никого не напрягать с программированием.
Пользователь
Сообщений: Регистрация: 29.05.2020
31.05.2021 10:38:56
, я не правильно пытаюсь получить значения через local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND) if tblTotalLot==nil then TotalLots=0 else TotalLots=tonumber(tblTotalLot.currentbal) end ? Зачем мне обязательно
Старатель написал: Почему вдруг TotalLots стал integer в то время, как getDepoEx возвращает currentbal во float?
Исходя из кода, такое может быть, если getDepoEx ничего не вернул, тогда в TotalLots вы присваиваете 0 Это возможно, например, когда QUIK переключился к другому серверу, и таблица depo_limits очистилась (это нормальное событие) и ещё не успела заполнится, как раз, когда был вызван getDepoEx.
Цитата
Сирануш написал: я не правильно пытаюсь получить значения через local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND) if tblTotalLot==nil then TotalLots=0 else TotalLots=tonumber(tblTotalLot.currentbal) end ?
Тут у каждого своё понимание о "правильности". Но такая запись может быть потенциально небезопасной, в зависимости от того, как вы обрабатываете полученные данные. Например, если QUIK переключается на другой сервер, то, как я написал выше, в TotalLots вы записываете 0, хотя по факту позиция может быть уже открыта.
Цитата
Сирануш написал: запустил терминал( сегодня суббота) и отключился от интернета вот что получилось: 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 Что теперь будешь предлагать, какую таблицу смотреть?
Выглядит весьма сомнительно, как будто в портфеле две записи для одного набора данных (FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND) Вот вам и предложили выводить таблицу целиком.
Цитата
Сирануш написал: Зачем мне обязательно делать перебор полей?
Читайте мою подпись. Угадывать за вас, что у вас происходит, никто не будет.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 29.05.2020
31.05.2021 13:43:24
, даже при переподключении между серверами не должно быть никаких ошибок это же понятно. Ошибка всплывает даже при отключенном интернете и при включенном и без совершения торговых действий не до не после ошибки на достаточном интервале времени. Перебирать таблицы за разработчиков смысла особого не вижу, даже если и найду что то исправить не смогу, пишу суда что у меня баг и где они? Если есть желание поковыряться код есть, логику изложил.
Пользователь
Сообщений: Регистрация: 29.05.2020
31.05.2021 14:08:45
Цитата
Сирануш написал: Угадывать за вас, что у вас происходит, никто не будет.
Гадать за меня ничего не надо, гадаешь собсна за себя, я просто говорю что у меня есть косяк возможно и у вас есть.
Пользователь
Сообщений: Регистрация: 27.01.2017
31.05.2021 14:33:54
Если Вы хотите решить проблему, то Вам надо предоставить информацию. Проблема же у Вас. Можете напрямую обратиться в техподдержку. У Вас запросят информацию для воспроизведения, т.к. того что Вы предоставил явно недостаточно. Вы обратились на форум, где по доброй воле разработчики могут ответить, в могут и не ответить.
Код, что Вы предоставили, дает мало информации, поэтому вывод дополнительной информации дал бы больше возможностей понять в чем проблема. Я сталкивался с особенностями работы функций get... поэтому стараюсь при анализе понимать, что сохранено в таблице к которой эта функция обращается. Собственно unit_test этой функции так и надо написать, сравнить возвращаемое значение с эталонным в таблице.
Вы же просто пишите - функция не работает. Разработчики ответят: проверили - работает.
Пользователь
Сообщений: Регистрация: 29.05.2020
31.05.2021 14:41:54
, код есть, логика ясна, где у меня возникает глюк привел, больше информации кому надо сам для анализа наковыряет, разрабы не ответили что у них все идет как по маслу и вообще ничего не ответили. У тебя тоже работает все как часы, проверял? Я больше ниче писать в пустоту не буду, есть желание пожалуйста, нет желания понятно)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
31.05.2021 19:29:21
Подтверждаю: "косяк" есть. Но в моём - это когда getDepoEx ничего не возвращает для того же набора параметров (FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT, LIMIT_KIND) При этом вызов getDepoEx сразу после ошибки
Код
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT, LIMIT_KIND)
if type(tblTotalLot) == "table" then
...
else
message("getDepoEx error", 3)
tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT, LIMIT_KIND)
end
возвращает уже нормальную таблицу с корректными значениями.
Ситуаций с левым currentbal не встречалось.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
31.05.2021 19:55:45
Цитата
Старатель написал: getDepoEx ничего не возвращает для того же набора параметров
Уточню: без переподключений, на ровном месте.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 29.05.2020
31.05.2021 20:06:04
, ну вот уже что то, если еще и мой скрипт запустить и оставить поработать то можно и разные циферки получить, что может привести к продаже/покупке( в зависимости от ситуации), а потом к обратной покупке/продаже)
Пользователь
Сообщений: Регистрация: 29.05.2020
01.06.2021 15:38:51
С утра весь день без ошибок и вот он долгожданный)))
FOLD_SPB date - time Tue Jun 1 15:33:36 2021 TotalLots 4.0 mLots 2.0 x 4.0 FOLD_SPB date - time Tue Jun 1 15:33:37 2021 TotalLots 2.0 mLots 4.0 x 2.0
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
sleep(1000) end end
Пользователь
Сообщений: Регистрация: 29.05.2020
02.06.2021 09:37:56
седня прям с утра поймался баг :
FOLD_SPB date - time Wed Jun 2 09:34:10 2021 TotalLots 1.0 memoryLots 2.0 FOLD_SPB date - time Wed Jun 2 09:34:11 2021 TotalLots 2.0 memoryLots 1.0
из кода убрал еще одну переменную x, как видно не в этом дело
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
sleep(1000) end end
Пользователь
Сообщений: Регистрация: 29.05.2020
02.06.2021 10:09:23
ETRN_SPB date - time Wed Jun 2 10:06:06 2021 TotalLots 1.0 memoryLots 2.0 ETRN_SPB date - time Wed Jun 2 10:06:07 2021 TotalLots 2.0 memoryLots 1.0
QUIK clients support
Сообщений: Регистрация: 27.01.2015
03.06.2021 12:44:48
Добрый день.
Все таки можете сообщить, какой параметр не верно считает, в переписке речь идет о разном. Выложите скриншот того, что видите в QUIK, результат, который возвращает скрипт.
Пользователь
Сообщений: Регистрация: 29.05.2020
03.06.2021 13:24:22
Добрый день, получается что из getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND).currentbal пытаюсь получить данные в TotalLots. Для сравнеия и выявления ошибки использую memoryLots. Код выше.
Пользователь
Сообщений: Регистрация: 12.05.2020
05.06.2021 09:35:41
Цитата
Сирануш написал: Для сравнеия и выявления ошибки использую memoryLots. Код выше.
74 сообщения и нигде не указана версия QUIK, в которой запускается программа в которой происходит непонятное. Версию QUIK следует указывать обязательно. Если вы работаете с QUIK версии >= 8.5 и < 8.13.1.16, то в них есть ошибка синхронизации, которая может проявляться в виде сбоев (смотрите ветку Отладка QUIK 8.13 ...).
Пользователь
Сообщений: Регистрация: 29.05.2020
05.06.2021 11:12:19
, так никто и не спрашивал про версию. Сейчас стоит 8.13.3.1.
Где вы взяли версию 8.13.3.1, если последняя официальная версия на сайте ARQA 8.13.1 (8.13.1.16) от 19.04.21?
Пользователь
Сообщений: Регистрация: 29.05.2020
05.06.2021 11:32:13
терминал сам обновлятся временами.
Пользователь
Сообщений: Регистрация: 29.05.2020
05.06.2021 11:33:55
, вы вообще имеете отношение к разработчикам или как я пользователь?
Пользователь
Сообщений: Регистрация: 12.05.2020
05.06.2021 11:43:33
Цитата
Сирануш написал: вы вообще имеете отношение к разработчикам или как я пользователь?
Я как пользователь. Хотел вам помочь. Похоже, не получилось.
Пользователь
Сообщений: Регистрация: 29.05.2020
05.06.2021 11:43:35
,
Цитата
TGB написал: Если вы работаете с QUIK версии >= 8.5 и < 8.13.1.16, то в них есть ошибка синхронизации, которая может проявляться в виде сбоев (смотрите ветку Отладка QUIK 8.13 ...).
Между этими версиями наверное десятиление и в них есть ошибка синхронизации, которая может проявляться в виде сбоев ( и приводить к потере денег клиентов ), это вообще как, нормально???!!! Это все равно, что продавать самовозгарающиеся авто.
Пользователь
Сообщений: Регистрация: 03.02.2021
05.06.2021 14:31:17
Сирануш, всего-то делов погуглить - у каждого автопроизводителя имеется целая куча автомобилей у которых вскрылись пожароопасные дефекты во время эксплуатации. И ничего, живут как-то.
Это как бы к тому, что косяки неизбежны, и критиковать людей по поводу их наличия это как минимум глупо.
Сирануш написал: так никто и не спрашивал про версию. Сейчас стоит 8.13.3.1.
Вы меня заинтриговали своей версией QUIK. Пожалуйста, еще раз проверьте версию QUIK, в которой вы работаете. Но если вы подтверждаете эту версию, то укажите брокера, через которого вы работаете. Если вы подтвердите номер версии QUIK, то это, наверное, Центробанк РФ . Каким образом вы можете работать в QUIK версии на два шага более новой, чем официальная производителя ARQA в текущий момент (на 06.06.21), для меня большая загадка. Но, возможно, мне что-то неизвестно. Кто-нибуть, возможно, поддержка QUIK, может объяснить, как такое бывает?
Пользователь
Сообщений: Регистрация: 20.12.2020
06.06.2021 17:48:11
Цитата
TGB написал: Вы меня заинтриговали своей версией QUIK
Тоже сначала удивлялся что это за версия такая 8.13.3, так как в некоторых темах пишут о данной версии Похоже что таким образом арка тестирует бета-версии квика, так сказать до официального релиза.
Сирануш, ну и по теме топика хотел бы добавить немного мыслей. Я бы дополнительно через коллбек OnDepoLimit попытался точнее определить проблему. Смотрите зачем это надо. Если через коллбек будут прилетать расхождения, тогда проблема не в квике, а в брокере, который шлет левые данные. Либо же через коллбек расхождений не будет наблюдаться, а через функцию getDepoEx будут расхождения, тогда косяк явно квика.
Просто на данный момент получается так, что проблема есть, а кто виновник пока не ясно.
Пользователь
Сообщений: Регистрация: 29.05.2020
07.06.2021 09:50:31
, написал же что за версия и скрин привел, какие еще могут быть вопросы? Если есть сомнения то я не буду переуюеждать.
Пользователь
Сообщений: Регистрация: 29.05.2020
07.06.2021 09:59:59
, с 45 по 48 посты писал уже, что отключился от интернета и это была суббота, все равно всплывало. Я если честно для себя решил проблему(частично) с помощью контроля переменных. Проблему обрисовал, код, версию предстваил. Если есть желание подловить с помощью колбэков можешь у себя запустить, заодно посмотишь есть ли у тебя такой баг.
QUIK clients support
Сообщений: Регистрация: 27.01.2015
07.06.2021 16:12:47
Цитата
Сирануш написал: , с 45 по 48 посты писал уже, что отключился от интернета и это была суббота, все равно всплывало. Я если честно для себя решил проблему(частично) с помощью контроля переменных. Проблему обрисовал, код, версию предстваил. Если есть желание подловить с помощью колбэков можешь у себя запустить, заодно посмотишь есть ли у тебя такой баг.
Добрый день.
Давайте сделаем так. Откройте таблицу позиций по бумагам, зафиксируйте проблему снова. Закройте QUIK, сделайте архив всей папки без ключей и пришлите нам на + скрипт который запускаете.
Пользователь
Сообщений: Регистрация: 29.05.2020
07.06.2021 16:18:09
Скрипт в 71 посте есть, только вместо вопросов вставить нужные значения. Там же есть проблема отражена, то что выводится в сообщении. Не думаю, что я смогу за секунду все это проделать пока значения вернуться в правильное состояние. У вас нет такой проблемы или вы не запускали?
QUIK clients support
Сообщений: Регистрация: 27.01.2015
07.06.2021 19:43:12
Цитата
Сирануш написал: Скрипт в 71 посте есть, только вместо вопросов вставить нужные значения. Там же есть проблема отражена, то что выводится в сообщении. Не думаю, что я смогу за секунду все это проделать пока значения вернуться в правильное состояние. У вас нет такой проблемы или вы не запускали?
Конечно проверили. Данные возвращаются корректные.
Пользователь
Сообщений: Регистрация: 29.05.2020
07.06.2021 22:39:12
, не знаю странно все это, но я бы увеличил кол-во наблюдаемых инструментов и длительность мониторинга( было бы хорошо чтоб повисели пару неделек без остановок и максимально много скриптов на разных инструментах). У меня в районе 50 скриптов висят и не на каждом всплывает этот баг и не не каждый день.
Вот наблюдается в т.ч. в джуниор по нескольку раз за день.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 12.05.2020
08.06.2021 09:47:13
Цитата
Сирануш написал: с 45 по 48 посты писал уже, что отключился от интернета и это была суббота, все равно всплывало.
--
Цитата
Сирануш написал: У меня в районе 50 скриптов висят и не на каждом всплывает этот баг и не не каждый день.
----------
Цитата
Старатель написал: Вот эта проблема наблюдается в т.ч. в джуниор по нескольку раз за день.
----------------------------- Выше приведенные комментарии, скорее всего, означают, что функция getDepoEx не является потокобезопасной. Вообще, все функции API работы с QUIK из QLua должны быть потокобезопасными хотя бы из-за того, что к ним могут обращаться из нескольких одновременно запущенных скриптов (работающих в разных потоках). Причем, ! обращаю особое внимание разработчиков, что объекты синхронизации в таких функциях должны локализоваться в месте, общем для всех скриптов, и это место точно не global_State и тем более не lua_State. ---- Просьба к поддержке, довести данный комментарий до разработчиков QUIK.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.06.2021 10:32:46
Цитата
Сирануш написал: 50 скриптов висят и не на каждом всплывает этот баг и не не каждый день.
Уменьшите sleep до 1 мс - вероятность воспроизведения бага вырастет.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 29.05.2020
08.06.2021 10:51:05
На самом деле, хотелось бы обратиться к читающим эту ветку, чтобы вы запустили у себя код( заменив вопросики на соответсвующие значеиния) из 71 поста и если подобное всплывет отписали сюда.
Вот наблюдается в т.ч. в джуниор по нескольку раз за день.
Добрый день.
Вы пишите, что getDepoEx ничего не возвращает, пользователь пишет, что у него ошибка текущего остатка.
Мы проверили ошибок нет, но мы не говорим, что разбираться не будем, будем конечно, просто ускорит процесс хотя бы копия рабочего места на момент проблемы.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
08.06.2021 13:17:23
Цитата
Egor Zaytsev написал: Вы пишите, что getDepoEx ничего не возвращает
Эта проблема легко воспроизводится скриптом, опубликованном мной в сообщении
В скрипте Сирануш в том случае, если getDepoEx ничего не возвращает, присваивает значению текущего остатка ноль. Поэтому для него "getDepoEx ничего не возвращает" = "ошибка текущего остатка", если по факту позиция открыта. Если позиция закрыта, то этой ошибки в его скрипте не будет.
Цитата
Egor Zaytsev написал: пользователь Сирануш пишет, что у него ошибка текущего остатка
Что касается левых значений в currentbal, то, вероятно, это может быть связано с открытыми позициями, их количеством, классами, сроков расчётов и пр. факторами. Т.ч. договаривайтесь с ТС о копии рабочего места.
Надо делать так, как надо. А как не надо - делать не надо.
написал: Вы пишите, что getDepoEx ничего не возвращает
Эта проблема легко воспроизводится скриптом, опубликованном мной в сообщении
В скрипте в том случае, если getDepoEx ничего не возвращает, присваивает значению текущего остатка ноль. Поэтому для него " getDepoEx ничего не возвращает " = " ошибка текущего остатка ", если по факту позиция открыта. Если позиция закрыта, то этой ошибки в его скрипте не будет.
Цитата
написал: пользователь Сирануш пишет, что у него ошибка текущего остатка
Что касается левых значений в currentbal, то, вероятно, это может быть связано с открытыми позициями, их количеством, классами, сроков расчётов и пр. факторами. Т.ч. договаривайтесь с ТС о копии рабочего места.
Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Пользователь
Сообщений: Регистрация: 12.05.2020
09.06.2021 07:15:52
Цитата
TGB написал: Выше приведенные комментарии, скорее всего, означают, что функция getDepoEx не является потокобезопасной. Вообще, все функции API работы с QUIK из QLua должны быть потокобезопасными хотя бы из-за того, что к ним могут обращаться из нескольких одновременно запущенных скриптов (работающих в разных потоках). Причем, ! обращаю особое внимание разработчиков, что объекты синхронизации в таких функциях должны локализоваться в месте, общем для всех скриптов, и это место точно не global_State и тем более не lua_State. ---- Просьба к поддержке, довести данный комментарий до разработчиков QUIK.
Реакции поддержки на просьбу нет. Ее трудно выполнить? Или поддержка считает, что выше написанное, не относится к обсуждаемому в данной ветке?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
09.06.2021 14:29:02
Ключевым является это:
Цитата
Сирануш написал: У меня в районе 50 скриптов висят
Т.е., более одного скрипта запрашивают позиции по разным бумагам.
Скрипт 1:
Скрытый текст
Код
local run = true
function OnStop()
run = nil
end
function main()
local mLots
while run do
local tblTotalLot = getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT, LIMIT_KIND)
if type(tblTotalLot) == "table" then
local TotalLots = tblTotalLot.currentbal
if mLots ~= TotalLots then
message(SEC_CODE .. ": mLots = " .. tostring(mLots) .. "\n" .. tblTotalLot.sec_code .. ": currentbal = " .. tostring(TotalLots), 3)
mLots = TotalLots
end
else
message("getDepoEx error", 3)
end
sleep(1)
end
end
Скрипт 2:
Скрытый текст
Код
local run = true
function OnStop()
run = nil
end
function main()
while run do
getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT, LIMIT_KIND)
sleep(1)
end
end
Запустил скрипт 1 по "SBER" и несколько скриптов 2 по другим бумагам. В итоге Скрипт 1 стал получать позиции не только по "SBER", но и по другим бумагам из других скриптов.
Скрытый текст
Причём эта ошибка более частая, чем "getDepoEx ничего не возвращает", и возникает в офлайн.
Надо делать так, как надо. А как не надо - делать не надо.