Ejemplo n.º 1
0
        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"));
                }
            }
        }
Ejemplo n.º 2
0
        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---");
            }
        }