← Zurück

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (5)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

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

vk37
vk37
vk37 Autor

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

        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 Autor

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

или Bids:

300 280 280 150

vk37
vk37 Autor

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