101

Re: Автологин в QUIK (на Lua)

С github и его желанием видеть все исходники только в uft8 кодировке - прям беда в самом деле sad
Было исследование одного из пользователей форума, где выявлялась система, по которой github все же может корректно "видеть" файлы и в другой кодировке, но определение идет по определённому имени файла, что очень неудобно, конечно для готовых проектов.

admin: обсуждение [url=https://quik2dde.ru/viewtopic.php?id=365]про GitHub вынесено в отдельную ветку[/url].

102

Re: Автологин в QUIK (на Lua)

BlaZed пишет:

На данный момент пользуюсь таким вариантом скрипта.
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.dll

Чтобы скрипт нашел библиотеку, создаем в папке с квиком папку w32 и распаковываем архив с библиотекой в нее
В папке w32 должны появиться подпапки x32, x64-Lua51, x64-Lua53, x64-Lua54, в каждой из них должна находиться w32.dll для нужной версии LUA

Не забываем из папки с квиком удалить файл w32.dll, если ранее вы туда его помещали.


Добрый день.

-- Торговый календарь московской биржи
-- 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]
  

Немного туплю. Верно понимаю, что он тянет полностью график, а не на 2021 только год?

Спасибо.

103

Re: Автологин в QUIK (на Lua)

Skyspirit, приветствую вас на форуме!

Skyspirit пишет:

Верно понимаю, что он тянет полностью график, а не на 2021 только год?

Ничего ниоткуда не "тянется".
В приведённом коде просто явно прописан календарь на 2021 год.
Для других годов следует дополнить этот код руками по аналогии с имеющимся.

104 (2022-10-09 22:00:28 отредактировано bilobrovandrey)

Re: Автологин в QUIK (на Lua)

Уважаемый swerg! можно ли объединить функционал этой w32  dll cо своей сделанной на дельфи? сейчас хочу  сделать  автологин с 2 фазовой аутентификацией... Было бы круто подключать 1 длл вместо нескольких.

105

Re: Автологин в QUIK (на Lua)

bilobrovandrey, не совсем мне понятно в каком вы это смысле спрашиваете: в техническом или в юридическом?
В любом случае лично я ничего вам запретить не могу smile

106

Re: Автологин в QUIK (на Lua)

вопрос риторический)
Посмотрел исходники, грустно вздохнул.. Все можно, нужно ли ,решить)

107 (2022-10-17 13:36:05 отредактировано swerg)

Re: Автологин в QUIK (на Lua)

Я лично не вижу проблем носить 3..5 библиотек рядом. Да хоть 20.
Все равно все они (библиотеки) подключаются единообразным образом в любой свой скрипт.
Зато это облегчает обновление библиотек раздельно, а не всей одной огромной, где что-то пойдет не та - и тогда всю её придется откатывать, вместе со всем новым функционалом в смысле.

108

Re: Автологин в QUIK (на Lua)

в коде есть маленькая логическая ошибка.
в этой процедуре

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

если есть окно "Логина" в соседнем квике , то этот квик насмерть виснет, а могут и оба.
в цикл while добавить sleep, тогда будет нормально.