mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-04 00:12:29 +00:00
Fixed forex.load for FMP, Polygon compatibility
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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}"
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user