diff --git a/openbb_platform/core/openbb_core/provider/standard_models/compare_groups.py b/openbb_platform/core/openbb_core/provider/standard_models/compare_groups.py index 6a9a4da65bfa..e9a6782792fb 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/compare_groups.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/compare_groups.py @@ -1,26 +1,12 @@ """Compare Groups Model.""" -from typing import Optional - from openbb_core.provider.abstract.data import Data from openbb_core.provider.abstract.query_params import QueryParams -from pydantic import Field class CompareGroupsQueryParams(QueryParams): """Compare Groups Query.""" - group: Optional[str] = Field( - default=None, - description="The group to compare - i.e., 'sector', 'industry', 'country'. Choices vary by provider.", - ) - metric: Optional[str] = Field( - default=None, - description="The type of metrics to compare - i.e, 'valuation', 'performance'. Choices vary by provider.", - ) - class CompareGroupsData(Data): """Compare Groups Data.""" - - name: str = Field(description="Name or label of the group.") diff --git a/openbb_platform/core/openbb_core/provider/standard_models/futures_info.py b/openbb_platform/core/openbb_core/provider/standard_models/futures_info.py new file mode 100644 index 000000000000..3a10f2856281 --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/futures_info.py @@ -0,0 +1,18 @@ +"""Futures Info Standard Model.""" + +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.query_params import QueryParams +from openbb_core.provider.utils.descriptions import DATA_DESCRIPTIONS +from pydantic import Field + + +class FuturesInfoQueryParams(QueryParams): + """Futures Info Query.""" + + # leaving this empty to let the provider create custom symbol docstrings. + + +class FuturesInfoData(Data): + """Futures Instruments Data.""" + + symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", "")) diff --git a/openbb_platform/core/openbb_core/provider/standard_models/futures_instruments.py b/openbb_platform/core/openbb_core/provider/standard_models/futures_instruments.py new file mode 100644 index 000000000000..adb7141001ec --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/futures_instruments.py @@ -0,0 +1,12 @@ +"""Futures Instruments Standard Model.""" + +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.query_params import QueryParams + + +class FuturesInstrumentsQueryParams(QueryParams): + """Futures Instruments Query.""" + + +class FuturesInstrumentsData(Data): + """Futures Instruments Data.""" diff --git a/openbb_platform/dev_install.py b/openbb_platform/dev_install.py index b7e74a6fcf43..0690bfaf0543 100644 --- a/openbb_platform/dev_install.py +++ b/openbb_platform/dev_install.py @@ -147,7 +147,7 @@ def install_platform_local(_extras: bool = False): extras_args = ["-E", "all"] if _extras else [] subprocess.run( - CMD + ["lock", "--no-update"], + CMD + ["lock"], cwd=PLATFORM_PATH, check=True, ) @@ -192,7 +192,7 @@ def install_platform_cli(): CMD = [sys.executable, "-m", "poetry"] subprocess.run( - CMD + ["lock", "--no-update"], + CMD + ["lock"], cwd=CLI_PATH, check=True, # noqa: S603 ) diff --git a/openbb_platform/extensions/derivatives/integration/test_derivatives_api.py b/openbb_platform/extensions/derivatives/integration/test_derivatives_api.py index deb3e60fabc2..836ac4d62ec3 100644 --- a/openbb_platform/extensions/derivatives/integration/test_derivatives_api.py +++ b/openbb_platform/extensions/derivatives/integration/test_derivatives_api.py @@ -113,6 +113,15 @@ def test_derivatives_options_unusual(params, headers): "expiration": "2025-12", } ), + ( + { + "provider": "deribit", + "interval": "1d", + "symbol": "BTC,ETH", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), ], ) @pytest.mark.integration @@ -144,6 +153,7 @@ def test_derivatives_futures_historical(params, headers): "date": "2024-06-25", } ), + ({"provider": "deribit", "date": None, "symbol": "BTC", "hours_ago": 12}), ], ) @pytest.mark.integration @@ -164,7 +174,9 @@ def test_derivatives_futures_curve(params, headers): ({"provider": "intrinio", "date": None, "only_traded": True}), ], ) -@pytest.mark.integration +@pytest.mark.skip( + reason="This test is skipped because the download is excessively large." +) def test_derivatives_options_snapshots(params, headers): """Test the options snapshots endpoint.""" params = {p: v for p, v in params.items() if v} @@ -174,3 +186,39 @@ def test_derivatives_options_snapshots(params, headers): result = requests.get(url, headers=headers, timeout=60) assert isinstance(result, requests.Response) assert result.status_code == 200 + + +@parametrize( + "params", + [ + ({"provider": "deribit"}), + ], +) +@pytest.mark.integration +def test_derivatives_futures_instruments(params, headers): + """Test the futures instruments endpoint.""" + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/derivatives/futures/instruments?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + +@parametrize( + "params", + [ + ({"provider": "deribit", "symbol": "ETH-PERPETUAL"}), + ], +) +@pytest.mark.integration +def test_derivatives_futures_info(params, headers): + """Test the futures info endpoint.""" + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/derivatives/futures/info?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 diff --git a/openbb_platform/extensions/derivatives/integration/test_derivatives_python.py b/openbb_platform/extensions/derivatives/integration/test_derivatives_python.py index b261e35e8959..989a6bcd4367 100644 --- a/openbb_platform/extensions/derivatives/integration/test_derivatives_python.py +++ b/openbb_platform/extensions/derivatives/integration/test_derivatives_python.py @@ -114,6 +114,15 @@ def test_derivatives_options_unusual(params, obb): "expiration": "2025-12", } ), + ( + { + "provider": "deribit", + "interval": "1d", + "symbol": "BTC,ETH", + "start_date": "2023-01-01", + "end_date": "2023-06-06", + } + ), ], ) @pytest.mark.integration @@ -130,6 +139,7 @@ def test_derivatives_futures_historical(params, obb): [ ({"provider": "yfinance", "symbol": "ES", "date": None}), ({"provider": "cboe", "symbol": "VX", "date": "2024-06-25"}), + ({"provider": "deribit", "date": None, "symbol": "BTC", "hours_ago": 12}), ], ) @pytest.mark.integration @@ -147,10 +157,42 @@ def test_derivatives_futures_curve(params, obb): ({"provider": "intrinio", "date": None, "only_traded": True}), ], ) -@pytest.mark.integration +@pytest.mark.skip( + reason="This test is skipped because the download is excessively large." +) def test_derivatives_options_snapshots(params, obb): """Test the options snapshots endpoint.""" result = obb.derivatives.options.snapshots(**params) assert result assert isinstance(result, OBBject) assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ({"provider": "deribit"}), + ], +) +@pytest.mark.integration +def test_derivatives_futures_instruments(params, obb): + """Test the futures instruments endpoint.""" + result = obb.derivatives.futures.instruments(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ({"provider": "deribit", "symbol": "ETH-PERPETUAL"}), + ], +) +@pytest.mark.integration +def test_derivatives_futures_info(params, obb): + """Test the futures info endpoint.""" + result = obb.derivatives.futures.info(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 diff --git a/openbb_platform/extensions/derivatives/openbb_derivatives/derivatives_views.py b/openbb_platform/extensions/derivatives/openbb_derivatives/derivatives_views.py index ce1b4b909847..84dfbeda63cc 100644 --- a/openbb_platform/extensions/derivatives/openbb_derivatives/derivatives_views.py +++ b/openbb_platform/extensions/derivatives/openbb_derivatives/derivatives_views.py @@ -17,6 +17,8 @@ def derivatives_futures_historical( # noqa: PLR0912 # pylint: disable=import-outside-toplevel from openbb_charting.charts.price_historical import price_historical + kwargs.update({"candles": False, "same_axis": False}) + return price_historical(**kwargs) @staticmethod @@ -107,7 +109,8 @@ def derivatives_futures_curve( # noqa: PLR0912 provider = kwargs.get("provider", "") - df["expiration"] = df["expiration"].apply(to_datetime).dt.strftime("%b-%Y") + if provider != "deribit": + df["expiration"] = df["expiration"].apply(to_datetime).dt.strftime("%b-%Y") if ( provider == "cboe" @@ -163,6 +166,15 @@ def create_fig(figure, df, dates, color_count): if "date" in df.columns else ["Current"] ) + + if provider == "deribit" and "hours_ago" in df.columns: + dates = [ + str(d) + " Hours Ago" if d > 0 else "Current" + for d in df["hours_ago"].unique().tolist() + ] + df.loc[:, "date"] = df["hours_ago"].apply( + lambda x: str(x) + " Hours Ago" if x > 0 else "Current" + ) figure, color_count = create_fig(figure, df, dates, color_count) # Set the title for the chart @@ -176,7 +188,7 @@ def create_fig(figure, df, dates, color_count): ) if len(dates) == 1 and dates[0] != "Current": title = f"{title} for {dates[0]}" - elif provider == "yfinance": + else: title = f"{symbol.upper()} Futures Curve" # Use the supplied title, if any. diff --git a/openbb_platform/extensions/derivatives/openbb_derivatives/futures/futures_router.py b/openbb_platform/extensions/derivatives/openbb_derivatives/futures/futures_router.py index d9622df2a10e..7e456263a9b9 100644 --- a/openbb_platform/extensions/derivatives/openbb_derivatives/futures/futures_router.py +++ b/openbb_platform/extensions/derivatives/openbb_derivatives/futures/futures_router.py @@ -60,3 +60,38 @@ async def curve( ) -> OBBject: """Futures Term Structure, current or historical.""" return await OBBject.from_query(Query(**locals())) + + +@router.command( + model="FuturesInstruments", + examples=[ + APIEx(parameters={"provider": "deribit"}), + ], +) +async def instruments( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject: + """Get reference data for available futures instruments by provider.""" + return await OBBject.from_query(Query(**locals())) + + +@router.command( + model="FuturesInfo", + examples=[ + APIEx(parameters={"provider": "deribit", "symbol": "BTC"}), + APIEx(parameters={"provider": "deribit", "symbol": "SOLUSDC"}), + APIEx(parameters={"provider": "deribit", "symbol": "SOL_USDC-PERPETUAL"}), + APIEx(parameters={"provider": "deribit", "symbol": "BTC,ETH"}), + ], +) +async def info( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject: + """Get current trading statistics by futures contract symbol.""" + return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/providers/deribit/README.md b/openbb_platform/providers/deribit/README.md index af2e097201f8..c391522e7633 100644 --- a/openbb_platform/providers/deribit/README.md +++ b/openbb_platform/providers/deribit/README.md @@ -10,3 +10,36 @@ - SOL - BNB - PAXG +- obb.derivatives.futures.curve + - Support for symbols: + - BTC + - ETH + - PAXG +- obb.derivatives.futures.historical + - Support for symbols (Perpetual Futures): + - ADAUSDC + - ALGOUSDC + - AVAXUSDC + - BCHUSDC + - BNBUSDC + - BTC + - BTCUSDC + - BTCUSDT + - DOGEUSDC + - DOTUSDC + - ETH + - ETHUSDC + - ETHUSDT + - LINKUSDC + - LTCUSDC + - NEARUSDC + - PAXGUSDC + - SOLUSDC + - TRXUSDC + - UNIUSDC + - XRPUSDC + - Additional symbols include all Deribit instrument names of current open contracts for BTC, ETH, and PAXG futures. +- obb.derivatives.futures.instruments + - Reference data for all current futures instruments. +- obb.derivatives.futures.info + - Key stats by symbol (multiple items allowed). diff --git a/openbb_platform/providers/deribit/openbb_deribit/__init__.py b/openbb_platform/providers/deribit/openbb_deribit/__init__.py index c09d418bf07c..ac4d98966bb7 100644 --- a/openbb_platform/providers/deribit/openbb_deribit/__init__.py +++ b/openbb_platform/providers/deribit/openbb_deribit/__init__.py @@ -1,7 +1,10 @@ """OpenBB Deribit Provider Module.""" from openbb_core.provider.abstract.provider import Provider - +from openbb_deribit.models.futures_curve import DeribitFuturesCurveFetcher +from openbb_deribit.models.futures_historical import DeribitFuturesHistoricalFetcher +from openbb_deribit.models.futures_info import DeribitFuturesInfoFetcher +from openbb_deribit.models.futures_instruments import DeribitFuturesInstrumentsFetcher from openbb_deribit.models.options_chains import DeribitOptionsChainsFetcher deribit_provider = Provider( @@ -9,7 +12,13 @@ website="https://deribit.com/", description="""Unofficial Python client for public data published by Deribit.""", credentials=None, - fetcher_dict={"OptionsChains": DeribitOptionsChainsFetcher}, + fetcher_dict={ + "FuturesCurve": DeribitFuturesCurveFetcher, + "FuturesHistorical": DeribitFuturesHistoricalFetcher, + "FuturesInfo": DeribitFuturesInfoFetcher, + "FuturesInstruments": DeribitFuturesInstrumentsFetcher, + "OptionsChains": DeribitOptionsChainsFetcher, + }, repr_name="Deribit Public Data", instructions="This provider does not require any credentials and is not meant for trading.", ) diff --git a/openbb_platform/providers/deribit/openbb_deribit/models/futures_curve.py b/openbb_platform/providers/deribit/openbb_deribit/models/futures_curve.py new file mode 100644 index 000000000000..364c5c972269 --- /dev/null +++ b/openbb_platform/providers/deribit/openbb_deribit/models/futures_curve.py @@ -0,0 +1,186 @@ +"""Deribit Futures Curve Model.""" + +# pylint: disable=unused-argument + +from typing import Any, Optional, Union + +from openbb_core.app.model.abstract.error import OpenBBError +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.futures_curve import ( + FuturesCurveData, + FuturesCurveQueryParams, +) +from openbb_core.provider.utils.descriptions import ( + QUERY_DESCRIPTIONS, +) +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_deribit.utils.helpers import ( + DERIBIT_FUTURES_CURVE_SYMBOLS, + FuturesCurveSymbols, +) +from pydantic import Field, field_validator, model_validator + + +class DeribitFuturesCurveQueryParams(FuturesCurveQueryParams): + """ + Deribit Futures Curve Query. + + Source: https://docs.deribit.com/?shell#public-ticker + """ + + __json_schema_extra__ = { + "symbol": { + "multiple_items_allowed": False, + "choices": DERIBIT_FUTURES_CURVE_SYMBOLS, + }, + "hours_ago": { + "multiple_items_allowed": True, + }, + } + + symbol: FuturesCurveSymbols = Field( + default="BTC", + description=QUERY_DESCRIPTIONS.get("symbol", "") + + " Default is 'btc' Supported symbols are: ['btc', 'eth', 'paxg']", + ) + hours_ago: Optional[Union[int, list[int], str]] = Field( + default=None, + description="Compare the current curve with the specified number of hours ago. Default is None.", + ) + + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def validate_symbol(cls, v): + """Validate the symbol.""" + symbol = v.upper() + if symbol not in DERIBIT_FUTURES_CURVE_SYMBOLS: + raise ValueError( + f"Invalid Deribit symbol, {symbol}. Supported symbols are: {', '.join(DERIBIT_FUTURES_CURVE_SYMBOLS)}" + ) + return symbol + + @field_validator("hours_ago", mode="before", check_fields=False) + @classmethod + def _validate_hours_ago(cls, v): + """Validate hours ago.""" + if isinstance(v, str): + return v + if isinstance(v, int): + return v + if isinstance(v, list): + return ",".join([str(i) for i in v]) + return None + + @model_validator(mode="before") + @classmethod + def _validate_model(cls, values): + """Validate the model.""" + if values.get("date"): + raise ValueError( + "Date field is not supported for Deribit provider. Use 'hours_ago' instead." + ) + return values + + +class DeribitFuturesCurveData(FuturesCurveData): + """Deribit Futures Curve Data.""" + + hours_ago: Optional[int] = Field( + default=None, + description="The number of hours ago represented by the price." + + " Only available when hours_ago is set in the query.", + ) + + +class DeribitFuturesCurveFetcher( + Fetcher[DeribitFuturesCurveQueryParams, list[DeribitFuturesCurveData]] +): + """Deribit Futures Curve Fetcher.""" + + @staticmethod + def transform_query(params: dict[str, Any]) -> DeribitFuturesCurveQueryParams: + """Transform query params.""" + return DeribitFuturesCurveQueryParams(**params) + + @staticmethod + async def aextract_data( + query: DeribitFuturesCurveQueryParams, + credentials: Optional[dict[str, str]], + **kwargs: Any, + ) -> list: + """Extract the raw data.""" + # pylint: disable=import-outside-toplevel + import asyncio # noqa + from openbb_deribit.utils.helpers import ( + get_futures_curve_symbols, + get_ticker_data, + get_futures_curve_by_hours_ago, + ) + + try: + symbols = await get_futures_curve_symbols(query.symbol) + tasks = [get_ticker_data(s) for s in symbols] + data = await asyncio.gather(*tasks, return_exceptions=True) + + if query.hours_ago is not None: + num_hours = query.hours_ago + + hours_ago = ( + [int(d) for d in num_hours.split(",")] + if isinstance(num_hours, str) + else [int(num_hours)] if isinstance(num_hours, int) else num_hours + ) + + for hours in hours_ago: + hours_data = await get_futures_curve_by_hours_ago( + query.symbol, hours + ) + if hours_data: + data.extend(hours_data) + return data + except Exception as e: # pylint: disable=broad-except + raise OpenBBError( + f"Failed to get futures curve -> {e.__class__.__name__ if hasattr(e, '__class__') else e}: {e.args}" + ) from e + + @staticmethod + def transform_data( + query: DeribitFuturesCurveQueryParams, data: list, **kwargs: Any + ) -> list[DeribitFuturesCurveData]: + """Transform the data.""" + # pylint: disable=import-outside-toplevel + from datetime import datetime # noqa + from pandas import to_datetime + + if not data: + raise EmptyDataError("No data found") + + futures_curve: list[DeribitFuturesCurveData] = [] + + for d in data: + + if not d: + continue + + ins_name = d.get("instrument_name", "") + exp = ins_name.split("-")[1] + hours_ago = d.get("hours_ago", 0) + exp = ( + datetime.today().strftime("%Y-%m-%d") + if exp == "PERPETUAL" + else to_datetime(exp).strftime("%Y-%m-%d") + ) + + price = d.get("last_price", d.get("mark_price")) + + result = {"expiration": exp, "price": price} + if query.hours_ago: + result["hours_ago"] = hours_ago + + if price: + futures_curve.append(DeribitFuturesCurveData.model_validate(result)) + + if not futures_curve: + raise EmptyDataError("No data found.") + + return sorted(futures_curve, key=lambda x: x.expiration) diff --git a/openbb_platform/providers/deribit/openbb_deribit/models/futures_historical.py b/openbb_platform/providers/deribit/openbb_deribit/models/futures_historical.py new file mode 100644 index 000000000000..b5b7394ac419 --- /dev/null +++ b/openbb_platform/providers/deribit/openbb_deribit/models/futures_historical.py @@ -0,0 +1,155 @@ +"""Deribit Futures Historical Model.""" + +# pylint: disable=unused-argument + +from datetime import datetime, timedelta +from typing import Any, Optional + +from openbb_core.app.model.abstract.error import OpenBBError +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.futures_historical import ( + FuturesHistoricalData, + FuturesHistoricalQueryParams, +) +from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_deribit.utils.helpers import DERIBIT_INTERVALS, DeribitIntervals +from pydantic import Field, field_validator, model_validator + + +class DeribitFuturesHistoricalQueryParams(FuturesHistoricalQueryParams): + """ + Deribit Futures historical Price Query. + + Source: https://docs.deribit.com/?shell#public-get_tradingview_chart_data + """ + + __json_schema_extra__ = { + "symbol": {"multiple_items_allowed": True}, + "interval": { + "multiple_items_allowed": False, + "choices": DERIBIT_INTERVALS, + }, + } + + interval: DeribitIntervals = Field( + default="1d", description=QUERY_DESCRIPTIONS.get("interval", "") + ) + + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def _validate_symbol(cls, v): + """Validate the symbol.""" + # pylint: disable=import-outside-toplevel + from openbb_core.provider.utils.helpers import run_async + from openbb_deribit.utils.helpers import ( + get_futures_symbols, + get_perpetual_symbols, + ) + + if not v: + raise ValueError("Symbol is required.") + + futures_symbols = run_async(get_futures_symbols) + perpetual_symbols = run_async(get_perpetual_symbols) + all_symbols = list(perpetual_symbols) + futures_symbols + symbols = v.upper().split(",") + new_symbols: list = [] + + for symbol in symbols: + if symbol not in all_symbols: + raise ValueError( + f"Invalid Deribit symbol: {symbol}. Supported symbols are: {', '.join(all_symbols)}" + ) + if symbol in perpetual_symbols: + new_symbols.append(perpetual_symbols[symbol]) + else: + new_symbols.append(symbol) + + return ",".join(new_symbols) + + @model_validator(mode="before") + @classmethod + def _validate_model(cls, values): + """Validate the model.""" + interval = values.get("interval") + now = datetime.today() + + if not values.get("start_date"): + if interval == "1m": + start = now - timedelta(days=30) + elif interval in ["3m", "5m"]: + start = now - timedelta(days=60) + elif interval in ["15m", "30m"]: + start = now - timedelta(days=90) + else: + start = now - timedelta(days=364) + + values["start_date"] = start.strftime("%Y-%m-%d") + + if not values.get("end_date"): + values["end_date"] = (now + timedelta(days=1)).strftime("%Y-%m-%d") + + return values + + +class DeribitFuturesHistoricalData(FuturesHistoricalData): + """Deribit Futures Historical Data.""" + + volume_notional: float = Field(description="Trading volume in quote currency.") + + +class DeribitFuturesHistoricalFetcher( + Fetcher[DeribitFuturesHistoricalQueryParams, list[DeribitFuturesHistoricalData]] +): + """Deribit Futures Historical Fetcher.""" + + @staticmethod + def transform_query(params: dict[str, Any]) -> DeribitFuturesHistoricalQueryParams: + """Transform the query.""" + return DeribitFuturesHistoricalQueryParams(**params) + + @staticmethod + async def aextract_data( + query: DeribitFuturesHistoricalQueryParams, + credentials: Optional[dict[str, str]], + **kwargs: Any, + ) -> list: + """Extract the raw data.""" + # pylint: disable=import-outside-toplevel + from openbb_deribit.utils.helpers import get_ohlc_data + + symbols = query.symbol.split(",") + results: list = [] + + for symbol in symbols: + try: + data = await get_ohlc_data( + symbol=symbol, + interval=query.interval, + start_date=query.start_date, + end_date=query.end_date, + ) + if data: + results.extend(data) + except OpenBBError as e: + raise e from e + + if not results: + raise EmptyDataError("No data found.") + + return sorted(results, key=lambda x: x["date"]) + + @staticmethod + def transform_data( + query: DeribitFuturesHistoricalQueryParams, data: list, **kwargs: Any + ) -> list[DeribitFuturesHistoricalData]: + """Transform the data.""" + symbols = query.symbol.split(",") + if len(symbols) == 1: + results: list[DeribitFuturesHistoricalData] = [] + for d in data: + _ = d.pop("symbol", None) + results.append(DeribitFuturesHistoricalData.model_validate(d)) + return [DeribitFuturesHistoricalData.model_validate(d) for d in data] + return [DeribitFuturesHistoricalData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/deribit/openbb_deribit/models/futures_info.py b/openbb_platform/providers/deribit/openbb_deribit/models/futures_info.py new file mode 100644 index 000000000000..9f79f0e1d678 --- /dev/null +++ b/openbb_platform/providers/deribit/openbb_deribit/models/futures_info.py @@ -0,0 +1,224 @@ +"""Deribit Futures Info Models.""" + +# pylint: disable=unused-argument + +from datetime import datetime +from typing import Any, Literal, Optional + +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.futures_info import ( + FuturesInfoData, + FuturesInfoQueryParams, +) +from openbb_core.provider.utils.descriptions import ( + DATA_DESCRIPTIONS, + QUERY_DESCRIPTIONS, +) +from pydantic import ConfigDict, Field, field_validator + + +class DeribitFuturesInfoQueryParams(FuturesInfoQueryParams): + """Deribit Futures Instruments Query.""" + + __json_schema_extra__ = { + "symbol": {"multiple_items_allowed": True}, + } + + symbol: str = Field( + description=QUERY_DESCRIPTIONS.get("symbol", "") + + " Perpetual contracts can be referenced by their currency pair - i.e, SOLUSDC" + + " - or by their official Deribit symbol - i.e, SOL_USDC-PERPETUAL" + + " For a list of currently available instruments, use `derivatives.futures.instruments()`" + ) + + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def _validate_symbol(cls, v): + """Validate the symbol.""" + # pylint: disable=import-outside-toplevel + from openbb_core.provider.utils.helpers import run_async + from openbb_deribit.utils.helpers import ( + get_futures_symbols, + get_perpetual_symbols, + ) + + symbols = v.split(",") + new_symbols: list = [] + perpetual_symbols = run_async(get_perpetual_symbols) + futures_symbols = run_async(get_futures_symbols) + all_symbols = futures_symbols + list(perpetual_symbols) + + for s in symbols: + if s not in all_symbols: + raise ValueError( + f"Invalid symbol: {s}. Valid symbols are: {all_symbols}" + ) + if s in perpetual_symbols: + new_symbols.append(perpetual_symbols[s]) + else: + new_symbols.append(s) + + return ",".join(new_symbols) + + +class DeribitFuturesInfoData(FuturesInfoData): + """Deribit Futures Info Data.""" + + __alias_dict__ = { + "symbol": "instrument_name", + "change_percent": "price_change", + } + model_config = ConfigDict(extra="ignore") + + symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", "")) + state: Literal["open", "closed"] = Field( + description="The state of the order book. Possible values are open and closed." + ) + open_interest: float = Field( + description="The total amount of outstanding contracts in the corresponding amount units." + ) + index_price: float = Field( + description="Current index (reference) price", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + best_ask_amount: Optional[float] = Field( + default=None, + description="It represents the requested order size of all best asks", + ) + best_ask_price: Optional[float] = Field( + default=None, + description="The current best ask price, null if there aren't any asks", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + best_bid_price: Optional[float] = Field( + default=None, + description="The current best bid price, null if there aren't any bids", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + best_bid_amount: Optional[float] = Field( + default=None, + description="It represents the requested order size of all best bids", + ) + last_price: Optional[float] = Field( + default=None, + description="The price for the last trade", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + high: Optional[float] = Field( + default=None, + description="Highest price during 24h", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + low: Optional[float] = Field( + default=None, + description="Lowest price during 24h", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + change_percent: Optional[float] = Field( + default=None, + description="24-hour price change expressed as a percentage, null if there weren't any trades", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + volume: Optional[float] = Field( + default=None, + description="Volume during last 24h in base currency", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + volume_usd: Optional[float] = Field( + default=None, + description="Volume in USD", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + mark_price: float = Field( + description="The mark price for the instrument", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + settlement_price: Optional[float] = Field( + default=None, + description="The settlement price for the instrument. Only when state = open", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + delivery_price: Optional[float] = Field( + default=None, + description="The settlement price for the instrument. Only when state = closed.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + estimated_delivery_price: float = Field( + description="Estimated delivery price for the market.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + current_funding: Optional[float] = Field( + default=None, + description="Current funding (perpetual only)", + ) + funding_8h: Optional[float] = Field( + default=None, + description="Funding 8h (perpetual only)", + ) + interest_value: Optional[float] = Field( + default=None, + description="Value used to calculate realized_funding in positions (perpetual only)", + ) + max_price: float = Field( + description="The maximum price for the future." + + " Any buy orders submitted higher than this price, will be clamped to this maximum.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + min_price: float = Field( + description="The minimum price for the future." + + " Any sell orders submitted lower than this price will be clamped to this minimum.", + json_schema_extra={"x-unit_measurement": "currency"}, + ) + timestamp: datetime = Field(description="The timestamp of the data.") + + @field_validator("change_percent", mode="before", check_fields=False) + @classmethod + def _validate_change_percent(cls, v): + """Validate the change percent.""" + return v / 100 if v else v + + +class DeribitFuturesInfoFetcher( + Fetcher[DeribitFuturesInfoQueryParams, list[DeribitFuturesInfoData]] +): + """Deribit Futures Info Fetcher.""" + + @staticmethod + def transform_query(params: dict[str, Any]) -> DeribitFuturesInfoQueryParams: + """Transform the query.""" + return DeribitFuturesInfoQueryParams(**params) + + @staticmethod + async def aextract_data( + query: DeribitFuturesInfoQueryParams, + credentials: Optional[dict[str, str]], + **kwargs: Any, + ) -> list: + """Extract data from the response.""" + # pylint: disable=import-outside-toplevel + import asyncio # noqa + from openbb_core.provider.utils.errors import EmptyDataError, OpenBBError + from openbb_deribit.utils.helpers import get_ticker_data + + result: list = [] + symbols = query.symbol.split(",") + try: + tasks = [get_ticker_data(symbol) for symbol in symbols] + for task in asyncio.as_completed(tasks, timeout=10): + result.append(await task) + except Exception as e: # pylint: disable=broad-except + raise OpenBBError(f"Error fetching data: {e}") from e + + if not result: + raise EmptyDataError("No data found for the given symbol(s).") + + return sorted(result, key=lambda x: symbols.index(x["instrument_name"])) + + @staticmethod + def transform_data( + query: DeribitFuturesInfoQueryParams, + data: list, + **kwargs: Any, + ) -> list[DeribitFuturesInfoData]: + """Transform the data.""" + return [DeribitFuturesInfoData(**d) for d in data] diff --git a/openbb_platform/providers/deribit/openbb_deribit/models/futures_instruments.py b/openbb_platform/providers/deribit/openbb_deribit/models/futures_instruments.py new file mode 100644 index 000000000000..91c4113ec678 --- /dev/null +++ b/openbb_platform/providers/deribit/openbb_deribit/models/futures_instruments.py @@ -0,0 +1,133 @@ +"""Deribit Futures Instruments Model.""" + +# pylint: disable=unused-argument + +from datetime import datetime +from typing import Any, Optional + +from openbb_core.app.model.abstract.error import OpenBBError +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.futures_instruments import ( + FuturesInstrumentsData, + FuturesInstrumentsQueryParams, +) +from openbb_core.provider.utils.descriptions import DATA_DESCRIPTIONS +from pydantic import ConfigDict, Field, field_validator + + +class DeribitFuturesInstrumentsQueryParams(FuturesInstrumentsQueryParams): + """Deribit Futures Instruments Query.""" + + +class DeribitFuturesInstrumentData(FuturesInstrumentsData): + """Deribit Futures Instrument Data.""" + + __alias_dict__ = { + "symbol": "instrument_name", + } + + model_config = ConfigDict(extra="ignore") + + instrument_id: int = Field(description="Deribit Instrument ID") + symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", "")) + base_currency: str = Field(description="The underlying currency being traded.") + counter_currency: str = Field(description="Counter currency for the instrument.") + quote_currency: str = Field( + description="The currency in which the instrument prices are quoted." + ) + settlement_currency: Optional[str] = Field( + default=None, description="Settlement currency for the instrument." + ) + future_type: str = Field(description="Type of the instrument. linear or reversed") + settlement_period: Optional[str] = Field( + default=None, description="The settlement period." + ) + price_index: str = Field( + description="Name of price index that is used for this instrument" + ) + contract_size: float = Field(description="Contract size for instrument.") + is_active: bool = Field( + description="Indicates if the instrument can currently be traded." + ) + creation_timestamp: datetime = Field( + description="The time when the instrument was first created (milliseconds since the UNIX epoch)." + ) + expiration_timestamp: Optional[datetime] = Field( + default=None, + description="The time when the instrument will expire (milliseconds since the UNIX epoch).", + ) + tick_size: float = Field( + description="Specifies minimal price change and, as follows, the number of decimal places for instrument prices." + ) + min_trade_amount: float = Field( + description="Minimum amount for trading, in USD units." + ) + max_leverage: int = Field(description="Maximal leverage for instrument.") + max_liquidation_commission: float = Field( + description="Maximal liquidation trade commission for instrument." + ) + block_trade_commission: float = Field( + description="Block Trade commission for instrument." + ) + block_trade_min_trade_amount: float = Field( + description="Minimum amount for block trading." + ) + block_trade_tick_size: float = Field( + description="Specifies minimal price change for block trading." + ) + + maker_commission: Optional[float] = Field( + default=None, description="Maker commission for instrument." + ) + taker_commission: Optional[float] = Field( + default=None, description="Taker commission for instrument." + ) + + @field_validator("expiration_timestamp", mode="before", check_fields=False) + @classmethod + def _validate_expiration(cls, v): + """Validate the expiration timestamp.""" + if int(v) == 32503708800000: + return None + return v + + +class DeribitFuturesInstrumentsFetcher( + Fetcher[DeribitFuturesInstrumentsQueryParams, list[DeribitFuturesInstrumentData]] +): + """Deribit Futures Instruments Fetcher.""" + + @staticmethod + def transform_query(params: dict[str, Any]) -> DeribitFuturesInstrumentsQueryParams: + """Transform the query.""" + return DeribitFuturesInstrumentsQueryParams(**params) + + @staticmethod + async def aextract_data( + query: DeribitFuturesInstrumentsQueryParams, + credentials: Optional[dict[str, str]], + **kwargs: Any, + ) -> list: + """Extract data from Deribit API.""" + # pylint: disable=import-outside-toplevel + from openbb_deribit.utils.helpers import get_instruments + + try: + data = await get_instruments("all", "future") + except Exception as e: # pylint: disable=broad-except + raise OpenBBError(f"Error fetching data: {e}") from e + if not data: + raise OpenBBError( + "There was an error with the request and it was returned empty." + ) + + return data + + @staticmethod + def transform_data( + query: DeribitFuturesInstrumentsQueryParams, + data: list, + **kwargs: Any, + ) -> list[DeribitFuturesInstrumentData]: + """Transform the data.""" + return [DeribitFuturesInstrumentData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/deribit/openbb_deribit/utils/helpers.py b/openbb_platform/providers/deribit/openbb_deribit/utils/helpers.py index 1cddcf297eb7..f388283cb9b0 100644 --- a/openbb_platform/providers/deribit/openbb_deribit/utils/helpers.py +++ b/openbb_platform/providers/deribit/openbb_deribit/utils/helpers.py @@ -1,6 +1,6 @@ """Deribit Helpers Module.""" -from typing import Literal, Optional +from typing import Literal, Optional, Union from async_lru import alru_cache from openbb_core.app.model.abstract.error import OpenBBError @@ -11,13 +11,48 @@ Currencies = Literal["BTC", "ETH", "USDC", "USDT", "EURR", "all"] DERIVATIVE_TYPES = ["future", "option", "spot", "future_combo", "option_combo"] DerivativeTypes = Literal["future", "option", "spot", "future_combo", "option_combo"] +DERIBIT_FUTURES_CURVE_SYMBOLS = ["BTC", "ETH", "PAXG"] +FuturesCurveSymbols = Literal["BTC", "ETH", "PAXG"] BASE_URL = "https://www.deribit.com" +DERIBIT_INTERVALS = [ + "1m", + "3m", + "5m", + "10m", + "15m", + "30m", + "1h", + "2h", + "3h", + "6h", + "12h", + "1d", +] +DeribitIntervals = Literal[ + "1m", "3m", "5m", "10m", "15m", "30m", "1h", "2h", "3h", "6h", "12h", "1d" +] +INTERVAL_MAP = { + "1m": "1", + "3m": "3", + "5m": "5", + "10m": "10", + "15m": "15", + "30m": "30", + "1h": "60", + "2h": "120", + "3h": "180", + "6h": "360", + "12h": "720", + "1d": "1D", +} + @alru_cache(maxsize=64) async def get_instruments( currency: Currencies = "BTC", derivative_type: Optional[DerivativeTypes] = None, + expired: bool = False, ) -> list[dict]: """ Get Deribit instruments. @@ -51,6 +86,9 @@ async def get_instruments( if derivative_type is not None: url += f"&kind={derivative_type}" + if expired: + url += f"&expired={str(expired).lower()}" + try: response = await amake_request(url) return response.get("result", []) # type: ignore @@ -67,7 +105,7 @@ async def get_options_symbols(symbol: OptionsSymbols = "BTC") -> dict: Parameters ---------- symbol : OptionsSymbols - The underlying symbol to get options for. Default is "BTC". + The underlying symbol to get options for. Default is "btc". Returns ------- @@ -109,3 +147,256 @@ async def get_options_symbols(symbol: OptionsSymbols = "BTC") -> dict: expirations[item[0]] = item[1] return {k: [d for d in all_options if v in d] for k, v in expirations.items()} + + +async def get_futures_curve_symbols(symbol: FuturesCurveSymbols = "BTC") -> list[str]: + """ + Get a list of futures symbols for a given symbol. + + Parameters + ---------- + symbol : FuturesCurveSymbols + The symbol to get futures symbols for. + + Returns + ------- + list[str] + A list of futures symbols. + """ + symbol = symbol.upper() # type: ignore + if symbol not in DERIBIT_FUTURES_CURVE_SYMBOLS: + raise ValueError( + f"Invalid Deribit symbol. Supported symbols are: {', '.join(DERIBIT_FUTURES_CURVE_SYMBOLS)}", + ) + + currency = "USDC" if symbol == "PAXG" else symbol + instruments = await get_instruments(currency, "future") + + symbols: list = [] + for d in instruments: + ins_name = d.get("instrument_name", "") + if ins_name.startswith(symbol): + symbols.append(ins_name) + + return symbols + + +async def get_ticker_data(symbol: str) -> dict: + """ + Get ticker data. + + Parameters + ---------- + symbol : str + The symbol to get ticker data for. + + Returns + ------- + dict + The ticker data. + """ + # pylint: disable=import-outside-toplevel + from openbb_core.provider.utils.helpers import amake_request + + url = f"{BASE_URL}/api/v2/public/ticker?instrument_name={symbol}" + + try: + response = await amake_request(url) + if response.get("error"): + raise OpenBBError(response.get("error")) + data = response.get("result", {}) + stats = data.pop("stats", {}) + return {**data, **stats} + + except Exception as e: # pylint: disable=broad-except + raise OpenBBError(f"Failed to get ticker data -> {e}: {e.args[0]}") from e + + +async def get_perpetual_symbols() -> dict: + """ + Get perpetual symbols. + + Returns + ------- + dict + A dictionary of short symbols to full perpetual symbols. + """ + instruments = await get_instruments("all", "future") + return { + d["instrument_name"].split("-")[0].replace("_", ""): d["instrument_name"] + for d in instruments + if d.get("settlement_period") == "perpetual" + } + + +async def get_ohlc_data( + symbol: str, start_date: str, end_date: str, interval: DeribitIntervals = "1d" +) -> list[dict]: + """Get OHLC data for a given symbol. Enter dates in the format 'YYYY-MM-DD'.""" + # pylint: disable=import-outside-toplevel + import asyncio # noqa + from openbb_core.provider.utils.errors import EmptyDataError + from openbb_core.provider.utils.helpers import amake_request + from pandas import DataFrame, date_range, to_datetime + + new_interval = INTERVAL_MAP.get(interval, interval) + + all_instruments = await get_instruments("all", None) + all_symbols = { + d.get("instrument_name"): d.get("creation_timestamp") for d in all_instruments + } + creation_date = all_symbols.get(symbol, 0) + use_start = to_datetime(start_date).timestamp() * 1000 > creation_date + + if creation_date == 0: + raise ValueError(f"Symbol {symbol} not found") + + def generate_urls(symbol, start_date, end_date, interval, window_size=5000): + """Generate urls for historical data breaking it down into requests of length window_size.""" + interval_period = f"{interval}min" if interval.lower() != "1d" else "1d" + interval = "1D" if interval.lower() == "1d" else interval + dates = date_range( + start=start_date if use_start else creation_date, + end=end_date, + freq=interval_period, + ) + windows = [ + (dates[i], dates[min(i + window_size, len(dates) - 1)]) + for i in range(0, len(dates), window_size) + ] + urls: list = [] + for start, end in windows: + start_timestamp = int(start.timestamp() * 1000) + end_timestamp = int(end.timestamp() * 1000) + url = ( + "https://www.deribit.com/api/v2/public/get_tradingview_chart_data?" + f"instrument_name={symbol}&start_timestamp={start_timestamp}&" + f"end_timestamp={end_timestamp}&resolution={interval}" + ) + urls.append(url) + + return urls + + results: list = [] + + async def get_one(url): + """Get data from one url.""" + json_response = await amake_request(url) + if json_response.get("error"): + raise ValueError(json_response["error"]) + if json_response.get("result"): + result = json_response["result"] + df = DataFrame(result) + df = ( + df.drop(columns=["status"]) + .rename(columns={"ticks": "date", "cost": "volume_notional"}) + .convert_dtypes() + ) + df.date = to_datetime(df.date, unit="ms", origin="unix", utc=True) + if interval == "1D": + df.date = df.date.dt.date + df.loc[:, "symbol"] = symbol + results.extend( + df[ + [ + "date", + "symbol", + "open", + "high", + "low", + "close", + "volume", + "volume_notional", + ] + ].to_dict(orient="records") + ) + + urls = generate_urls(symbol, start_date, end_date, new_interval) + + if len(urls) > 15: + raise OpenBBError( + "The request is too large. Break up the request into smaller chunks." + ) + + tasks = [get_one(url) for url in urls] + + await asyncio.gather(*tasks, return_exceptions=True) + + if results: + return sorted(results, key=lambda x: x["date"]) + raise EmptyDataError("No data found for the given symbol and dates.") + + +async def check_ohlc_symbol(symbol: str) -> Union[bool, str]: + """ + Check if the symbol has OHLC data. + + Parameters + ---------- + symbol : str + The symbol to check. + + Returns + ------- + bool + True if the symbol has OHLC data, False otherwise. + """ + all_instruments = await get_instruments("all", None) + all_symbols = { + d.get("instrument_name", ""): d.get("creation_timestamp") + for d in all_instruments + } + all_perpetuals = await get_perpetual_symbols() + + if symbol in all_perpetuals: + return all_perpetuals.get(symbol, False) + if symbol in all_symbols: + return symbol + return False + + +async def get_futures_symbols() -> list: + """ + Get futures symbols. + + Returns + ------- + list + A list of futures symbols. + """ + instruments = await get_instruments("all", "future") + return [d["instrument_name"] for d in instruments] + + +async def get_futures_curve_by_hours_ago(symbol, hours): + """Get futures curve N hours ago.""" + # pylint: disable=import-outside-toplevel + import asyncio # noqa + from datetime import datetime, timedelta + + symbols = await get_futures_curve_symbols(symbol) + now = datetime.now().replace(microsecond=0, second=0) + + if hours < 24: + start = (now - timedelta(days=1)).strftime("%Y-%m-%d") + else: + start = (now - timedelta(hours=hours)).strftime("%Y-%m-%d") + end = (now + timedelta(days=2)).strftime("%Y-%m-%d") + + results: list = [] + + async def get_one(s): + """Get data for one symbol.""" + data = await get_ohlc_data(s, start, end, "1h") + result = { + "instrument_name": data[-1 - hours]["symbol"], + "hours_ago": hours, + "last_price": data[-1 - hours]["close"], + } + results.append(result) + + tasks = [get_one(s) for s in symbols] + + await asyncio.gather(*tasks, return_exceptions=True) + + return results diff --git a/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_curve_fetcher_urllib3_v1.yaml b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_curve_fetcher_urllib3_v1.yaml new file mode 100644 index 000000000000..262b23149c78 --- /dev/null +++ b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_curve_fetcher_urllib3_v1.yaml @@ -0,0 +1,528 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=BTC&expired=false&kind=future + response: + body: + string: !!binary | + H4sIAAAAAAAAA+2Y30/bMBDH/xc/B2Q7Tuz0rdBOGtoPBPRpQlGaXjevzQ9sh8EQ//subdkoJRoP + yGVT8pTc1z7fXT7yObkj321VmjonA8IPKQmIAdssHRl8uSO10TmkupzBDcpTl6eNnbVD5ldkMM+W + FgKyQBnFeeMaA6gVukydyWaQZkXVlOiI0UMaEG3TLHf6GsjAmQYn6tLiTQGlS8usQDM5ujg+YPRk + +IlHraNsASbNq6LQ1uqqJIMDdEQpC4jbkVZKtOXU3datUwPXYCy0YcNNrU3mcELqdAHWZUWN4ckw + FklMV1dA8qrE8HOXWv0THoJ3Ol9sDPwQl5kuKzSs03yk4ViMbppZSPPGGCjz23VaZCsyjQUTTMg4 + xuUMPBdRxFUsWLKKyIJzS1jNrMHoqi33D4AFOl1X/ZlUi+wmXbaP2dc25mhj0VeNnq3Xe1o9+SSt + xzrmDAdiW999z3xTwUfx7lQhb4e27+6PMDkfoXDVVA52zb+Lm1oHtUUqL++D/YAp9wCmZJQq32DG + STu4C0yVMM54D+abATNk3WCuGXllKFXIqPALZZjgpTqhxM1ScqY6oSwwym89lT6p5Ord+MgjlYJK + vmnifnt4N5V/6+E9lXug8uPwzCeVIRPKcwMPaSJp0kUlw/aecN7dwHsq/VMpTyY+O3jEKGPcM5UC + 1406qUyimMVM9FS+ISrj8/GpTyqVwi9xz1Ti2VF0dnAuBRe0P1e+LSpH42OPVMbxA5Sez5WyP1f+ + O1Sejs9OxxeT4QdPXIY8oqGkLz5a0tcBkzOqwq7tMgpxt+RcyU4w8aYG12TLl8MZ0f8JzsuANPZ9 + uf7nzLhIKMeSUspb++fGPRGYilthpOdzVBSm4bDaJbgNxve/AJzKofa9FwAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '672' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-10JAN25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRy1LDMAz8F51DRrbzcm48LnCAC/eM27itwXEysVNgOv135BTSFnzTrnZXkg/w + 5ns3DmuogacICYzaTzZAfYBgOu2D6gaoWSkKxjOJvBRZAoQGTYp+0A5OpY+KndnuoJYSizzFBGz/ + QVWZszLNExhGs9bNeqfclrSYIkeRwL63U0d1VaS8krks+QI2k2+JyKpSSIx+P7Drg+mdshfcMQHj + Wv3ZzCEUWvFCpCKiPowkcqFxKubA3ev9DcOn22ee0+hW+XAW5WLO8ToEq2fRmUKeVmTYGbeAJQoe + N+vUOZje7BFP0xgXNN2Trsk5ZlJmGJvH9wtbhmlVJLCirkb5K2b2nomVaa8l5EO46egb2qbV1uz1 + +PVv+cVUdf3k4hRVns3ixfWXYViw0x0n/+iuPjxjKLOIv0zhDyFQRuLBbDZkzmjcQMZOU99GWa+P + 395bfrBfAgAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '351' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-PERPETUAL + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VSy07DMBD8lz2HyHZsx+mNRw9ISFSonCPTuK3BcarYLiDEv7NOS6Fw3Jkd7+ys + P+A5DH7crWAGrCRQwGhCchFmHxBtb0LU/Q5mtK4kZbwhrK6aAhCNBhXDzng4lCErtnazhVmjlCAl + KcANr1jVTE3VbrQr06622m9Qi1AlZAH7waUea8YkLylpuFDNCW5T6DLFCBOiml45En6IdvDanbGf + BVjfmbd2GpWNMFmVVUZDHFHmY+t1ngZXy+uLxfxhMV8+Xt7hCk6H+Eum6lLgXiZGZybZDyUwJuR6 + 60+gVLTK3nr9M7qpJctYjqi1PhrMFVOlFPdDkk/t48v5TC6y10Nvu9cuHYOiRBHFlcRcJasVK+Ap + d+hwpld53kQ82e7fMojbHs/WtZ1xdm/G938xnR7V/ZA8umWU88MpT89+U7KUBiWrNI45n3XynfWb + yW4Bx6pV+BtUSZk0FwKPk8KtP/tLnFLaZPw+xT9ExWgmbux6jT4IrhzRgjfYt9YumM8vHVcPAroC + AAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '401' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-31JAN25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRy3KDIBT9l7s2DA8VcdfHpl20m+4dEklCi+gIpu1k8u+9mMZJ2o0j59zz4HKE + 99D7cdhADZxQyGA0YXIR6iNE25kQdTdAzaQoGc8V5fiTAaLRoKIfjIfzMSTF3u72UCsluSRFBq7/ + xFPFVEFoBsNoN6bZ7LXfoXZFCRWFyODQu6lDIJekopLmvMovYDOFNhGC5jlNFr+w76PtvXZX3CkD + 61vz1cwpKZWXgoiEhjiiyMfG65QD928PK8Ge7154gd2dDnERKc7mqsHE6MwsWiimBJE8g876BZSS + z706vQQzQqk0ePm0m8b6aHChuE6Wy5IXgs7T48dVJFVEoe8axxodbpi5zEysbbsQOG5wRwjbDt+h + bVrj7MGM3/8uv3jqrp88tpC8pDeeF4LlpTivcQpP/ubBCy5plfDXKf4h8JuIR7vdIqOwVERjb3Bu + q10wpx+MwXpJXwIAAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '355' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-28MAR25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRyU7DMBD9F59Ty2sS51bgwgEhIe6R27itwXGi2ClFVf+dcWhDSyVf5i0z4zdH + 9BE6P/RrVCGGCcrQYMLoIqqOKNrWhKjbHlW04DllQhFWCJkhQKMBR9cbj37LkBw7u92BmFDJCww6 + 132lkhA5lf1g16Ze77TfgntBMBWkzNC+c2MLAKMKSyEUL0l+QesxNMAwWhBKCSYz7rtoO6/dNXnK + kPWNOdTTIFSpkuUc84SGOIDLx9rrNAo9vD8uWPmyfGMSPuB0iBcTbE/EtG4wMTozua64gmIFLVvr + 5zFYSSMA0oc/IZNcpnVTRLX10UCukKpgeV5KUpIkHz6vG1MYCo1XoKt1uKPOzMo2N8w0BAjbwkma + ujHO7s3wfRfB3Fa33ehjShu2SOa57YUR/BzmGJ79ze0lPJHw1zH+I1T60hie7GaTTgIHjNDXG9Bt + tAvm9AN3pHxTagIAAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '355' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-17JAN25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRuXKDMBD9l60JowMkoMvRJEXSpNfIRjZKhGCQcJLx+N+zwmMHTwoV+449no7w + EQY/jVtogOUEMphMmF2E5gjR9iZE3Y/QUMkFZUVN8IkMEI0GHcNoPJzLkByd3XfQ1DUrSU4ycMMX + VlIWZarGyW6N2nba79G7CA6Dm3ssOM9JXXEiygum5tAizkQhi5VU+SHawWu34k4ZWN+ab7UMwIEV + EzznCQ1xQpOPyus0Bh7eH++ofLl/ZSWu7XSIfybJZI7jg4nRmcW0ojAamkFv/RWUrFj0vb4OpoQw + yhKYclHWR4NhYpSCVZTXJImnz3XbOpe45wZFSoc1w5ebF2Jj29tNsD/itscvaFVrnD2Y6eff8dem + uh9mj0swWt42vRClOIc4h2e//mlZsoqLhL/N8ZbghMpEPNndDpkKs4nY1hvU7bQL5vQLMMZctVgC + AAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '344' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-26SEP25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRy07DMBD8lz2nke34kfTI48AJJLhHbuO2BseJYqcUVf131mlLAxw9szM7nj3C + e+j80K9hCSwnkMFgwugiLI8QbWtC1G0PS6oKSRmvCCuIzADRaFDR9cbD+RmSYme3OxwmipYsFxm4 + 7jM9hRQkJxn0g12ber3TfovqBWKC4tS+c2OLABN5RZUUtJJXsB5Dg4SShJ8tLrDvou28djPulIH1 + jTnU0xZYViWTRV4kNMQBRT7WXqc9cPd2v2Dy9fGFCUzvdIhXESVSUZEWBROjM5Pqxkl0pGUGrfU3 + VJBSpc+2+nADS1ZNeVNDtfXRYK1YKi245FxxksaHj7k1mpSYdoVztQ5/KXFhVrb5lWeqGQnb4kWa + ujHO7s3w9a+EH1vddqPHJCynppiZXnF6rnIMT35+diWYrIqEP4/xD1FylogHu9kgw6sMIrp6g3Mb + 7YI5fQOBB4bEZQIAAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '355' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-26DEC25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRwXKDIBT8l3c2joKKeGzSQ0+99O6QSBJaQEcwbSeTf++DxNS0M17Y3bf73nqG + d9fbcdhBAyTNIIFRukl7aM7glZHOCzNAkzNa5aTgGaFZlQCiXuJEP0gL16cLE0d1OKI44zXP0iwB + 3X+GZ00zkpYJDKPayXZ3FPaA0yuUkOB26vVkEKB5WlFeMF6UM9hOrkOiKAtSRMcbbHuveiv0grsk + oGwnv9qYAg2vSUVTGlDnRxyyvrUi5MDT23pFqs3zmpS4vRbOz0O4OuFlCHLSey3j1IKreEoSMMr+ + gqy63mrEPTpHKYsXh4JaZb3EVn2okbGCk6gePxbGFG9ndQJblLXCPVAk7hOZreoeNo3BSCiD/6Nr + O6nVSY7f/yq42wrTTxYXubV5N51xjJIUm5zci13+dVbixwL+Ovk/BKYEYqP2ezQmeLVHWytRtxfa + ycsPJLJ86WQCAAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '353' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-28FEB25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRyW6DMBD9lzlTywvGgWO6SD310jtygpO4NQZhk6aK8u8dEyUB9ei3zLx5PsNX + 6PzQb6ECTihkMJgwugjVGaJtTYi67aFiShSM5yXlgosMEI0GHV1vPFyfITkOdn9AMaWFVERm4Lof + qMqSienVD3Zr6u1B+z2anyihqlxlcOzc2CLAOJEyl1LRO1iPoUmEVEyh/A77LtrOazfjLhlY35hT + PW3BrSteCCISGuKAJh9rr9MeWH8+P/HV2+uaSwzvdIg3EyZnfMoaTIzOTK45J0mRZ9Ba/1hTXI9r + 9emhZEUuU9zUT219NFgqVsql4EoomtTD93xwzgjFrBuU1TosKDkdPjEb2yxM02IkbIvf0dSNcfZo + ht9/FdzH6rYbfQpCVbEce2MwtsmxyzG8+/m3K8lLzhP+McYlIVipEvFidzscrTBTxLHeoG6nXTCX + P4lKSENlAgAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '351' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-27JUN25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRy1LDMAz8F52Dx484TnIELnCAC5wzbuO2BsfJxE4p0+m/I6fTNh2O2tWupNUR + vkLvx2ENNXBCIYPRhMlFqI8QbWdC1N0ANVOiYDyvKJeKZYBoNKjoB+PhXIak2NntDptpXghOZAau + /0ml4Hwuh9GuTbPeab9F9QMljHGVwb53U4dAKQkVgpVCiAvYTKFFopSsUpTQK+z7aHuv3YI7ZWB9 + aw7NPAXqquSFICKhIY4o8rHxOs2Bx4+nB65eP9+4xO2dDvEiwtVZIdOgYGJ0ZlYtOClJhZad9TcU + I5lX6/ThBsqiUunklFBjfTQYK4bKMUjOSz63j99LayFImWewwr5Ghzsqn/1nZmXbO9E8BAnb4Ufa + pjXO7s34+y+Eq63u+smnTWSh7m0vDP7uHOcUXvzy9UrySsmEv0/xnhCS0UQ8280GaiwziOjrDfZt + tAvm9Ac5r1NEaQIAAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '355' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:02 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_curve_fetcher_urllib3_v2.yaml b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_curve_fetcher_urllib3_v2.yaml new file mode 100644 index 000000000000..2ebad1838e26 --- /dev/null +++ b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_curve_fetcher_urllib3_v2.yaml @@ -0,0 +1,528 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=BTC&expired=false&kind=future + response: + body: + string: !!binary | + H4sIAAAAAAAAA+2Y30/bMBDH/xc/B2Q7ju30DWgnDe0H4sfThKI0vW5emx/YDoMh/vdd2rIBJRoP + yLApeUrva5/P5498l96Q766ubFOQEeG7lETEgmuXnoy+3JDGmgIyU83gCuWpL7LWzboh8wsymudL + BxFZoIzivPWtBdRKU2Xe5jPI8rJuK3TE6C6NiHFZXnhzCWTkbYsTTeXwpYTKZ1Veopnsnx7sMHq4 + 94knnaN8ATYr6rI0zpm6IqMddEQpi4jfklZK8sCpv246pxYuwTrowoarxtjc44TMmxKcz8sGw1Ox + FKmkqyciRV1h+IXPnPkJd8F7Uyw2Br6Ly0yXNRrW27yn4ViMbpo7yIrWWqiK6/W2yIPIDCZMMKGk + xOUsPBVRwrUULF1F5MD7JaxmNmBN3aX7B8ACna6z/sRWy/wqW3Y/869dzMnGYi5aM1uv9zh76tG2 + 7uu4Z9gRD/Xtc+abDN6LdysLRTe0O7s/wtnJGIWLtvawbf6d3Mx5aBxSeX4bvQ6Y6hXAVIxSHRpM + mXaD+8DUKeOMD2C+GTBj1g/mmpEXhlLHjIqwUMYpProXSrwsFWe6F8oSo/w2UBmSSq7fTfYDUimo + 4psiHraG91P5txo+UPkKVH7cOw5JZcyEDlzAY5oqmvZRybC8p5z3F/CByvBUqsOzkBU8YZQxHphK + gesmvVSmiWSSiYHKN0SlPJkchaRSa/wSD0wl9o6it4JzJbigQ1/5tqgcTw4CUinlHZSB+0o19JX/ + DpVHk+OjyenZ3odAXMY8obGiz24t6cuAyRnVcd91mcR4W3KuVS+Y+NKAb/Pl8+FM6P8E53lEWve+ + Wv/nzLhQiRSJ1Jx19s+tfySkYiWMzXyOCu+OFLNdgd9gfPsLcvm6kb0XAAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '671' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:36 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-17JAN25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRu3LDIBD8l6sVBhASlro8mqRImvQabJ1tEoQ0AjnJePzvOZSxbE/K273dPZYj + fITej8MGapCMQwYjhslFqI8QbYchmm6AWui8FFLpQgsuMyA0Iin6AT38jSEp9na3h7qqZMEZz8D1 + XzRprYo0DaPdYLPZG78j7R1tKF5kcOjd1BGQ54xXuuIiF2ewmUJLBJOl0lguqO+j7b1xF+qUgfUt + fjdzBmWupCiYUgkOcSSRj403KQYe3h/vhH65f5UFne5MiBdVudKMTgoYo8NZtFBaUj10WWf9AjIt + kTI6swQLzkUpk0eqprE+IvVJbZZyJVTO0/L4eR3IWUGua1pqTLhiNJ9Lm4m1ba8k1dwt4bajX2ib + Fp094Pjz//GLq+n6ydMVuSz5jeuZEExhTi1O4dnf/LZeVZwn/G2Kt0Ql0u9N4clut1DLNESy9Uh7 + W+MCnn4Boe+AJVwCAAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '356' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-28FEB25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VSyW7DIBD9lzm7FmBjjI/pIvXUS+8WiUlCi7FlcJoqyr93IEriqNx424wenODL + D24aN9AAywlkMGk/2wDNCYLptQ+qH6GhoqgoKwUXtKIZIBo0OoZRO7hcfXTszW6PYkIqLnKegR1+ + oJGSFuk2Tmaj281euR2an0hOZFlncBjs3CNAWc7jKevqCraz7yLBBRMov8FuCGZwyi64cwbGdfrY + pik4tWaU52UZYR8mdLnQOhUHwerz+YnVb68rxnF7q3y4unB1ytKyXodgdXItOZ5XGNkbd5/DBY+r + 9ep4V1IuUkosqDUuaGwVO2W8YKIQST19L4KJqHLGMlijrFX+gZIsJiVmbbolUycGCdPje3Rtp605 + 6On3fwe3XNUPs8NNCiZTobfYKyFremlz9u/u4eFFLUkR8Y85PBKS8DISL2a7RYbjDwmY6zTqtsp6 + ff4DhydV1GcCAAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '353' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-10JAN25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRy1LDMAz8F51Tj+3YsZ0bjwsc4MI94zZua0icTOwUmE7/HSVAmoGjdrVarXSG + 19iFod9BCZxQyGBwcWwSlGdIvnUx2baHkqm8YFwoqZg2GSCaHCq63gX4LuOkOPrDEUpjaCEJzaDp + 3rFSkikiM+gHv3PV7mjDAbUbSiineQanrhlbBHRBuMmZMGYBqzHWSAitlKDTwB84dMl3wTYr7pKB + D7X7qGYXdNWcSSLEBMc0oCqkKtjJCG5f7jaMPt48cYnLNzamq0qY2Si6lBo3ixZKUk407tb6sICF + 0XO21l6djRFz+uk4lQ/J4UXxnpxTzCbo1Dy8rRyLgjCdwRa7KhvXjJ53mYmtr1eEmg0Q9y0+oq5q + 1/iTGz7/p1+m2rYbA65REOny1dBfnBEmnMAzjvEhrB/OmeKUTfjzmP4QQuQTce/3ewwoeAYJ5waH + fXvbRHf5AqMF+TpfAgAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '357' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-26SEP25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRS3PCIBD+L3uODBAgicc+Dj21M+09gwaVlpBMINaO43/vEqvG6XG/F8u3R/gM + nR/6NSyBEwoZDCaMLsLyCNG2JkTd9rBkRa4YF4UsWFllgGg06Oh64+E8huTY2e0OxRRVnMgMXPed + RqkkJTSDfrBrU6932m/RvUBMMlTtOze2CHBJKlYoySp1AesxNEgUiopzxB/su2g7r92MO2VgfWMO + 9fQKLKuSM0mESHCIA7p8rL1OD8HDx+OCq/fnNy5xfadDvLgYVQXa8KVgYnRmct04pXLCygxa62+o + pGL6basPN7DkYopJFdXWR4O9YqssF0qIQtAkH77m0SInWO0KZbUOd4wsUvzErGwzZ86rImFbvEhT + N8bZvRl+/pdwzdVtN3rcJOfV1Og19kIwQo3ANsfw4ueX55xXkib8dYz3RM5klYgnu9ngSSgOEWO9 + Qd1Gu2BOv3IS2hpoAgAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '357' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-27JUN25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRTVPDIBD9L5xTBjYhIT2qFz3oRc8Z2tAWJSQTSK3T6X93obapetz3sW/n7ZG8 + +96Nw5osCVBGMjJqP9lAlkcSTKd9UN1AlrzKSw5FJSou64wgGjQ6+kE7ch59dOzMdodiVpQ5UJER + 23/GMQdI4zCatW7WO+W26F4wyiVARva9nToEZEFrKYXkBb+AzeRbJGRR5Tmj7Aq7PpjeKXvDnTJi + XKsPTUohy1oCF7QoIuzDiC4XGqdiELl7vV9A9fT2DALPt8qHiwtvZ1LEJK9DsDq5Zo4LQes8I51x + MwoCkqNThxkUpUgHx4oa44LGXrFVwCY5MJHk48ev2JJKXL1CXaP8TFGM1eKHWJn21lOnDCRMhx9p + m1Zbs9fj1/8SrmtV108uXoIfTe7r3gtTQnXuc/KP7vb3ADljZcRfpvCH4DVE4sFsNshIVAXc6zTq + Nsp6ffoGy3fWDmoCAAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '356' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-26DEC25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRu3KDMBD8l6uxRuiBgDJ2ilRp0jOykW05QjBIOMl4/O854dhhklK7t7u6vQuc + Qu/HYQc1MEIhg9GEyUWoLxBtZ0LU3QB1rniRM6FkoSqZAaLRoKIfjIfbMyTF0R6OOEyrsqKEZuD6 + j/QsOWUEZcNod6bZHbU/oHpFSc6kyuDcu6lDgOekEDmOy+oONlNokRBSCDY7/sC+j7b32i24awbW + t+azmVOgrkqWSyJEgkMcUeVj43UKgqe39YoVm+c1k/h9p0O8q/DvTMqUFEyMzsyqBVdUhGXQWf8L + qkLM23X6kZ3PNsklNdRYHw3WGlOPSomK0TQ9vi+NS05KXHuLY40OSwo3TE4zs7XtUsRVCkbCdniQ + tmmNs2czfv3v4OGru37yMZV9O9HD9k5gmOFY5hRe/OLwijFOuUj46xT/EIwWidjY/T4x2FBEW29w + bq9dMNdvYSt3zWcCAAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '356' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-PERPETUAL + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VSy27bMBD8F55lgcuHSPmWNDkUKJCgSM8CY9E2G4oyRNJpEeTfu2RSx06OO7Oz + OzvkC/kd57AcNmRNWEtJQxYbs09k/UKSm2xMZjqQNSjeARNKKsZ4QxBNFhXzwQbyVsai2Lvdnqx7 + rSVtaUP8/IyVYrpWh8Vt7LDZm7BD7QoxzqEhx9nnCQHGOmip6noBoP7DQ45joUAxJaGOeSfCnNwc + jL9gXxviwmj/DHVXccJAtkIUOKYFdSENwZR15Prh2+r+9uf97cOvqx94hDcxnemEbCVeZlPytso+ + KIlBITe5cAI7JXUxN5mP3b2idUYJaXAhWUwWcwWQPUNfrLYvT2eDObSdKl7feoej8RmZkhRQpXoF + nILWVHS6IY+lw8RzveiKh0o8uvHLMYi7CR9uHEbr3dEuf7/mdJpqpjmHYpcLEPRi7omCvhKbvCwl + oW0Oowu7argh79Wg8UfoFjjYlcT3yfF7uPxPWoi+4Hc5fSI6rgpx47ZbZDQendBDsNi3NT7a138K + i9jIvgIAAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '406' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-28MAR25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VSyW7DIBD9lzm7CDDYxrculx6qSlXvFolJQouxZXCaKsq/d3CVxe1x3jJvZuAI + H6H347CGGjihkMFowuQi1EeItjMh6m6AmpV5wbgoZclZkQGi0aCjH4yH3zIkx85udyimTOYlkRm4 + /iuVlMq5HEa7Ns16p/0W3XeUsIqKDPa9mzoEOFMkl5ghq/KMNlNokeFMMqYooRfc99H2Xrtb8pSB + 9a05NHMQ1KpCigiR4BBHtPnYeJ2y4OH98Y5XL/dvXOIGTod4duH4OHCKCiZGZ2bXDVcyovIMOusv + OUqIebZOH65KPBdPW6cjNdZHg5fFuwpeFJVS5SwfP696qqQkafMV6hodFlQxDzQzK9sumDkZCdvh + o7RNa5zdm/H7/xEufXXXTx5HqSq66HrG8SMYgcecwrNfvH2uyqJK+OsU/xCKq0Q82c0GmYJlELGt + N6jbaBfM6QeRjc7xagIAAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '358' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-31JAN25 + response: + body: + string: !!binary | + H4sIAAAAAAAAA2VRy1LDIBT9l7tOmUBICNn52OhCN+4ztKEtSkgmkKrT6b97QRszOqw4554HlzO8 + +sFN4w4aYCSHDCbtZxugOUMwvfZB9SM0VBQVZVyUglKeAaJBo2IYtYPvq4+KozkcoZFSMEHKDOzw + jreaypLkGYyT2el2d1TugNpNTnIuZAanwc49AlwQwfEUvL6C7ey7SDBeFnm0+IHdEMzglF1xlwyM + 6/RHm1JiKqMl4TzCPkyocqF1KgbB7cvdpqCPN0+sxPJW+bCoJK1Tc69DsDqJfilZEMEy6I1bQFGJ + 9LZeLck0z6uSRZO4nda4oHGluFDKRcWwbBqf3lbGFSMVzWCLY63ya0akNonYmm5NpATETY9f0bWd + tuakp8//719cVT/MDnvUIu1yMb3ilHDNcY+zf3DrH2eFrGoW8ec5/CFqwSNxb/Z7ZCROBbR1Guf2 + ynp9+QJ/d3xeYAIAAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '355' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:52:37 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_historical_fetcher_urllib3_v1.yaml b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_historical_fetcher_urllib3_v1.yaml new file mode 100644 index 000000000000..7c0b18063944 --- /dev/null +++ b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_historical_fetcher_urllib3_v1.yaml @@ -0,0 +1,916 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=any&expired=false&kind=future + response: + body: + string: !!binary | + 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 + faUNqbrakUyXKP/4D7B0jAQFbgAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1788' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:21 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=any&expired=false + response: + body: + string: !!binary | + H4sIAAAAAAAAA+zdbZPc1pmt6f+iz00GXjawgf4m0bR1Oty2QqInHDExUcGXtMVpipSLlEbnOPzf + B5lJ0iQrsasShYXnZnH1mTkzRbLFrMLFBWCvZwP//Or/ff3q5eXPT7/6z6+a+9VX//HV5e71Ly/e + fPWf//c/v/r58vnT3cXzl892v02//eTlk4tfXj97uv8zf/vHV//5t8cvXu/+46v/mX5/+t1XP795 + /url9Hs/PX958eby8bPdxeOfXv3ycvov1f/x1fPXF4+fvnn+6+6r/3xz+cv0v/X85evp/+en3cs3 + Fy8f/zT98lff/Ombi7/88LsH9/r/+vpPTXevb6p7D/b/vcf/s7u8ePrqp5+ev369/yv+s7pfVdX0 + H31z+ne6j/7rb/73z/v/+ovnL3ePL6f/3O63n59fPt5/1os3z3/avX7z+Kefp4+Y277uqlTt/+c/ + vnr66uX0LTx9c/H6+f+Z/rfr+9OvTf/F5/8zfTF9rv2Xb54//Z+3v13dnz7Mkxevpl84fuNXfu/x + 693F018uL3cvn/7v47f61Ucf8vn0E0x17uo8/d2Xu1Mfrxtz7vvjx3u9e/Pmxe7wv/nz7vL5q/3P + /9nj/z39N49H4d03/fTxixdfffzRrvy02o9//+rRa7pP/soPvpH98fpq/+Oa/uT+UFz5nX/88urN + 7sSvv/8JXbx+s/v59aTt//nXfwDAffelgRtWBffzL2/s7cbeWmjAtUJvowMuFBwy4ITgmsoBF+Yt + QQMuCb3VDrhQcMiAU4JrHHBh3jpowHVCb60DLhQcMuCU4JIDLsxbDw24Xuitc8CFgkMGnBJc74AL + 85ahAZeF3lwyxIJDBpwSnEuGOG8DNOAGoTeXDLHgkAEnBNe6ZAj01kEDrtN5c8kQC44ZcEJwLhni + vI3QK7hReEJ1yRALDhlwSnAuGQK9Qa/gRuEJ1SVDLDhmwAnBuWQI85Yr5hXc9Ll03lwyxIIjBpwU + nEuGQG/MK7jpc+m8uWSIBccMOB245JIhzlsNvYKrdSfU5JIhFhwy4JTgXDIEeoNewdXCE6pLhlhw + zIATgnPJEOcN+jSRLHy4Q3LJEAsOGXBKcC4ZAr1Br+Aa4QnVJUMsOGbACcG5ZIjzBn1cUhY+vSa5 + ZIgFhww4IbjOJUOgN+gVXKs7oXYuGWLBMQNOCM4lQ5w36PPgsvDxXJ1LhlhwyIBTgnPJEOgNegWX + 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 + uP6By6RGplym6x8uTO4OoCTfZ9G4/oHLpEamXKbrnzNh/vz4t7/vZT4V0fzu67/+4WL6dh68B9p0 + TTE661mg3SmgL56/3D2+XIPn/oNdGYLrCji7qzL33+4pmikVbs2nv7dqo0JzFuf+oM3qfHCK59tf + v+qT464QjHfV3fyN9yJ3K0XiF8QuUeMu6di1hbeS79lVfe2407tjxp3U3Xybvcid4+5cdj017nol + u/mu2nG3mTtm3EndzTfRjrtN2A3UuBuU7Mo3s467Tdwx407qrnwz67iTsxupcTfK2HV5KNxUdENX + Rb3G+8tyx4w7qbvCXcUSd467M9ldMxgTx+7E8MF6J9n5iRhf3G3GDpl2Unbz4y6+tttEXQ0Nu+mD + CW8p5odZnHabuUOmndbd/KiK424TdtQxlF45DlB4g6vjbjN3zLiTunMvG8yupcZdq2TnXhbgjhl3 + UnfuZYPZUafueuH0Uyq8N9Vxt5k7ZtxJ3bmXDWZXfup1ILsTDxZej52bCoA7ZtxJ3bmqCGZHHTLu + hcOeqfC2UsfdZu6YcSd156oimF2mxl0Wsiu8aNRxt5k7ZtxJ3bmqCGZH3VPRC2fbU+EdoY67zdwx + 407qzlVFLLuMHTLOsmnPVHi7p9NuM3bItJOyc1ERrI46dZeV00+Fd8w57TZzh0w7rTsXFcHsqGMo + WTkOUHg/nONuM3fMuJO6c1ERzI7ay2ZlP1Z4t5vjbjN3zLiTunNREcyOWlRk5YJx4b1sjrvN3DHj + TurORUUsu2veeRG4Ynz1vQKrqSs+YbEd+lQ57fTskGknZVfqxxaw+7zD7vWrFwvRVTdS98Of//gx + uhoUdR+Qmz7WlfNr6fUpJ96dMn2rp8RNpK5btPuygi6EHCXmtiJ33XqdQ04qDtTFfijuRCO2lrh8 + 3VKdQ05OjhhySnLXrdI55KTiQA3sh+JO9GCribtugc4hJydHDDkluevW5hxyUnGg7f8fijuxCXs1 + cdcNEDvk5OSIIackd93wsENOKg40XPKhuBMV/2rirpsbdsjJyRFDTknuupFhh5xW3MAMuUEkLqW+ + FHL7t6A45OTkkCEnJFcKuQXkHHLniQM9z+RDcSeeKrHaadXtajg5YsgpybldjRXXMEOukYkb3K6G + k0OGnJCc29VYcT0z5HqdOLer4eSQISck53Y1VBxom9eH4k5stllNnNvVcHLEkFOSc7saKy4xQy7p + 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 + qpuxrr3GCcBJDU41zqG0AL8Ep4NzTZvgnUOjenNG15c2ZwzD6HEkAE5qcMpxloaMl+B0cK5pE7xz + aNRuzhjffoKZk3rbVbXXOAE4qcEpx1lo1RfhdHCuaRO8c2gUb85ox352GWn/5K4++4oTgJManHKc + pSfQLMHp4FzTJnjn0Ch/rUvth3zwcVKDU42z8UM+yDbBO4dG8eaMVKX5uyE/Vo6Ckxqccpyze9X9 + WDmATfAA/CieMU5NLmwHbtrGe9UJOKnBKcdZWEdahNPBuaLN4xIzNDmnL3ad9nbIj0f6DHQyo3MD + nX4+EhoneCJp+qKR6sylgqiu6jR4lpPAE5udcp6FUeNFPB2eq+oEl+vTF0mqc2wKDzTe727rfctO + 4IkNTznP8s7g83k6PFfVCS7Ypy869X2RHzH3GfDEhqecpx8yh9YJLtmnL3rtqT21pSvPvhv9Kg0C + T2x4ynmWrjyX8HR4rqoTXLRPXwxinUN5//rhdQ4Oz2ie2PBU8yw+QnYJT4fnmjoPdSY2PGv1bZEf + 0/kZ6KRmp1ynn9OJxonu2mtpmTlOB6DwMMS261p37QSe2OyU8yyMgizi6fBcVSe6a6+lZebY5cK7 + C6aL0rHziieBJzY85TzndxYt4+nwXFUnumuv5WWmH3X8GfDEhqecpx92jNaJ7tprZZmZqjTMLyq1 + 7V6v6yICT2x4ynnOryot4+nwXFUnumuvlWVmqrq+nx2jm3SO023T6PCM54kNTznP+Tm6ZTwdnmvq + PCw5Y8NTu/mtHYfSwzv73o+LR+ikZqdcZ+npnUt0OjpXxYnu2hulzsOJvXTT7utOCE9sdsp5lm7a + fd0ZrhNdFzXa9fjUFHRWTTN0HlQi8MSGp5xn6WF0S3g6PNfU2aJv2lspzmEovvG6Th7yROikZqdc + Z2HGc5FOR+eqONHXna32xD604+wjQabPmPcvjHF2xvPEZqec53yXuYynw3NNnQl93Sl+2NdY3L2R + ar8iE6GTmp1ynYVHLizS6ehcFSf6ujNJT+xjVbfzmzema55x9IQngSc2O+U8C7dFi3g6PNfU2aGv + O+U3RYUn0fmenaKTmp1ynYUH0fmWPRxnj45O6VMSx2rsCpedXd0M3tJO0EmNTrnOwlXnIp2OzjVx + DujolD4jcaJZuCVq6rEbBl91AnRSo1Ouc74oWqbT0bkizsOMAzU6G+37CPc452/YHZ0Ynczo3EDn + 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 + lNmAQ7NRn849p0mnSQ1NOU3PaYJltuDQbNUyPadJp0kNTTlNz2mCZXLnNFvpMNxBpkeO6DSpoSmn + 6ZEjsEzunGYrH4Yb3J7TaVJDU01zdHsOlsmd02ylw3AHmW7P6TSpoSmn6fYcLDODQzOrZboIotOk + hqacposgsEzucHsrnyAeXQTRaVJDU07TRRBY5ggOzVEt00UQnSY1NOU0XQRxZe73sEJDM8m3XRSe + cuTQZNBkhqacZukpRw7NcJncHUFJuu1ikjkUX2c1dskP7AinSQ1NOc1SEbSEpkNzRZncHUFJve2i + qdye02lSQ1NO0+05WCZ3R1CSbrtIVcrNvMzpf4aucmhG06SGppzm/GDHMpoOzRVlcncEJfW2i6by + yBGdJjU05TQ9cgSWyd0RlKTbLlLVN33hfZRdXbcOzXCa1NCU0yy8jHIRTYfmijK5O4KSettFU3lO + k06TGppymp7TBMvkDrcn9QRxU3lOk06TGppymp7T5MrcryhDQ7PTD8N5TpNOkxmaepq15zTBMrkj + R510riNVXW7nZe6fSzY6NMNpUkNTTnN+Gm4ZTYfmijK5RVCnfv5WU3tOk06TGppymp7T5Mrsubfn + vf4eyCNHdJrM0NyApkeOwDK5V5q9eK6jy0359nzwNspwmtTQlNMs356fT9OhuZ7MgXulOUhP56lK + feEdQW3bVOP+4WQOzVCazNDcgOb8yNEymg7N9WTWFTc1py92SUuzMN3u1GTYZMbmBjYL4+2OzWia + 4KmjeroNEtOcnzpybEJsUmNTbbPwniDH5mmaPz/+7e97m09FOL/7+q9/uJi+nQfviTZtV0zPelZo + d0roi+cvd48v1/C5/2D7rz/6WXYFnd1Vmvtv94TNuhqGeZupS+N+xjomN2d17o/aLM8Hp3y+/fWr + QDnwCtF4V+HNr1sug7dSKH457q558EacuxPPNliHXTX0TWFRchyrFFZ/f1nukHkndVdYcVzkznF3 + Ljvq9V2SnWb37grLic67zeAh804Lr7BW6MDbwt01AzuB59mrMxHrsSusAzrvNnOHzDulu9IGLsfd + JuwaaNxNH0y2jDIWHtOXur7d71xz3unhIfNOC29+IWUZPAfeue4SNfCS7L5ibPr5hZSJ5fTbDrwt + 4DEDTwpvfiVlGTwH3rnuqCt4nXIhpbT/3ne0m8FjBp4UXuGNHr6l3cRdTw28XuduLDwPNFVNTr6l + 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 + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '43294' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:22 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_tradingview_chart_data?end_timestamp=1733184000000&instrument_name=BTC-PERPETUAL&resolution=720&start_timestamp=1733011200000 + response: + body: + string: '{"usOut":1736124923261326,"usIn":1736124923259456,"usDiff":1870,"testnet":false,"result":{"volume":[1765.50937228,1795.26276348,3824.28604442,7511.65710613,3391.8982902],"ticks":[1732996800000,1733040000000,1733083200000,1733126400000,1733169600000],"status":"ok","open":[97116.5,96529.5,97288.0,96077.0,95872.5],"low":[95555.0,96487.5,95843.5,94377.5,95153.5],"high":[97116.5,97627.0,98275.0,97469.0,96375.0],"cost":[170140340.0,174409490.0,371629810.0,720033750.0,324979260.0],"close":[96530.0,97288.0,96077.5,95872.5,95602.0]},"jsonrpc":"2.0"}' + headers: + Connection: + - keep-alive + Content-Length: + - '546' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:55:23 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_historical_fetcher_urllib3_v2.yaml b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_historical_fetcher_urllib3_v2.yaml new file mode 100644 index 000000000000..5d21a3d3f4df --- /dev/null +++ b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_historical_fetcher_urllib3_v2.yaml @@ -0,0 +1,916 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=any&expired=false&kind=future + response: + body: + string: !!binary | + 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 + fKqWO5LpkuUf/wEjI6skBm4AAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1786' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:34:14 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=any&expired=false + response: + body: + string: !!binary | + H4sIAAAAAAAAA+zdbZPc1pmt6f+iz00GXjawgf4m0bR1Oty2QqInHDExUcGXtMVpipSLlEbnOPzf + B5lJ0iQrsasShYXnZnH1mTkzRbLFrMLFBWCvZwP//Or/ff3q5eXPT7/6z6+a+9VX//HV5e71Ly/e + fPWf//c/v/r58vnT3cXzl892v02//eTlk4tfXj97uv8zf/vHV//5t8cvXu/+46v/mX5/+t1XP795 + /url9Hs/PX958eby8bPdxeOfXv3ycvov1f/x1fPXF4+fvnn+6+6r/3xz+cv0v/X85evp/+en3cs3 + Fy8f/zT98lff/Ombi7/88LsH9/r/+vpPTXevb6p7D/b/vcf/s7u8ePrqp5+ev369/yv+s7pfVdX0 + H31z+ne6j/7rb/73z/v/+ovnL3ePL6f/3O63n59fPt5/1os3z3/avX7z+Kefp4+Y277uqlTt/+c/ + vnr66uX0LTx9c/H6+f+Z/rfr+9OvTf/F5/8zfTF9rv2Xb54//Z+3v13dnz7Mkxevpl84fuNXfu/x + 693F018uL3cvn/7v47f61Ucf8vn0E0x17uo8/d2Xu1Mfrxtz7vvjx3u9e/Pmxe7wv/nz7vL5q/3P + /9nj/z39N49H4d03/fTxixdfffzRrvy02o9//+rRa7pP/soPvpH98fpq/+Oa/uT+UFz5nX/88urN + 7sSvv/8JXbx+s/v59aTt//nXfwDAffelgRtWBffzL2/s7cbeWmjAtUJvowMuFBwy4ITgmsoBF+Yt + QQMuCb3VDrhQcMiAU4JrHHBh3jpowHVCb60DLhQcMuCU4JIDLsxbDw24Xuitc8CFgkMGnBJc74AL + 85ahAZeF3lwyxIJDBpwSnEuGOG8DNOAGoTeXDLHgkAEnBNe6ZAj01kEDrtN5c8kQC44ZcEJwLhni + vI3QK7hReEJ1yRALDhlwSnAuGQK9Qa/gRuEJ1SVDLDhmwAnBuWQI85Yr5hXc9Ll03lwyxIIjBpwU + nEuGQG/MK7jpc+m8uWSIBccMOB245JIhzlsNvYKrdSfU5JIhFhwy4JTgXDIEeoNewdXCE6pLhlhw + zIATgnPJEOcN+jSRLHy4Q3LJEAsOGXBKcC4ZAr1Br+Aa4QnVJUMsOGbACcG5ZIjzBn1cUhY+vSa5 + ZIgFhww4IbjOJUOgN+gVXKs7oXYuGWLBMQNOCM4lQ5w36PPgsvDxXJ1LhlhwyIBTgnPJEOgNegWX + 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 + uP6By6RGplym6x8uTO4OoCTfZ9G4/oHLpEamXKbrnzNh/vz4t7/vZT4V0fzu67/+4WL6dh68B9p0 + TTE661mg3SmgL56/3D2+XIPn/oNdGYLrCji7qzL33+4pmikVbs2nv7dqo0JzFuf+oM3qfHCK59tf + v+qT464QjHfV3fyN9yJ3K0XiF8QuUeMu6di1hbeS79lVfe2407tjxp3U3Xybvcid4+5cdj017nol + u/mu2nG3mTtm3EndzTfRjrtN2A3UuBuU7Mo3s467Tdwx407qrnwz67iTsxupcTfK2HV5KNxUdENX + Rb3G+8tyx4w7qbvCXcUSd467M9ldMxgTx+7E8MF6J9n5iRhf3G3GDpl2Unbz4y6+tttEXQ0Nu+mD + CW8p5odZnHabuUOmndbd/KiK424TdtQxlF45DlB4g6vjbjN3zLiTunMvG8yupcZdq2TnXhbgjhl3 + UnfuZYPZUafueuH0Uyq8N9Vxt5k7ZtxJ3bmXDWZXfup1ILsTDxZej52bCoA7ZtxJ3bmqCGZHHTLu + hcOeqfC2UsfdZu6YcSd156oimF2mxl0Wsiu8aNRxt5k7ZtxJ3bmqCGZH3VPRC2fbU+EdoY67zdwx + 407qzlVFLLuMHTLOsmnPVHi7p9NuM3bItJOyc1ERrI46dZeV00+Fd8w57TZzh0w7rTsXFcHsqGMo + WTkOUHg/nONuM3fMuJO6c1ERzI7ay2ZlP1Z4t5vjbjN3zLiTunNREcyOWlRk5YJx4b1sjrvN3DHj + TurORUUsu2veeRG4Ynz1vQKrqSs+YbEd+lQ57fTskGknZVfqxxaw+7zD7vWrFwvRVTdS98Of//gx + uhoUdR+Qmz7WlfNr6fUpJ96dMn2rp8RNpK5btPuygi6EHCXmtiJ33XqdQ04qDtTFfijuRCO2lrh8 + 3VKdQ05OjhhySnLXrdI55KTiQA3sh+JO9GCribtugc4hJydHDDkluevW5hxyUnGg7f8fijuxCXs1 + cdcNEDvk5OSIIackd93wsENOKg40XPKhuBMV/2rirpsbdsjJyRFDTknuupFhh5xW3MAMuUEkLqW+ + FHL7t6A45OTkkCEnJFcKuQXkHHLniQM9z+RDcSeeKrHaadXtajg5YsgpybldjRXXMEOukYkb3K6G + k0OGnJCc29VYcT0z5HqdOLer4eSQISck53Y1VBxom9eH4k5stllNnNvVcHLEkFOSc7saKy4xQy7p + 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 + qpuxrr3GCcBJDU41zqG0AL8Ep4NzTZvgnUOjenNG15c2ZwzD6HEkAE5qcMpxloaMl+B0cK5pE7xz + aNRuzhjffoKZk3rbVbXXOAE4qcEpx1lo1RfhdHCuaRO8c2gUb85ox352GWn/5K4++4oTgJManHKc + pSfQLMHp4FzTJnjn0Ch/rUvth3zwcVKDU42z8UM+yDbBO4dG8eaMVKX5uyE/Vo6Ckxqccpyze9X9 + WDmATfAA/CieMU5NLmwHbtrGe9UJOKnBKcdZWEdahNPBuaLN4xIzNDmnL3ad9nbIj0f6DHQyo3MD + nX4+EhoneCJp+qKR6sylgqiu6jR4lpPAE5udcp6FUeNFPB2eq+oEl+vTF0mqc2wKDzTe727rfctO + 4IkNTznP8s7g83k6PFfVCS7Ypy869X2RHzH3GfDEhqecpx8yh9YJLtmnL3rtqT21pSvPvhv9Kg0C + T2x4ynmWrjyX8HR4rqoTXLRPXwxinUN5//rhdQ4Oz2ie2PBU8yw+QnYJT4fnmjoPdSY2PGv1bZEf + 0/kZ6KRmp1ynn9OJxonu2mtpmTlOB6DwMMS261p37QSe2OyU8yyMgizi6fBcVSe6a6+lZebY5cK7 + C6aL0rHziieBJzY85TzndxYt4+nwXFUnumuv5WWmH3X8GfDEhqecpx92jNaJ7tprZZmZqjTMLyq1 + 7V6v6yICT2x4ynnOryot4+nwXFUnumuvlWVmqrq+nx2jm3SO023T6PCM54kNTznP+Tm6ZTwdnmvq + PCw5Y8NTu/mtHYfSwzv73o+LR+ikZqdcZ+npnUt0OjpXxYnu2hulzsOJvXTT7utOCE9sdsp5lm7a + fd0ZrhNdFzXa9fjUFHRWTTN0HlQi8MSGp5xn6WF0S3g6PNfU2aJv2lspzmEovvG6Th7yROikZqdc + Z2HGc5FOR+eqONHXna32xD604+wjQabPmPcvjHF2xvPEZqec53yXuYynw3NNnQl93Sl+2NdY3L2R + ar8iE6GTmp1ynYVHLizS6ehcFSf6ujNJT+xjVbfzmzema55x9IQngSc2O+U8C7dFi3g6PNfU2aGv + O+U3RYUn0fmenaKTmp1ynYUH0fmWPRxnj45O6VMSx2rsCpedXd0M3tJO0EmNTrnOwlXnIp2OzjVx + DujolD4jcaJZuCVq6rEbBl91AnRSo1Ouc74oWqbT0bkizsOMAzU6G+37CPc452/YHZ0Ynczo3EDn + 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 + lNmAQ7NRn849p0mnSQ1NOU3PaYJltuDQbNUyPadJp0kNTTlNz2mCZXLnNFvpMNxBpkeO6DSpoSmn + 6ZEjsEzunGYrH4Yb3J7TaVJDU01zdHsOlsmd02ylw3AHmW7P6TSpoSmn6fYcLDODQzOrZboIotOk + hqacposgsEzucHsrnyAeXQTRaVJDU07TRRBY5ggOzVEt00UQnSY1NOU0XQRxZe73sEJDM8m3XRSe + cuTQZNBkhqacZukpRw7NcJncHUFJuu1ikjkUX2c1dskP7AinSQ1NOc1SEbSEpkNzRZncHUFJve2i + qdye02lSQ1NO0+05WCZ3R1CSbrtIVcrNvMzpf4aucmhG06SGppzm/GDHMpoOzRVlcncEJfW2i6by + yBGdJjU05TQ9cgSWyd0RlKTbLlLVN33hfZRdXbcOzXCa1NCU0yy8jHIRTYfmijK5O4KSettFU3lO + k06TGppymp7TBMvkDrcn9QRxU3lOk06TGppymp7T5MrcryhDQ7PTD8N5TpNOkxmaepq15zTBMrkj + R510riNVXW7nZe6fSzY6NMNpUkNTTnN+Gm4ZTYfmijK5RVCnfv5WU3tOk06TGppymp7T5Mrsubfn + vf4eyCNHdJrM0NyApkeOwDK5V5q9eK6jy0359nzwNspwmtTQlNMs356fT9OhuZ7MgXulOUhP56lK + feEdQW3bVOP+4WQOzVCazNDcgOb8yNEymg7N9WTWFTc1py92SUuzMN3u1GTYZMbmBjYL4+2OzWia + 4KmjeroNEtOcnzpybEJsUmNTbbPwniDH5mmaPz/+7e97m09FOL/7+q9/uJi+nQfviTZtV0zPelZo + d0roi+cvd48v1/C5/2D7rz/6WXYFnd1Vmvtv94TNuhqGeZupS+N+xjomN2d17o/aLM8Hp3y+/fWr + QDnwCtF4V+HNr1sug7dSKH457q558EacuxPPNliHXTX0TWFRchyrFFZ/f1nukHkndVdYcVzkznF3 + Ljvq9V2SnWb37grLic67zeAh804Lr7BW6MDbwt01AzuB59mrMxHrsSusAzrvNnOHzDulu9IGLsfd + JuwaaNxNH0y2jDIWHtOXur7d71xz3unhIfNOC29+IWUZPAfeue4SNfCS7L5ibPr5hZSJ5fTbDrwt + 4DEDTwpvfiVlGTwH3rnuqCt4nXIhpbT/3ne0m8FjBp4UXuGNHr6l3cRdTw28XuduLDwPNFVNTr6l + 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 + r9/8/PO4JXB8Y8PT/ba+uSXl3/8fS0hArCy1HQA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '43292' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:34:15 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_tradingview_chart_data?end_timestamp=1733184000000&instrument_name=BTC-PERPETUAL&resolution=720&start_timestamp=1733011200000 + response: + body: + string: '{"usOut":1736123656142468,"usIn":1736123656140693,"usDiff":1775,"testnet":false,"result":{"volume":[1765.50937228,1795.26276348,3824.28604442,7511.65710613,3391.8982902],"ticks":[1732996800000,1733040000000,1733083200000,1733126400000,1733169600000],"status":"ok","open":[97116.5,96529.5,97288.0,96077.0,95872.5],"low":[95555.0,96487.5,95843.5,94377.5,95153.5],"high":[97116.5,97627.0,98275.0,97469.0,96375.0],"cost":[170140340.0,174409490.0,371629810.0,720033750.0,324979260.0],"close":[96530.0,97288.0,96077.5,95872.5,95602.0]},"jsonrpc":"2.0"}' + headers: + Connection: + - keep-alive + Content-Length: + - '546' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 00:34:16 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_info_fetcher_urllib3_v1.yaml b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_info_fetcher_urllib3_v1.yaml new file mode 100644 index 000000000000..205e715fc3dc --- /dev/null +++ b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_info_fetcher_urllib3_v1.yaml @@ -0,0 +1,132 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=any&kind=future + response: + body: + string: !!binary | + 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 + ZLpk+cd/1CYNgAZuAAA= + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1781' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 19:35:30 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-PERPETUAL + response: + body: + string: !!binary | + H4sIAAAAAAAAA21Sy27bMBD8lz0rAl/iQ7e0zaFAgQRFehYYi7bZUJQhkk6LIP/epeKkzuPInZ2d + 2Vk+wu80x+WwgR5YS6CBxaUSMvSPkP3kUrbTAXqquKSGUU6UNg1gNTtkzAcX4fmZKmPvd3tsJkxS + 3XYNhPkBeqOMUC1p4LD4jRs2ext3SOatoZQ3cJxDmdzKoqyVWgulmXqpDyWNKya04JqTOueExDn7 + OdrwFn5qwMfR/RlWtYpRzXirRa2nvCAz5iHaKglfbr9e3Fz9vLm6/XX5AxcJNuVzYrdukVzOwa28 + E2YMxtEKdDn5+J9AODWVMNkzec5VV4s1q8HH7DBgjJcyFGCqE6T2L/fnshiXYNXvc/NwtKEghNup + rhNKSU6JQXZd6q422HT/0faK3PnxHYJ6CPgJLzgOowv+6Ja/n6T1OthOc4noWFAqu/UAr5NfINST + Djmbsiw1pm2Jo4+71XIDp9eg699opeDcXQi8U0nf45uvZaiUptavS34HGKIr8M1vt9Azjl0ZTUSH + fVsbknv6B2sLSIvJAgAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '414' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 19:35:30 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_info_fetcher_urllib3_v2.yaml b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_info_fetcher_urllib3_v2.yaml new file mode 100644 index 000000000000..7acf8a10ad77 --- /dev/null +++ b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_info_fetcher_urllib3_v2.yaml @@ -0,0 +1,132 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=any&kind=future + response: + body: + string: !!binary | + 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 + lKqrHcl0ifKP/wA0kD8VBW4AAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1786' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 19:35:48 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-PERPETUAL + response: + body: + string: !!binary | + H4sIAAAAAAAAA2WST2/cIBDFv8ucHQswf/fWJjlEitSoSs8WWbO7JDZeGdi2ivLdO5BNu26OzG/e + zOPBKzzHOSzHLWyAtQQaWFzMY4LNKyQ/uZjsdIQNVZ2khlFuKJMNYDU5VMxHF+D9GIvi4PcHbCZM + Ut2KBsb5J2yMMly1pIHj4reu3x5s2KO4aw0RtIHTPObJVRXlrZBMU2b0R73PcahMkI4rTsqcMwlz + 8nOw4xq/NeDD4H71dVthVHPdmlKOaUFhSH2wZSN8fby+erj9/nD7+OPLPd5jtDFd6gQrl4gupdFV + 3ZkZg2m0XDUw+fBPgBZk8TfZi+0dJ3VKiar3ITnMF9OlDPs55lT7l5fLtYq3VBa/7839yY4ZEV5O + CcGVkh0lhlCmeQNPpcHGlV7XtCt58sOKyGIFgZ/wAYd+cKM/ueX357D+zrXTnAMa1oIospr7QfBT + dKyibV6WEtMuh8GHfbXcwPnU6/I1Wsm7zl1xfKYc78L6ZykpulL/ltN/QJeccrzxux0SgckntBEc + 9u3sGN3bH+ZnaX7IAgAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '414' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 19:35:49 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_instruments_fetcher_urllib3_v1.yaml b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_instruments_fetcher_urllib3_v1.yaml new file mode 100644 index 000000000000..06bfcb4ccc52 --- /dev/null +++ b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_instruments_fetcher_urllib3_v1.yaml @@ -0,0 +1,79 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=any&kind=future + response: + body: + string: !!binary | + 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 + VF3uSKZLln/8BwWVErMGbgAA + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1785' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 16:43:09 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_instruments_fetcher_urllib3_v2.yaml b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_instruments_fetcher_urllib3_v2.yaml new file mode 100644 index 000000000000..57834285ab9c --- /dev/null +++ b/openbb_platform/providers/deribit/tests/record/http/test_deribit_fetchers/test_deribit_futures_instruments_fetcher_urllib3_v2.yaml @@ -0,0 +1,79 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://www.deribit.com/api/v2/public/get_instruments?currency=any&kind=future + response: + body: + string: !!binary | + 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 + rTzqckcyXbL84z9ZbTVhBm4AAA== + headers: + Access-Control-Allow-Headers: + - Authorization,User-Agent,Range,X-Requested-With,Content-Type,Partner + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1786' + Content-Type: + - application/json + Date: + - Mon, 06 Jan 2025 16:43:31 GMT + Server: + - nginx + Strict-Transport-Security: + - max-age=15768000 + Vary: + - Origin,Authorization,Partner + - accept-encoding + X-Frame-Options: + - SAMEORIGIN + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/deribit/tests/test_deribit_fetchers.py b/openbb_platform/providers/deribit/tests/test_deribit_fetchers.py index 121d5ec1b3b1..ed5508a139f4 100644 --- a/openbb_platform/providers/deribit/tests/test_deribit_fetchers.py +++ b/openbb_platform/providers/deribit/tests/test_deribit_fetchers.py @@ -1,10 +1,15 @@ """Deribit Fetcher Tests.""" +from datetime import date from unittest.mock import MagicMock, patch import pytest from openbb_core.app.service.user_service import UserService from openbb_core.provider.utils.helpers import run_async +from openbb_deribit.models.futures_curve import DeribitFuturesCurveFetcher +from openbb_deribit.models.futures_historical import DeribitFuturesHistoricalFetcher +from openbb_deribit.models.futures_info import DeribitFuturesInfoFetcher +from openbb_deribit.models.futures_instruments import DeribitFuturesInstrumentsFetcher from openbb_deribit.models.options_chains import ( DeribitOptionsChainsData, DeribitOptionsChainsFetcher, @@ -63,7 +68,7 @@ def vcr_config(): return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ - None, + ("expired", None), ], } @@ -97,3 +102,48 @@ async def test_deribit_options_chains_fetcher(credentials=test_credentials): ): result = await fetcher.fetch_data(params, {}) assert isinstance(result, DeribitOptionsChainsData) + + +@pytest.mark.record_http +def test_deribit_futures_curve_fetcher(credentials=test_credentials): + """Test Deribit Futures Curve Fetcher.""" + params = {"symbol": "BTC"} + + fetcher = DeribitFuturesCurveFetcher() + result = fetcher.test(params, credentials) + assert result is None + + +@pytest.mark.record_http +def test_deribit_futures_historical_fetcher(credentials=test_credentials): + """Test Deribit Futures Historical Fetcher.""" + params = { + "symbol": "BTC-PERPETUAL", + "start_date": date(2024, 12, 1), + "end_date": date(2024, 12, 3), + "interval": "12h", + } + + fetcher = DeribitFuturesHistoricalFetcher() + result = fetcher.test(params, credentials) + assert result is None + + +@pytest.mark.record_http +def test_deribit_futures_instruments_fetcher(credentials=test_credentials): + """Test Deribit Futures Instruments Fetcher.""" + params = {} + + fetcher = DeribitFuturesInstrumentsFetcher() + result = fetcher.test(params, credentials) + assert result is None + + +@pytest.mark.record_http +def test_deribit_futures_info_fetcher(credentials=test_credentials): + """Test Deribit Futures Info Fetcher.""" + params = {"symbol": "BTC-PERPETUAL"} + + fetcher = DeribitFuturesInfoFetcher() + result = fetcher.test(params, credentials) + assert result is None diff --git a/openbb_platform/providers/finviz/openbb_finviz/models/compare_groups.py b/openbb_platform/providers/finviz/openbb_finviz/models/compare_groups.py index 0c2915f51884..88e3fd9884fa 100644 --- a/openbb_platform/providers/finviz/openbb_finviz/models/compare_groups.py +++ b/openbb_platform/providers/finviz/openbb_finviz/models/compare_groups.py @@ -2,7 +2,7 @@ # pylint: disable=unused-argument -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional from openbb_core.provider.abstract.data import ForceInt from openbb_core.provider.abstract.fetcher import Fetcher @@ -20,18 +20,27 @@ class FinvizCompareGroupsQueryParams(CompareGroupsQueryParams): """Finviz Compare Groups Query Params.""" - group: Union[GROUPS, None] = Field( + __json_schema_extra__ = { + "group": { + "multiple_items_allowed": False, + "choices": GROUPS_CHOICES, + }, + "metric": { + "multiple_items_allowed": False, + "choices": ["performance", "valuation", "overview"], + }, + } + + group: GROUPS = Field( default="sector", description="US-listed stocks only." - + " When a sector is selected, it is broken down by industry." - + " The default is sector.", - json_schema_extra={"choices": GROUPS_CHOICES}, # type: ignore + + " When an individual sector is selected, it is broken down by industry." + + " The default is 'sector'.", ) - metric: Union[METRICS, None] = Field( + metric: METRICS = Field( default="performance", - description="Select from: performance, valuation, overview." - + " The default is performance.", - json_schema_extra={"choices": ["performance", "valuation", "overview"]}, + description="Statistical metric to return. Select from: ['performance', 'valuation', 'overview']" + + " The default is 'performance'.", ) @@ -67,6 +76,8 @@ class FinvizCompareGroupsData(CompareGroupsData): "analyst_recommendation": "Recom", } + name: str = Field(description="Name or label of the group.") + stocks: Optional[int] = Field( default=None, description="The number of stocks in the group.",