Example #1
0
        private async Task <SortedDictionary <long, KlineTick> > DoGetTicks(string symbol, Period period)
        {
            var url   = $"https://api.huobi.pro/market/history/kline?period={period.GetId()}&symbol={symbol}&size={Size}";
            var kline = await _httpClient.GetStringAsync(url);

            var klineHistory = Json.Deserialize <KlineHistory>(kline);
            var result       = SortedDictionaryFactory.NewSortedDictionary();

            foreach (var tick in klineHistory.Data)
            {
                if (!result.ContainsKey(tick.Id))
                {
                    result[tick.Id] = tick;
                }
            }

            return(result);
        }
Example #2
0
        private void Init()
        {
            var webSocket = _webSocket = HuobiWebSocketClient.GetWebSocket();

            webSocket.OnMessage += (sender, e) => {
                var data = GZipDecompresser.Decompress(e.RawData);
                if (data.Contains("ping"))
                {
                    webSocket.Send(data.Replace("ping", "pong"));
                }
                else
                {
                    try {
                        var updateEvent = Json.Deserialize <TrickUpdateEvent>(data);
                        if (!_cache.ContainsKey(updateEvent.Ch))
                        {
                            lock (this) {
                                if (!_cache.ContainsKey(updateEvent.Ch))
                                {
                                    _cache[updateEvent.Ch] = SortedDictionaryFactory.NewSortedDictionary();
                                }
                            }
                        }

                        var ticks = _cache[updateEvent.Ch];
                        ticks[updateEvent.Tick.Id] = updateEvent.Tick;
                        while (ticks.Count > Size)
                        {
                            ticks.Remove(ticks.Last().Key);
                        }
                    }
                    catch (Exception) {
                        // ignored
                    }
                }
            };
            webSocket.OnClose += (sender, e) => _cache.Clear();
            webSocket.OnError += (sender, e) => WebSocketUtils.CloseWebSocket(webSocket);
            webSocket.Connect();
        }
Example #3
0
        public List <KlineTick> GetTicks(string symbol, Period period, int size = 200)
        {
            if (!_symbolsService.Exist(symbol))
            {
                return(null);
            }

            var key = GetKey(symbol, period);

            if (!_cache.ContainsKey(key))
            {
                lock (this) {
                    if (!_cache.ContainsKey(key))
                    {
                        var sendData = $"{{\"sub\":\"{key}\",\"id\":\"{Guid.NewGuid()}\"}}";
                        _webSocket.Send(sendData);

                        _cache[key] = SortedDictionaryFactory.NewSortedDictionary();
                        _cache[key] = DoGetTicks(symbol, period).Result;
                    }
                }
            }

            var ticks  = _cache[key].Values;
            var result = new List <KlineTick>();

            foreach (var tick in ticks)
            {
                if (result.Count < size)
                {
                    result.Add(tick);
                }
                else
                {
                    break;
                }
            }

            return(result);
        }