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


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


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

Фотография
Дата: 17.02.2012
Ответить


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

Так что всё возможно с квиком.
Спасибо:

Maxim

Фотография
Дата: 17.02.2012
Ответить


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


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

Alexander

Фотография
Дата: 17.02.2012
Ответить


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


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


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

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

Maxim

Фотография
Дата: 17.02.2012
Ответить


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

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

Alexander

Фотография
Дата: 17.02.2012
Ответить


Maxim Перейти
Доступа на кодплекс нет.

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


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

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

Maxim

Фотография
Дата: 17.02.2012
Ответить


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

Alexander

Фотография
Дата: 17.02.2012
Ответить


Maxim Перейти
Ник goricap


добавил
Спасибо:

Maxim

Фотография
Дата: 17.02.2012
Ответить


Сенкс.

Сори, а как редактировать документацию?
Автор топика
Спасибо:

Alexander

Фотография
Дата: 17.02.2012
Ответить


Maxim Перейти
Сенкс.

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


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


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

loading
clippy