← Back

Изменение Order.StopCondition.Parameters в стоп-заявке, после Order.State == Done

Добрый день. Я создаю стоп-завку 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()

Comments (9)

Login or Create account, Log in or register to leave a comment

Alexander
Alexander

Есть несколько таблиц, которые выводятся по DDE. И по которым можно понять что заявка перешла в состояние Done. Меняем на Done по той, по которой данные пришли первой. Затем по другой, к примеру, узнаём о времени исполнения - заполняем его.

Так что всё возможно с квиком.

Maxim
Maxim Author

Тогда надо исправить документацию. В ней написано следующее: «Done - заявка более не активна на бирже, и по ней не может прийти ни одно изменение.»

Касательно моего вопроса. А что может измениться в Order.StopCondition.Parameters? Там же вроде данные, которые не меняются после создания заявки.

Alexander
Alexander

Maxim: Тогда надо исправить документацию. В ней написано следующее: «Done - заявка более не активна на бирже, и по ней не может прийти ни одно изменение.»

Касательно моего вопроса. А что может измениться в Order.StopCondition.Parameters? Там же вроде данные, которые не меняются после создания заявки.

Поправите доку? Если нет доступа на codeplex - дам.

По вашему вопросу - проще под дебагером посмотреть что конкретно там меняется.

Maxim
Maxim Author

Доступа на кодплекс нет.

Насчет дебагера, не совсем представляю как ловить изменение Order.StopCondition.Parameters, не имея сорсов стокшарпа. Со своей стороны кода я этого не словлю.

Alexander
Alexander

Maxim: Доступа на кодплекс нет.

Насчет дебагера, не совсем представляю как ловить изменение Order.StopCondition.Parameters, не имея сорсов стокшарпа. Со своей стороны кода я этого не словлю.

Какой ник на codeplex? Если нет - надо зарегаться и написать мне ник

Отследить по order.Changed Сорсы S# в данном случае никак не помогут :)

Maxim
Maxim Author

Ник goricap

Alexander
Alexander

Maxim: Ник goricap

добавил

Maxim
Maxim Author

Сенкс.

Сори, а как редактировать документацию?

Alexander
Alexander

Maxim: Сенкс.

Сори, а как редактировать документацию?

Открыть в любом текстовом редакторе aml файл в папке Topics. Более правильно и структурно - через программу SandCastle