Spaces:
Running
Running
camphong24032002
commited on
Commit
·
be1eeae
1
Parent(s):
5c36aa4
feat: get vn100 symbols
Browse files- models/index.py +11 -0
- routes/data.py +10 -0
- 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 |
-
|
103 |
-
|
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 |
-
|
264 |
-
|
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 |
-
|
361 |
-
|
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
|