Germany | Finland | Saint Petersburg | Drive

Запуск quik, авторизация, включение экспорта и т.д. с AmiSharp

Опубликовано в AmiSharp

Как в случае использования AmiSharp автоматически запустить терминал QUIK, авторизоваться, включить DDE экспорт, проверить наличие связи и остальное?

 

В качестве примера - фрагмент реального скрипта. В нем используется некоторое количество функций, которые здесь не приведены. Названия этих функций говорят сами за себя, не составит труда их написать. 

procedure StartDDE(path)
{
        mutant.SendKeysByClass(path + "info.exe","^~S^~L","InfoClass");
}


// Подготовка к работе
function Initialize()
{ local Can_Start;
// Нормализуем каталог QUIK - удаляем info.exe, если есть и добавляем конечный слеш
if (StrToLower(StrRight(QUIK_Path,8)) == "info.exe")
     QUIK_Path = StrLeft(QUIK_Path,StrLen(QUIK_Path)-8);
if (StrRight(QUIK_Path,1) != "\\")
     QUIK_Path += "\\";
// Запускаем Quik. Запускаем его только один раз
Can_Start = mutant.IsProcessStarted(QUIK_Path + "info.exe") == "1";
if (!Can_Start AND StaticVarGetText("AttemtToStartQUIK") != "Yes")
{ StaticVarSetText("AttemtToStartQUIK","Yes");
   write_log("Запуск терминала QUIK");
   if (mutant.StartProcess(QUIK_Path + "info.exe",QUIK_Path) != "1")
         error(mutant.GetErrorName());
}
// Идентифицируемся, если известны пароль и логин
if (QUIK_Login != "" AND QUIK_Password != "" AND mutant.IsWindowExists(QUIK_Path + "info.exe","Идентификация пользователя") == "1")
{ write_log("Идентификация QUIK");
  mutant.SendKeysByTitle(QUIK_Path + "info.exe", QUIK_Login+"{TAB}"+QUIK_Password+"{ENTER}", "Идентификация пользователя");
}
// Проверка связи Trans2Quik.dll и квика
if (Can_Start)
   if (mutant.QuikIsDLLConnected() == "0")
   { write_log("Подключаем Trans2Quik");
      if (mutant.QuikConnect(QUIK_Path) == "0")
      { error(mutant.GetErrorName());
        Can_Start = False;
      }
   }
// Проверка связи с сервером
if (Can_Start AND mutant.QuikIsConnected() == "0")
{ error("Нет соединения с брокером");
  Can_Start = False;
}
// Загружаем таблицы, экпортируемые по DDE
if (Can_Start)
   if (mutant.IsTableExists(TTP_Table) == "0")
   { error("Отсутствует экспорт таблицы текущих параметров " + TTP_Table+ " по DDE");
     write_log("Включаем трансляцию DDE");
     StartDDE(QUIK_Path);
     Can_Start = False;
   }
 return Can_Start;
}
Комментарии   
# magni2de 02.03.2013 15:00
А что значит строка:

Can_Start = mutant.IsProces sStarted(QUIK_F ile) == "1";

Я имею в виду == "1"
Ответить | Ответить с цитатой | Цитировать
# admin 02.03.2013 15:34
Олег, тоже самое что и

Ответить | Ответить с цитатой | Цитировать
# magni2de 03.03.2013 22:31
Не могу тогда понять, почему у меня вот эта строчка всегда возвращает 0 или False:

Can_Start = mutant.IsProces sStarted(QUIK_F ile) == "1";

Думал сначала, что из-за == "1", но потом проверил и просто:

mutant.IsProces sStarted(QUIK_F ile);

тоже всегда возвращается "0"


При этом:
QUIK_Path = "C:\\QUIK-Junior";
QUIK_Path += "\\";
QUIK_File = QUIK_Path + "info.exe";

и при этом строчка запуска QUIK работает нормально, QUIK запускается:
mutant.StartProcess(QUIK_File,QUIK_Path);

Вообще не знаю, может лучше перенести мой вопрос отсюда в форум?
Ответить | Ответить с цитатой | Цитировать
# admin 03.03.2013 22:55
Олег, попробуйте сделать такой скрипт

