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


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


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

Теги:


Спасибо:




14 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 15.03.2014
Ответить


vk37 Перейти


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

vk37

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


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

Автор топика
Спасибо:

vk37

Фотография
Курсы
Дата: 17.03.2014
Ответить


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

vk37

Фотография
Курсы
Дата: 17.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

Фотография
Курсы
Дата: 02.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 923KB (0)
Автор топика
Спасибо:

vk37

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


Михаил Сухов Перейти
vk37 Перейти

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


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


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

Автор топика
Спасибо:

vk37

Фотография
Курсы
Дата: 03.07.2014
Ответить


В продолжение этой темы. Версия API 4.2.3.20. При получении большого количества сделок получаю ошибку "Connection Timeout Error":
Код
2014-07-03 01:13:53,922 [33] INFO  - 17:13:51.000 | IQFeedTrader    | Получение тиков +CL#@IQ с 19.12.2013 0:00:00 по 02.07.2014 0:00:00.
2014-07-03 01:13:53,922 [33] INFO  - 01:13:52.411 | IQFeedWrapper   | Request: HTT,+CL#,20131219 000000,20140702 000000,,000000,235959,1,#70767497#
2014-07-03 01:13:53,922 [33] INFO  - 01:13:52.411 | IQFeedTrader    | Инструмент +CL#@IQ зарегистрирован на получение рыночных данных для Trades с 12/19/2013 00:00:00 по 07/02/2014 00:00:00.
2014-07-03 01:17:08,699 [31] ERROR - 01:17:08.387 | IQFeedTrader    | System.InvalidOperationException: Connection Timeout Error.
2014-07-03 01:17:08,700 [31] INFO  - 01:17:08.387 | IQFeedTrader    | Получение тиков +DJ#@IQ с 19.12.2013 0:00:00 по 02.07.2014 0:00:00.
2014-07-03 01:17:08,700 [31] INFO  - 01:17:08.681 | IQFeedWrapper   | Request: HTT,+DJ#,20131219 000000,20140702 000000,,000000,235959,1,#70767502#
2014-07-03 01:17:08,700 [31] INFO  - 01:17:08.681 | IQFeedTrader    | Инструмент +DJ#@IQ зарегистрирован на получение рыночных данных для Trades с 12/19/2013 00:00:00 по 07/02/2014 00:00:00.
В случае этой ошибки метод возвращает isSuccess == true и сделки от куфид сервера приходят не полностью. Есть вариант как увеличить таймаут?
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 03.07.2014
Ответить


vk37 Перейти
В случае этой ошибки метод возвращает isSuccess == true


Надо Debug лог.
Спасибо:

vk37

Фотография
Курсы
Дата: 04.07.2014
Ответить


Михаил Сухов Перейти
vk37 Перейти
В случае этой ошибки метод возвращает isSuccess == true


Надо Debug лог.

Ошибка с таймаутом возникает не всегда. Дебаг лог будет просто огромным и может занять весь HDD.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 04.07.2014
Ответить


vk37 Перейти
Дебаг лог будет просто огромным и может занять весь HDD.


Значит надо как-то писать лог эвристически. В любом случе без дебаг лога помочь невозможно.
Спасибо:


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

loading
clippy