# twelvedata_api.py import requests import os class TwelveDataAPI: def __init__(self, api_key): self.api_key = api_key self.base_url = "https://api.twelvedata.com" def _make_request(self, endpoint, params): url = f"{self.base_url}/{endpoint}" params['apikey'] = self.api_key try: response = requests.get(url, params=params) response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx) return response.json() except requests.exceptions.HTTPError as errh: print(f"Http Error: {errh}") return {"error": f"HTTP Error: {errh}"} except requests.exceptions.ConnectionError as errc: print(f"Error Connecting: {errc}") return {"error": f"Error Connecting: {errc}"} except requests.exceptions.Timeout as errt: print(f"Timeout Error: {errt}") return {"error": f"Timeout Error: {errt}"} except requests.exceptions.RequestException as err: print(f"Something went wrong: {err}") return {"error": f"Something went wrong: {err}"} def get_stocks(self, symbol: str, exchange: str = "NASDAQ", country: str = "USA"): """ Tìm kiếm và liệt kê các cổ phiếu có mã tương tự. Args: symbol (str): Mã cổ phiếu để tìm kiếm. Returns: dict: Kết quả tìm kiếm từ TwelveData. """ print(f"Calling TwelveData /stocks for symbol: {symbol}") return self._make_request("stocks", {"symbol": symbol, "exchange": exchange, "country": country}) def get_time_series(self, symbol: str, interval: str = "1day", outputsize: int = 30): """ Lấy thông tin time-series của một cổ phiếu cụ thể. Args: symbol (str): Mã cổ phiếu (ví dụ: VNINDEX, AAPL). interval (str): Khoảng thời gian (ví dụ: "1min", "5min", "1day", "1week"). Mặc định "1day". outputsize (int): Số lượng điểm dữ liệu trả về. Mặc định 30. Returns: dict: Dữ liệu time-series từ TwelveData. """ print(f"Calling TwelveData /time-series for symbol: {symbol}, interval: {interval}, outputsize: {outputsize}") outputsize = int(outputsize) if outputsize > 120: outputsize = 120 if outputsize < 1: outputsize = 1 return self._make_request("time_series", { "symbol": symbol, "interval": interval, "outputsize": outputsize }) def currency_conversion(self, amount: float, symbol: str): """ Tìm thông tin quy đổi tiền tệ giữa 2 đơn vị. Args: amount (float): Số lượng tiền cần quy đổi. symbol (str): Cặp tiền tệ (ví dụ: USD/VND, EUR/GBP). Returns: dict: Kết quả quy đổi tiền tệ từ TwelveData. """ print(f"Calling TwelveData /currency_conversion for amount: {amount}, symbol: {symbol}") return self._make_request("currency_conversion", { "amount": amount, "symbol": symbol }) def get_all_stocks(self, exchange: str = "NASDAQ"): """ Lấy danh sách tất cả các cổ phiếu từ một sàn giao dịch cụ thể để cache. Lưu ý: API miễn phí có thể giới hạn, chúng ta lấy ví dụ sàn NASDAQ. Args: exchange (str): Sàn giao dịch để lấy mã. Returns: dict: Danh sách cổ phiếu. """ print(f"Calling TwelveData /stocks for ALL stocks") # API có thể trả về rất nhiều dữ liệu, nên giới hạn trong demo return self._make_request("stocks", {"exchange": exchange}) def get_forex_pairs(self): """ Lấy tất cả các cặp quy đổi tiền tệ có sẵn. Returns: dict: Danh sách các cặp tiền tệ. """ print("Calling TwelveData /forex_pairs") return self._make_request("forex_pairs", {})