Algorithmischer Handel für .NET und Python✦86+ Konnektoren · Börsen · Broker · Krypto✦S#.Designer · Backtest · optimieren · live gehen✦Eine Community von 31,458+ Tradern und Entwicklern✦Algorithmischer Handel für .NET und Python✦86+ Konnektoren · Börsen · Broker · Krypto✦S#.Designer · Backtest · optimieren · live gehen✦Eine Community von 31,458+ Tradern und Entwicklern✦
В версии 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 и сделки от куфид сервера приходят не полностью. Есть вариант как увеличить таймаут?
vk37:
Дебаг лог будет просто огромным и может занять весь HDD.
Значит надо как-то писать лог эвристически. В любом случе без дебаг лога помочь невозможно.
Wir verwenden Cookies, um die beste Erfahrung auf unserer Website zu gewährleisten. Durch die weitere Nutzung unserer Seite stimmen Sie der Verwendung von Cookies zu.
Kommentare (14)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
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 лог.
Значит надо как-то писать лог эвристически. В любом случе без дебаг лога помочь невозможно.