m = createstaticobject("amisharp.mutant")
_trace(m.isprocessstarted("c:\\windows\\notepad.exe");

и посмотрите, что он выводит в окно трассировки при запущенном и незапущенном нотепаде.
Ответить | Ответить с цитатой | Цитировать
# magni2de 03.03.2013 22:59
Это странно, но всегда нули.
Ответить | Ответить с цитатой | Цитировать
# admin 04.03.2013 00:09
Олег, проверьте, что в Вашем скрипте создаётся объект амишарп прежде, чем идет обращение к его методу.
Ответить | Ответить с цитатой | Цитировать
# magni2de 04.03.2013 00:51
А как это сделать?

Я столкнулся с тем, что все методы AmiSharp работают, например отправляются заявки и считываются значения из таблиц, а два метода нет: IsProcessStarte d и IsWindowExists
Ответить | Ответить с цитатой | Цитировать
# admin 04.03.2013 01:06
Олег, пришлите мне тест МИНИМАЛЬНОГО размера, который бы смог проиллюстрирова ть Вашу проблему. Типа такого:

mutant=create...
_trace(...)
_trace(...)
Ответить | Ответить с цитатой | Цитировать
# magni2de 04.03.2013 01:24
Проверил только что метод IsProcessStarte d на реальной винде, а не установленной под виртуальной машиной - все работает хорошо.

Видимо проблема с путями к файлам. Возможно, что из-за того, что на виртуальной машине они реально лежат не на диске С... там вообще вся файловая система эмулируется и находится внутри одного файла, которым управляет Parallels.

Можно как-то в отладчике или еще как (у меня стоит Microsoft Studio) посмотреть как выглядят пути у запущенных в системе процессов? Я так понимаю, что если я укажу чуть по-другому путь к процессу (exe-файлу), то он совпадет с тем, что запущен и метод IsProcessStarte d вернет правильное значение.
Ответить | Ответить с цитатой | Цитировать
# admin 04.03.2013 09:18
Диспетчер задач - процессы - вид - командная строка (путь к образу)
Ответить | Ответить с цитатой | Цитировать
# magni2de 04.03.2013 09:39
У меня в диспетчере задач, в процессах, в меню "Вид" нет "командная строка (путь к образу)". Посмотрел и в WinXP и в Win8.
Ответить | Ответить с цитатой | Цитировать
# admin 09.12.2013 14:01
Я посмотрел на проблему и подшаманил. Если готовы пробовать - напишите.
Ответить | Ответить с цитатой | Цитировать
# Timofey 30.03.2013 20:28
Вы знаете, я столкнулся с той же самой проблемой... У меня машины запущены под VMWare. Может быть вы уже смогли решить данную проблему. Если да, то прошу поделиться опытом.
Ответить | Ответить с цитатой | Цитировать
# Timofey 30.03.2013 20:43
Может быть это связано с работой VM и они используют какие-то другие внутренние процессы....
Ответить | Ответить с цитатой | Цитировать
# magni2de 31.03.2013 19:58
Проблему эту не решил. Пока занимаюсь реализацией самого алгоритма торговли.
Ответить | Ответить с цитатой | Цитировать
# AlexLan 12.04.2013 09:22
Михаил, добрый день.
Подскажите пожалуйста.
Как из Amibrokera выключить quik?
И Можно ли из программы запустить выключение Amibrokera? Может быть запустить какой либо Bat файл?
С уважением, Александр.
Ответить | Ответить с цитатой | Цитировать
# admin 12.04.2013 12:21
Александр, вот текст программы на autoit, закрывающий все открытые терминалы quik:

While 1 = WinClose("[CLAS S:InfoClass]", "")
WEnd

Функция WinСlose(или аналогичная, закрывающая окно по его классу) найдется в любом нормальном языке

Можно то же самое сделать через sendKeys (в том числе из амишарпа - послав {Alt}СК русские, но это менее надёжно.
Ответить | Ответить с цитатой | Цитировать
# AlexLan 12.04.2013 12:55
Михаил, спасибо.
Замечательный пример.
А как это будет без использования Autoit?
Если конечно Вам не трудно написать.
С уважением, Александр.
Ответить | Ответить с цитатой | Цитировать
# admin 12.04.2013 13:25
Например, амишарпом этом можно сделать так:

amisharp.SendKeysByClass("c:\\quik\\info.exe","@{F4}","InfoClass")

Проверьте.....
Ответить | Ответить с цитатой | Цитировать
# AlexLan 04.05.2013 13:23
Михаил, добрый день.
Не получилось закрыть quik такой командой.
Вышел из положения виндовыми средствами.
В планировщике задач в 00:05 запускаю программу закрытие всех программ. В 00:10 запускаю команду выключить комп. Все работает как часы))))
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий


Майнинг в браузере