siglab-py 0.3.12__tar.gz → 0.3.13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of siglab-py might be problematic. Click here for more details.
- {siglab_py-0.3.12 → siglab_py-0.3.13}/PKG-INFO +1 -1
- {siglab_py-0.3.12 → siglab_py-0.3.13}/pyproject.toml +1 -1
- {siglab_py-0.3.12 → siglab_py-0.3.13}/setup.cfg +1 -1
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/util/market_data_util.py +40 -1
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py.egg-info/PKG-INFO +1 -1
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/__init__.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/constants.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/exchanges/__init__.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/exchanges/any_exchange.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/exchanges/futubull.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/__init__.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/aggregated_orderbook_provider.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/candles_provider.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/candles_ta_provider.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/ccxt_candles_ta_to_csv.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/deribit_options_expiry_provider.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/futu_candles_ta_to_csv.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/orderbooks_provider.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/test_provider.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/ordergateway/__init__.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/ordergateway/client.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/ordergateway/encrypt_keys_util.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/ordergateway/gateway.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/ordergateway/test_ordergateway.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/tests/__init__.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/tests/integration/__init__.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/tests/integration/market_data_util_tests.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/tests/unit/__init__.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/tests/unit/analytic_util_tests.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/tests/unit/market_data_util_tests.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/tests/unit/trading_util_tests.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/util/__init__.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/util/analytic_util.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/util/aws_util.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/util/notification_util.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/util/retry_util.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/util/slack_notification_util.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/util/trading_util.py +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py.egg-info/SOURCES.txt +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py.egg-info/dependency_links.txt +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py.egg-info/requires.txt +0 -0
- {siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "siglab_py"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.13"
|
|
8
8
|
description = "Market data fetches, TA calculations and generic order gateway."
|
|
9
9
|
authors = [{name = "r0bbarh00d", email = "r0bbarh00d@gmail.com"}]
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -2,6 +2,7 @@ import logging
|
|
|
2
2
|
import incremental
|
|
3
3
|
import tzlocal
|
|
4
4
|
from datetime import datetime, timezone
|
|
5
|
+
import time
|
|
5
6
|
from typing import List, Dict, Union, NoReturn, Any, Tuple
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
import math
|
|
@@ -512,6 +513,28 @@ def fetch_candles(
|
|
|
512
513
|
)
|
|
513
514
|
return { '' : None }
|
|
514
515
|
|
|
516
|
+
'''
|
|
517
|
+
Find listing date https://gist.github.com/mr-easy/5185b1dcdd5f9f908ff196446f092e9b
|
|
518
|
+
|
|
519
|
+
Usage:
|
|
520
|
+
listing_ts = find_start_time(exchange, 'HYPE/USDT:USDT', int(datetime(2024,1,1).timestamp()*1000), int(datetime(2025,5,1).timestamp()*1000), '1h')
|
|
521
|
+
|
|
522
|
+
Caveats:
|
|
523
|
+
1) If listing date lies outside [start_time, end_time], this function will stackoverflow,
|
|
524
|
+
2) Even if not, it's still very time consuming.
|
|
525
|
+
|
|
526
|
+
Alternative: market['created']
|
|
527
|
+
'''
|
|
528
|
+
def search_listing_ts(exchange, symbol, start_time, end_time, timeframe):
|
|
529
|
+
mid_time = (start_time + end_time)//2
|
|
530
|
+
if(mid_time == start_time): return mid_time+1
|
|
531
|
+
ohlcv = exchange.fetch_ohlcv(symbol, timeframe, mid_time, limit=1)
|
|
532
|
+
time.sleep(1)
|
|
533
|
+
if(len(ohlcv) == 0):
|
|
534
|
+
return search_listing_ts(exchange, symbol, mid_time, end_time, timeframe)
|
|
535
|
+
else:
|
|
536
|
+
return search_listing_ts(exchange, symbol, start_time, mid_time, timeframe)
|
|
537
|
+
|
|
515
538
|
def _fetch_candles_ccxt(
|
|
516
539
|
start_ts : int,
|
|
517
540
|
end_ts : int,
|
|
@@ -524,6 +547,10 @@ def _fetch_candles_ccxt(
|
|
|
524
547
|
|
|
525
548
|
rsp = {}
|
|
526
549
|
|
|
550
|
+
exchange.load_markets()
|
|
551
|
+
|
|
552
|
+
num_tickers = len(normalized_symbols)
|
|
553
|
+
i = 0
|
|
527
554
|
for ticker in normalized_symbols:
|
|
528
555
|
@retry(num_attempts=3, pause_between_retries_ms=1000)
|
|
529
556
|
def _fetch_ohlcv(exchange, symbol, timeframe, since, limit, params) -> Union[List, NoReturn]:
|
|
@@ -548,7 +575,17 @@ def _fetch_candles_ccxt(
|
|
|
548
575
|
raise ValueError(f"Invalid candle_size {candle_size}")
|
|
549
576
|
return num_intervals * increment
|
|
550
577
|
|
|
551
|
-
logger.info(f"Fetching {candle_size} candles for {ticker}.")
|
|
578
|
+
logger.info(f"{i}/{num_tickers} Fetching {candle_size} candles for {ticker}.")
|
|
579
|
+
|
|
580
|
+
'''
|
|
581
|
+
It uses a while loop to implement a sliding window to download candles between start_ts and end_ts.
|
|
582
|
+
However, start_ts for example can be 1 Jan 2021 for a given ticker.
|
|
583
|
+
But if that ticker listing date is 1 Jan 2025, this while loop would waste a lot of time loop between 1 Jan 2021 thru 31 Dec 2024, slowly incrementing this_cutoff += _calc_increment(candle_size).
|
|
584
|
+
A more efficient way is to find listing date. Start looping from there.
|
|
585
|
+
'''
|
|
586
|
+
market = exchange.markets[ticker]
|
|
587
|
+
if market['created']:
|
|
588
|
+
start_ts = max(start_ts, int(market['created']/1000))
|
|
552
589
|
|
|
553
590
|
all_candles = []
|
|
554
591
|
params = {}
|
|
@@ -574,6 +611,8 @@ def _fetch_candles_ccxt(
|
|
|
574
611
|
|
|
575
612
|
rsp[ticker] = pd_all_candles
|
|
576
613
|
|
|
614
|
+
i+=1
|
|
615
|
+
|
|
577
616
|
return rsp
|
|
578
617
|
|
|
579
618
|
def fetch_deribit_btc_option_expiries(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/candles_ta_provider.py
RENAMED
|
File without changes
|
{siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/ccxt_candles_ta_to_csv.py
RENAMED
|
File without changes
|
|
File without changes
|
{siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/futu_candles_ta_to_csv.py
RENAMED
|
File without changes
|
{siglab_py-0.3.12 → siglab_py-0.3.13}/siglab_py/market_data_providers/orderbooks_provider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|