Добрый день. Я создаю стоп-завку 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()
Kommentare (9)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Есть несколько таблиц, которые выводятся по DDE. И по которым можно понять что заявка перешла в состояние Done. Меняем на Done по той, по которой данные пришли первой. Затем по другой, к примеру, узнаём о времени исполнения - заполняем его.
Так что всё возможно с квиком.
Тогда надо исправить документацию. В ней написано следующее: «Done - заявка более не активна на бирже, и по ней не может прийти ни одно изменение.»
Касательно моего вопроса. А что может измениться в Order.StopCondition.Parameters? Там же вроде данные, которые не меняются после создания заявки.
Поправите доку? Если нет доступа на codeplex - дам.
По вашему вопросу - проще под дебагером посмотреть что конкретно там меняется.
Доступа на кодплекс нет.
Насчет дебагера, не совсем представляю как ловить изменение Order.StopCondition.Parameters, не имея сорсов стокшарпа. Со своей стороны кода я этого не словлю.
Какой ник на codeplex? Если нет - надо зарегаться и написать мне ник
Отследить по order.Changed Сорсы S# в данном случае никак не помогут :)
Ник goricap
добавил
Сенкс.
Сори, а как редактировать документацию?
Открыть в любом текстовом редакторе aml файл в папке Topics. Более правильно и структурно - через программу SandCastle