Skip to content

Commit fdcd3a6

Browse files
authored
Merge pull request #211 from Azulinho/next_release
Next release
2 parents cd73754 + f92aaeb commit fdcd3a6

File tree

5 files changed

+72
-37
lines changed

5 files changed

+72
-37
lines changed

lib/helpers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import udatetime
1212
from binance.client import Client
1313
from filelock import SoftFileLock
14-
from tenacity import retry, wait_exponential
14+
from tenacity import retry, wait_fixed, stop_after_delay
1515

1616

1717
def mean(values: list[float]) -> float:
@@ -44,7 +44,7 @@ def c_from_timestamp(date: float) -> datetime:
4444
return datetime.fromtimestamp(date)
4545

4646

47-
@retry(wait=wait_exponential(multiplier=1, max=3))
47+
@retry(wait=wait_fixed(2), stop=stop_after_delay(10))
4848
def cached_binance_client(access_key: str, secret_key: str) -> Client:
4949
"""retry wrapper for binance client first call"""
5050

run

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function usage() {
1414
echo "./run config-endpoint-service BIND=0.0.0.0 CONFIG_FILE=myconfig.yaml"
1515
echo "./run klines-caching-service BIND=0.0.0.0"
1616
echo "./run price_log_service BIND=0.0.0.0"
17-
echo "./run download_price_logs FROM=20220101 TO=20220131"
17+
echo "./run download_price_logs FROM=20220101 TO=20220131 UNIT=1m"
1818
}
1919

