Spaces:
Running
Running
camphong24032002
commited on
Commit
·
5c36aa4
1
Parent(s):
41875de
fix: return exception error
Browse files- models/price.py +9 -1
- routes/data.py +3 -1
- services/indicator.py +55 -31
models/price.py
CHANGED
|
@@ -1,5 +1,13 @@
|
|
| 1 |
-
from pydantic import BaseModel
|
| 2 |
|
| 3 |
|
| 4 |
class PricePayload(BaseModel):
|
| 5 |
symbol: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pydantic import BaseModel, validator
|
| 2 |
|
| 3 |
|
| 4 |
class PricePayload(BaseModel):
|
| 5 |
symbol: str
|
| 6 |
+
count_back: int = 150
|
| 7 |
+
source: str = "database"
|
| 8 |
+
|
| 9 |
+
@validator("source")
|
| 10 |
+
def valid_source(cls, v):
|
| 11 |
+
if v not in ["database", "vnstock"]:
|
| 12 |
+
raise ValueError('source must be database or vnstock')
|
| 13 |
+
return v
|
routes/data.py
CHANGED
|
@@ -61,7 +61,9 @@ async def update_entire_macd():
|
|
| 61 |
status_code=status.HTTP_200_OK
|
| 62 |
)
|
| 63 |
async def get_price_data(payload: PricePayload) -> Sequence[dict]:
|
| 64 |
-
price_df = Indicator.get_price(payload.symbol
|
|
|
|
|
|
|
| 65 |
if price_df is None:
|
| 66 |
return [{"message": "Error"}]
|
| 67 |
return json.loads(price_df.to_json(orient="records"))
|
|
|
|
| 61 |
status_code=status.HTTP_200_OK
|
| 62 |
)
|
| 63 |
async def get_price_data(payload: PricePayload) -> Sequence[dict]:
|
| 64 |
+
price_df = Indicator.get_price(payload.symbol,
|
| 65 |
+
payload.count_back,
|
| 66 |
+
payload.source)
|
| 67 |
if price_df is None:
|
| 68 |
return [{"message": "Error"}]
|
| 69 |
return json.loads(price_df.to_json(orient="records"))
|
services/indicator.py
CHANGED
|
@@ -155,27 +155,53 @@ class Indicator:
|
|
| 155 |
updating_price = False
|
| 156 |
|
| 157 |
@staticmethod
|
| 158 |
-
def get_price(symbol
|
|
|
|
|
|
|
| 159 |
try:
|
| 160 |
symbol = symbol.upper()
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
|
| 180 |
@staticmethod
|
| 181 |
def update_daily_rsi() -> None:
|
|
@@ -288,10 +314,7 @@ class Indicator:
|
|
| 288 |
client = MongoClient(uri)
|
| 289 |
database = client.get_database("data")
|
| 290 |
collection = database.get_collection("rsi")
|
| 291 |
-
|
| 292 |
-
records = list(collection.find())
|
| 293 |
-
except Exception as e:
|
| 294 |
-
print(f"Error: {e}")
|
| 295 |
record_df = pd.DataFrame(records).drop(columns=["_id"])
|
| 296 |
record_df = \
|
| 297 |
record_df[["time", symbol]].rename(columns={symbol: "rsi"})
|
|
@@ -303,8 +326,10 @@ class Indicator:
|
|
| 303 |
record_df["stoch_rsi_smooth_k"], smooth_d
|
| 304 |
)
|
| 305 |
return record_df
|
| 306 |
-
except Exception:
|
| 307 |
-
return
|
|
|
|
|
|
|
| 308 |
|
| 309 |
@staticmethod
|
| 310 |
def stoch_rsi(rsi: pd.Series, periods: int = 14) -> pd.Series:
|
|
@@ -384,16 +409,15 @@ class Indicator:
|
|
| 384 |
client = MongoClient(uri)
|
| 385 |
database = client.get_database("data")
|
| 386 |
collection = database.get_collection("macd")
|
| 387 |
-
|
| 388 |
-
records = list(collection.find())
|
| 389 |
-
except Exception as e:
|
| 390 |
-
print(f"Error: {e}")
|
| 391 |
record_df = pd.DataFrame(records).drop(columns=["_id"])
|
| 392 |
record_df = \
|
| 393 |
record_df[["time", symbol]].rename(columns={symbol: "macd"})
|
| 394 |
return record_df
|
| 395 |
-
except Exception:
|
| 396 |
-
return
|
|
|
|
|
|
|
| 397 |
|
| 398 |
@staticmethod
|
| 399 |
def get_ichimoku_cloud(
|
|
|
|
| 155 |
updating_price = False
|
| 156 |
|
| 157 |
@staticmethod
|
| 158 |
+
def get_price(symbol: str,
|
| 159 |
+
count_back: int = 150,
|
| 160 |
+
source: str = "database") -> pd.DataFrame:
|
| 161 |
try:
|
| 162 |
symbol = symbol.upper()
|
| 163 |
+
if source == "database":
|
| 164 |
+
uri = os.environ.get("MONGODB_URI")
|
| 165 |
+
client = MongoClient(uri)
|
| 166 |
+
database = client.get_database("data")
|
| 167 |
+
collection = database.get_collection("price")
|
| 168 |
+
result = list(collection.find())
|
| 169 |
+
tmp_df = pd.DataFrame(result[0]["value"])
|
| 170 |
+
lst_symbols = tmp_df["ticker"].values
|
| 171 |
+
if symbol not in lst_symbols:
|
| 172 |
+
return pd.DataFrame(
|
| 173 |
+
[{"message": "The symbol is not existed"}]
|
| 174 |
+
)
|
| 175 |
+
symbol_index = np.argwhere(lst_symbols == symbol)[0][0]
|
| 176 |
+
lst_values = []
|
| 177 |
+
for record in result:
|
| 178 |
+
value = record["value"][symbol_index]
|
| 179 |
+
value["time"] = record["time"]
|
| 180 |
+
lst_values.append(value)
|
| 181 |
+
return pd.DataFrame(lst_values)
|
| 182 |
+
elif source == "vnstock":
|
| 183 |
+
datetime_now = datetime.utcnow()
|
| 184 |
+
end_date = datetime_now.date()
|
| 185 |
+
delta = timedelta(days=count_back)
|
| 186 |
+
start_date = end_date - delta
|
| 187 |
+
start_date = start_date.strftime(DATE_FORMAT)
|
| 188 |
+
end_date = end_date.strftime(DATE_FORMAT)
|
| 189 |
+
df = longterm_ohlc_data(symbol,
|
| 190 |
+
start_date,
|
| 191 |
+
end_date,
|
| 192 |
+
resolution="D",
|
| 193 |
+
type="stock"
|
| 194 |
+
).reset_index(drop=True)
|
| 195 |
+
df[["open", "high", "low", "close"]] = \
|
| 196 |
+
df[["open", "high", "low", "close"]] * 1000
|
| 197 |
+
# convert open, high, low, close to int
|
| 198 |
+
df[["open", "high", "low", "close"]] = \
|
| 199 |
+
df[["open", "high", "low", "close"]].astype(int)
|
| 200 |
+
return df[["time", "ticker", "open", "high", "low", "close"]]
|
| 201 |
+
except Exception as e:
|
| 202 |
+
return pd.DataFrame(
|
| 203 |
+
[{"message": f"Caught error {e}"}]
|
| 204 |
+
)
|
| 205 |
|
| 206 |
@staticmethod
|
| 207 |
def update_daily_rsi() -> None:
|
|
|
|
| 314 |
client = MongoClient(uri)
|
| 315 |
database = client.get_database("data")
|
| 316 |
collection = database.get_collection("rsi")
|
| 317 |
+
records = list(collection.find())
|
|
|
|
|
|
|
|
|
|
| 318 |
record_df = pd.DataFrame(records).drop(columns=["_id"])
|
| 319 |
record_df = \
|
| 320 |
record_df[["time", symbol]].rename(columns={symbol: "rsi"})
|
|
|
|
| 326 |
record_df["stoch_rsi_smooth_k"], smooth_d
|
| 327 |
)
|
| 328 |
return record_df
|
| 329 |
+
except Exception as e:
|
| 330 |
+
return pd.DataFrame(
|
| 331 |
+
[{"message": f"Caught error {e}"}]
|
| 332 |
+
)
|
| 333 |
|
| 334 |
@staticmethod
|
| 335 |
def stoch_rsi(rsi: pd.Series, periods: int = 14) -> pd.Series:
|
|
|
|
| 409 |
client = MongoClient(uri)
|
| 410 |
database = client.get_database("data")
|
| 411 |
collection = database.get_collection("macd")
|
| 412 |
+
records = list(collection.find())
|
|
|
|
|
|
|
|
|
|
| 413 |
record_df = pd.DataFrame(records).drop(columns=["_id"])
|
| 414 |
record_df = \
|
| 415 |
record_df[["time", symbol]].rename(columns={symbol: "macd"})
|
| 416 |
return record_df
|
| 417 |
+
except Exception as e:
|
| 418 |
+
return pd.DataFrame(
|
| 419 |
+
[{"message": f"Caught error {e}"}]
|
| 420 |
+
)
|
| 421 |
|
| 422 |
@staticmethod
|
| 423 |
def get_ichimoku_cloud(
|