StockDailyPrice.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. namespace Domain.Entities.Stocks;
  4. /// <summary>
  5. /// T+1 일별 마감 시세 (금융위 주식시세 API) — (StockID, TradingDate) UNIQUE.
  6. /// 수정주가 보정 없음 (액면분할 등 미반영 — 차트는 TradingView 위임).
  7. /// </summary>
  8. public class StockDailyPrice
  9. {
  10. [ForeignKey(nameof(StockID))]
  11. public virtual Stock? Stock { get; private set; }
  12. [Key]
  13. public long ID { get; private set; }
  14. public int StockID { get; private set; }
  15. /// <summary>거래일 (basDt)</summary>
  16. public DateOnly TradingDate { get; private set; }
  17. /// <summary>시가</summary>
  18. public int Open { get; private set; }
  19. /// <summary>고가</summary>
  20. public int High { get; private set; }
  21. /// <summary>저가</summary>
  22. public int Low { get; private set; }
  23. /// <summary>종가</summary>
  24. public int Close { get; private set; }
  25. /// <summary>거래량 (주)</summary>
  26. public long Volume { get; private set; }
  27. /// <summary>거래대금 (원)</summary>
  28. public long TradingValue { get; private set; }
  29. /// <summary>전일 대비 (원)</summary>
  30. public int ChangeAmount { get; private set; }
  31. /// <summary>등락률 %</summary>
  32. public decimal ChangeRate { get; private set; }
  33. /// <summary>시가총액 (원)</summary>
  34. public long? MarketCap { get; private set; }
  35. /// <summary>상장주식수</summary>
  36. public long? ListedShares { get; private set; }
  37. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  38. private StockDailyPrice() { }
  39. public static StockDailyPrice Create(
  40. int stockID,
  41. DateOnly tradingDate,
  42. int open,
  43. int high,
  44. int low,
  45. int close,
  46. long volume,
  47. long tradingValue,
  48. int changeAmount,
  49. decimal changeRate,
  50. long? marketCap = null,
  51. long? listedShares = null
  52. ) {
  53. ArgumentOutOfRangeException.ThrowIfNegativeOrZero(stockID);
  54. return new StockDailyPrice
  55. {
  56. StockID = stockID,
  57. TradingDate = tradingDate,
  58. Open = open,
  59. High = high,
  60. Low = low,
  61. Close = close,
  62. Volume = volume,
  63. TradingValue = tradingValue,
  64. ChangeAmount = changeAmount,
  65. ChangeRate = changeRate,
  66. MarketCap = marketCap,
  67. ListedShares = listedShares
  68. };
  69. }
  70. /// <summary>동일 (StockID, TradingDate) 재수집 시 값 갱신 (upsert)</summary>
  71. public void Update(
  72. int open,
  73. int high,
  74. int low,
  75. int close,
  76. long volume,
  77. long tradingValue,
  78. int changeAmount,
  79. decimal changeRate,
  80. long? marketCap = null,
  81. long? listedShares = null
  82. ) {
  83. Open = open;
  84. High = high;
  85. Low = low;
  86. Close = close;
  87. Volume = volume;
  88. TradingValue = tradingValue;
  89. ChangeAmount = changeAmount;
  90. ChangeRate = changeRate;
  91. MarketCap = marketCap;
  92. ListedShares = listedShares;
  93. }
  94. }