private void _onData(byte[] Data, int Count, string MessageType) { _timerTick = _interval; if (MessageType == "Binary") { if (Count == 1) { if (_debug) { Console.WriteLine(DateTime.Now.ToLocalTime() + " Heartbeat"); } } else { int offset = 0; ushort count = ReadShort(Data, ref offset); //number of packets if (_debug) { Console.WriteLine("No of packets: " + count); } if (_debug) { Console.WriteLine("No of bytes: " + Count); } for (ushort i = 0; i < count; i++) { ushort length = ReadShort(Data, ref offset); // length of the packet if (_debug) { Console.WriteLine("Packet Length " + length); } Tick tick = new Tick(); if (length == 8) // ltp { tick = ReadLTP(Data, ref offset); } else if (length == 28) // index quote { tick = ReadIndexQuote(Data, ref offset); } else if (length == 32) // index quote { tick = ReadIndexFull(Data, ref offset); } else if (length == 44) // quote { tick = ReadQuote(Data, ref offset); } else if (length == 184) // full with marketdepth and timestamp { tick = ReadFull(Data, ref offset); } // If the number of bytes got from stream is less that that is required // data is invalid. This will skip that wrong tick if (tick.InstrumentToken != 0 && IsConnected && offset <= Count) { OnTick(tick); } } } } else if (MessageType == "Text") { string message = Encoding.UTF8.GetString(Data.Take(Count).ToArray()); if (_debug) { Console.WriteLine("WebSocket Message: " + message); } Dictionary <string, dynamic> messageDict = Utils.JsonDeserialize(message); if (messageDict["type"] == "order") { OnOrderUpdate?.Invoke(new Order(messageDict["data"])); } else if (messageDict["type"] == "error") { OnError?.Invoke(messageDict["data"]); } } else if (MessageType == "Close") { Close(); } }
public async Task <CallResult <UpdateSubscription> > SubscribeAsync <TParams>(HitBtcSocketSubscribeBaseRequest <TParams> subscribeRequest) { var dataHandler = new Action <string>(data => { var token = JToken.Parse(data); var method = (string)token["method"]; HitBtcSocketEvent responseType; if (!mappedResponses.TryGetValue(method, out responseType)) { log.Write(LogVerbosity.Warning, $"Unknown response method [{method}] update catched at data {data}"); return; } switch (responseType) { case HitBtcSocketEvent.OrderBookUpdated: { var result = Deserialize <HitBtcSocketOrderBookEvent>(token, false); if (result.Success) { OnOrderBookUpdate?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.OrderbookFullSnapshot: { var result = Deserialize <HitBtcSocketOrderBookEvent>(token, false); if (result.Success) { OnOrderBookSnapshot?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.TradesSnapshot: { var result = Deserialize <HitBtcSocketTradesEvent>(token, false); if (result.Success) { OnTradesSnapshot?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.TradesUpdated: { var result = Deserialize <HitBtcSocketTradesEvent>(token, false); if (result.Success) { OnTradesUpdate?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.TickerUpdated: { var result = Deserialize <HitBtcSocketTickerEvent>(token, false); if (result.Success) { OnTickerUpdate?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.CandlesSnapshot: { var result = Deserialize <HitBtcSocketCandlesEvent>(token, false); if (result.Success) { OnCandlesSnapshot?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.CandlesUpdated: { var result = Deserialize <HitBtcSocketCandlesEvent>(token, false); if (result.Success) { OnCandlesUpdate?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.ActiveOrdersSnapshot: { var result = Deserialize <HitBtcSocketActiveOrdersReportEvent>(token, false); if (result.Success) { OnActiveOrdersSnapshot?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.OrderUpdated: { var result = Deserialize <HitBtcSocketOrderReportEvent>(token, false); if (result.Success) { OnOrderUpdate?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.MarginOrdersSnapshot: { var result = Deserialize <HitBtcSocketMarginActiveOrdersReportEvent>(token, false); if (result.Success) { OnMarginActiveOrdersSnapshot?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.MarginOrderUpdated: { var result = Deserialize <HitBtcSocketMarginOrderReportEvent>(token, false); if (result.Success) { OnMarginOrderUpdate?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.MarginAccountsSnapshot: { var result = Deserialize <HitBtcSocketMarginAccountsEvent>(token, false); if (result.Success) { OnMarginAccountsSnapshot?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.MarginAccountUpdated: { var result = Deserialize <HitBtcSocketMarginAccountReportEvent>(token, false); if (result.Success) { OnMarginAccountUpdate?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } case HitBtcSocketEvent.TransactionUpdated: { var result = Deserialize <HitBtcSocketAccountTransactionEvent>(token, false); if (result.Success) { OnAccountTransactionUpdate?.Invoke(result.Data); } else { log.Write(LogVerbosity.Warning, "Couldn't deserialize data received from stream: " + result.Error); } break; } default: log.Write(LogVerbosity.Warning, $"Catched unknown method update: {data}"); break; } }); return(await Subscribe(BaseAddress + subscribeRequest.EndpointSuffix, subscribeRequest, null, subscribeRequest.EndpointSuffix != MarketDataUrlSuffix, dataHandler)); }
private void _onData(byte[] Data, int Count, string MessageType) { _timerTick = _interval; if (MessageType == "Binary") { if (Count == 1) { if (_debug) { Console.WriteLine(DateTime.Now.ToLocalTime() + " Heartbeat"); } } else { int offset = 0; ushort count = ReadShort(Data, ref offset); //number of packets if (_debug) { Console.WriteLine("No of packets: " + count); } if (_debug) { Console.WriteLine("No of bytes: " + Count); } for (ushort i = 0; i < count; i++) { ushort length = ReadShort(Data, ref offset); // length of the packet if (_debug) { Console.WriteLine("Packet Length " + length); } Tick tick = new Tick(); if (length == 8) // ltp { tick = ReadLTP(Data, ref offset); } else if (length == 28) // index quote { tick = ReadIndexQuote(Data, ref offset); } else if (length == 32) // index quote { tick = ReadIndexFull(Data, ref offset); } else if (length == 44) // quote { tick = ReadQuote(Data, ref offset); } else if (length == 184) // full with marketdepth and timestamp { tick = ReadFull(Data, ref offset); } // If the number of bytes got from stream is less that that is required // data is invalid. This will skip that wrong tick if (tick.InstrumentToken != 0 && IsConnected && offset <= Count) { //List<KeyValuePair<string, object>> keyValuePairs = new List<KeyValuePair<string, object>>(); //keyValuePairs.Add(new KeyValuePair<string,object>("timestamp", tick.Timestamp)); //keyValuePairs.Add(new KeyValuePair<string, object>("instrumenttoken", tick.InstrumentToken)); //keyValuePairs.Add(new KeyValuePair<string, object>("tradable", tick.Tradable)); //keyValuePairs.Add(new KeyValuePair<string, object>("open", tick.Open)); //keyValuePairs.Add(new KeyValuePair<string, object>("high", tick.High)); //keyValuePairs.Add(new KeyValuePair<string, object>("low", tick.Low)); //keyValuePairs.Add(new KeyValuePair<string, object>("close", tick.Close)); //keyValuePairs.Add(new KeyValuePair<string, object>("lastprice", tick.LastPrice)); //keyValuePairs.Add(new KeyValuePair<string, object>("volume", tick.Volume)); //_tickCache.Data.Append(keyValuePairs, true); OnTick(tick, _hubContext); } } } } else if (MessageType == "Text") { string message = Encoding.UTF8.GetString(Data.Take(Count).ToArray()); if (_debug) { Console.WriteLine("WebSocket Message: " + message); } Dictionary <string, dynamic> messageDict = CommonFunctions.JsonDeserialize(message); if (messageDict["type"] == "order") { OnOrderUpdate?.Invoke(new Order(messageDict["data"])); } else if (messageDict["type"] == "error") { OnError?.Invoke(messageDict["data"]); } } else if (MessageType == "Close") { Close(); } }