Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Владимир написал: Какое отношение скрипт имеет к авторизации? Это дело Квика, но никак не скрипта - автоматическая авторизация не может быть реализована на любом языке.
Ну если квик не умеет автоматическую авторизацию, то приходится реализовывать это самостоятельно.
Цитата
Владимир написал: А скрипту она совершенно по барабану (моему, во всяком случае).
Так моему тоже )))
Есть торговый скрипт, а есть скрипт для авторизации. И это совершенно разные скрипты с разным функционалом.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Владимир написал: А что, собссно, нельзя реализовать на луа?
Например автологин и прохождение двухфакторной авторизации на "чистом" луа без доп. библиотек и сторонних утилит даже на представляю как сделать. А это весьма нужный функционал для автоматизации на мой взгляд.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Владимир написал: КАКИЕ ИМЕННО "костыли" позволяют добиться стабильной работы?
Шутить изволите? Да у меня значительную часть кода занимают костыли, которыми проверяю как факт доставки, так и корректность получаемых данных и даже передаваемых данных. Ну как пример
Код
local param=getParamEx2(class_code,sec_code,"LAST")
if(param.result=="1")and(param.param_image~="")and(param.param_type=="1")and(tonumber(param.param_value)~=0)then params["LAST"]=tonumber(param.param_value) end
и вот без подобных проверок на каждый чих замучаешься потом ошибки ловить, и будешь кричать на весь форум что квик говно.
У квика, на мой взгляд, основная беда в том, что нет гарантии что ты получишь данные, а если получил их, то это еще не значит, что они будут корректными. С отправляемыми данными из-за динамической типизации та же беда, надо всегда убеждаться что они корректные. Зато если убедился что с данными полный порядок, то скипт как-то стабильно работает, ну если руки не из жопы, конечно.
Цитата
Владимир написал: А вот Квик я как раз поменял, с девятой версии снова на восьмую. Десятку даже не пытался ставить, но по здешним отзывам она хуже даже девятки.
Всегда обновлялся практически сразу, как только арка обнову выкатывала. По-крайней мере всё что мне надо, работает начиная с седьмой и по десятую.
Цитата
Владимир написал: И что Луа есть полное дерьмо, но писать нужно именно на нём, тоже говорил.
Предпочтительно писать на луа, это да. Но далеко не все можно реализовать на луа. Я не про непосредственно торговлю, а про автоматизацию торговли, чтобы не сидеть перед монитором постоянно.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Владимир написал: Здесь ни в чём нельзя быть уверенным наверняка, и никакие костыли от этого не спасут.
Ну зачем так категорично-то? Спору нет, в Квике проблем хватает, но с помощью "костылей" вполне можно добиться стабильной работы. Я так уже и не помню когда в свои скрипты последний раз серьезные правки вносил, только мелочи всякие причесываю, да стратегию немного корректирую под текущие условия. Торгуют роботы, деньгу приносят и никаких проблем не наблюдается.
Цитата
Владимир написал: Я уже приводил пример, что данные портфеля ЧАСАМИ могут лежать неправильными.
Я бы после подобного брокера сменил.
Зачем постоянно на квик ругаться? Вы же тут сами постоянно пишете, что ваш робот 100500 инструментов одновременно торгует и зарабатывает. Квик это ж всего лишь инструмент, со своими, конечно, косяками, но работать на нем вполне можно.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Рустем написал: Что является для программы триггером что можно начать анализировать данные и торговать ?
Нет четкого триггера. Есть только определенная вероятность того, что данные получены.
Я, например, опрашиваю таблицу, пока ее размер не станет больше нуля, но не дольше заданного времени. Если время прошло, а таблица все-еще пустая, то считаем что позиций нет.
Код
function FuturesClientHolding() -- Первоначальное заполнение позиций по срочному рынку
params["TOTALNET"] = 0 -- Текушие позиции
params["OPENSELLS"] = 0 -- Активная продажа
params["OPENBUYS"] = 0 -- Активная покупка
local n=0
while (runStatus==3)and(n<try_count)and(getNumberOf('FUTURES_CLIENT_HOLDING')==0) do -- Ждем заполнения таблицы "Позиции по клиентским счетам (фьючерсы)"
if(n==0)then message("["..account.."] Ждем... Позиции по клиентским счетам") end
sleep(loop_timeout) n=n+1
end
if(getNumberOf('FUTURES_CLIENT_HOLDING')>0)then -- Таблица "Позиции по клиентским счетам (фьючерсы)" заполнена
for i=0,getNumberOf('FUTURES_CLIENT_HOLDING')-1 do
local tbl=getItem('FUTURES_CLIENT_HOLDING', i)
if(type(tbl)=="table")and(tbl['firmid']==firmid)and(tbl['trdaccid']==account)and(tbl['sec_code']==sec_code)and(tbl['type']==0)then
params["TOTALNET"] = tbl['totalnet']
params["OPENSELLS"] = tbl['opensells']
params["OPENBUYS"] = tbl['openbuys']
end
end
end
message("["..account.."] Позиции: Текущие="..params["TOTALNET"].." Покупка="..params["OPENBUYS"].." Продажа="..params["OPENSELLS"])
end
Метод весьма далек от идеала, но лучшего не нашел.
PS: В свое время рассматривал еще один вариант. Перед проверками поставить один лот на покупку по минимально возможной цене (чтобы точно не сработала заявка), и тут же снять его. После чего ждать пока в таблице позиций не появится нужный инструмент, а он обязан будет появиться.
Предварительная проверка наличия в базе Quik инструмента (опциона), Subscribe_Level_II_Quotes и getParamEx не существующего опциона приводят к зависанию Quik
BlaZed написал: Можно в основном цикле сравнивать локальное время компа с вашими требованиями к работе скрипта по времени. При соответствии выполнять функционал, при несоответствии крутить пустой цикл.
вместо пустого цикла используйте sleep(время ожидания до следующего запуска)
Естественно пустой цикл со слипом, я просто не стал очевидные вещи расписывать
Можно в основном цикле сравнивать локальное время компа с вашими требованиями к работе скрипта по времени. При соответствии выполнять функционал, при несоответствии крутить пустой цикл.
- У меня квик виснет - Сделайте первое и второе и предоставьте нам информацию для анализа проблемы - Ничего не буду делать, я тут деньги теряю, догадайтесь сами что у меня поломалось
PS: ошибки в скриптах могут быть логическими, и проявляться только при определенных условиях, так что 99% времени работает стабильно, а потом виснет, вполне реальное поведение при ошибках в скриптах.
Айдар, ну каждому свое, я бы рехнулся каждый тик анализировать
Тренды наше все, и на часовиках они отлично видны. Робот распознал тренд, нашел точку входа и держит пока тренд не сломается. В месяц около 10 сделок выходит на инструмент, зато никакого дрочилова и результат очень даже радует.
Евгений написал: Можно узнать какое железо конкретно? давно интересно какое оно у тех у кого ничего не тормозит
Да достаточно простое железо AMD Ryzen 5 3500X, 3600 MHz Asus Prime B450M-A DDR4 Kingston HiperX Fury Black 4096MBx2 SSD 256GB Intel 760 Series всякую мелочевку перечислять смысла нет
Установлена Windows10, на которой кроме квика практически ничего больше нет, только несколько мелких прог типа фара, виндетектива и т.п.
Ну и в самом квике всего два скрипта, один автологин, второй торговый
В рабочем режиме загрузка цп 2-3%, памяти 30-35%, ssd 0-1%
Дмитрий, Как вариант, у вас, возможно, в каком-нибудь колбеке ожидание завершения чего-либо имеется или sleep. А так, приведите минимальный код, который продемонстрирует проблему, чтобы не гадать.
Вот реально этот "спам" сообщений достал. Когда валится несколько сотен сообщений с инфой о инструментах которые я не использовал и не собираюсь использовать в ближайшее время, с этим определенно надо что-то делать.
Предлагаю разработчикам реализовать определение источника сообщений (сообщения биржи, сообщения брокера, сообщения скриптов) и фильтр сообщений по ключевым словам, по типу черного и белого списков.
Чтобы можно было настраивать какие сообщения хочу получать, а какие нет. Например, сообщения биржи прогонять через фильтр, сообщения брокера игнорить, а сообщения от скриптов получать все.
Я когда-то для перекодировки входящих смс такую себе написал
Код
function dos2win(s)
local str=""
for i=1,string.len(s) do
local byte=string.byte(s,i)
local char=string.char(byte)
if(byte>=128)and(byte<=175)then char=string.char(byte+64) end
if(byte>=224)and(byte<=239)then char=string.char(byte+16) end
if(byte==240) then char=string.char(168) end
if(byte==241) then char=string.char(184) end
str=str..char
end
return str
end
Так откройте текстовым редактором и посмотрите. Как минимум номера счетов и id фирмы в файле info.wnd открытым текстом лежат Так же имена нескольких своих скриптов тоже там найти можно.
Вроде не столь критично, но все же ну его нафик такое давать кому-то.
Роман написал: Всем привет. А можно у автологина настроить правильно, чтобы по субботам и воскресеньям не подключался? Спасибо
Конечно можно. Давно уже все реализовано и прекрасно работает, правда с помощью подключения внешней библиотеки w32.dllЕсли вас этот момент не смущает, то вам сюдаhttps://quik2dde.ru/viewtopic.php?id=80
Alexey Ivannikov написал: Прошло 10 дней, за это время никто более тут по проблеме не высказался, конкретики Вы также не предоставили.
На самом деле, и правда же сразу понятно кого Незнайка имеет ввиду.
Но лично я проблемы в этом просто не вижу. Мое мнение, что старичок хоть троллит и флудит как не в себя, зато делает форум забавнее, без него скучно бы тут было. Так что не надо его трогать, он местная достопримечательность.
Отличия только в настройках программы, которые брокеры делают, чтобы пользователям не надо было париться с подключением к конкретному брокеру. Ну и компоненты программы у разных брокеров могут отличаться.
Другими словами, вы можете взять чистый дистрибутив QUIK-Junior и работать с любым брокером который работает с QUIK. Вам надо будет только самостоятельно настроить шифрование и подключение к серверам брокера.
Vladimir написал: Что вы имеете ввиду по обновлением с серверов арки вручную? Скачивать с ftp и копировать/распаковывать архив в свою рабочую папку, предварительно заархивировав то что было?
А зачем перезапускать скрипт? Чисто теоретически ничего не мешает в скрипте в определенное время занилить используемые переменные после чего запустить сборщик мусора.
Такое ощущение, что вы не с той стороны пытаетесь решать проблему. 1) Если постоянные разрывы связи, то менять провайдера надо Если редкие и кратковременные, то автологин квика нормуль отрабатывает https://quik2dde.ru/viewtopic.php?id=802) Если не приходят СМС, значит или менять опсоса, или отключить двухфакторную авторизацию 3) Лучше свести вероятность отказа компа до минимума. Рейд, резервное питание, нормльное железо. Ну или даже виртуализировать. А так то ничего не мешает держать несколько квиков на одном брокерском счете, это от настроек брокера зависит.
Роман написал: Дистрибутивы предоставляются брокерами, т.к. у каждого брокера свой модуль автоматического подключения завязанный именно на него.
Дистрибутивы предоставляются разработчиком. А брокеры просто настраивают конфиги квика на свои сервера и методы авторизации, и выкладывают эти правленные дистры у себя. Все ради того, чтобы пользователям надо было меньше думать.
Цитата
Роман написал: И суть проблемы ещё раз прочитайте!
Так с первого раза все предельно понятно. info.wnd сконвертировался под конкретную версию, под более старую на заводится, а бекапов вероятно нет
Еще раз: используйте актуальную версию квика и не страдайте ерундой
Александр, Научитесь излагать мысли так, чтобы люди не прибегая к телепатии вас могли бы понять. Совершенно же не ясно что вы хотите. А в коде и правда менять нечего, ибо нету тут кода.
Вы напишите код, а что будет не получаться, спрашивайте. А сейчас это выглядит именно как "напишите за меня" причем даже не понятно что именно.
Судя по коду сначала файл script_update.ini должен скачаться с удаленного сервера, а потом открыться. Но как видно из ошибки открыть файл не получается.
Логично предположить два варианта 1) Файл D:\SAMP\CLEAR SBORKA SAMP\moonloader\script_update.ini имеется, но какой-то косяк с правами доступа => Проверить права на файл 2) Файл отсутствует по указанному пути. 2.1) Файл не может быть записан в указанную директорию => Проверить права доступа на директорию D:\SAMP\CLEAR SBORKA SAMP\moonloader\ 2.2) Файл не скачивается => Выяснить почему А не скачаваться он может, если я нашел верное описание функции downloadUrlToFile
Цитата
Описание Загружает файл из интернета по URL по протоколу HTTP.
По пунктам 2, 4 и 5 это явно мимо. Или железо слабое, или ОС загажена, или в квике 100500 окон открыто
QUIK стартует 3-4 секунды до ввода пароля и 5-10 секунд до полной загрузки всех таблиц и графиков. Ну и, естественно, никаких торможений не наблюдаются. Причем у меня железо далеко не топовое.
QUIK 9.3.3.3, правда я ставил чистый квик джуниор и настраивал на Открытие брокер
Иван написал: Подскажите пожалуйста рекомендации что еще можно сделать?
В ярлычках квика добавил ключ запуска -clear, теперь всякий мусор прям при запуске квика чистится
Цитата
1.8 Ключи запуска Рабочего места QUIK -clear – очистить служебные файлы, которые содержат торговые данные (info.log (или curr_data.log в зависимости от настроек терминала), acnt.dat, alert.ik, alltrade.dat, trades.dat, orders.dat). Это позволяет ускорить загрузку программы.
только аккуратно, а то вдруг для вас вышеуказанные файлы не мусор
Иван написал: Подскажите пожалуйста почему вы остановились именно на 3 днях до экспирации? А не на 1?
В первом посте задача стояла в три дня до экспирации Я лично за 1 до экспирации инструмент меняю.
Цитата
Иван написал: Но у меня заработало получение актуальных фьючерсов только после изменения изменения шаблона поиска для функции gmatch() for test_sec_code in string.gmatch(sec_list, "("..pref.."[^%s,]+)") do -- Перебираем список
У вас getClassSecurities(class_code) возвращает строку с пробелами?
isRun = true
base_time = "22:16:30"
base_hour,base_min,base_sec = string.match(base_time,"(%d*):(%d*):(%d*)")
base_offset=base_hour*3600+base_min*60+base_sec
function main()
while isRun do
srv_hour,srv_min,srv_sec = string.match(getInfoParam('SERVERTIME'),"(%d*):(%d*):(%d*)")
srv_offset=srv_hour*3600+srv_min*60+srv_sec
if(srv_offset>=base_offset)then
message("go")
isRun = false
else
message("wait")
end
sleep(100)
end
end
Владимир написал: BlaZed, Чего хорошего в такой "динамике"? Понятно, что список инструментов нужно вынести в отдельный файл, но получать динамически его от брокера... У меня этот список проходит довольно тщательную проверку, где-то раз в месяц повторяемую, и бОльшая часть инструментов эту проверку не проходит. А с оставшимися можно работать.
Если вы даже не поняли о чем разговор, то не стоит встревать с "умными" советами.
В код зашивать список инструментов так себе идея, если необходимо несколько инструментов отслеживать, то грустно станет списки поддерживать в актуальном состоянии. Динамически будет проще и красивее.
Код
function FindSecCode(class_code,pref,dtmd) -- Определяем инструмент для торговли
local sec_list=getClassSecurities(class_code) -- Получаем список инструментов
for test_sec_code in string.gmatch(sec_list,"("..pref.."[^,]+)") do -- Перебираем список
local param=getParamEx(class_code,test_sec_code,"DAYS_TO_MAT_DATE")
if(param.result=="1")and(param.param_image~="")and(param.param_type~="0")then -- Параметр получен корректно?
if(tonumber(param.param_value)>=dtmd)then return test_sec_code end -- Проверяем дни до экспирации
end
end
end
sec_code=FindSecCode("SPBFUT","BR",3)
if(sec_code)then message("actual futures is "..sec_code) end
Возможно, стоило бы сортировку прикрутить, но сколько не наблюдал, от брокера сразу отсортированный по времени экспирации список прилетает.
uuh написал: Как теперь проверять возможность выставления заявки - не понятно
Надо не только сам параметр проверять, а еще и корректность получения данного параметра А то бывает такое, что параметр как бы есть, но его как бы нет и доверять ему не стоит
Вот так работаем с такой напастью
Код
local param=getParamEx2(class_code,sec_code,"TRADINGSTATUS") -- Состояние сессии
if(param.result=="1")and(param.param_image~="")and(param.param_type=="4")and(tonumber(param.param_value)>=0)then params["TRADINGSTATUS"] =tonumber(param.param_value) end
Roffild написал: Нужна нормальная функция, которая точно ответит на "Торговля разрешена?"
Нормальной нет, но можно же накидать доп проверок, чтобы свести точность до приемлемого уровня. isConnected - это и так понятно, проверяем наличие подключения к брокеру Проверяем параметр "TRADINGSTATUS" из ТТТ. - Параметр тормозной, в пики нагрузок (на открытии утром торгов и при открытии вечерней сессии) наблюдал задержки 3-5 секунд, но уже лучше чем ничего, если не скальперить, то этого уже более чем достаточно.
Пишем и прикручиваем функцию проверки на праздничные/выходные дни и время работы биржи. Благо все эти параметры известны заранее. При синхронизированных системных часах точность очень хорошая. Я еще дополнительно проверяю соответствие локального времени и время последней свечи на высоколиквидном инструменте (SI).
Нет ничего невозможного. Мосбиржа уже несколько лет предоставляет такую возможность https://www.moex.com/s2116 Но для этого придется расположить свое оборудование в зоне колокации мосбиржи.