API 4.2.2.18. Получение исторических сделок. Как не пропустить ошибку

API 4.2.2.18. Получение исторических сделок. Как не пропустить ошибку
Atom
15.03.2014
vk37


Получаю исторические сделки в цикле для каждого инструмента из списка:
Код
trades = Connector.GetTrades(security, from, to);
Процесс длится несколько часов. Если рвется связь, то исключения при вызове GetTrades не происходит. Пока отслеживаю удачно или нет выполнен запрос по IQFeedTrader.DataErrorCount. Может все-таки не проглатывать исключение, а давать его?

Теги:


Спасибо:


1 2  >
Mikhail Sukhov

Фотография
Дата: 15.03.2014
Ответить


vk37


GetTrades - это всего лишь простая обертка над нормальными запросами. Ошибки не проглатываются. Есть специальные методы их отслеживания.
Спасибо:

vk37

Фотография
Дата: 15.03.2014
Ответить


Михаил Сухов
Ошибки не проглатываются. Есть специальные методы их отслеживания.
Через событие connector.ProcessDataError?

Спасибо:

vk37

Фотография
Дата: 18.03.2014
Ответить


В версии 4.2.2.20 в случае если в процессе вызова Connector.GetTrades(security, from, to) происходит потеря подключения к серверу IQ, то метод GetTrades, похоже, зависает в каком-то вечном цикле, никаких сообщений об ошибках не выдает.
Спасибо:

vk37

Фотография
Дата: 18.03.2014
Ответить


Даже если прервать этот вечный цикл как-то так:
Код
                        var task = Task.Factory.StartNew(() =>
                        {
                            trades = Connector.GetTrades(security, from, to);
                        });

                        if (!task.Wait(TimeSpan.FromMinutes(1)))
                        {
                            //Error
                        }
то последующие запросы после восстановления подключения уже не выполняются.
Спасибо:

vk37

Фотография
Дата: 27.03.2014
Ответить


Тестирую версию 4.2.2.22.

Если подключение к серверу IQ разрывается перед вызовом Connector.GetTrades, то ошибку можно поймать в обработчике события ProcessDataError.

Если подключение к серверу IQ разрывается в процессе вызова Connector.GetTrades, то исполнение кода останавливается на этом вызове (зависает) и IQTrader перестает работать даже если прервать вызов GetTrades например так:
Код
var task = Task.Factory.StartNew(() =>
{
    trades = Connector.GetTrades(security, from, to);
});
 
if (!task.Wait(TimeSpan.FromMinutes(1)))
{
    //Error
}
Спасибо:

Mikhail Sukhov

Фотография
Дата: 28.03.2014
Ответить


vk37

Если подключение к серверу IQ разрывается в процессе вызова Connector.GetTrades, то исполнение кода останавливается на этом вызове (зависает)


Я тестировал этот момент. Идет разрыв получения данных и метод сразу же возвращает управление.
Спасибо:

vk37

Фотография
Дата: 30.03.2014
Ответить


Цитата:
Я тестировал этот момент. Идет разрыв получения данных и метод сразу же возвращает управление.

Тестирую на версии 4.2.2.24. По-прежнему, если подключение к серверу IQ разрывается в процессе вызова Connector.GetTrades, то исполнение кода останавливается на этом вызове (зависает) и IQTrader перестает работать.
Методика тестирования:
1. Ставлю брейкпоинт на вызов метода GetTrades
2. Останавливаю исполнение кода на этом брейкпоинте.
3. F5 для продолжения исполнения, при этом сразу после F5 отключаю питание у роутера, через который комп подключен к интернету.
4. Убеждаюсь, что исполнение кода дальше не идет.
5. Включаю питание у роутера, убеждаюсь, что интернет заработал.
6. Убеждаюсь, что в течении последующих нескольких минут исполнение кода не идет.
7. Убеждаюсь, что последующие вызовы GetTrades также не работают.
Спасибо:

vk37

Фотография
Дата: 30.03.2014
Ответить


На версии 4.2.2.22 сделал более 100000 запросов за 3 суток. Где-то 3 раза приходилось перезапускать закачку данных из-за таких ошибок.
Спасибо:

vk37

Фотография
Дата: 03.04.2014
Ответить


