Блог им. zzssg

Автоматическое переподключение Квика. Скрипт AutoIt


Написал для себя, выкладываю тут — может кому пригодится.
Скрипт имеет громкое название — 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


 

★5
6 комментариев
sam063rus, это первое что и мне пришло на мой скромный ум…
+++
avatar
автомат в квике кстати глюкавый. бывает отваливается и усё…
avatar
Maaxee, вот. Мой скрипт предназначен как раз для таких случаев. Если квиковый автомат сам переустановит соединенеие — мой скрипт в ситуацию вмешиваться не будет.
sam063rus, всё вы верно говорите. Если квик сам переконнектился, то данный скрипт ничего не делает. Только вот квик не всегда может самостоятельно переустановить соединение.
У меня иногда при отрабатывании квикового реконнекта возникает ошибка «ключи не найдены». Лечится только рестартом квика.
Также, если торговый сервер становится недоступным на некоторое время (проюлемы у брокера или провайдера) то квиковый реконнект тут не справится с задачей.

Мой скрипт как раз и предназначен для выполнения переподключения когда встроенный реконнект не справляется и квик, не смотря на включенную опцию реконнекта, не может установить связь с торговым сервером.

Спасибо, добрый человек!
Мучает вопрос: можно-ли с помощью AutoIt менять текущий выбранный инструмент в таблице «Текущие торги»?

avatar

теги блога Сергей Иконников

....все тэги



UPDONW
Новый дизайн