RepositoryExtension.QT.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System.Threading.Tasks;
  2. using System;
  3. using Wicture.DbRESTFul.Infrastructure.Repository;
  4. using System.Linq;
  5. using Newtonsoft.Json.Linq;
  6. using System.Collections.Generic;
  7. using System.Net.Http;
  8. using JiaZhiQuan.Common.Utils;
  9. using Wicture.DbRESTFul.Cache;
  10. using Newtonsoft.Json;
  11. using Polly;
  12. using Wicture.DbRESTFul.Rpc.Client;
  13. namespace JiaZhiQuan.Common
  14. {
  15. public static partial class RepositoryExtension
  16. {
  17. /// <summary>
  18. /// 获取至少前7个交易日(不考虑停牌)
  19. /// </summary>
  20. public static async Task<List<string>> GetQTRecentTradeDaysBefore7(this DbRESTFulRepository repository, RedisCacheProvider cacheProvider, string dateStr)
  21. {
  22. var key = CacheKeys.QTRecentTradeDaysBefore7(dateStr);
  23. var tradeDates = await cacheProvider.Get<List<string>>(key);
  24. if (tradeDates == null || tradeDates.Count == 0)
  25. {
  26. tradeDates = (await repository.QueryAsync<DateTime>(
  27. $"select `date` from n_stock_trade_date where `date`<='{dateStr}' order by `date` desc limit 7"))
  28. .Select(e => e.ToString("yyyy-MM-dd")).ToList();
  29. await cacheProvider.Set(key, tradeDates, CacheKeys.QTRecentTradeDaysCacheSecs);
  30. }
  31. return tradeDates;
  32. }
  33. /// <summary>
  34. /// 获取当日最近前后3个交易日(不考虑停牌)
  35. /// </summary>
  36. public static async Task<List<string>> GetQTTradeDaysAround3Days(this DbRESTFulRepository repository,
  37. string dateStr, RedisCacheProvider cacheProvider)
  38. {
  39. // 获取当日最近前后3个交易日
  40. var key = CacheKeys.QTRecentTradeDaysRound3(dateStr);
  41. var tradeDates = await cacheProvider.Get<List<string>>(key);
  42. if (tradeDates == null || tradeDates.Count == 0)
  43. {
  44. var tradeDatesBefore = (await repository.QueryAsync<DateTime>(
  45. $"select `date` from n_stock_trade_date where `date`<='{dateStr}' order by `date` desc limit 4")).ToList();
  46. var tradeDatesAfter = (await repository.QueryAsync<DateTime>(
  47. $"select `date` from n_stock_trade_date where `date`>='{dateStr}' order by `date` asc limit 4")).ToList();
  48. tradeDates = tradeDatesBefore.Concat(tradeDatesAfter).Distinct().OrderBy(e => e)
  49. .Select(e => e.ToString("yyyy-MM-dd")).ToList();
  50. await cacheProvider.Set(key, tradeDates, CacheKeys.QTRecentTradeDaysCacheSecs);
  51. }
  52. return tradeDates;
  53. }
  54. /// <summary>
  55. /// 获取某日对应的停牌信息(通过AKShare获取)
  56. /// </summary>
  57. public static async Task<List<QTSuspensionData>> GetQTSuspensionDataList(this DbRESTFulRepository repository,
  58. string dateStr, RedisCacheProvider cacheProvider, IHttpClientFactory clientFactory)
  59. {
  60. var key = CacheKeys.QTSuspensionDataList(dateStr);
  61. var list = await cacheProvider.Get<List<QTSuspensionData>>(key);
  62. if (list == null)
  63. {
  64. list = await QTUtils.GetAKSData<List<QTSuspensionData>>(clientFactory, "stock_tfp_em",
  65. new { date = dateStr.Replace("-", "") });
  66. await cacheProvider.Set(key, list, CacheKeys.QTSuspensionDataListCacheSecs);
  67. }
  68. return list;
  69. }
  70. /// <summary>
  71. /// 判断某一个合约在某一个交易日是否停牌
  72. /// </summary>
  73. public static bool QTIsSuspended(this DbRESTFulRepository repository, string contractCode, DateTime tradeDate, List<QTSuspensionData> suspensions)
  74. {
  75. var isIndex = (contractCode.Contains("SH") && !contractCode.StartsWith("6")) ||
  76. (contractCode.Contains("SZ") && !contractCode.StartsWith("0"));
  77. if (isIndex) return false;
  78. var codePart = contractCode.Split('.', StringSplitOptions.RemoveEmptyEntries)[0];
  79. return suspensions.Any(e =>
  80. codePart.Equals(e.代码) && e.停牌时间 != null &&
  81. e.停牌时间.Value.Date <= tradeDate.Date &&
  82. (e.停牌截止时间 == null || e.停牌截止时间 >= tradeDate.Date) &&
  83. !(e.停牌期限 ?? string.Empty).Contains("盘中"));
  84. }
  85. }
  86. }