siglab-py 0.5.22__tar.gz → 0.5.25__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.

Files changed (43) hide show
  1. {siglab_py-0.5.22 → siglab_py-0.5.25}/PKG-INFO +1 -1
  2. {siglab_py-0.5.22 → siglab_py-0.5.25}/pyproject.toml +1 -1
  3. {siglab_py-0.5.22 → siglab_py-0.5.25}/setup.cfg +1 -1
  4. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/tests/unit/analytic_util_tests.py +2 -1
  5. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/util/analytic_util.py +44 -1
  6. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py.egg-info/PKG-INFO +1 -1
  7. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/__init__.py +0 -0
  8. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/constants.py +0 -0
  9. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/exchanges/__init__.py +0 -0
  10. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/exchanges/any_exchange.py +0 -0
  11. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/exchanges/futubull.py +0 -0
  12. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/__init__.py +0 -0
  13. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/aggregated_orderbook_provider.py +0 -0
  14. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/candles_provider.py +0 -0
  15. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/candles_ta_provider.py +0 -0
  16. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/ccxt_candles_ta_to_csv.py +0 -0
  17. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/deribit_options_expiry_provider.py +0 -0
  18. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/futu_candles_ta_to_csv.py +0 -0
  19. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/orderbooks_provider.py +0 -0
  20. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/test_provider.py +0 -0
  21. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/market_data_providers/tg_monitor.py +0 -0
  22. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/ordergateway/__init__.py +0 -0
  23. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/ordergateway/client.py +0 -0
  24. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/ordergateway/encrypt_keys_util.py +0 -0
  25. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/ordergateway/gateway.py +0 -0
  26. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/ordergateway/test_ordergateway.py +0 -0
  27. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/tests/__init__.py +0 -0
  28. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/tests/integration/__init__.py +0 -0
  29. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/tests/integration/market_data_util_tests.py +0 -0
  30. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/tests/unit/__init__.py +0 -0
  31. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/tests/unit/market_data_util_tests.py +0 -0
  32. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/tests/unit/trading_util_tests.py +0 -0
  33. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/util/__init__.py +0 -0
  34. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/util/aws_util.py +0 -0
  35. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/util/market_data_util.py +0 -0
  36. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/util/notification_util.py +0 -0
  37. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/util/retry_util.py +0 -0
  38. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/util/slack_notification_util.py +0 -0
  39. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py/util/trading_util.py +0 -0
  40. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py.egg-info/SOURCES.txt +0 -0
  41. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py.egg-info/dependency_links.txt +0 -0
  42. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py.egg-info/requires.txt +0 -0
  43. {siglab_py-0.5.22 → siglab_py-0.5.25}/siglab_py.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: siglab_py
3
- Version: 0.5.22
3
+ Version: 0.5.25
4
4
  Summary: Market data fetches, TA calculations and generic order gateway.
5
5
  Author: r0bbarh00d
6
6
  Author-email: r0bbarh00d <r0bbarh00d@gmail.com>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "siglab_py"
7
- version = "0.5.22"
7
+ version = "0.5.25"
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"}
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = siglab_py
3
- version = 0.5.22
3
+ version = 0.5.25
4
4
  description = Market data fetches, TA calculations and generic order gateway.
5
5
  author = r0bbarh00d
6
6
  author_email = r0bbarh00d@gmail.com
@@ -57,13 +57,14 @@ class AnalyticUtilTests(unittest.TestCase):
57
57
  'ema_volume_short_periods', 'ema_volume_long_periods',
58
58
  'max_short_periods', 'max_long_periods', 'idmax_short_periods', 'idmax_long_periods', 'min_short_periods', 'min_long_periods', 'idmin_short_periods', 'idmin_long_periods',
59
59
  'price_swing_short_periods', 'price_swing_long_periods',
60
+ 'higher_highs_long_periods', 'lower_lows_long_periods', 'higher_highs_short_periods', 'lower_lows_short_periods',
60
61
  'h_l', 'h_pc', 'l_pc', 'tr', 'atr', 'atr_avg_short_periods', 'atr_avg_long_periods',
61
62
  'hurst_exp',
62
63
  'boillenger_upper', 'boillenger_lower', 'boillenger_channel_height', 'boillenger_upper_agg', 'boillenger_lower_agg', 'boillenger_channel_height_agg',
63
64
  'aggressive_up', 'aggressive_up_index', 'aggressive_up_candle_height', 'aggressive_up_candle_high', 'aggressive_up_candle_low', 'aggressive_down', 'aggressive_down_index', 'aggressive_down_candle_height', 'aggressive_down_candle_high', 'aggressive_down_candle_low',
64
65
  'fvg_low', 'fvg_high', 'fvg_gap', 'fvg_mitigated',
65
66
  'close_delta', 'close_delta_percent', 'up', 'down',
