diff --git a/openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py index aa41f969d03..d4035a7ec9d 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py @@ -1,17 +1,18 @@ """FMP Forex end of day fetcher.""" # IMPORT STANDARD -from datetime import date, datetime -from typing import Dict, List, Literal, Optional +from datetime import datetime +from typing import Dict, List, Optional # IMPORT INTERNAL from openbb_provider.model.abstract.data import Data, QueryParams +from openbb_provider.model.data.base import BaseSymbol from openbb_provider.model.data.forex_eod import ForexEODData, ForexEODQueryParams from openbb_provider.provider.abstract.fetcher import Fetcher -from openbb_provider.provider.provider_helpers import data_transformer, get_querystring +from openbb_provider.provider.provider_helpers import data_transformer # IMPORT THIRD-PARTY -from pydantic import Field, NonNegativeInt, validator +from pydantic import Field, validator from .helpers import get_data_many @@ -25,21 +26,9 @@ class FMPForexEODQueryParams(QueryParams): --------- symbol : str The symbol of the company. - start_date : date - The start date of the stock data from which to retrieve the data. - end_date : date - The end date of the stock data up to which to retrieve the data. - timeseries : Optional[int] - The number of days to look back. - series_type : Optional[Literal["line"]] - The type of the series. Only "line" is supported. """ symbol: str = Field(min_length=1) - series_type: Optional[Literal["line"]] = None - start_date: date - end_date: date - timeseries: Optional[NonNegativeInt] = None # Number of days to looks back class FMPForexEODData(Data): @@ -53,7 +42,7 @@ class FMPForexEODData(Data): unadjustedVolume: float change: float changePercent: float - vwap: float + vwap: Optional[float] label: str changeOverTime: float @@ -72,26 +61,19 @@ class FMPForexEODFetcher( ): @staticmethod def transform_query( - query: ForexEODQueryParams, - extra_params: Optional[Dict] = None, # pylint: disable=W0613 + query: ForexEODQueryParams, extra_params: Optional[Dict] = None ) -> FMPForexEODQueryParams: - now = datetime.now() - start_date = query.start_date if query.start_date else now - end_date = query.end_date if query.end_date else now return FMPForexEODQueryParams( symbol=query.symbol, - start_date=start_date, - end_date=end_date, + **extra_params or {}, ) @staticmethod def extract_data( query: FMPForexEODQueryParams, api_key: str ) -> List[FMPForexEODData]: - base_url = "https://financialmodelingprep.com/api/v3/" - query_str = get_querystring(query.dict(), ["symbol"]) - query_str = query_str.replace("start_date", "from").replace("end_date", "to") - url = f"{base_url}historical-price-full/{query.symbol}?{query_str}&apikey={api_key}" + base_url = "https://financialmodelingprep.com/api/v3" + url = f"{base_url}/historical-price-full/forex/{query.symbol}?&apikey={api_key}" return get_data_many(url, FMPForexEODData, "historical") @staticmethod diff --git a/openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py index 01f69a0eaa7..edd615d4c09 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py @@ -1,22 +1,24 @@ """Polygon forex end of day fetcher.""" # IMPORT STANDARD -from datetime import datetime, timedelta -from typing import Dict, List, Optional +from datetime import date, datetime, timedelta +from typing import Dict, List, Optional, Union, Literal # IMPORT INTERNAL +from openbb_provider.model.abstract.data import QueryParams from openbb_provider.model.data.forex_eod import ForexEODData, ForexEODQueryParams from openbb_provider.provider.abstract.fetcher import Fetcher from openbb_provider.provider.provider_helpers import data_transformer +from openbb_polygon.types import Timespan # IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.types import BaseStockData -class PolygonForexEODQueryParams(BaseStockQueryParams): +class PolygonForexEODQueryParams(QueryParams): """Polygon forex end of day query. Source: https://polygon.io/docs/forex/get_v2_aggs_ticker__forexticker__range__multiplier___timespan___from___to @@ -25,9 +27,9 @@ class PolygonForexEODQueryParams(BaseStockQueryParams): ---------- stocksTicker : str The ticker symbol of the stocks to fetch. - start_date : Union[date, datetime] + start_date : Union[date, datetime], optional The start date of the query. - end_date : Union[date, datetime] + end_date : Union[date, datetime], optional The end date of the query. timespan : Timespan, optional The timespan of the query, by default Timespan.day @@ -41,6 +43,15 @@ class PolygonForexEODQueryParams(BaseStockQueryParams): The multiplier of the query, by default 1 """ + stocksTicker: str = Field(alias="symbol") + start_date: Optional[Union[date, datetime]] + end_date: Optional[Union[date, datetime]] + timespan: Optional[Timespan] = Field(default=Timespan.day) + sort: Optional[Literal["asc", "desc"]] = Field(default="desc") + limit: Optional[PositiveInt] = Field(default=49999) + adjusted: Optional[bool] = Field(default=True) + multiplier: Optional[PositiveInt] = Field(default=1) + class PolygonForexEODData(BaseStockData): v: NonNegativeFloat = Field(alias="volume") @@ -60,24 +71,22 @@ class PolygonForexEODFetcher( def transform_query( query: ForexEODQueryParams, extra_params: Optional[Dict] = None ) -> PolygonForexEODQueryParams: - now = datetime.now() - start_date = query.start_date if query.start_date else now - timedelta(days=1) - end_date = query.end_date if query.end_date else now return PolygonForexEODQueryParams( symbol=query.symbol, - start_date=start_date, - end_date=end_date, - **extra_params if extra_params else {}, + **extra_params or {}, ) @staticmethod def extract_data( query: PolygonForexEODQueryParams, api_key: str ) -> List[PolygonForexEODData]: + now = datetime.now() + start_date = query.start_date or (now - timedelta(days=7)).date() + end_date = query.end_date or now.date() request_url = ( f"https://api.polygon.io/v2/aggs/ticker/" - f"C:{query.stocksTicker.upper()}/range/1/{query.timespan}/" - f"{query.start_date}/{query.end_date}?adjusted={query.adjusted}" + f"C:{query.stocksTicker.upper()}/range/1/{query.timespan.value}/" + f"{start_date}/{end_date}?adjusted={query.adjusted}" f"&sort={query.sort}&limit={query.limit}&multiplier={query.multiplier}" f"&apiKey={api_key}" ) diff --git a/openbb_sdk/sdk/provider/openbb_provider/model/data/forex_eod.py b/openbb_sdk/sdk/provider/openbb_provider/model/data/forex_eod.py index c54081c416d..e3a15399c2f 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/model/data/forex_eod.py +++ b/openbb_sdk/sdk/provider/openbb_provider/model/data/forex_eod.py @@ -1,12 +1,11 @@ """Forex aggregate end of day price data model.""" -from datetime import date, datetime +from datetime import datetime from typing import Optional -from pydantic import Field, NonNegativeFloat, PositiveFloat +from pydantic import NonNegativeFloat, PositiveFloat -from openbb_provider.metadata import DESCRIPTIONS from openbb_provider.model.abstract.data import Data, QueryParams from openbb_provider.model.data.base import BaseSymbol @@ -17,19 +16,9 @@ class ForexEODQueryParams(QueryParams, BaseSymbol): Parameter --------- symbol : str - The symbol of the company. - start_date : Optional[date] - The start date of the stock data from which to retrieve the data. - end_date : Optional[date] - The end date of the stock data up to which to retrieve the data. + The symbol of the forex currency pair. """ - start_date: date = Field( - description=DESCRIPTIONS.get("start_date", ""), - default=None, - ) - end_date: date = Field(description=DESCRIPTIONS.get("end_date", ""), default=None) - class ForexEODData(Data): """Forex end of day price data. @@ -37,19 +26,17 @@ class ForexEODData(Data): Returns ------- date : datetime - The date of the stock. + The date of the forex currency pair. open : PositiveFloat - The open price of the stock. + The open price of the forex currency pair. high : PositiveFloat - The high price of the stock. + The high price of the forex currency pair. low : PositiveFloat - The low price of the stock. + The low price of the forex currency pair. close : PositiveFloat - The close price of the stock. + The close price of the forex currency pair. adj_close : Optional[PositiveFloat] - The adjusted close price of the stock. - volume : PositiveFloat - The volume of the stock. + The adjusted close price of the forex currency pair. """ date: datetime