From 96dad6ac2fe0f583a20c1175d396b9df955b9178 Mon Sep 17 00:00:00 2001 From: Michael Whittle Date: Wed, 16 Aug 2023 16:27:57 +0100 Subject: [PATCH] fixed coinbase advanced trade missing candles issue --- .github/workflows/unit-tests.yml | 4 ++-- examples/script-coinbase.py | 6 ++---- models/exchange/coinbase/api.py | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 56ad6716..0a72aadb 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -17,10 +17,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up Python 3.9 + - name: Set up Python 3.11 uses: actions/setup-python@v2 with: - python-version: 3.9 + python-version: 3.11 - name: Find typos with codespell uses: codespell-project/actions-codespell@master with: diff --git a/examples/script-coinbase.py b/examples/script-coinbase.py index 9ea91232..a1acb7df 100644 --- a/examples/script-coinbase.py +++ b/examples/script-coinbase.py @@ -10,11 +10,9 @@ app1 = PyCryptoBot(exchange="coinbase") model1 = CBAuthAPI(app1.api_key, app1.api_secret, app1.api_url, app=app1) -""" app2 = PyCryptoBot(exchange="coinbasepro") model2 = CAuthAPI(app2.api_key, app2.api_secret, app2.api_passphrase, app2.api_url, app=app2) model3 = CPublicAPI(app=app2) -""" """ COINBASE""" # df = model1.get_accounts() @@ -74,8 +72,8 @@ print(df) """ COINBASE PRO""" -# df = model3.get_historical_data("ADA-GBP", Granularity.ONE_HOUR) # Coinbase Pro has this in the public API, Advanced Trade has this in the auth API -# print(df) +df = model3.get_historical_data("ADA-GBP", Granularity.ONE_HOUR) # Coinbase Pro has this in the public API, Advanced Trade has this in the auth API +print(df) """ COINBASE""" diff --git a/models/exchange/coinbase/api.py b/models/exchange/coinbase/api.py index 0d12a208..b7d72812 100644 --- a/models/exchange/coinbase/api.py +++ b/models/exchange/coinbase/api.py @@ -740,6 +740,22 @@ def get_historical_data( df["close"] = df["close"].astype(float) df["volume"] = df["volume"].astype(float) + # create a full range of requested interval + full_range = pd.date_range(start=df.index[0], end=df.index[-1], freq=freq) + + # re-index the dataframe using the full range + df = df.reindex(full_range) + + # fill missing values and forward-fill the price columns and set volume to 0 for missing rows. + df["open"].fillna(method="ffill", inplace=True) + df["high"].fillna(method="ffill", inplace=True) + df["low"].fillna(method="ffill", inplace=True) + df["close"].fillna(method="ffill", inplace=True) + df["volume"].fillna(0, inplace=True) + df["market"] = market + df["granularity"] = granularity.to_integer + df["date"] = df.index + # reset pandas dataframe index df.reset_index()