camphong24032002 commited on
Commit
be1eeae
·
1 Parent(s): 5c36aa4

feat: get vn100 symbols

Browse files
Files changed (3) hide show
  1. models/index.py +11 -0
  2. routes/data.py +10 -0
  3. services/indicator.py +26 -15
models/index.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel, validator
2
+
3
+
4
+ class IndexPayload(BaseModel):
5
+ source: str = "database"
6
+
7
+ @validator("source")
8
+ def valid_source(cls, v):
9
+ if v not in ["database", "hsx"]:
10
+ raise ValueError('source must be database or hsx')
11
+ return v
routes/data.py CHANGED
@@ -3,6 +3,7 @@ from models.ichimoku import IchimokuPayload
3
  from models.rsi import RSIPayload
4
  from models.price import PricePayload
5
  from models.macd import MACDPayload
 
6
  from fastapi import status, APIRouter
7
  from typing import Sequence
8
  import json
@@ -55,6 +56,15 @@ async def update_entire_macd():
55
  Indicator.update_entire_macd()
56
 
57
 
 
 
 
 
 
 
 
 
 
58
  @router.post(
59
  "/get_price",
60
  name="Get price",
 
3
  from models.rsi import RSIPayload
4
  from models.price import PricePayload
5
  from models.macd import MACDPayload
6
+ from models.index import IndexPayload
7
  from fastapi import status, APIRouter
8
  from typing import Sequence
9
  import json
 
56
  Indicator.update_entire_macd()
57
 
58
 
59
+ @router.get(
60
+ "/vn100",
61
+ name="Get VN100 symbols",
62
+ status_code=status.HTTP_200_OK
63
+ )
64
+ async def get_vn100(payload: IndexPayload) -> dict:
65
+ return Indicator.get_vn100(payload.source)
66
+
67
+
68
  @router.post(
69
  "/get_price",
70
  name="Get price",
services/indicator.py CHANGED
@@ -29,6 +29,26 @@ class Indicator:
29
  def __init__(self) -> None:
30
  pass
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  @staticmethod
33
  def update_daily_price() -> None:
34
  global updating_price
@@ -99,11 +119,8 @@ class Indicator:
99
  hour = datetime_now.hour
100
  weekday = datetime_now.weekday()
101
  try:
102
- data = requests.get(VN100_URL).json()
103
- data = data["rows"]
104
- lst_symbols = []
105
- for value in data:
106
- lst_symbols.append(value["cell"][2].strip())
107
  if weekday < 5 and hour < 12:
108
  updating_price = False
109
  return
@@ -260,11 +277,8 @@ class Indicator:
260
  hour = datetime_now.hour
261
  weekday = datetime_now.weekday()
262
  try:
263
- data = requests.get(VN100_URL).json()
264
- data = data["rows"]
265
- lst_symbols = []
266
- for value in data:
267
- lst_symbols.append(value["cell"][2].strip())
268
  if weekday < 5 and hour < 12:
269
  updating_rsi = False
270
  return
@@ -357,11 +371,8 @@ class Indicator:
357
  hour = datetime_now.hour
358
  weekday = datetime_now.weekday()
359
  try:
360
- data = requests.get(VN100_URL).json()
361
- data = data["rows"]
362
- lst_symbols = []
363
- for value in data:
364
- lst_symbols.append(value["cell"][2].strip())
365
  if weekday < 5 and hour < 12:
366
  updating_macd = False
367
  return
 
29
  def __init__(self) -> None:
30
  pass
31
 
32
+ @staticmethod
33
+ def get_vn100(source: str = "database") -> dict:
34
+ try:
35
+ lst_symbols = []
36
+ if source == "database":
37
+ uri = os.environ.get("MONGODB_URI")
38
+ client = MongoClient(uri)
39
+ database = client.get_database("data")
40
+ collection = database.get_collection("rsi")
41
+ newest_record = collection.find_one()
42
+ lst_symbols = list(newest_record["value"].keys())
43
+ elif source == "hsx":
44
+ data = requests.get(VN100_URL).json()
45
+ data = data["rows"]
46
+ for value in data:
47
+ lst_symbols.append(value["cell"][2].strip())
48
+ return {"symbols": lst_symbols}
49
+ except Exception as e:
50
+ return {"message": f"Caught error {e}"}
51
+
52
  @staticmethod
53
  def update_daily_price() -> None:
54
  global updating_price
 
119
  hour = datetime_now.hour
120
  weekday = datetime_now.weekday()
121
  try:
122
+ symbol_dict = Indicator.get_vn100(source="hsx")
123
+ lst_symbols = symbol_dict["symbols"]
 
 
 
124
  if weekday < 5 and hour < 12:
125
  updating_price = False
126
  return
 
277
  hour = datetime_now.hour
278
  weekday = datetime_now.weekday()
279
  try:
280
+ symbol_dict = Indicator.get_vn100(source="hsx")
281
+ lst_symbols = symbol_dict["symbols"]
 
 
 
282
  if weekday < 5 and hour < 12:
283
  updating_rsi = False
284
  return
 
371
  hour = datetime_now.hour
372
  weekday = datetime_now.weekday()
373
  try:
374
+ symbol_dict = Indicator.get_vn100(source="hsx")
375
+ lst_symbols = symbol_dict["symbols"]
 
 
 
376
  if weekday < 5 and hour < 12:
377
  updating_macd = False
378
  return