66
- 'rsi', 'ema_rsi', 'rsi_max', 'rsi_idmax', 'rsi_min', 'rsi_idmin', 'rsi_trend',
67
+ 'rsi', 'ema_rsi', 'rsi_max', 'rsi_idmax', 'rsi_min', 'rsi_idmin', 'rsi_trend', 'rsi_higher_highs', 'rsi_lower_lows', 'rsi_divergence',
67
68
  'typical_price',
68
69
  'money_flow', 'money_flow_positive', 'money_flow_negative', 'positive_flow_sum', 'negative_flow_sum', 'money_flow_ratio', 'mfi',
69
70
  'macd', 'signal', 'macd_minus_signal',
@@ -50,7 +50,31 @@ def calculate_slope(
50
50
  pd_data[f"normalized_{slope_col_name}_max"] = normalized_slope_rolling.max()
51
51
  pd_data[f"normalized_{slope_col_name}_idmin"] = normalized_slope_rolling.apply(lambda x : x.idxmin())
52
52
  pd_data[f"normalized_{slope_col_name}_idmax"] = normalized_slope_rolling.apply(lambda x : x.idxmax())
53
-
53
+
54
+ def higherhighs(series: pd.Series) -> Union[str, None]:
55
+ unique_maxima = series.dropna()[series.dropna().diff().ne(0)]
56
+ if len(unique_maxima) < 2:
57
+ return None
58
+ first, last = unique_maxima.iloc[0], unique_maxima.iloc[-1]
59
+ if first > last:
60
+ return 'lower_highs'
61
+ elif first < last:
62
+ return 'higher_highs'
63
+ else:
64
+ return 'sideways'
65
+
66
+ def lowerlows(series: pd.Series) -> Union[str, None]:
67
+ unique_minima = series.dropna()[series.dropna().diff().ne(0)]
68
+ if len(unique_minima) < 2:
69
+ return None
70
+ first, last = unique_minima.iloc[0], unique_minima.iloc[-1]
71
+ if first > last:
72
+ return 'lower_lows'
73
+ elif first < last:
74
+ return 'higher_lows'
75
+ else:
76
+ return 'sideways'
77
+
54
78
  '''
55
79
  compute_candles_stats will calculate typical/basic technical indicators using in many trading strategies:
56
80
  a. Basic SMA/EMAs (And slopes)
@@ -180,6 +204,11 @@ def compute_candles_stats(
180
204
  pd_candles['min_long_periods'] - pd_candles['max_long_periods'] # Down swing (negative)
181
205
  )
182
206
 
207
+ pd_candles['higher_highs_long_periods'] = higherhighs(pd_candles['max_long_periods'])
208
+ pd_candles['lower_lows_long_periods'] = lowerlows(pd_candles['min_long_periods'])
209
+ pd_candles['higher_highs_short_periods'] = higherhighs(pd_candles['max_short_periods'])
210
+ pd_candles['lower_lows_short_periods'] = lowerlows(pd_candles['min_short_periods'])
211
+
183
212
  # ATR https://medium.com/codex/detecting-ranging-and-trending-markets-with-choppiness-index-in-python-1942e6450b58
184
213
  pd_candles.loc[:,'h_l'] = pd_candles['high'] - pd_candles['low']
185
214
  pd_candles.loc[:,'h_pc'] = abs(pd_candles['high'] - pd_candles['close'].shift(1))
@@ -395,6 +424,20 @@ def compute_candles_stats(
395
424
  return 'up' if row.name > row['rsi_idmin'] and row['rsi'] >= rsi_lower_threshold else 'down'
396
425
 
397
426
  pd_candles['rsi_trend'] = pd_candles.apply(lambda row: rsi_trend(row), axis=1)
427
+
428
+ pd_candles['rsi_higher_highs'] = higherhighs(pd_candles['rsi_max'])
429
+ pd_candles['rsi_lower_lows'] = lowerlows(pd_candles['rsi_min'])
430
+
431
+ def _rsi_divergence(row):
432
+ # Bullish Divergence: Price lower low + RSI higher low
433
+ if row['lower_lows_long_periods']=='lower_lows' and row['rsi_lower_lows']=='higher_lows':
434
+ return 'bullish_divergence'
435
+ # Bearish Divergence: Price higher high + RSI lower high
436
+ elif row['higher_highs_long_periods']=='higher_highs' and row['rsi_higher_highs']=='lower_highs':
437
+ return 'bearish_divergence'
438
+ else:
439
+ return 'no_divergence'
440
+ pd_candles['rsi_divergence'] = pd_candles.apply(_rsi_divergence, axis=1)
398
441
 
399
442
 
400
443
  # MFI (Money Flow Index) https://randerson112358.medium.com/algorithmic-trading-strategy-using-money-flow-index-mfi-python-aa46461a5ea5
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: siglab_py
3
- Version: 0.5.22
3
+ Version: 0.5.25
4
4
  Summary: Market data fetches, TA calculations and generic order gateway.
5
5
  Author: r0bbarh00d
6
6
  Author-email: r0bbarh00d <r0bbarh00d@gmail.com>