Добрый день. Я создаю стоп-завку StopLimit типа. В методе, который подписан к событию Quik.StopOrdersChanged, я проверяю условие Order.State == OrderStates.Done. Если это условие выполнилось, то я записываю ордер в SQL. При формировании данных для SQL я пробегаю циклом foreach по словарю Order.StopCondition.Parameters. Но во время этого пробега, появляется ошибка «Collection was modified; enumeration operation may not execute.» Правильно ли я понимаю, что после того, как заявка стала Done, в ней ничего уже не должно изменяться?
Помогите, пожалуйста, разобраться это баг или фича? Возможно я что-то понимаю и делаю не так?
Код формирования стоп-заявки
Order _newOrder = new Order
{
Type = OrderTypes.Conditional,
Volume = __volume,
Price = Price,
Security = paperSecurity,
Direction = __direct,
ExpiryDate = DateTime.MaxValue,
Portfolio = PortfolioStock,
StopCondition = new QuikStopCondition
{
Type = QuikStopConditionTypes.StopLimit,
StopPrice = PriceHSignal,
ActiveTime = null
}
};
Код записи заявки в SQL
private static void writeOrdersToSql(IEnumerable<Order> __orders)
{
using (SqlConnection _sqlConn = new SqlConnection(SqlQuik.SqlConnStr))
{
_sqlConn.Open();
foreach (Order _order in __orders)
if (_order.State == OrderStates.Done)
{
// Узнаем условие стоп заявки, если это стоп заявка
String _stopCondition = String.Empty;
if (_order.StopCondition != null)
foreach (var _param in _order.StopCondition.Parameters)
if (_param.Value != null)
_stopCondition += _param.Key + " : " + _param.Value.ToString() + "; ";
if (_stopCondition == String.Empty)
_stopCondition = "NULL";
else
_stopCondition = "'" + _stopCondition + "'";
// Формирование строки SQL и запись в SQL
// ..................................
}
}
}
Message
"Collection was modified; enumeration operation may not execute."
StackTrace
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at FirmName.ProgrammName.SqlQuik.writeOrdersToSql(IEnumerable`1 __orders) in D:\C\FirmName\FirmNameSolution\ProgrammName\SqlQuik\SqlQuik.cs:line 376
at FirmName.ProgrammName.SqlQuik.<>c__DisplayClass8.<quik_OrdersChanged>b__7() in D:\C\FirmName\FirmNameSolution\ProgrammName\SqlQuik\SqlQuik.cs:line 335
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
Комментарии (9)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Есть несколько таблиц, которые выводятся по DDE. И по которым можно понять что заявка перешла в состояние Done. Меняем на Done по той, по которой данные пришли первой. Затем по другой, к примеру, узнаём о времени исполнения - заполняем его.
Так что всё возможно с квиком.
Тогда надо исправить документацию. В ней написано следующее: «Done - заявка более не активна на бирже, и по ней не может прийти ни одно изменение.»
Касательно моего вопроса. А что может измениться в Order.StopCondition.Parameters? Там же вроде данные, которые не меняются после создания заявки.
Поправите доку? Если нет доступа на codeplex - дам.
По вашему вопросу - проще под дебагером посмотреть что конкретно там меняется.
Доступа на кодплекс нет.
Насчет дебагера, не совсем представляю как ловить изменение Order.StopCondition.Parameters, не имея сорсов стокшарпа. Со своей стороны кода я этого не словлю.
Какой ник на codeplex? Если нет - надо зарегаться и написать мне ник
Отследить по order.Changed Сорсы S# в данном случае никак не помогут :)
Ник goricap
добавил
Сенкс.
Сори, а как редактировать документацию?
Открыть в любом текстовом редакторе aml файл в папке Topics. Более правильно и структурно - через программу SandCastle