/// <summary> /// Implements IComponent.Execute method. /// </summary> /// <param name="pc">Pipeline context</param> /// <param name="inmsg">Input message</param> /// <returns>Original input message</returns> /// <remarks> /// IComponent.Execute method is used to initiate /// the processing of the message in this pipeline component. /// </remarks> public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pipelineContext, Microsoft.BizTalk.Message.Interop.IBaseMessage inputMsg) { // // TODO: implement component logic // // this way, it's a passthrough pipeline component IBaseMessagePart bodyPart = inputMsg.BodyPart; if (bodyPart != null) { using (Stream stream = bodyPart.GetOriginalDataStream()) { if (stream == null) { return(inputMsg); } using (Stream stream2 = new ReadOnlySeekableStream(stream)) { if (this.UseCustomEncoder) { string jsonStg = ""; XDocument xdoc = new XDocument(); xdoc = XDocument.Load(stream2); stream2.Position = 0L; xdoc.Declaration = null; xdoc.Descendants() .Attributes() .Where(x => x.IsNamespaceDeclaration) .Remove(); XmlDocument node = new XmlDocument(); node = ToXmlDocument(xdoc); if (this.RemoveOuterEnvelope) { jsonStg = JsonConvert.SerializeXmlNode(node, Newtonsoft.Json.Formatting.None, true); } else { jsonStg = JsonConvert.SerializeXmlNode(node); } bodyPart.Data = GenerateStreamFromString(jsonStg); } else { XmlSchema matchingSchema = null; XmlDocument node = new XmlDocument(); node.Load(stream2); stream2.Position = 0L; matchingSchema = this.GetMatchingSchema(pipelineContext, stream2); bodyPart.Data = JsonConvertExtension.SerializeXmlNodeToStream(node, this.RemoveOuterEnvelope, true, true, matchingSchema); } } } } return(inputMsg); }
/// <summary>Обработчик события получения сообщения от сокета</summary> private void Ws_OnMessage(object sender, MessageEventArgs e) { CountMessage++; long numMess = CountMessage; TimeLastMessage = DateTime.UtcNow; //try { if (e.Data.StartsWith("{\"table\":\"orderBook10\"")) { string symbol = "\"symbol\":\"" + WorkSymbol + "\""; string bids = "bids\":[["; string asks = "asks\":[["; int indexSymb = (e.Data.IndexOf(symbol)); if (indexSymb >= 0) { int index = (e.Data.IndexOf(bids, indexSymb + symbol.Length)); 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, indexSymb + symbol.Length)); 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); } } } else if (e.Data.StartsWith("{\"table\":\"quote\"")) { string symbol = "\"symbol\":\"" + WorkSymbol + "\""; string bidPrice = "bidPrice\":"; string askPrice = "askPrice\":"; int indexSymb = (e.Data.IndexOf(symbol)); if (indexSymb >= 0) { int index = (e.Data.IndexOf(bidPrice, indexSymb + symbol.Length)); if (index > 0) { int indEnd = e.Data.IndexOf(',', index); string val = e.Data.Substring((index += bidPrice.Length), indEnd - index); MaxBuy = decimal.Parse(val, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); } index = (e.Data.IndexOf(askPrice, indexSymb + symbol.Length)); if (index > 0) { int indEnd = e.Data.IndexOf(',', index); string val = e.Data.Substring((index += askPrice.Length), indEnd - index); MinSell = decimal.Parse(val, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); } } } else if (e.Data.StartsWith("{\"info\":")) { if (JsonConvertExtension.TryDeserializeObject(e.Data, out InfoDocs infoDocs)) { Console.WriteLine(infoDocs.Print()); InfoDocsList = InfoDocsList.Append(infoDocs); } else if (JsonConvertExtension.TryDeserializeObject(e.Data, out InfoHelp infoHelp)) { Console.WriteLine(infoHelp.Print()); } } else if (e.Data.StartsWith("{\"table\":")) { if (JsonConvertExtension.TryDeserializeObject(e.Data, out TableJSON table)) { table.Number = numMess; if (table.Data == null || table.Data.Length == 0) { ConvertTable(table); } else { lock (listTableJSON) { listTableJSON.Add(table); if (table.Table == "order") { //Console.WriteLine // ( // $"№{table.Number} ({DateTime.Now.Ticks}) ->" + // $"table={{{table.Table}, {table.Action}, {table.Data[0]["timestamp"]:HH:mm:ss.ffffff}}}," // ); } } while (listTableJSON.Count > 0) { Thread.Sleep(100); lock (listTableJSON) { if (listTableJSON.Count > 0) { TableJSON tableFirst = listTableJSON .OrderBy(t => t.Data[0]["timestamp"]) .ThenBy(t => t.Action == "partial" ? 0 : t.Action == "insert" ? 1 : t.Action == "update" ? 2 : 3) .ThenBy(t => !t.Data[0].ContainsKey("workingIndicator") ? 0 : (bool)t.Data[0]["workingIndicator"] ? 1 : 2) .First(); if (tableFirst.Table == "order") { Console.WriteLine ( $"tableFirst={{{tableFirst.Table}, {tableFirst.Action}, {tableFirst.Data[0]["orderID"]}, {tableFirst.Data[0]["timestamp"]:HH:mm:ss.ffffff}}}" ); } //if (table.Table == "order" || tableFirst.Table == "order") //{ // Console.WriteLine // ( // $"№{table.Number} ({DateTime.Now.Ticks}) ->" + // $"table={{{table.Table}, {table.Action}, {table.Data[0]["timestamp"]:HH:mm:ss.ffffff}}}," + // $"tableFirst={{{tableFirst.Table}, {tableFirst.Action}, {tableFirst.Data[0]["timestamp"]:HH:mm:ss.ffffff}}}" // ); //} ConvertTable(tableFirst); listTableJSON.Remove(tableFirst); } } } } //Console.WriteLine($"TableMargin: Баланс ( * 100 млн.): {tableMargin.data["walletBalance"]}"); } else { } } //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); // OrderBook10Asks = orderBookList.Asks; // OrderBook10Bids = orderBookList.Bids; // } //} else if (e.Data.StartsWith("{\"status\":")) { if (JsonConvertExtension.TryDeserializeObject(e.Data, out StatusClass status) /*&& status.Status!=null*/) { if (status.Status == 401) { switch (status.Error) { case "Invalid API Key.": InvalidAPIKey = true; Authorization = false; break; case "Signature not valid.": SignatureNotValid = true; Authorization = false; break; } } Console.WriteLine($"StatusClass: {status.Status}, {status.Error}, {status.Request?.Op}, {status.Request?.Args[0]}"); } } else if (e.Data.StartsWith("{\"success\":")) { if (JsonConvertExtension.TryDeserializeObject(e.Data, out SuccessClass success) /*&& status.Status!=null*/) { if (success.Request.Op == "authKeyExpires") { Authorization = success.Success; } 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*/) //{ //} } //catch (Exception) //{ // MessageBox.Show("Какой-то сбой при разборе ответа от сервера"); //} }
/// <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); //} }