Блог им. 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


 

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

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

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

avatar

Читайте на SMART-LAB:
Фото
GBP/USD: Джентльменское пари — устоит ли последняя линия обороны?
«Старый джентльмен» вновь демонстрирует свой непростой нрав. После неудачной попытки закрепиться выше сопротивления 1.3460, британец развернулся и...
ЭсЭфАй остался без (Евро)плана
Инвестхолдинг отчитался по МСФО за 2025 год   ЭсЭфАй (SFIN)   ➡️ Инфо и показатели   Результаты — чистый процентный доход: ₽2,6...
Эфир АВО с участием ПАО «АПРИ»
Эфир АВО с участием ПАО «АПРИ» Состоялся эфир Ассоциации инвесторов «АВО» , в рамках которого Илья Винокуров, член Совета...
Фото
Какую акцию УК Первая в феврале покупала на миллиарды рублей - ищем вместе с Вами
Продолжаю делать серию ежемесячных постов с отслеживанием покупок/продаж профессиональными управляющими. Особенно теми, кто управляет МИЛЛИАРДАМИ...

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

....все тэги



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