public Task DoWork(IJobExecutionContext context) { lock (_lock) { var trigger = (CronTriggerImpl)((JobExecutionContextImpl)context).Trigger; try { var watch = new Stopwatch(); watch.Start(); var coin_array = _huobi.GetAllCoin(); Parallel.ForEach(coin_array, item => { List <Domain.Coin.CoinKLineData.CoinKLineData> kline = null; var retry = Policy.Handle <WebException>().Retry(3, (ex, count, text) => { _logger.LogError(new EventId(ex.HResult), ex, $"---CoinAnalyseJob GetKLine Exception,进行重试 {count}次---"); Thread.Sleep(100); }); retry.Execute(() => { kline = _huobi.GetKLine(item.base_currency, item.quote_currency, CoinTime.Time_1day.ToString().Split('_')[1], 2000); }); if (kline == null) { return; } var coin = item.base_currency + "-" + item.quote_currency; SMA(coin, kline, CoinTime.Time_1day); MACD(coin, kline, CoinTime.Time_1day); KDJ(coin, kline, CoinTime.Time_1day); }); if (list_coin.Any()) { using var scope = _scopeFactory.CreateScope(); using var db_context = scope.ServiceProvider.GetRequiredService <CoinDbContext>(); db_context.Database.ExecuteSqlRaw("UPDATE CoinAnalyse SET IsDelete=1 where IndicatorType<>0 "); db_context.CoinAnalyse.AddRange(list_coin); db_context.SaveChanges(); } Analyse(CoinTime.Time_1day); watch.Stop(); context.Scheduler.Context.Put(trigger.FullName + "_Result", "Success"); context.Scheduler.Context.Put(trigger.FullName + "_Time", watch.ElapsedMilliseconds); _logger.LogInformation($"------>{context.GetJobDetail()} 耗时:{watch.ElapsedMilliseconds} "); return(Task.FromResult("Success")); } catch (Exception ex) { context.Scheduler.Context.Put(trigger.FullName + "_Exception", ex); _logger.LogError(new EventId(ex.HResult), ex, "---CoinAnalyseJob DoWork Exception---"); return(Task.FromResult("Error")); } } }
public void AddKLineData(string coin) { try { using var scope = _scopeFactory.CreateScope(); using var db_context = scope.ServiceProvider.GetRequiredService <CoinDbContext>(); var new_list = new List <Domain.Coin.CoinKLineData.CoinKLineData>(); var old_datatime = new List <DateTime>(); foreach (CoinTime time in Enum.GetValues(typeof(CoinTime))) { var max = db_context.CoinKLineData.Where(x => x.Coin.Equals(coin) && x.IsDelete == 0 && x.TimeType == (int)time && x.Platform == (int)Platform.Huobi).OrderByDescending(x => x.DataTime) .FirstOrDefault(); var size = 2000; if (max != null) { size = GetSize(max.DataTime, time); } var kline = ""; var retry = Policy.Handle <WebException>().Retry(3, (ex, count, text) => { _logger.LogError(new EventId(ex.HResult), ex, $"---CoinKLineDataJob GetKLine Exception,进行重试 {count}次---"); Thread.Sleep(100); }); retry.Execute(() => { kline = _huobi.GetKLine(coin + "usdt", time.ToString().Split('_')[1], size); }); if (string.IsNullOrWhiteSpace(kline)) { continue; } var jobject = JObject.Parse(kline); var json = jobject?["data"]; if (json == null) { continue; } var list = new List <Domain.Coin.CoinKLineData.CoinKLineData>(); foreach (var item in json) { var data_time = DateTimeConvert.ConvertDateTime(item["id"].ToString()); var model = new Domain.Coin.CoinKLineData.CoinKLineData { Id = Guid.NewGuid().ToString(), IsDelete = 0, Platform = (int)Platform.Huobi, Coin = coin, TimeType = (int)time, DataTime = data_time, Open = Convert.ToDouble(item["open"]), Close = Convert.ToDouble(item["close"]), Low = Convert.ToDouble(item["low"]), High = Convert.ToDouble(item["high"]), CreateTime = DateTime.Now }; old_datatime.Add(data_time); list.Add(model); } var old_list = db_context.CoinKLineData.Where(x => old_datatime.Contains(x.DataTime) && x.TimeType == (int)time && x.Coin.Equals(coin) && x.Platform == (int)Platform.Huobi && x.IsDelete == 0).ToList(); if (old_list.Count > 0) { db_context.CoinKLineData.RemoveRange(old_list); } new_list.AddRange(list); } db_context.CoinKLineData.AddRange(new_list); db_context.SaveChanges(); } catch (Exception ex) { _logger.LogError(new EventId(ex.HResult), ex, "---AddKLineData Exception---"); } }