Иногда в стакане BestBid.Price или BestAsk.Price равны нулю. Стаканы яполчаю в конструкторе и для рассчета текущих сигналов использую только их вот код
public BasketSignalCalculator(TradedBasket basket, TikerController tikerController, bool isSigmaCalculated) { this.isSigmaCalculated = isSigmaCalculated; this.trader = tikerController.Trader; this.basket = basket; this.tikerController = tikerController; leftSideMD = trader.GetMarketDepth(trader.Securities.First(sec => sec.Code == basket.Basket.LeftSide[0].Asset.Name)); rightSideMDs = trader.GetMarketDepth(trader.Securities.First(sec => sec.Code == basket.Basket.RightSide[0].Asset.Name)); }
вот код одного из методов
public decimal CalcSumCurrentBids() { decimal delta = 0; foreach (TradedBasketItem tradedBasketItem in basket.CurrentPart.RightSide) { decimal koef = GetTikerKoef(tradedBasketItem.Tiker); double bid = rightSideMDs.BestBid.Price; delta = delta + bid * tradedBasketItem.Weight * koef; if (delta <= 0) {
TradeBasketHelperLogger.Logger.Debug(String.Format("Delta = 0, koef = {0}, BB = {1}, TotalVol = {2}, TotalPrice {3}", koef, bid, rightSideMDs.TotalVolume, rightSideMDs.TotalPrice)); } } return delta; }
и вот лог
14:06:57,421 - Delta = 0, koef = 1, BB = 0, TotalVol = 667149, TotalPrice 1487,4 14:09:05,515 - Delta = 0, koef = 1, BB = 0, TotalVol = 659359, TotalPrice 1486,44 14:10:23,468 - Delta = 0, koef = 1, BB = 0, TotalVol = 522221, TotalPrice 1486,02
что это за глюк и как с ним бороться?
Comments (17)
Login or Create account, Log in or register to leave a comment
Может быть банально еще не пришел экспорт? Или это в середине работы случается?
и вот еще
14:27:57,078 - Delta = 0, koef = 1, BB = 0, TotalVol = 0, TotalPrice 0 14:28:15,953 - Delta = 0, koef = 1, BB = 0, TotalVol = 0, TotalPrice 0 14:28:18,078 - Delta = 0, koef = 1, BB = 0, TotalVol = 520064, TotalPrice 1489,09
в середине, в том то и беда. метод CalcSumCurrentBids() вызываеся в цикле весьма часто (как видно по тайм стампам), десять раз в секунду точно
вот секция из info.ini
[excel] timeout=90 price-timeout=0 start-timeout=100 use-multithread=1 num-attempts=0 language_id=0
может price-timeout = 0 не надо делать?
Я кстати правильно делаю, что создаю переменную сткана в конструкторе , кладу ее в поле и потом пользую? не надо какжый рах trader.GetMarketDepth() использовать?
И вот вопрос - щас покурил мануал и что лучге использовать - MarketDepth.BestAsk или MarketDepth GetBestQuote(OrderDirections.Sell)?
Минутку, а как данные в эти стаканы попадают?
Отбой, я понял о чем идет речь.
Второе вызывает первое.
Частота не зависит... А можете сократить код до простого примера в 10 строчек?
Да грубо говоря так
MarketDepth md = trader.GetMarketDepth(security);
while(true) { Console.WriteLine(md.BestAsk.Price); Thread.Sleep(10);
Ок, посмотрю чуть по-позже. Надо еще глянуть на частоту обновления инструментов... Главное, чтобы этот код точно приводил к баге.
Иожно вообще слип убрать и отлавливать моменты когда бестбид или бестаск равны 0. еще вот я заметил тоталволюм парур раз 0 проскакивал.
вероятно если подписаться на событие QoutesChanged таког не будет, н оу Workflow со событиями как то не айс работа, на то он и flow.
а MarketDepth потокобезопасный? может я в него лезу как раз в тот момент , ктога он обновляет эти свойства?
Потокобезопасный.
Две новости. Хорошая - у меня работает. Плохая (но не для меня) - у меня версия 2.1. Вот так =)
Действительно, посмотрел старый код. Такое поведение могло быть. Обновление котировок было не атомарно.
а долго ожидать релиза 2.1?
Я в процессе документирования. Думал на этой неделе сделаю, а у вас все проблемы да проблемы... Думаю 2-3 дня.