public MarketMakerMatchingEngine( string id, IEventChannel <BestPriceChangeEventArgs> bestPriceChangeEventChannel, OrderBookList orderBooks, IContextFactory contextFactory) { Id = id; _bestPriceChangeEventChannel = bestPriceChangeEventChannel; _orderBooks = orderBooks; _contextFactory = contextFactory; }
public OrderBookSaveService( IMarginTradingBlobRepository blobRepository, OrderBookList orderBookList, ILog log, IContextFactory contextFactory) : base(nameof(OrderBookSaveService), 5000, log) { _blobRepository = blobRepository; _orderBookList = orderBookList; _log = log; _contextFactory = contextFactory; }
public OrderBookSaveService( IMarginTradingBlobRepository blobRepository, OrderBookList orderBookList, MarginTradingSettings marginTradingSettings, ILog log, IContextFactory contextFactory) : base(nameof(OrderBookSaveService), marginTradingSettings.BlobPersistence.OrderbooksDumpPeriodMilliseconds, log) { _blobRepository = blobRepository; _orderBookList = orderBookList; _log = log; _contextFactory = contextFactory; }
/// <summary>Обработчик события получения сообщения от сокета</summary> private void Ws_OnMessage(object sender, MessageEventArgs e) { CountMessage++; DateTime timeMessage = DateTime.UtcNow; if (e.Data.StartsWith("{\"table\":\"orderBook10\"")) { string bids = "bids\":[["; string asks = "asks\":[["; int index = (e.Data.IndexOf(bids)); if (index > 0) { int indEnd = e.Data.IndexOf(',', index); string val = e.Data.Substring((index += bids.Length), indEnd - index); MaxBuy = decimal.Parse(val, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); } index = (e.Data.IndexOf(asks)); if (index > 0) { int indEnd = e.Data.IndexOf(',', index); string val = e.Data.Substring((index += asks.Length), indEnd - index); MinSell = decimal.Parse(val, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); } } //if (e.Data.StartsWith("{\"table\":\"orderBook10\"") && e.Data.Contains("partial")) //{ //} //if ((timeMessage - TimeLastMessage).TotalMilliseconds < 500) // return; TimeLastMessage = timeMessage; if (JsonConvertExtension.TryDeserializeObject(e.Data, out InfoDocs infoDocs) /*&& infoDocs.Info !=null && infoDocs.Docs !=null*/) { Console.WriteLine(infoDocs.Print()); } else if (JsonConvertExtension.TryDeserializeObject(e.Data, out TableOrderBookArr tableOrderBook)) { //Console.WriteLine($"tableOrderBook: {tableOrderBook.Table}, {tableOrderBook.Action}, {tableOrderBook.Data[0].Asks[0][0]}, {tableOrderBook.Data[0].Bids[0][0]}"); if (tableOrderBook.Table == "orderBook10" && tableOrderBook.Data.FirstOrDefault(data => data.Symbol == WorkSymbol) is OrderBookArr orderBook) { OrderBookList orderBookList = OrderBookList.FromArr(orderBook); switch (tableOrderBook.Action) { case "partial": { OrderBook10Asks = orderBookList.Asks; OrderBook10Bids = orderBookList.Bids; break; } case "update": { if (OrderBook10Asks != default) { foreach ((OrderBook s, OrderBook f)tupl in OrderBook10Asks.Zip(orderBookList.Asks, (s, f) => (s, f))) { tupl.s.CopyFrom(tupl.f); } foreach ((OrderBook s, OrderBook f)tupl in OrderBook10Bids.Zip(orderBookList.Bids, (s, f) => (s, f))) { tupl.s.CopyFrom(tupl.f); } } break; } } } } else if (JsonConvertExtension.TryDeserializeObject(e.Data, out StatusClass status) /*&& status.Status!=null*/) { Console.WriteLine($"StatusClass: {status.Status}, {status.Error}, {status.Request.Op}, {status.Request.Args[0]}"); } else if (JsonConvertExtension.TryDeserializeObject(e.Data, out SuccessClass success) /*&& status.Status!=null*/) { Console.WriteLine($"SuccessClass: {success.Success}, {success.Subscribe}, {success.Request.Op}, {success.Request.Args[0]}"); } else { Console.WriteLine("e.Data = " + e.Data); } //messCount++; //WebScocketLastMessage = DateTime.UtcNow; //try //{ // JObject Message = JObject.Parse(e.Data); // if (Message.ContainsKey("table")) // { // if ((string)Message["table"] == "trade") // { // //if (Message.ContainsKey("data")) // //{ // // JArray TD = (JArray)Message["data"]; // // if (TD.Any()) // // { // // decimal Price = (decimal)TD.Children().LastOrDefault()["price"]; // // string Symbol = (string)TD.Children().LastOrDefault()["symbol"]; // // Prices[Symbol] = Price; // // } // //} // } // else if ((string)Message["table"] == "orderBook10") // { // if (Message.ContainsKey("data")) // { // var arrOrderBook = JsonConvert.DeserializeObject<TableOrderBookArr>(e.Data); // var listOrderBook = TableOrderBookList.FormArr(arrOrderBook); // // JArray TD = (JArray)Message["data"]; // // if (TD.Any()) // // { // // JArray TDBids = (JArray)TD[0]["bids"]; // // if (TDBids.Any()) // // { // // List<OrderBook> OB = new List<OrderBook>(); // // foreach (JArray i in TDBids) // // { // // OrderBook OBI = new OrderBook // // { // // Price = (decimal)i[0], // // Size = (int)i[1] // // }; // // OB.Add(OBI); // // } // // OrderBookTopBids = OB; // // } // // JArray TDAsks = (JArray)TD[0]["asks"]; // // if (TDAsks.Any()) // // { // // List<OrderBook> OB = new List<OrderBook>(); // // foreach (JArray i in TDAsks) // // { // // OrderBook OBI = new OrderBook // // { // // Price = (decimal)i[0], // // Size = (int)i[1] // // }; // // OB.Add(OBI); // // } // // OrderBookTopAsks = OB; // // } // // } // } // } // else if ((string)Message["table"] == "position") // { // //// PARSE // //if (Message.ContainsKey("data")) // //{ // // JArray TD = (JArray)Message["data"]; // // if (TD.Any()) // // { // // if (TD.Children().LastOrDefault()["symbol"] != null) // // { // // SymbolPosition.Symbol = (string)TD.Children().LastOrDefault()["symbol"]; // // } // // if (TD.Children().LastOrDefault()["currentQty"] != null) // // { // // SymbolPosition.CurrentQty = (int?)TD.Children().LastOrDefault()["currentQty"]; // // } // // if (TD.Children().LastOrDefault()["avgEntryPrice"] != null) // // { // // SymbolPosition.AvgEntryPrice = (decimal?)TD.Children().LastOrDefault()["avgEntryPrice"]; // // } // // if (TD.Children().LastOrDefault()["markPrice"] != null) // // { // // SymbolPosition.MarkPrice = (decimal?)TD.Children().LastOrDefault()["markPrice"]; // // } // // if (TD.Children().LastOrDefault()["liquidationPrice"] != null) // // { // // SymbolPosition.LiquidationPrice = (decimal?)TD.Children().LastOrDefault()["liquidationPrice"]; // // } // // if (TD.Children().LastOrDefault()["leverage"] != null) // // { // // SymbolPosition.Leverage = (decimal?)TD.Children().LastOrDefault()["leverage"]; // // } // // if (TD.Children().LastOrDefault()["unrealisedPnl"] != null) // // { // // SymbolPosition.UnrealisedPnl = (decimal?)TD.Children().LastOrDefault()["unrealisedPnl"]; // // } // // if (TD.Children().LastOrDefault()["unrealisedPnlPcnt"] != null) // // { // // SymbolPosition.UnrealisedPnlPcnt = (decimal?)TD.Children().LastOrDefault()["unrealisedPnlPcnt"]; // // } // // } // //} // } // else if ((string)Message["table"] == "margin") // { // // if (Message.ContainsKey("data")) // // { // // JArray TD = (JArray)Message["data"]; // // if (TD.Any()) // // { // // try // // { // // Balance = ((decimal)TD.Children().LastOrDefault()["walletBalance"] / 100000000); // // UpdateBalanceAndTime(); // // } // // catch (Exception /*ex*/) // // { // // } // // } // // } // } // } // else if (Message.ContainsKey("info") && Message.ContainsKey("docs")) // { // //string WebSocketInfo = "Websocket Info: " + Message["info"].ToString() + " " + Message["docs"].ToString(); // //UpdateWebSocketInfo(WebSocketInfo); // InfoDocs info = JsonConvert.DeserializeObject<InfoDocs>(e.Data); // Console.WriteLine(info.Print()); // } //} //catch (Exception /*ex*/) //{ // //MessageBox.Show(ex.Message); //} }