Версия 4.2.2.25. Код для тестирования.
Код
namespace IQFeedGetCanglesDemo
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;
    using StockSharp.BusinessEntities;
    using StockSharp.IQFeed;
    using StockSharp.Logging;
    using StockSharp.Messages;

    class Program
    {
        static void Main(string[] args)
        {
            var connector = new IQFeedTrader();

            var logManager = new LogManager
            {
                Application = {LogLevel = LogLevels.Debug}
            };
            logManager.Listeners.Add(new FileLogListener("Log.txt"));
            logManager.Listeners.Add(new ConsoleLogListener());
            logManager.Sources.Add(connector);

            var foundSecurities = new List<Security>();

            connector.NewSecurities += securities =>
            {
                foreach (var security in securities)
                {
                    connector.AddInfoLog(() => string.Format("{0}", security));
                    foundSecurities.Add(security);
                }
            };

            if (WaitHelper.Failed(connector.Connect, TimeSpan.FromSeconds(30), () => connector.ConnectionState == ConnectionStates.Connected))
                throw new TimeoutException("Подключение не выполнено в заданный отрезок времени");

            if (WaitHelper.Failed(connector.StartExport, TimeSpan.FromSeconds(30), () => connector.ExportState == ConnectionStates.Connected))
                throw new TimeoutException("Запуск экспорта не выполнен в заданный отрезок времени");
            
            var criteria = new Security()
            {
                Code = "@ES#",
                Type = SecurityTypes.Future,
            };

            connector.LookupSecurities(criteria);

            if (WaitHelper.Failed(TimeSpan.FromSeconds(30), () => foundSecurities.Count == 1))
                connector.AddErrorLog(() => "Инструмент не найден в заданный отрезок времени");

            var trades = connector.GetTrades(foundSecurities.First(), DateTime.Today.AddDays(-7), DateTime.Today);

            if (WaitHelper.Failed(connector.StopExport, TimeSpan.FromSeconds(10), () => connector.ExportState == ConnectionStates.Disconnected))
                connector.AddErrorLog(() => "Остановка экспорта не выполнена в заданный отрезок времени");

            if (WaitHelper.Failed(connector.Disconnect, TimeSpan.FromSeconds(10), () => connector.ConnectionState == ConnectionStates.Disconnected))
                connector.AddErrorLog(() => "Отключение не выполнено в заданный отрезок времени");
        }

        public static class WaitHelper
        {
            public static bool Failed(Action action, TimeSpan time, Func<bool> condition)
            {
                var task = Task.Factory.StartNew(() =>
                {
                    if (action != null)
                        action.Invoke();

                    while (!condition.Invoke())
                        Thread.Sleep(50);

                    Thread.Sleep(500);
                });

                return !task.Wait(time);
            }

            public static bool Failed(TimeSpan time, Func<bool> condition)
            {
                return Failed(null, time, condition);
            }
        }
    }
}

1. Ставлю брейкпоинт на вызов метода GetTrades
2. Останавливаю исполнение кода на этом брейкпоинте.
3. F5 для продолжения исполнения, при этом сразу после F5 отключаю питание у роутера, через который комп подключен к интернету.

Полный лог приложен к сообщению. Момент разрыва и попытки восставовить подключение:
Log.zip 923 KB (357)
Спасибо:

vk37

Фотография
Дата: 09.06.2014
Ответить


Михаил Сухов
vk37

Если подключение к серверу IQ разрывается в процессе вызова Connector.GetTrades, то исполнение кода останавливается на этом вызове (зависает)


Я тестировал этот момент. Идет разрыв получения данных и метод сразу же возвращает управление.


Протестировал снова на версии S# 4.2.3.8 и IQFeed Client версии 5.1.0.5. Версии последние на текущий момент. Ситуация не изменилась: если идет разрыв соединения с куфид сервером в процессе вызова Connector.GetTrades, то исполнение кода останавливается на вызове Connector.GetTrades и дальше не идет (зависает). У меня робот качает историю по сделкам с куфид сервера: ежедневно дергает этот метод по несколько десятков тысяч раз. За сутки такая ошибка пару раз встречается даже если качать не с домашнего инета, а через сервер в дата центре. Хотелось бы получить ответ будут ли по исправлению этой ошибки предприниматься какие-либо действия.

Спасибо:
1 2  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy