siglab-py 0.5.30__py3-none-any.whl → 0.6.16__py3-none-any.whl

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 (34) hide show
  1. siglab_py/backtests/__init__.py +0 -0
  2. siglab_py/backtests/backtest_core.py +2371 -0
  3. siglab_py/backtests/coinflip_15m_crypto.py +432 -0
  4. siglab_py/backtests/fibonacci_d_mv_crypto.py +541 -0
  5. siglab_py/backtests/macdrsi_crosses_15m_tc_crypto.py +468 -0
  6. siglab_py/constants.py +5 -0
  7. siglab_py/exchanges/binance.py +38 -0
  8. siglab_py/exchanges/deribit.py +83 -0
  9. siglab_py/exchanges/futubull.py +11 -2
  10. siglab_py/market_data_providers/candles_provider.py +2 -2
  11. siglab_py/market_data_providers/candles_ta_provider.py +3 -3
  12. siglab_py/market_data_providers/futu_candles_ta_to_csv.py +6 -4
  13. siglab_py/market_data_providers/google_monitor.py +320 -0
  14. siglab_py/market_data_providers/orderbooks_provider.py +15 -12
  15. siglab_py/market_data_providers/tg_monitor.py +6 -2
  16. siglab_py/market_data_providers/{test_provider.py → trigger_provider.py} +9 -8
  17. siglab_py/ordergateway/encrypt_keys_util.py +1 -1
  18. siglab_py/ordergateway/gateway.py +97 -35
  19. siglab_py/tests/integration/market_data_util_tests.py +37 -1
  20. siglab_py/tests/unit/analytic_util_tests.py +37 -10
  21. siglab_py/tests/unit/simple_math_tests.py +252 -0
  22. siglab_py/tests/unit/trading_util_tests.py +0 -21
  23. siglab_py/util/analytic_util.py +195 -33
  24. siglab_py/util/datetime_util.py +39 -0
  25. siglab_py/util/market_data_util.py +184 -65
  26. siglab_py/util/notification_util.py +1 -1
  27. siglab_py/util/retry_util.py +6 -1
  28. siglab_py/util/simple_math.py +262 -0
  29. siglab_py/util/trading_util.py +0 -12
  30. {siglab_py-0.5.30.dist-info → siglab_py-0.6.16.dist-info}/METADATA +1 -1
  31. siglab_py-0.6.16.dist-info/RECORD +50 -0
  32. {siglab_py-0.5.30.dist-info → siglab_py-0.6.16.dist-info}/WHEEL +1 -1
  33. siglab_py-0.5.30.dist-info/RECORD +0 -39
  34. {siglab_py-0.5.30.dist-info → siglab_py-0.6.16.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,262 @@
1
+ import math
2
+ import random
3
+ from typing import List, Dict, Union
4
+
5
+ from pandas import isna
6
+
7
+ def generate_rand_nums(
8
+ range_min : float = 0,
9
+ range_max : float = 1,
10
+ size=100, # list size
11
+ percent_in_range : float = 100,
12
+ abs_min : float = 0,
13
+ abs_max : float = 1
14
+ ) -> List[float]:
15
+ assert(range_min<range_max)
16
+
17
+ if abs_min>range_min:
18
+ abs_min = range_min
19
+ if abs_max<range_max:
20
+ abs_max = range_max
21
+
22
+ result : List[float] = []
23
+ for _ in range(int(size * percent_in_range/100)):
24
+ result.append(random.uniform(range_min, range_max))
25
+ for _ in range(size - len(result)):
26
+ if random.uniform(0, 1)>0.5:
27
+ result.append(random.uniform(abs_min, range_min))
28
+ else:
29
+ result.append(random.uniform(range_max, abs_max))
30
+
31
+ random.shuffle(result)
32
+
33
+ return result
34
+
35
+ def compute_level_increment(
36
+ num : float,
37
+ level_granularity : float = 0.01
38
+ ) -> float:
39
+ if math.isnan(num):
40
+ return num
41
+ level_size = num * level_granularity
42
+ magnitude = math.floor(math.log10(abs(level_size)))
43
+ base_increment = 10 ** magnitude
44
+ rounded_level_size = round(level_size / base_increment) * base_increment
45
+ return rounded_level_size
46
+
47
+ # https://norman-lm-fung.medium.com/levels-are-psychological-7176cdefb5f2
48
+ def round_to_level(
49
+ num : float,
50
+ level_granularity : float = 0.01
51
+ ) -> float:
52
+ if math.isnan(num):
53
+ return num
54
+ rounded_level_size = compute_level_increment(num, level_granularity)
55
+ rounded_num = round(num / rounded_level_size) * rounded_level_size
56
+ return rounded_num
57
+
58
+ def compute_adjacent_levels(
59
+ num : float,
60
+ level_granularity : float = 0.01,
61
+ num_levels_per_side : int = 1
62
+ ) -> Union[None, List[float]]:
63
+ if math.isnan(num):
64
+ return None
65
+ rounded_level_size = compute_level_increment(num, level_granularity)
66
+ rounded_num = round(num / rounded_level_size) * rounded_level_size
67
+ levels = [ rounded_num ]
68
+ levels = list(reversed([ rounded_num - (i+1)*rounded_level_size for i in list(range(num_levels_per_side))])) + levels + [ rounded_num + (i+1)*rounded_level_size for i in list(range(num_levels_per_side))]
69
+ return levels
70
+
71
+ def bucket_series(
72
+ values : List[float],
73
+ outlier_threshold_percent : float = 0,
74
+ level_granularity : float = 0.1 # 0.1 = 10%
75
+ ) -> Dict[
76
+ str,
77
+ Dict[str,Union[float, List[float]]]
78
+ ]:
79
+ buckets : Dict[
80
+ str,
81
+ Dict[str,Union[float, List[float]]]
82
+ ] = {}
83
+ list_0_to_1 : bool = True if len([x for x in values if x<0 or x>1])/len(values)*100 <= outlier_threshold_percent else False
84
+ list_m1_to_1 : bool = True if len([x for x in values if x<-1 or x>1])/len(values)*100 <= outlier_threshold_percent else False
85
+
86
+ list_0_to_100 : bool = True if len([x for x in values if x<0 or x>100])/len(values)*100 <= outlier_threshold_percent else False
87
+ if (
88
+ list_0_to_100
89
+ and (
90
+ not min(values)<100*(outlier_threshold_percent/100) or not max(values)>100*(1-outlier_threshold_percent/100)
91
+ )
92
+ ):
93
+ list_0_to_100 = False
94
+ list_m100_to_100 : bool = True if len([x for x in values if x<-100 or x>100])/len(values)*100 <= outlier_threshold_percent else False
95
+ if (
96
+ list_m100_to_100
97
+ and (
98
+ not min(values)<-100*(1-outlier_threshold_percent/100) or not max(values)>100*(1-outlier_threshold_percent/100)
99
+ )
100
+ ):
101
+ list_m100_to_100 = False
102
+
103
+ def _generate_sequence(start, stop, step):
104
+ result = []
105
+ current = start
106
+ num_steps = int((stop - start) / step) + 1
107
+ for i in range(num_steps):
108
+ result.append(round(start + i * step, 10))
109
+ return result
110
+
111
+ if list_0_to_1:
112
+ step = round_to_level(
113
+ 1 * level_granularity,
114
+ level_granularity=level_granularity
115
+ )
116
+ intervals = _generate_sequence(0.1, 1, step)
117
+ last_interval = 0
118
+ buckets[f"< 0"] = {
119
+ 'min' : float("-inf"),
120
+ 'max' : 0,
121
+ 'values' : [ x for x in values if x<0 ]
122
+ }
123
+ for interval in intervals:
124
+ buckets[f"{last_interval} - {interval}"] = {
125
+ 'min' : last_interval,
126
+ 'max' : interval,
127
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
128
+ }
129
+ last_interval = interval
130
+ buckets[f">1"] = {
131
+ 'min' : last_interval,
132
+ 'max' : float("inf"),
133
+ 'values' : [ x for x in values if x>=1 ]
134
+ }
135
+
136
+ elif not list_0_to_1 and list_m1_to_1:
137
+ step = round_to_level(
138
+ 1 * level_granularity,
139
+ level_granularity=level_granularity
140
+ )
141
+ intervals = _generate_sequence(-0.9, 1, step)
142
+ last_interval = -1
143
+ buckets[f"< -1"] = {
144
+ 'min' : float("-inf"),
145
+ 'max' : -1,
146
+ 'values' : [ x for x in values if x<-1 ]
147
+ }
148
+ for interval in intervals:
149
+ buckets[f"{last_interval} - {interval}"] = {
150
+ 'min' : last_interval,
151
+ 'max' : interval,
152
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
153
+ }
154
+ last_interval = interval
155
+ buckets[f">1"] = {
156
+ 'min' : last_interval,
157
+ 'max' : float("inf"),
158
+ 'values' : [ x for x in values if x>=1 ]
159
+ }
160
+
161
+ elif not list_0_to_1 and not list_m1_to_1 and list_0_to_100:
162
+ step = round_to_level(
163
+ 100 * level_granularity,
164
+ level_granularity=level_granularity
165
+ )
166
+ intervals = _generate_sequence(10, 100, step)
167
+ last_interval = 0
168
+ buckets[f"<0"] = {
169
+ 'min' : float("-inf"),
170
+ 'max' : 0,
171
+ 'values' : [ x for x in values if x<0 ]
172
+ }
173
+ for interval in intervals:
174
+ buckets[f"{last_interval} - {interval}"] = {
175
+ 'min' : last_interval,
176
+ 'max' : interval,
177
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
178
+ }
179
+ last_interval = interval
180
+ buckets[f">100"] = {
181
+ 'min' : last_interval,
182
+ 'max' : float("inf"),
183
+ 'values' : [ x for x in values if x>=100 ]
184
+ }
185
+
186
+ elif not list_0_to_1 and not list_m1_to_1 and not list_0_to_100 and list_m100_to_100:
187
+ step = round_to_level(
188
+ 100 * level_granularity,
189
+ level_granularity=level_granularity
190
+ )
191
+ intervals = _generate_sequence(-90, 100, step)
192
+ last_interval = -100
193
+ buckets[f"<-100"] = {
194
+ 'min' : float("-inf"),
195
+ 'max' : -100,
196
+ 'values' : [ x for x in values if x<-100 ]
197
+ }
198
+ for interval in intervals:
199
+ buckets[f"{last_interval} - {interval}"] = {
200
+ 'min' : last_interval,
201
+ 'max' : interval,
202
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
203
+ }
204
+ last_interval = interval
205
+ buckets[f">100"] = {
206
+ 'min' : last_interval,
207
+ 'max' : float("inf"),
208
+ 'values' : [ x for x in values if x>=100 ]
209
+ }
210
+
211
+ else:
212
+ range_min = round_to_level(
213
+ min(values),
214
+ level_granularity=level_granularity
215
+ )
216
+ range_max = round_to_level(
217
+ max(values),
218
+ level_granularity=level_granularity
219
+ )
220
+ step = round_to_level(
221
+ abs(range_max - range_min) * level_granularity,
222
+ level_granularity=level_granularity
223
+ )
224
+
225
+ intervals = _generate_sequence(range_min+step, range_max, step)
226
+ last_interval = range_min
227
+ buckets[f"< {range_min}"] = {
228
+ 'min' : float("-inf"),
229
+ 'max' : range_min,
230
+ 'values' : [ x for x in values if x<range_min ]
231
+ }
232
+ for interval in intervals:
233
+ buckets[f"{last_interval} - {interval}"] = {
234
+ 'min' : last_interval,
235
+ 'max' : interval,
236
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
237
+ }
238
+ last_interval = interval
239
+ buckets[f"> {range_max}"] = {
240
+ 'min' : last_interval,
241
+ 'max' : float("inf"),
242
+ 'values' : [ x for x in values if x>=range_max ]
243
+ }
244
+
245
+ for key in buckets:
246
+ bucket = buckets[key]
247
+ assert(len([x for x in bucket['values'] if x<bucket['min'] or x>bucket['max']])==0) # type: ignore
248
+
249
+ return buckets
250
+
251
+ def bucketize_val(
252
+ x : float,
253
+ buckets : Dict[
254
+ str,
255
+ Dict[str,Union[float, List[float]]]
256
+ ]
257
+ ) -> Union[str,None]:
258
+ for key in buckets:
259
+ bucket = buckets[key]
260
+ if x>=bucket['min'] and x<=bucket['max']: # type: ignore
261
+ return key
262
+ return None
@@ -116,15 +116,3 @@ def calc_eff_trailing_sl(
116
116
  effective_tp_trailing_percent = default_effective_tp_trailing_percent
117
117
 
118
118
  return effective_tp_trailing_percent
119
-
120
- # https://norman-lm-fung.medium.com/levels-are-psychological-7176cdefb5f2
121
- def round_to_level(
122
- price : float,
123
- level_granularity : float = 0.01
124
- ) -> float:
125
- level_size = price * level_granularity
126
- magnitude = math.floor(math.log10(level_size))
127
- base_increment = 10 ** magnitude
128
- rounded_level_size = round(level_size / base_increment) * base_increment
129
- rounded_price = round(price / rounded_level_size) * rounded_level_size
130
- return rounded_price
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: siglab_py
3
- Version: 0.5.30
3
+ Version: 0.6.16
4
4
  Summary: Market data fetches, TA calculations and generic order gateway.
5
5
  Author: r0bbarh00d
6
6
  Author-email: r0bbarh00d <r0bbarh00d@gmail.com>
@@ -0,0 +1,50 @@
1
+ siglab_py/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ siglab_py/constants.py,sha256=RlWh0-_sXHanfPIVLgDPLNbn9ljv3aZJYMv92Zd0jZI,701
3
+ siglab_py/backtests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ siglab_py/backtests/backtest_core.py,sha256=LsK2H9bdPgR0Nyjw52Ama7S_jVbfeybKnyDefbBAC7g,162194
5
+ siglab_py/backtests/coinflip_15m_crypto.py,sha256=MKMksVLVER3pMykSaXlSVyR63IvxJuTZmUEp17SDTpk,15247
6
+ siglab_py/backtests/fibonacci_d_mv_crypto.py,sha256=WTAgumotdGd5VmWRWh7P1oXSgZMaV1ew42q2iXAno0s,20513
7
+ siglab_py/backtests/macdrsi_crosses_15m_tc_crypto.py,sha256=HzaYnFMSSOOtuyarOe-2zrymjg1llyRzFYHLNQ9PQ-o,16419
8
+ siglab_py/exchanges/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ siglab_py/exchanges/any_exchange.py,sha256=Y-zue75ZSmu9Ga1fONbjBGLNH5pDHQI01hCSjuLBkAk,889
10
+ siglab_py/exchanges/binance.py,sha256=3hLeU5t4AXVLS2u6V8wlqsvdo3Uh00ebgx4MONy8X6k,1394
11
+ siglab_py/exchanges/deribit.py,sha256=gI5ezORDeu-Z1S8yxJj1Kj43OroK3ga9BckNijkuk8A,3361
12
+ siglab_py/exchanges/futubull.py,sha256=i0jNgl9BGJvgEIDeOkTfD52FaK77vX8axCKNYwJHwSI,21144
13
+ siglab_py/market_data_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ siglab_py/market_data_providers/aggregated_orderbook_provider.py,sha256=FZRobEBNRzcNGlOG3u38OVhmOZYlkNm8dVvR-S7Ii2g,23342
15
+ siglab_py/market_data_providers/candles_provider.py,sha256=FXvciwU7ONC0VdX-fggELIl2yqd7mRB2CjDeUsDzr-A,14145
16
+ siglab_py/market_data_providers/candles_ta_provider.py,sha256=az3tVjR4g0vhOCc8S5kGvjuNIpwxnXarUhMi62Z5Pzc,12013
17
+ siglab_py/market_data_providers/ccxt_candles_ta_to_csv.py,sha256=DHj51QTbkCmEd9RFNVhWWpsSPz1aLd6zTLqkUUbEkK0,11158
18
+ siglab_py/market_data_providers/deribit_options_expiry_provider.py,sha256=e9Ee8TmC8pXaid8-jouSLKIpuW6_JBBgwRTieI665yQ,8684
19
+ siglab_py/market_data_providers/futu_candles_ta_to_csv.py,sha256=SCWlI_mOuErpGP8Kxh5WKEoff9cqqxO19oLFLd04bTs,10964
20
+ siglab_py/market_data_providers/google_monitor.py,sha256=B08Aj1urL4M9hVUfjubVwTsFhfsj5-eFaf36lYqZ8-o,14028
21
+ siglab_py/market_data_providers/orderbooks_provider.py,sha256=b1XgPVSTU3y0Dxm5DOKjeldK-0ZrP15_iG3fzjBBBG8,16376
22
+ siglab_py/market_data_providers/tg_monitor.py,sha256=LY4oRm5qQ_XiuLk0RMVDc0Vdsi6CKE6O9hgeGm3VXBM,21995
23
+ siglab_py/market_data_providers/trigger_provider.py,sha256=b9B1RSBI8bFyGsM4DVXhEY8w08iTy8sPZkTqoy72VJE,2505
24
+ siglab_py/ordergateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ siglab_py/ordergateway/client.py,sha256=LvtrYirrdFOcKgTkvuqwdEN7r3nurjX320ESnk7tHE0,15095
26
+ siglab_py/ordergateway/encrypt_keys_util.py,sha256=U_M-jPrPYOTO_sU0bMVkO5ruNXge5vek8yUGa8jaE-g,1349
27
+ siglab_py/ordergateway/gateway.py,sha256=KAulWLZf8UYFo0esWwb4H8NmGnylkkckx4xBcF6-IZQ,47343
28
+ siglab_py/ordergateway/test_ordergateway.py,sha256=4PE2flp_soGcD3DrI7zJOzZndjkb6I5XaDrFNNq4Huo,4009
29
+ siglab_py/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ siglab_py/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ siglab_py/tests/integration/market_data_util_tests.py,sha256=h6KQytMFj3et54sY-r58fYWazfCxCrscjJqkHfgEs5g,8762
32
+ siglab_py/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ siglab_py/tests/unit/analytic_util_tests.py,sha256=tV7MsItlidwqdAQ_kD1000PsG4zIoQyQY1RdOn5XQAQ,5942
34
+ siglab_py/tests/unit/market_data_util_tests.py,sha256=A1y83itISmMJdn6wLpfwcr4tGola8wTf1D1xbelMvgw,2026
35
+ siglab_py/tests/unit/simple_math_tests.py,sha256=ZIRNjyLI1UtRjJ_vfz13WGCOxbU0ttR101rrjaG5WGM,10480
36
+ siglab_py/tests/unit/trading_util_tests.py,sha256=LiflZrduWXyLMbpSFQCaydA7jdJx3vFR-3KuKRRGhjQ,2927
37
+ siglab_py/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ siglab_py/util/analytic_util.py,sha256=KoRDlesLuYKkr0V0ytJLEqaDHh6Tyfr6GhaPQYFCU2U,65225
39
+ siglab_py/util/aws_util.py,sha256=KGmjHrr1rpnnxr33nXHNzTul4tvyyxl9p6gpwNv0Ygc,2557
40
+ siglab_py/util/datetime_util.py,sha256=3yijKKhnvC1vJME-NsZxFn6hu2ogLsTlXdt2DoIyQVw,1590
41
+ siglab_py/util/market_data_util.py,sha256=ReutR6IjL7kyNKwftB-RMu5P9DUfVD0UHgzS-qwaHEk,36341
42
+ siglab_py/util/notification_util.py,sha256=tNZMUkkjz4q1CKqcQq62oEmZgHgNIwz2Iw9J22V22Zw,2668
43
+ siglab_py/util/retry_util.py,sha256=Y244NHoN7eJoQWn7MStRz1BtLz6B61MZHAGhJ8gg2b8,1108
44
+ siglab_py/util/simple_math.py,sha256=PmSEwDvbnUIKS-ACY6wpO2vyMFFq5ZMIWmrcI15VoM8,9407
45
+ siglab_py/util/slack_notification_util.py,sha256=G27n-adbT3Q6oaHSMvu_Nom794rrda5PprSF-zvmzkM,1912
46
+ siglab_py/util/trading_util.py,sha256=dlIOzoMGnddLSFODcJ61EBH1Aeruq4IT2MsxIdFkV9I,5252
47
+ siglab_py-0.6.16.dist-info/METADATA,sha256=548tipZkie4H7vnrFlojRpIEpMvW8zc5jN2U9BHfw2g,829
48
+ siglab_py-0.6.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
+ siglab_py-0.6.16.dist-info/top_level.txt,sha256=AbD4VR9OqmMOGlMJLkAVPGQMtUPIQv0t1BF5xmcLJSk,10
50
+ siglab_py-0.6.16.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,39 +0,0 @@
1
- siglab_py/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- siglab_py/constants.py,sha256=atSjvM0wv_f1wrzWHE0DcbUn6fqLmg-51BpfMJR1QB4,547
3
- siglab_py/exchanges/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- siglab_py/exchanges/any_exchange.py,sha256=Y-zue75ZSmu9Ga1fONbjBGLNH5pDHQI01hCSjuLBkAk,889
5
- siglab_py/exchanges/futubull.py,sha256=f-_trzvuH5NaiG-PzyiNqZ12w7J-ARi_-xcr78rFU4E,20510
6
- siglab_py/market_data_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- siglab_py/market_data_providers/aggregated_orderbook_provider.py,sha256=FZRobEBNRzcNGlOG3u38OVhmOZYlkNm8dVvR-S7Ii2g,23342
8
- siglab_py/market_data_providers/candles_provider.py,sha256=fqHJjlECsBiBlpgyywrc4gTgxiROPNzZM8KxQBB5cOg,14139
9
- siglab_py/market_data_providers/candles_ta_provider.py,sha256=uiAhbEZZdTF-YulBHpSLwabos5LHCKU91NTiTmpUc0w,12001
10
- siglab_py/market_data_providers/ccxt_candles_ta_to_csv.py,sha256=DHj51QTbkCmEd9RFNVhWWpsSPz1aLd6zTLqkUUbEkK0,11158
11
- siglab_py/market_data_providers/deribit_options_expiry_provider.py,sha256=e9Ee8TmC8pXaid8-jouSLKIpuW6_JBBgwRTieI665yQ,8684
12
- siglab_py/market_data_providers/futu_candles_ta_to_csv.py,sha256=PZRpVL80CG6518uUg38Wb9aoWzidunyBAFFFGvrDnaI,10531
13
- siglab_py/market_data_providers/orderbooks_provider.py,sha256=olt-3LIkoyzQWfNNQRhJtKibLbkTutt_q_rCCTM7i1g,16216
14
- siglab_py/market_data_providers/test_provider.py,sha256=wBLCgcWjs7FGZJXWsNyn30lkOLa_cgpuvqRakMC0wbA,2221
15
- siglab_py/market_data_providers/tg_monitor.py,sha256=lRqONP0JAP223gyX37R-wCkhyGFKTvKkgmeDNoO3ay4,21813
16
- siglab_py/ordergateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- siglab_py/ordergateway/client.py,sha256=LvtrYirrdFOcKgTkvuqwdEN7r3nurjX320ESnk7tHE0,15095
18
- siglab_py/ordergateway/encrypt_keys_util.py,sha256=-qi87db8To8Yf1WS1Q_Cp2Ya7ZqgWlRqSHfNXCM7wE4,1339
19
- siglab_py/ordergateway/gateway.py,sha256=Z-BQ-Z9gXoNrKQHzRIy9R1mnCybf9QwWhHpqkSI7bBM,43901
20
- siglab_py/ordergateway/test_ordergateway.py,sha256=4PE2flp_soGcD3DrI7zJOzZndjkb6I5XaDrFNNq4Huo,4009
21
- siglab_py/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- siglab_py/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- siglab_py/tests/integration/market_data_util_tests.py,sha256=p-RWIJZLyj0lAdfi4QTIeAttCm_e8mEVWFKh4OWuogU,7189
24
- siglab_py/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- siglab_py/tests/unit/analytic_util_tests.py,sha256=5Vic-lwuGvgLfjcP1gmrdBizMn0hXPMnixYKAF3y-fI,4366
26
- siglab_py/tests/unit/market_data_util_tests.py,sha256=A1y83itISmMJdn6wLpfwcr4tGola8wTf1D1xbelMvgw,2026
27
- siglab_py/tests/unit/trading_util_tests.py,sha256=9DZmTZlW55lPtNfTCukgDdiyBiMYv9R4mEFWJIJiTNg,3870
28
- siglab_py/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- siglab_py/util/analytic_util.py,sha256=GCPbz41qCKBb2hjzMrqF0BuiOwxaFCsyYCwBfqC5wtE,55686
30
- siglab_py/util/aws_util.py,sha256=KGmjHrr1rpnnxr33nXHNzTul4tvyyxl9p6gpwNv0Ygc,2557
31
- siglab_py/util/market_data_util.py,sha256=mUXg4uaiX3b6_klgJWIEgnUQU4IUd6CwTOqKLiQWRlU,31307
32
- siglab_py/util/notification_util.py,sha256=vySgHjpHgwFDLW0tHSi_AGh9JBbPc25IUgvWxmjAeT8,2658
33
- siglab_py/util/retry_util.py,sha256=g-UU6pkPouWZZRZEqP99R2Z0lX5xzckYkzjwqqSDpVQ,922
34
- siglab_py/util/slack_notification_util.py,sha256=G27n-adbT3Q6oaHSMvu_Nom794rrda5PprSF-zvmzkM,1912
35
- siglab_py/util/trading_util.py,sha256=-TGNgJdy4HMDPgq31KQn_lRawFxuXnFU5NnLRb1XM5o,5757
36
- siglab_py-0.5.30.dist-info/METADATA,sha256=D-8hoBCaGYwWVu33axvqZEjYhKAz9XrMHdvs9YLyzK8,829
37
- siglab_py-0.5.30.dist-info/WHEEL,sha256=lTU6B6eIfYoiQJTZNc-fyaR6BpL6ehTzU3xGYxn2n8k,91
38
- siglab_py-0.5.30.dist-info/top_level.txt,sha256=AbD4VR9OqmMOGlMJLkAVPGQMtUPIQv0t1BF5xmcLJSk,10
39
- siglab_py-0.5.30.dist-info/RECORD,,