В версии 4.2.2.20 в случае если в процессе вызова Connector.GetTrades(security, from, to) происходит потеря подключения к серверу IQ, то метод GetTrades, похоже, зависает в каком-то вечном цикле, никаких сообщений об ошибках не выдает.
Даже если прервать этот вечный цикл как-то так:```csharp
var task = Task.Factory.StartNew(() =>
{
trades = Connector.GetTrades(security, from, to);
});
if (!task.Wait(TimeSpan.FromMinutes(1)))
{
//Error
}
Если подключение к серверу IQ разрывается перед вызовом Connector.GetTrades, то ошибку можно поймать в обработчике события ProcessDataError.
Если подключение к серверу IQ разрывается в процессе вызова Connector.GetTrades, то исполнение кода останавливается на этом вызове (зависает) и IQTrader перестает работать даже если прервать вызов GetTrades например так:```csharp
var task = Task.Factory.StartNew(() =>
{
trades = Connector.GetTrades(security, from, to);
});
if (!task.Wait(TimeSpan.FromMinutes(1)))
{
//Error
}
vk37:
Если подключение к серверу IQ разрывается в процессе вызова Connector.GetTrades, то исполнение кода останавливается на этом вызове (зависает)
Я тестировал этот момент. Идет разрыв получения данных и метод сразу же возвращает управление.
Протестировал снова на версии S# 4.2.3.8 и IQFeed Client версии 5.1.0.5. Версии последние на текущий момент. Ситуация не изменилась: если идет разрыв соединения с куфид сервером в процессе вызова Connector.GetTrades, то исполнение кода останавливается на вызове Connector.GetTrades и дальше не идет (зависает). У меня робот качает историю по сделкам с куфид сервера: ежедневно дергает этот метод по несколько десятков тысяч раз. За сутки такая ошибка пару раз встречается даже если качать не с домашнего инета, а через сервер в дата центре. Хотелось бы получить ответ будут ли по исправлению этой ошибки предприниматься какие-либо действия.
Я тестировал этот момент. Идет разрыв получения данных и метод сразу же возвращает управление.
Тестирую на версии 4.2.2.24. По-прежнему, если подключение к серверу IQ разрывается в процессе вызова Connector.GetTrades, то исполнение кода останавливается на этом вызове (зависает) и IQTrader перестает работать.
Методика тестирования:
Ставлю брейкпоинт на вызов метода GetTrades
Останавливаю исполнение кода на этом брейкпоинте.
F5 для продолжения исполнения, при этом сразу после F5 отключаю питание у роутера, через который комп подключен к интернету.
Убеждаюсь, что исполнение кода дальше не идет.
Включаю питание у роутера, убеждаюсь, что интернет заработал.
Убеждаюсь, что в течении последующих нескольких минут исполнение кода не идет.
Убеждаюсь, что последующие вызовы GetTrades также не работают.
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);
}
}
}
}
Ставлю брейкпоинт на вызов метода GetTrades
Останавливаю исполнение кода на этом брейкпоинте.
F5 для продолжения исполнения, при этом сразу после F5 отключаю питание у роутера, через который комп подключен к интернету.
Полный лог приложен к сообщению. Момент разрыва и попытки восставовить подключение: :::spoiler
В продолжение этой темы. Версия 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 и сделки от куфид сервера приходят не полностью. Есть вариант как увеличить таймаут?
Комментарии (14)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
GetTrades - это всего лишь простая обертка над нормальными запросами. Ошибки не проглатываются. Есть специальные методы их отслеживания.
В версии 4.2.2.20 в случае если в процессе вызова Connector.GetTrades(security, from, to) происходит потеря подключения к серверу IQ, то метод GetTrades, похоже, зависает в каком-то вечном цикле, никаких сообщений об ошибках не выдает.
Даже если прервать этот вечный цикл как-то так:```csharp var task = Task.Factory.StartNew(() => { trades = Connector.GetTrades(security, from, to); });
Тестирую версию 4.2.2.22.
Если подключение к серверу IQ разрывается перед вызовом Connector.GetTrades, то ошибку можно поймать в обработчике события ProcessDataError.
Если подключение к серверу IQ разрывается в процессе вызова Connector.GetTrades, то исполнение кода останавливается на этом вызове (зависает) и IQTrader перестает работать даже если прервать вызов GetTrades например так:```csharp var task = Task.Factory.StartNew(() => { trades = Connector.GetTrades(security, from, to); });
if (!task.Wait(TimeSpan.FromMinutes(1))) { //Error }
Я тестировал этот момент. Идет разрыв получения данных и метод сразу же возвращает управление.
Протестировал снова на версии S# 4.2.3.8 и IQFeed Client версии 5.1.0.5. Версии последние на текущий момент. Ситуация не изменилась: если идет разрыв соединения с куфид сервером в процессе вызова Connector.GetTrades, то исполнение кода останавливается на вызове Connector.GetTrades и дальше не идет (зависает). У меня робот качает историю по сделкам с куфид сервера: ежедневно дергает этот метод по несколько десятков тысяч раз. За сутки такая ошибка пару раз встречается даже если качать не с домашнего инета, а через сервер в дата центре. Хотелось бы получить ответ будут ли по исправлению этой ошибки предприниматься какие-либо действия.
На версии 4.2.2.22 сделал более 100000 запросов за 3 суток. Где-то 3 раза приходилось перезапускать закачку данных из-за таких ошибок.
Версия 4.2.2.25. Код для тестирования.
Полный лог приложен к сообщению. Момент разрыва и попытки восставовить подключение: :::spoiler
В продолжение этой темы. Версия API 4.2.3.20. При получении большого количества сделок получаю ошибку "Connection Timeout Error":
Надо Debug лог.
Значит надо как-то писать лог эвристически. В любом случе без дебаг лога помочь невозможно.