← Назад

API 4.2.1.5 ошибки при сохранении стакана

Перед началом основной торговой сессии фортс такие были ошибки около 20 шт.

2013-12-24 09:46:52,688 [ 7] ERROR - Ошибка при сохранении стаканов
System.ArgumentException: An item with the same key has already been added.
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at StockSharp.Algo.TraderHelper.GetDelta(IEnumerable`1 from, IEnumerable`1 to)
   at StockSharp.Algo.TraderHelper.GetDelta(MarketDepth from, MarketDepth to)
   at #=q$U8A663fhd_0nxstRJ5STtHVdvBVtQukA7zl9AibzNGeEEvji2dJooZa8ayjIDhC.#=qSjYXVuN0ckTGw8mrYQriqA==(List`1 #=q2cQNsRhsImEgVXVksZBjSw==, IEnumerable`1 #=qlKCfxei94Vv3UzqvpNz3hA==, #=qPjD4BOv$5BKxe_ttNIce9KX$StN0NyiBwpObU6kch$BMgL6S9sfObFU3GqsEgX1e #=qTFfdcnxupMR9RCen$yyBAg==)
   at #=qvPdOKmEvEXpYUIeZNvfr_znIw80Z0XdYcnKCHvfSPW$53oUCutiMW2z6RXfDAe41ciQl8jAAT5WAqwWdQkoDGQ==.#=qyIZ0I1YeVbWE63bhnA1K1m2wMY4WufT7V_fi6zP$BEiUFK4ZG1$WOQya8xSiCOYZmeScHvX14dkmWXwkWW4x83yElb8cbD$Qj2VhO6A1Tg8=(IEnumerable`1 #=qeNRuCwPbA1MZUv6t_RCB1A==, #=qhGR8S6Wu_SWG1MG6nOa3ZCrPdX2mFvXg_NU1dSJhBRouCHpisXihlhUpXrrFBvL4 #=qNeuAjq1TWLi$Pw_QrW3tyQ==)
   at #=qMr7SOgVDO7e2LOOI0TIpOlcrRD__36oAVUZnLjrXy4f8WChvEhvBrmKrhHWHTTDM.#=qslrI4Dm2UMjXW3BBv90Pwg==(DateTime #=qOA7tKmye8FF6uiZjivgoew==, #=q_8rCYviG8F7vLRinZLvBtg==[] #=qCViIC5A30X4eCFdr$Hf6jw==, Boolean #=qoNs8QO9b8hjaaFLpfZViow==)
   at #=qMr7SOgVDO7e2LOOI0TIpOlcrRD__36oAVUZnLjrXy4f8WChvEhvBrmKrhHWHTTDM.Save(IEnumerable`1 #=q1V7P2EQ7pJv8vVj8c5ImrQ==)
   at AlgoTrading.Hydra.Model.SaveManager.SaveMarketDepths() in d:\Temp\AlgoTrading\Build Process Data\Export\SourceCode\Applications\AlgoTrading.Hydra\Model\SaveManager.cs:line 224
```Смартком х64 3.0.87

Комментарии (5)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Mikhail Sukhov
Mikhail Sukhov

Старая добрая ошибка смартком. Цена лучших квот равна. Надо такое фильтровать как в гидре перед сохранением.

vk37
vk37
vk37 Автор

Михаил Сухов: Старая добрая ошибка смартком. Цена лучших квот равна. Надо такое фильтровать как в гидре перед сохранением.Посмотрел: стоит у меня такая проверка )

        private void OnMarketDepthsChanged(IEnumerable<MarketDepth> marketDepths)
        {
            foreach (var marketDepth in marketDepths)
            {
                var theClone = marketDepth.Clone();

                if (theClone.Bids.Length == 0 || theClone.Asks.Length == 0)
                    continue;

                if (theClone.BestAsk == null ||  theClone.BestBid == null)
                    continue;
                
                // Эта проверка
                if (theClone.BestAsk.Price <= theClone.BestBid.Price)
                    continue;

                _saveManager.MarketDepths.Enqueue(theClone);
            }
        }
```Под смартком 2.2 такой ошибки не замечал, мой код с тех пор не менялся.

                
Mikhail Sukhov
Mikhail Sukhov

vk37:

Михаил Сухов: Старая добрая ошибка смартком. Цена лучших квот равна. Надо такое фильтровать как в гидре перед сохранением.Посмотрел: стоит у меня такая проверка )

Сделайте еще вот так:

var fake = theClone.ToDictionary(q => q.Price);
vk37
vk37 Автор

Ошибка из-за того, что в стакане есть котировки с одинаковой ценой. Т.е. например: Asks: 350 340 340 320

или Bids:

300 280 280 150

vk37
vk37 Автор

Добавил еще такую проверку:```csharp if (marketDepth.Asks.Length != marketDepth.Asks.Select(a => a.Price).Distinct().Count()) continue;

            if (marketDepth.Bids.Length != marketDepth.Bids.Select(a => a.Price).Distinct().Count())
                continue;