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); }
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(); }
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); }