Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merging beta into main #830

Merged
merged 3 commits into from
Aug 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
6 changes: 2 additions & 4 deletions examples/script-coinbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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"""
Expand Down
24 changes: 16 additions & 8 deletions models/config/binance_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import json
import os.path
import re
import sys

from .default_parser import is_currency_valid, default_config_parse, merge_config_and_args

Expand Down Expand Up @@ -101,14 +102,21 @@ def parser(app, binance_config, args={}):
app.api_key_file = binance_config["api_key_file"]

if app.api_key_file is not None:
try:
with open(app.api_key_file, "r") as f:
key = f.readline().strip()
secret = f.readline().strip()
binance_config["api_key"] = key
binance_config["api_secret"] = secret
except Exception:
raise RuntimeError(f"Unable to read {app.api_key_file}")
if not os.path.isfile(app.api_key_file):
try:
raise Exception(f"Unable to read {app.api_key_file}, please check the file exists and is readable. Remove it from the config file for test mode!\n")
except Exception as e:
print(f"{type(e).__name__}: {e}")
sys.exit(1)
else:
try:
with open(app.api_key_file, "r") as f:
key = f.readline().strip()
secret = f.readline().strip()
binance_config["api_key"] = key
binance_config["api_secret"] = secret
except Exception:
raise RuntimeError(f"Unable to read {app.api_key_file}")

if "api_key" in binance_config and "api_secret" in binance_config and "api_url" in binance_config:
# validates the api key is syntactically correct
Expand Down
24 changes: 16 additions & 8 deletions models/config/coinbase_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import json
import os.path
import re
import sys

from .default_parser import is_currency_valid, default_config_parse, merge_config_and_args
from models.exchange.Granularity import Granularity
Expand Down Expand Up @@ -56,14 +57,21 @@ def parser(app, coinbase_config, args={}):
app.api_key_file = coinbase_config["api_key_file"]

if app.api_key_file is not None:
try:
with open(app.api_key_file, "r") as f:
key = f.readline().strip()
secret = f.readline().strip()
coinbase_config["api_key"] = key
coinbase_config["api_secret"] = secret
except Exception:
raise RuntimeError(f"Unable to read {app.api_key_file}")
if not os.path.isfile(app.api_key_file):
try:
raise Exception(f"Unable to read {app.api_key_file}, please check the file exists and is readable. Remove \"api_key_file\" key from the config file for test mode!\n")
except Exception as e:
print(f"{type(e).__name__}: {e}")
sys.exit(1)
else:
try:
with open(app.api_key_file, "r") as f:
key = f.readline().strip()
secret = f.readline().strip()
coinbase_config["api_key"] = key
coinbase_config["api_secret"] = secret
except Exception:
raise RuntimeError(f"Unable to read {app.api_key_file}")

if "api_url" in coinbase_config["config"]:
coinbase_config["api_url"] = coinbase_config["config"]["api_url"]
Expand Down
28 changes: 18 additions & 10 deletions models/config/coinbase_pro_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import json
import os.path
import re
import sys

from .default_parser import is_currency_valid, default_config_parse, merge_config_and_args
from models.exchange.Granularity import Granularity
Expand Down Expand Up @@ -57,16 +58,23 @@ def parser(app, coinbase_config, args={}):
app.api_key_file = coinbase_config["api_key_file"]

if app.api_key_file is not None:
try:
with open(app.api_key_file, "r") as f:
key = f.readline().strip()
secret = f.readline().strip()
password = f.readline().strip()
coinbase_config["api_key"] = key
coinbase_config["api_secret"] = secret
coinbase_config["api_passphrase"] = password
except Exception:
raise RuntimeError(f"Unable to read {app.api_key_file}")
if not os.path.isfile(app.api_key_file):
try:
raise Exception(f"Unable to read {app.api_key_file}, please check the file exists and is readable. Remove \"api_key_file\" key from the config file for test mode!\n")
except Exception as e:
print(f"{type(e).__name__}: {e}")
sys.exit(1)
else:
try:
with open(app.api_key_file, "r") as f:
key = f.readline().strip()
secret = f.readline().strip()
password = f.readline().strip()
coinbase_config["api_key"] = key
coinbase_config["api_secret"] = secret
coinbase_config["api_passphrase"] = password
except Exception:
raise RuntimeError(f"Unable to read {app.api_key_file}")

if "api_key" in coinbase_config and "api_secret" in coinbase_config and "api_passphrase" in coinbase_config and "api_url" in coinbase_config:

Expand Down
27 changes: 17 additions & 10 deletions models/config/kucoin_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,16 +60,23 @@ def parser(app, kucoin_config, args={}):
app.api_key_file = kucoin_config["api_key_file"]

if app.api_key_file is not None:
try:
with open(app.api_key_file, "r") as f:
key = f.readline().strip()
secret = f.readline().strip()
password = f.readline().strip()
kucoin_config["api_key"] = key
kucoin_config["api_secret"] = secret
kucoin_config["api_passphrase"] = password
except Exception:
raise RuntimeError(f"Unable to read {app.api_key_file}")
if not os.path.isfile(app.api_key_file):
try:
raise Exception(f"Unable to read {app.api_key_file}, please check the file exists and is readable. Remove \"api_key_file\" key from the config file for test mode!\n")
except Exception as e:
print(f"{type(e).__name__}: {e}")
sys.exit(1)
else:
try:
with open(app.api_key_file, "r") as f:
key = f.readline().strip()
secret = f.readline().strip()
password = f.readline().strip()
kucoin_config["api_key"] = key
kucoin_config["api_secret"] = secret
kucoin_config["api_passphrase"] = password
except Exception:
raise RuntimeError(f"Unable to read {app.api_key_file}")

if "api_key" in kucoin_config and "api_secret" in kucoin_config and "api_passphrase" in kucoin_config and "api_url" in kucoin_config:
# validates the api key is syntactically correct
Expand Down
16 changes: 16 additions & 0 deletions models/exchange/coinbase/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
Loading