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

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


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


Михаил Сухов Go to
Старая добрая ошибка смартком. Цена лучших квот равна. Надо такое фильтровать как в гидре перед сохранением.
Посмотрел: стоит у меня такая проверка )
Code
        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 Go to
Михаил Сухов Go to
Старая добрая ошибка смартком. Цена лучших квот равна. Надо такое фильтровать как в гидре перед сохранением.
Посмотрел: стоит у меня такая проверка )


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

Code
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


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