На данный момент пользуюсь таким вариантом скрипта.
QUIK 8.12.0.41
-- Автологин терминала QUIK
-- (c) http://quik2dde.ru/
-- Версия: 4.2 (BlaZed Edition)
QUIK_LOGIN="Логин" -- Логин
QUIK_PASSW="Пароль" -- Пароль
function OnInit()
local luadir="x32"
if(_VERSION=="Lua 5.1")then luadir="x64-Lua51" end
if(_VERSION=="Lua 5.3")then luadir="x64-Lua53" end
if(_VERSION=="Lua 5.4")then luadir="x64-Lua54" end
package.cpath=package.cpath..";"..getWorkingFolder().."\\w32\\"..luadir.."\\?.dll";
w32 = require("w32")
CurrentProcessId=w32.GetCurrentProcessId() -- ID процесса QUIK
QuikMainWindowHandle=GetWindowHandle("InfoClass","") -- Дескриптор главного окна QUIK
if(QuikMainWindowHandle==0) then message("Дескриптор главного окна QUIK не найден") return end
MainWindowText=w32.GetWindowText(QuikMainWindowHandle) -- Текст заголовка главного окна QUIK
LoginWindowText="Идентификация пользователя" -- Текст заголовка окна логина Язык RU (по умолчанию)
if(string.find(MainWindowText,"version")~=nil) then LoginWindowText="User identification" end -- Язык EN
serv_n=-1 -- Порядковый номер сервера
end
function main()
is_run = true
while is_run do
if(isConnected()==0)then
if(WorkTime()==true)then QuikConnect() end -- Нажать кнопку "Установить соединение с информационным сервером"
QuikLogin() -- Ввести Логин/Пароль и нажать кнопку "Вход"
collectgarbage() -- Сбор мусора
else
serv_n=-1
end
sleep(1000)
end
end
function OnStop()
is_run=false
return 100
end
function QuikConnect() -- Нажать кнопку "Установить соединение с информационным сервером"
w32.PostMessage(QuikMainWindowHandle,w32.WM_COMMAND,100,0)
end
function QuikLogin() -- Ввести Логин/Пароль и нажать кнопку "Вход"
local hWnd=GetWindowHandle("#32770",LoginWindowText) -- Получить дескриптор окна логина QUIK
if hWnd==0 then return end -- Дескриптор не найден, выход
local hServe=w32.FindWindowEx(hWnd,0,"ComboBox","") -- Сервер
local hLogin=w32.FindWindowEx(hWnd,hServe,"Edit","") -- Логин
local nPassw=w32.FindWindowEx(hWnd,hLogin,"Edit","") -- Пароль
if(serv_count==nil)then serv_count=w32.SendMessage(hServe,w32.CB_GETCOUNT,0,0) end -- Количество серверов в списке
if(serv_n>=0)then -- при первой попытке коннект к серверу из последнего соединения, при неудачном коннекте перебор
serv_n=serv_n%serv_count
w32.SendMessage(hServe,w32.CB_SETCURSEL,serv_n,0)
end
serv_n=serv_n+1
w32.SetWindowText(hLogin,QUIK_LOGIN)
w32.SetWindowText(nPassw,QUIK_PASSW)
w32.PostMessage(hWnd,w32.WM_COMMAND,1,0)
end
function GetWindowHandle(ClassName,Text) -- Получить дескриптор окна
local hWnd=0
while true do
hWnd=w32.FindWindowEx(0,hWnd,ClassName,Text)
if hWnd==0 then break end -- Окно не найдено
local ThreadId,ProcessId=w32.GetWindowThreadProcessId(hWnd)
if ProcessId==CurrentProcessId then break end -- Окно найдено
end
return hWnd
end
function WorkTime() -- Возвращает флаг рабочего времени
local GMT3=10800 -- Часовой пояс биржи GMT+3 Москва (3*60*60=10800 - количество секунд в 3 часах)
dt=os.date("!*t",os.time()+GMT3)
-- Торговый календарь московской биржи
-- 2021 год https://www.moex.com/s3196
-- true - рабочий день, false - не рабочий день, nil - проверяем день недели
local calendar={[20210101]=false,[20210107]=false,[20210220]=true,[20210223]=false,[20210308]=false,[20210503]=false,[20210510]=false,[20210614]=false,[20211104]=false,[20211231]=false}
local today=calendar[dt.year*10000+dt.month*100+dt.day]
if(today==false)or((today==nil)and((dt.wday==1)or(dt.wday==7)))then return false end
if(dt.hour*60+dt.min<590) then return false end -- Отсекаем время до 9:50 (9*60+50=590 - количество минут с 0:00 до 9:50)
return true
end
Чтобы скрипт нашел библиотеку, создаем в папке с квиком папку w32 и распаковываем архив с библиотекой в нее
В папке w32 должны появиться подпапки x32, x64-Lua51, x64-Lua53, x64-Lua54, в каждой из них должна находиться w32.dll для нужной версии LUA
Не забываем из папки с квиком удалить файл w32.dll, если ранее вы туда его помещали.