2020
function free_port () { # looks for a free TCP port
@@ -72,6 +72,10 @@ function download_price_logs() { # downloads klines logs fro binance
7272
exit 1
7373
fi
7474

75+
if [ -z "$UNIT" ]; then
76+
export UNIT="1m"
77+
fi
78+
7579
docker run --rm \
7680
${USE_TTY} \
7781
${DOCKER_RUN_AS} \
@@ -81,7 +85,7 @@ function download_price_logs() { # downloads klines logs fro binance
8185
${RUN_IN_BACKGROUND} \
8286
${IMAGE}:${TAG} \
8387
/cryptobot/.venv/bin/python -u /cryptobot/utils/pull_klines.py \
84-
-s ${FROM} -e ${TO}
88+
-s ${FROM} -e ${TO} -u ${UNIT}
8589
}
8690

8791
function docker_network() { # creates a docker network
@@ -307,9 +311,11 @@ function github_actions_ci_pr_docker_tests() {
307311
cat tests/price.log.gz | grep BTCUSDT | grep 2021-12-${ta} |gzip -1 > log/BTCUSDT/202112${ta}.log.gz
308312
done
309313
cp tests/index.json.gz log/
314+
cp tests/index_v2.json.gz log/
310315

311316
export PRICE_LOG_PORT=$( cat ${STATE_DIR}/.price_log_service.port)
312317
curl --output /dev/null http://${DOCKER_IP}:${PRICE_LOG_PORT}/index.json.gz
318+
curl --output /dev/null http://${DOCKER_IP}:${PRICE_LOG_PORT}/index_v2.json.gz
313319

314320
echo BuyMoonSellRecoveryStrategy.yaml
315321
cp tests/BuyMoonSellRecoveryStrategy.yaml configs/
@@ -352,7 +358,7 @@ function github_actions_ci_pr_docker_tests() {
352358
TAG=pr CONFIG_FILE=prove-backtesting.yaml
353359

354360
wc -l results/prove-backtesting.prove-backtesting.yaml.txt \
355-
| grep '29'
361+
| grep '44'
356362

357363
for ta in 01 02 03 04 05 06 07 08 09
358364
do

tests/index_v2.json.gz

310 Bytes
Binary file not shown.

utils/prove-backtesting.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
import pandas as pd
1717
import requests
1818
import yaml
19-
from tenacity import retry, wait_exponential
19+
from tenacity import retry, wait_fixed, stop_after_delay
2020

2121

22-
@retry(wait=wait_exponential(multiplier=2, min=1, max=30))
22+
@retry(wait=wait_fixed(2), stop=stop_after_delay(10))
2323
def get_index_json(query: str) -> requests.Response:
2424
"""retry wrapper for requests calls"""
2525
response: requests.Response = requests.get(query, timeout=5)
@@ -455,17 +455,18 @@ def write_all_coin_configs(
455455
"""generate all coinfiles"""
456456

457457
r: requests.Response = get_index_json(
458-
f"{self.price_log_service_url}/index.json.gz"
458+
f"{self.price_log_service_url}/index_v2.json.gz"
459459
)
460460
index: Any = json.loads(r.content)
461+
index_dates = index["DATES"]
461462

462463
next_run_coins: Dict[str, Any] = self.filter_on_avail_days_with_log(
463-
dates, index
464+
dates, index_dates
464465
)
465466

466467
if self.enable_new_listing_checks:
467468
next_run_coins = self.filter_on_coins_with_min_age_logs(
468-
index, dates[-1], next_run_coins
469+
index_dates, dates[-1], next_run_coins
469470
)
470471
for coin, _price_logs in next_run_coins.items():
471472
self.write_single_coin_config(coin, _price_logs, thisrun)
@@ -776,12 +777,6 @@ def run_optimized_config(self, s_investment: float) -> float:
776777
price_logs = pv.generate_price_log_list(rollforward_dates)
777778
tickers = pv.gather_best_results_from_backtesting_log("coincfg")
778779

779-
# if our backtesting gave us no tickers,
780-
# we'll skip this forward testing run
781-
if not tickers:
782-
log_msg("forwardtesting config contains no tickers, skipping run")
783-
continue
784-
785780
log_msg(
786781
f"now forwardtesting {rollforward_dates[0]}...{rollforward_dates[-1]}"
787782
)

utils/pull_klines.py

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,52 +49,86 @@ def daterange(date1, date2):
4949
return dates
5050

5151

52-
def generate_index(log_dir="log"):
53-
"""generates index.json with dates <- [coins]"""
52+
def gather_symbols_and_logs(log_dir="log") -> tuple[set[str], set[str]]:
53+
"""returns lists of symbols and dates"""
5454
date_list = set()
5555
symbols_list = set()
56-
index = {}
5756

5857
# gather all date.log.gz logs and
5958
# all symbol dirs
60-
for item in sorted(os.listdir(log_dir)):
59+
for dir_item in sorted(os.listdir(log_dir)):
6160
if (
62-
os.path.isfile(f"{log_dir}/{item}")
63-
and item.startswith("20")
64-
and ".log." in item
61+
os.path.isfile(f"{log_dir}/{dir_item}")
62+
and dir_item.startswith("20")
63+
and dir_item.endswith(".log.gz")
6564
):
66-
date = item.split(".")[0]
65+
date: str = dir_item.split(".")[0]
6766
date_list.add(date)
68-
if os.path.isdir(f"{log_dir}/{item}"):
69-
symbols_list.add(item)
67+
if os.path.isdir(f"{log_dir}/{dir_item}"):
68+
symbols_list.add(dir_item)
69+
70+
return (set(symbols_list), set(date_list))
71+
72+
73+
def gather_symbols_per_date(
74+
log_dir, symbols_list, date_list
75+
) -> dict[str, list[str]]:
76+
"""returns map of dates containing symbols available on that date"""
77+
dates_idx: dict[str, list[str]] = {}
7078

7179
# we'll store all symbol logs in each date
7280
for date in sorted(date_list):
73-
index[date] = set()
81+
if date not in dates_idx:
82+
dates_idx[date] = []
7483

75-
# iterate over all the symbols and gather all the
76-
# logfiles in in each one of those symbol dirs
7784
for _symbol in sorted(symbols_list):
78-
logs = os.listdir(f"{log_dir}/{_symbol}")
85+
logs: list[str] = os.listdir(f"{log_dir}/{_symbol}")
7986
for _log in sorted(logs):
8087
if not os.path.isfile(f"{log_dir}/{_symbol}/{_log}"):
8188
continue
82-
date = _log.split(".")[0]
83-
index[date].add(_symbol)
89+
_date: str = _log.split(".")[0]
90+
dates_idx[_date].append(_symbol)
91+
return dates_idx
8492

85-
tmp = index
86-
index = {}
87-
for date in tmp.keys(): # pylint: disable=C0206,C0201
88-
index[date] = list(tmp[date])
93+
94+
def generate_index(log_dir="log") -> None:
95+
"""generates index.json with dates <- [coins]"""
96+
97+
print("generating index...")
98+
symbols_list, date_list = gather_symbols_and_logs(log_dir)
99+
100+
dates_index: dict[str, list[str]] = gather_symbols_per_date(
101+
log_dir, symbols_list, date_list
102+
)
103+
104+
# generate index_v1
105+
print("writing index.json.gz...")
89106

90107
with gzip.open(
91108
f"{log_dir}/index.json.gz", "wt", encoding="utf-8"
109+
) as index_json:
110+
index_json.write(json.dumps(dates_index, indent=4))
111+
112+
# generate index_v2
113+
print("generating index_v2.json.gz...")
114+
index: dict[str, dict] = {"DATES": {}, "COINS": {}}
115+
for date in dates_index.keys(): # pylint: disable=C0206,C0201
116+
index["DATES"][date] = list(dates_index[date])
117+
118+
for _symbol in sorted(os.listdir(log_dir)):
119+
if os.path.isdir(f"{log_dir}/{_symbol}"):
120+
logs: list[str] = os.listdir(f"{log_dir}/{_symbol}")
121+
index["COINS"][_symbol] = sorted(logs)
122+
123+
print("writing index_v2.json.gz...")
124+
with gzip.open(
125+
f"{log_dir}/index_v2.json.gz", "wt", encoding="utf-8"
92126
) as index_json:
93127
index_json.write(json.dumps(index, indent=4))
94128

95129

96130
if __name__ == "__main__":
97-
parser = argparse.ArgumentParser()
131+
parser: argparse.ArgumentParser = argparse.ArgumentParser()
98132
parser.add_argument("-s", "--start", help="start day to fetch klines for")
99133
parser.add_argument(
100134
"-e", "--end", help="end day to fetch klines for", required=False

0 commit comments

Comments
 (0)