Beispiel #1
0
        public DepthTick GetDepth(string symbol)
        {
            if (!_symbolsService.Exist(symbol))
            {
                throw null;
            }

            if (!_webSocket.IsAlive)
            {
                Init();
            }

            var key = $"market.{symbol}.depth.step0";

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

            for (var i = 0; i < 10; i++)
            {
                if (_cache.ContainsKey(key))
                {
                    break;
                }

                Thread.Sleep(200);
            }

            return(_cache[key]);
        }
Beispiel #2
0
        public List <TradeData> GetTradeData(string symbol, int size = 20)
        {
            if (!_symbolsService.Exist(symbol))
            {
                throw new ArgumentException($"symbol {symbol} error");
            }

            var key = $"market.{symbol}.trade.detail";

            if (!_cache.ContainsKey(key))
            {
                lock (this) {
                    if (!_cache.ContainsKey(key))
                    {
                        var history = _httpClient
                                      .GetStringAsync($"https://api.huobi.pro/market/history/trade?symbol={symbol}&size=100")
                                      .Result;
                        history = history.Replace("trade-id", "tradeId");
                        var tradeHistory = Json.Deserialize <TradeHistory>(history);
                        _cache[key] = new ConcurrentQueue <TradeData>();
                        var tradeTicks = new LinkedList <TradeData>();
                        foreach (var item in tradeHistory.Data.SelectMany(tick => tick.Data))
                        {
                            tradeTicks.AddFirst(item);
                        }

                        foreach (var data in tradeTicks)
                        {
                            _cache[key].Enqueue(data);
                        }

                        var sendData = $"{{\"sub\":\"{key}\",\"id\":\"{Guid.NewGuid()}\"}}";
                        _webSocket.Send(sendData);
                    }
                }
            }

            for (var i = 0; i < 50; i++)
            {
                if (_cache.ContainsKey(key))
                {
                    break;
                }

                Thread.Sleep(200);
            }

            var result = new List <TradeData>(_cache[key]);

            result.Reverse();
            return(result.GetRange(0, Math.Min(result.Count, size)));
        }
Beispiel #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);
        }