Написал для себя, выкладываю тут — может кому пригодится.
Скрипт имеет громкое название — QuikConnectionGuard :-)
Следит за наличием соединения между квиком и торговым сервером.
Если соединение пропадает — перезапускает квик и заново коннектится, а затем заново загружает портфель (qpl-файл). Проверка соединения выполняется раз в 30 секунд.
Графический интерфейс скрипта прост: формы для ввода логина/пароля и текстовое поле для вывода лога работы.
Скрипт написан на AutoIt
www.autoitscript.com/site/autoit/downloads/
Можно собрать скрипт в исполняемый файл и запускать как отдельное приложение.
#Region
#AutoIt3Wrapper_icon=...\...\VistaOSX09\icons\RKLauncher.ico
#AutoIt3Wrapper_Compression=4
#EndRegion
;Class=InfoClass — QUIK
;Class=MsgDialogClass; Title=QUIK: окно сообщений — окошко с ошибкой «Net error: Connection reset by peer»
#requireadmin
#include <GUIConstants.au3>
#include <Constants.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
AutoItSetOption(«GUIOnEventMode», 1)
Local $Login = ""; Логин
Local $Password = ""; Пароль
Local $Delay = 30000; Пауза между итерациями (миллисекунды)
Local $myedit
GUICreate(«QUIK Connection Guard», 300, 500)
GUISetOnEvent($GUI_EVENT_CLOSE, «CloseApp»)
GUICtrlCreateLabel(«Логин», 65, 10)
GUICtrlCreateLabel(«Пароль», 65, 40)
$LoginEdit = GUICtrlCreateInput("", 110, 10, 100, 20)
$PasswordEdit = GUICtrlCreateInput("", 110, 40, 100, 20, $ES_PASSWORD)
$myedit = GUICtrlCreateEdit("", 0, 80, 300, 420, $ES_AUTOVSCROLL + $WS_VSCROLL)
GUISetState(@SW_SHOW)
While True
GUICtrlSetData($myedit, "*** Пауза между итерациями (" & $Delay & " мс) ***" & @CRLF, 1)
Sleep(30000)
$Login = GUICtrlRead ($LoginEdit)
$Password = GUICtrlRead ($PasswordEdit)
; Если квик запущен — входим тут
If is_QUIK_running() Then
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Квик запущен.." & @CRLF, 1)
; Если квик подключен к бирже — делать больше нечего
If is_QUIK_connected(«15100») Then
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Квик соединён с биржей.." & @CRLF, 1)
ContinueLoop
; Если не подключен к бирже — закрываем его и запускаем заново, затем загружаем портфель
Else
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Квик не соединён с биржей. Закрываем его… " & @CRLF, 1)
WinClose ("[CLASS:InfoClass]")
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Ждём 5 секунд… " & @CRLF, 1)
Sleep(5000)
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Запускаем Квик… " & @CRLF, 1)
run_QUIK()
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Проверяем — соединён ли квик с биржей… " & @CRLF, 1)
If is_QUIK_connected(«15100») Then
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Квик соединён с биржей — загружаем портфель… " & @CRLF, 1)
load_portfolio()
ContinueLoop
EndIf
EndIf
; Сюда попадаем если квик не запущен
Else
; Запускаем квик
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Квик не запущен — запускаем его… " & @CRLF, 1)
run_QUIK()
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Проверяем — соединён ли квик с биржей… " & @CRLF, 1)
If is_QUIK_connected(«15100») Then
GUICtrlSetData($myedit, "[" & @HOUR & ":" & @MIN & ":" & @SEC & "] Квик соединён с биржей — загружаем портфель… " & @CRLF, 1)
load_portfolio()
Else
GUICtrlSetData($myedit, «Соединиться с биржей не удалось. Проверьте подключение к Сети и правильность ввода логина/пароля.» & @CRLF, 1)
EndIf
EndIf
WEnd
GUIDelete()
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;FUNCTIONS;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func CloseApp()
Exit
EndFunc
Func is_QUIK_running()
If WinExists("[CLASS:InfoClass]") Then
Return 1
EndIf
Return 0
EndFunc
Func is_QUIK_connected($port_number)
Local $foo = Run(«cmd.exe», @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
StdinWrite($foo, «netstat -aon -p TCP | find „“» & $port_number & """ | find "«ESTABLISHED»"" & @CRLF)
; Calling with no 2nd arg closes stream
StdinWrite($foo)
Local $line
Local $count
Local $array
$count = -1
While True
$line = StdoutRead($foo)
If @error Then ExitLoop
$array = StringRegExp($line, $port_number, 4)
For $i = 0 To UBound($array) — 1
Local $match = $array[$i]
For $j = 0 To UBound($match) — 1
$count = $count + 1
Next
Next
Sleep(25)
WEnd
If $count > 0 Then
Return 1
Else
Return 0
EndIf
EndFunc
Func run_QUIK()
Run(«C:\Program Files\Info\info.exe», «C:\Program Files\Info», @SW_MAXIMIZE)
WinWaitActive ("[TITLE: Идентификация пользователя]")
Send ($Login)
Send ("{TAB}")
Send ($Password)
Send ("{ENTER}")
WinWaitActive ("[TITLE:QUIK: окно сообщений]")
WinClose ("[TITLE:QUIK: окно сообщений]")
EndFunc
Func load_portfolio()
WinActivate("[CLASS:InfoClass]")
Sleep(10000)
Send("^{F10}")
WinWaitActive("[TITLE: Загрузка описаний портфелей из файла]")
Sleep(10000)
Send(«C:\QPILE scripts\backup.qpl»)
Send ("{ENTER}")
WinWaitActive("[TITLE: Работа с портфелями]")
Sleep(1000)
MouseClick(«left», 730, 230)
WinWaitActive("[TITLE:QUIK: окно сообщений]")
WinClose("[TITLE:QUIK: окно сообщений]")
WinClose("[TITLE: Работа с портфелями]")
EndFunc
Спасибо, добрый человек!
Мучает вопрос: можно-ли с помощью AutoIt менять текущий выбранный инструмент в таблице «Текущие торги»?