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

API 4.2.1.5 ошибки при сохранении стакана
Atom
12/24/2013
vk37


Перед началом основной торговой сессии фортс такие были ошибки около 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

Tags:


Thanks:


Mikhail Sukhov

Avatar
Date: 12/24/2013
Reply


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

Thanks: vk37

vk37

Avatar
Date: 12/25/2013
Reply


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

        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 такой ошибки не замечал, мой код с тех пор не менялся.

                
Thanks:

Mikhail Sukhov

Avatar
Date: 12/25/2013
Reply


vk37:

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

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

var fake = theClone.ToDictionary(q => q.Price);
Thanks:

vk37

Avatar
Date: 1/15/2014
Reply


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

или Bids:

300 280 280 150

Thanks:

vk37

Avatar
Date: 1/15/2014
Reply


Добавил еще такую проверку:```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;
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy