← Zurück

Получение времени сервера для QUIK.

У меня есть такое предложение.

А почему бы не получать время сервера из Статусбара QIUK?

Если кому интерсно, у меня это уже сделанно. И работает безотказно.

C# + WinApi

War dieses Thema hilfreich?

Thema teilen

Kommentare (14)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

Выкладывай. А какую проблему это решит?

HaMMeR
HaMMeR Autor

using System; using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; using ManagedWinapi.Windows;

internal static class ServerTime { //Экземпляр Статусбара private static readonly SystemWindow StatusBar;

   static ServerTime()
    {
        //Поличаем список всех процессов
        Process[] processlist = Process.GetProcesses();

       //Находим процесс QUIK
        Process infoExe = processlist.Single(process =>

(process.ProcessName == "info"));

       //Получаем обработчик окна QUIK
        var swnd = new SystemWindow(infoExe.MainWindowHandle); //

msctls_statusbar32

       //Находим Статусбар
        StatusBar = swnd.AllChildWindows.Single(window =>

(window.ClassName.Equals("msctls_statusbar32"))); }

   public static DateTime GetServerTime()
    {
        //Начальная инициализация времени сервера
        //Берем текушее время
        DateTime serverTime = DateTime.Now;
        DateTime wndSrvTime = serverTime;

       //Текст статусбара
        String srvTimeString = StatusBar.Content.LongDescription;
        try
        {
            String dateTime = "";

           //Успользуем регулярное выражение, чтобы найти время
            var regexObj = new Regex(@"\d\d:\d\d:\d\d");
            Match matchResult = regexObj.Match(srvTimeString);
            if (matchResult.Success)
            {
                dateTime = matchResult.Value;
            }

           //Успользуем регулярное выражение, чтобы найти дату
            regexObj = new Regex(@"\d\d[/.]\d\d[/.]\d\d\d\d");
            matchResult = regexObj.Match(srvTimeString);
            if (matchResult.Success)
            {
                dateTime = matchResult.Value + " " + dateTime;
            }
            wndSrvTime = DateTime.Parse(dateTime);
        }
        catch (ArgumentException)
        {
            // Syntax error in the regular expression
        }
        catch(FormatException)
        {
            //
        }

       return wndSrvTime;
    }
}
HaMMeR
HaMMeR Autor

Не надо будет волноваться о синхрнизации премени компютера с временем на бирже.

А еще можно получить премя используя портфель и QPILE.

takanaev
takanaev

Так вроде QPILE-скрипт запускается каждые n секунд, думаю, не вариант.

HaMMeR
HaMMeR Autor

Я согласен с вами и нашел алтернативный вариант. Который у меня безотказно работает.

ddd888
ddd888

Интересно, а какую еще информацию можно "выудить" таким образом из квика?

HaMMeR
HaMMeR Autor

А что именно вам надо?

ddd888
ddd888

Если б знать, что возможно, то тогда и спрос соответствующий появился бы. :) Да вопросов возникает куча, на самом деле. Хотя бы, например, какие таблицы открыты или насколько корректно происходит обновление информации - нет ли запаздываний в приеме данных. Каков статус соединения с брокером и т.д.

HaMMeR
HaMMeR Autor

Можно например получить

  • какие таблицы открыты
  • статус соединения с брокером

Да и много чего. Можно с примером поиграть. В режиме Debug постаь точку остановки и посмотри swnd.AllChildWindows, думаю найдеш мнсого чего интересного.

ddd888
ddd888

Супер! На досуге надо будет обязательно "поковыряться". :)

takanaev
takanaev

Сейчас если открыта закладка, в которой нет таблицы экспорта (они в другой закладке), то возникает ошибка. Очень полезно будет создать механизм открытия той закладки, которая необходима типа new QuikTrader(quikPath, zakladkaName, ddeServer, dllName);

HaMMeR
HaMMeR Autor

Какая закладка? Вы имейте ввиду закладка в QIUK-е , они в принцыпе фальшивые и не имеет значение какя закладка выбрана. Какую именно ошибка у вас вазникает?

E G
E G

В вашем примере используется директива using ManagedWinapi.Windows

Я что-то не могу найти библиотек такую, не подскажите где ее можно скачать?

E G
E G

Все нашел, спасибо.