import datetime
-import functools
import hashlib
import json
import logging
calculate_quantile,
ewo,
format_number,
+ get_callable_sha256,
get_distance,
get_zl_ma_fn,
non_zero_diff,
timestamp = int(current_time.timestamp())
candle_duration_secs = max(1, int(self._candle_duration_secs))
candle_start_secs = (timestamp // candle_duration_secs) * candle_duration_secs
- callback_code = getattr(callback, "__code__", None)
- if callback_code is None and isinstance(callback, functools.partial):
- func = callback.func
- callback_code = getattr(func, "__code__", None)
- if callback_code is None and hasattr(func, "__func__"):
- callback_code = getattr(func.__func__, "__code__", None)
- if callback_code is None and hasattr(callback, "__func__"):
- callback_code = getattr(callback.__func__, "__code__", None)
- if callback_code is None and hasattr(callback, "__call__"):
- callback_code = getattr(callback.__call__, "__code__", None)
- if callback_code is None:
- raise ValueError("Unable to retrieve code object from callback")
- key = hashlib.sha256(
- f"{pair}|{callback_code.co_filename}|{callback_code.co_firstlineno}|{callback_code.co_name}".encode()
- ).hexdigest()
+ callback_hash = get_callable_sha256(callback)
+ key = hashlib.sha256(f"{pair}|{callback_hash}".encode()).hexdigest()
if candle_start_secs != self.last_candle_start_secs.get(key):
self.last_candle_start_secs[key] = candle_start_secs
try:
import copy
+import functools
+import hashlib
import math
from enum import IntEnum
from functools import lru_cache
)
+def get_callable_sha256(fn: Callable) -> str:
+ if not callable(fn):
+ raise ValueError("fn must be callable")
+ code = getattr(fn, "__code__", None)
+ if code is None and isinstance(fn, functools.partial):
+ fn = fn.func
+ code = getattr(fn, "__code__", None)
+ if code is None and hasattr(fn, "__func__"):
+ code = getattr(fn.__func__, "__code__", None)
+ if code is None and hasattr(fn, "__func__"):
+ code = getattr(fn.__func__, "__code__", None)
+ if code is None and hasattr(fn, "__call__"):
+ code = getattr(fn.__call__, "__code__", None)
+ if code is None:
+ raise ValueError("Unable to retrieve code object from fn")
+ return hashlib.sha256(code.co_code).hexdigest()
+
+
@lru_cache(maxsize=128)
def format_number(value: int | float, significant_digits: int = 5) -> str:
if not isinstance(value, (int, float)):