protected override async Task <CurrencyHistoryData> LoadDataAsync(string secId, DateTime day)
        {
            var bg = await _staticDataService.GetBoardgroup(secId);

            if (bg == null)
            {
                return(null);
            }

            string date = day.ToString("yyyy-MM-dd");
            var    url  = _config.PrepareUrl(bg.Id, secId, new Dictionary <string, string>
            {
                ["sort_order"] = "desc",
                ["till"]       = date,
                ["limit"]      = "10",
            });

            CurrencyHistoryData result = null;

            try
            {
                var data = await _httpClientService.Get <CurrencyHistoryData[]>(url, _config.ObjectPath);

                result = data.FirstOrDefault(d => d.WAPRICE != null);
            }
            catch (ServiceResponseException)
            {
            }

            return(result);
        }
        protected override async Task <IndexHistoryData> LoadDataAsync(string secId, DateTime day)
        {
            var    boardgroupId = 9;
            string date         = day.Date.ToString("yyyy-MM-dd");
            var    url          = _config.PrepareUrl(boardgroupId, secId, new Dictionary <string, string>
            {
                ["sort_order"] = "desc",
                ["till"]       = date,
                ["limit"]      = "1",
            });

            IndexHistoryData result = null;

            try
            {
                var data = await _httpClientService.Get <IndexHistoryData[]>(url, _config.ObjectPath);

                result = data.FirstOrDefault();
            }
            catch (ServiceResponseException)
            {
            }

            return(result);
        }
        private async Task <IEnumerable <string> > GetSecIdsByAssetCode(string assetCode, DateTime date)
        {
            var maxAttemptsCacheKey = $"SECIDSNOTFOUND-{assetCode}-{date.ToString("yyyy-MM-dd")}";
            var value = await _stringCacheProvider.GetAsync(maxAttemptsCacheKey);

            if (value != null)
            {
                return(new string[0]);
            }

            var children = Enumerable.Empty <JToken>();

            var reqDate = date.Date;
            int count   = 0;

            do
            {
                var url = _historyConf.PrepareUrl(FuturesBoardgroupId, null, new Dictionary <string, string>
                {
                    ["assetcode"] = assetCode,
                    ["date"]      = reqDate.ToString("yyyy-MM-dd"),
                });
                var token = await _getService.Get <JToken>(url, _historyConf.ObjectPath);

                children = token.Children().ToList();

                reqDate = reqDate.AddDays(-1);
                count++;
            } while (children.Count() < 1 && count < MaxHistoryBackwardStepCount);

            if (count >= MaxHistoryBackwardStepCount)
            {
                _logger.LogWarning(
                    "Error get history contract data for assetcode {assetCode} till {date}. Max attempt count reached.",
                    assetCode,
                    date.ToString("yyyy-MM-dd"));
                await _stringCacheProvider.PutAsync(maxAttemptsCacheKey, string.Empty);
            }

            return(children.Select(t => t.Value <string>("SECID")));
        }