Example #1
0
        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));
        }
Example #3
0
        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();
            }
        }