From a83d44d6ceef96e2903142c621ffe0ed56b39eca Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 18 Mar 2024 14:08:41 +0100 Subject: [PATCH 1/4] Give the user a slighly better hint to when the backtest can start - with an optional CSS class for the h3 that is displaying the raise error in the dashboard it could also handle the line breaks which currently only work in the console needed css: "white-space: pre-line;" --- jesse/services/required_candles.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jesse/services/required_candles.py b/jesse/services/required_candles.py index 99697e1e2..d6c143879 100644 --- a/jesse/services/required_candles.py +++ b/jesse/services/required_candles.py @@ -1,3 +1,5 @@ +from datetime import datetime + import arrow import numpy as np @@ -87,6 +89,7 @@ def load_required_candles(exchange: str, symbol: str, start_date_str: str, finis )[0][0] first_backtestable_timestamp = first_existing_candle + (pre_finish_date - pre_start_date) + (60_000 * 1440) + first_backtestable_datetime = datetime.fromtimestamp(first_backtestable_timestamp/1000) # if first backtestable timestamp is in the future, that means we have some but not enough candles if first_backtestable_timestamp > jh.today_to_timestamp(): @@ -96,7 +99,9 @@ def load_required_candles(exchange: str, symbol: str, start_date_str: str, finis ) raise CandleNotFoundInDatabase( - f'Not enough candles for {exchange} {symbol} exists to run backtest from {start_date_str} => {finish_date_str}. \n' + f'Not enough candles for {exchange} {symbol} exists to run backtest from {start_date_str} => {finish_date_str} ' + f'(first possible date is {first_backtestable_datetime.date()}). \n' + f'Are you considering the warmup candles? For more info please read:\n https://jesse.trade/help/faq/i-imported-candles-but-keep-getting-not-enough-candles' ) From 941f3bb7993fa59145ea326066e35b11837af974 Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 4 Apr 2024 17:56:25 +0200 Subject: [PATCH 2/4] actually telling about the first and last availabe candle dates so this error holds a bit more information --- jesse/modes/backtest_mode.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/jesse/modes/backtest_mode.py b/jesse/modes/backtest_mode.py index 7eed0b544..1969278ab 100644 --- a/jesse/modes/backtest_mode.py +++ b/jesse/modes/backtest_mode.py @@ -1,4 +1,5 @@ import time +from datetime import datetime from typing import Dict, Union, List import arrow @@ -205,8 +206,18 @@ def load_candles(start_date_str: str, finish_date_str: str) -> Dict[str, Dict[st # validate that there are enough candles for selected period required_candles_count = (finish_date - start_date) / 60_000 if len(candles_tuple) == 0 or candles_tuple[-1][0] != finish_date or candles_tuple[0][0] != start_date: + message = f'Not enough candles for {symbol}.' + if len(candles_tuple) == 0: + message += ' You need to import candles.' + + if candles_tuple[-1][0] != finish_date: + message += f' Last available candle: {datetime.fromtimestamp(candles_tuple[-1][0] / 1000)}' + + if candles_tuple[0][0] != start_date: + message += f' First available candle: {datetime.fromtimestamp(candles_tuple[0][0] / 1000)}' + raise exceptions.CandleNotFoundInDatabase( - f'Not enough candles for {symbol}. You need to import candles.' + message ) elif len(candles_tuple) != required_candles_count + 1: raise exceptions.CandleNotFoundInDatabase( From 3bdb857565fd33d576fc3bddce418bc1020f0c01 Mon Sep 17 00:00:00 2001 From: Andy Date: Sun, 7 Apr 2024 00:07:06 +0200 Subject: [PATCH 3/4] adding cache fot njit decorators - the result is a 3x speed improvement in with pytest --- jesse/indicators/bandpass.py | 2 +- jesse/indicators/cg.py | 2 +- jesse/indicators/correlation_cycle.py | 2 +- jesse/indicators/cwma.py | 2 +- jesse/indicators/damiani_volatmeter.py | 2 +- jesse/indicators/edcf.py | 2 +- jesse/indicators/efi.py | 2 +- jesse/indicators/emd.py | 4 ++-- jesse/indicators/epma.py | 2 +- jesse/indicators/frama.py | 2 +- jesse/indicators/gauss.py | 2 +- jesse/indicators/heikin_ashi_candles.py | 6 +++--- jesse/indicators/high_pass.py | 2 +- jesse/indicators/high_pass_2_pole.py | 2 +- jesse/indicators/hurst_exponent.py | 2 +- jesse/indicators/hwma.py | 2 +- jesse/indicators/itrend.py | 2 +- jesse/indicators/jma.py | 2 +- jesse/indicators/lrsi.py | 2 +- jesse/indicators/maaq.py | 2 +- jesse/indicators/mcginley_dynamic.py | 2 +- jesse/indicators/mwdx.py | 2 +- jesse/indicators/nma.py | 2 +- jesse/indicators/pma.py | 2 +- jesse/indicators/reflex.py | 2 +- jesse/indicators/rma.py | 2 +- jesse/indicators/rsx.py | 4 ++-- jesse/indicators/sqwma.py | 2 +- jesse/indicators/srwma.py | 2 +- jesse/indicators/supersmoother.py | 2 +- jesse/indicators/supersmoother_3_pole.py | 2 +- jesse/indicators/supertrend.py | 4 ++-- jesse/indicators/trendflex.py | 2 +- jesse/indicators/vi.py | 2 +- jesse/indicators/vlma.py | 2 +- jesse/indicators/voss.py | 2 +- jesse/indicators/vpwma.py | 2 +- 37 files changed, 42 insertions(+), 42 deletions(-) diff --git a/jesse/indicators/bandpass.py b/jesse/indicators/bandpass.py index 4f8b3e055..e3510a312 100644 --- a/jesse/indicators/bandpass.py +++ b/jesse/indicators/bandpass.py @@ -49,7 +49,7 @@ def bandpass(candles: np.ndarray, period: int = 20, bandwidth: float = 0.3, sou return BandPass(bp[-1], bp_normalized[-1], signal[-1], trigger[-1]) -@njit +@njit(cache=True) def bp_fast(source, hp, alpha, beta): # Function is compiled to machine code when called the first time bp = np.copy(hp) diff --git a/jesse/indicators/cg.py b/jesse/indicators/cg.py index 81ba6b928..32cdc94fb 100644 --- a/jesse/indicators/cg.py +++ b/jesse/indicators/cg.py @@ -29,7 +29,7 @@ def cg(candles: np.ndarray, period: int = 10, source_type: str = "close", sequen return same_length(candles, res) if sequential else res[-1] -@njit +@njit(cache=True) def go_fast(source, period): # Function is compiled to machine code when called the first time res = np.full_like(source, fill_value=np.nan) for i in range(source.size): diff --git a/jesse/indicators/correlation_cycle.py b/jesse/indicators/correlation_cycle.py index 2ce557581..14e6be62c 100644 --- a/jesse/indicators/correlation_cycle.py +++ b/jesse/indicators/correlation_cycle.py @@ -42,7 +42,7 @@ def correlation_cycle(candles: np.ndarray, period: int = 20, threshold: int = 9, return CC(realPart[-1], imagPart[-1], angle[-1], state[-1]) -@njit +@njit(cache=True) def go_fast(source, period): # Function is compiled to machine code when called the first time # Correlation Cycle Function PIx2 = 4.0 * np.arcsin(1.0) diff --git a/jesse/indicators/cwma.py b/jesse/indicators/cwma.py index eeb5c5396..d3c0dd3f6 100644 --- a/jesse/indicators/cwma.py +++ b/jesse/indicators/cwma.py @@ -35,7 +35,7 @@ def cwma(candles: np.ndarray, period: int = 14, source_type: str = "close", sequ return res if sequential else res[-1] -@njit +@njit(cache=True) def vpwma_fast(source, period): newseries = np.copy(source) for j in range(period + 1, source.shape[0]): diff --git a/jesse/indicators/damiani_volatmeter.py b/jesse/indicators/damiani_volatmeter.py index 856ce19a2..6a623bf9a 100644 --- a/jesse/indicators/damiani_volatmeter.py +++ b/jesse/indicators/damiani_volatmeter.py @@ -46,7 +46,7 @@ def damiani_volatmeter(candles: np.ndarray, vis_atr: int = 13, vis_std: int = 20 return DamianiVolatmeter(vol[-1], t[-1]) -@njit +@njit(cache=True) def damiani_volatmeter_fast(source, sed_std, atrvis, atrsed, vis_std, threshold): # Function is compiled to machine code when called the first time lag_s = 0.5 diff --git a/jesse/indicators/edcf.py b/jesse/indicators/edcf.py index bd23e3957..f48c0991f 100644 --- a/jesse/indicators/edcf.py +++ b/jesse/indicators/edcf.py @@ -35,7 +35,7 @@ def edcf(candles: np.ndarray, period: int = 15, source_type: str = "hl2", sequen return res if sequential else res[-1] -@njit +@njit(cache=True) def edcf_fast(source, period): newseries = np.full_like(source, np.nan) diff --git a/jesse/indicators/efi.py b/jesse/indicators/efi.py index ba1677227..17feda966 100644 --- a/jesse/indicators/efi.py +++ b/jesse/indicators/efi.py @@ -34,7 +34,7 @@ def efi(candles: np.ndarray, period: int = 13, source_type: str = "close", seque return res_with_nan if sequential else res_with_nan[-1] -@njit +@njit(cache=True) def efi_fast(source, volume): dif = np.zeros(source.size - 1) for i in range(1, source.size): diff --git a/jesse/indicators/emd.py b/jesse/indicators/emd.py index 8ed48611d..d2c1318d6 100644 --- a/jesse/indicators/emd.py +++ b/jesse/indicators/emd.py @@ -42,7 +42,7 @@ def emd(candles: np.ndarray, period: int = 20, delta=0.5, fraction=0.1, sequenti return EMD(avg_peak[-1], mean[-1], avg_valley[-1]) -@njit +@njit(cache=True) def bp_fast(price, period, delta): # bandpass filter beta = np.cos(2 * np.pi / period) @@ -58,7 +58,7 @@ def bp_fast(price, period, delta): return bp -@njit +@njit(cache=True) def peak_valley_fast(bp, price): peak = np.copy(bp) valley = np.copy(bp) diff --git a/jesse/indicators/epma.py b/jesse/indicators/epma.py index f19e73b7e..7ef51cf89 100644 --- a/jesse/indicators/epma.py +++ b/jesse/indicators/epma.py @@ -36,7 +36,7 @@ def epma(candles: np.ndarray, period: int = 11, offset: int = 4, source_type: st return res if sequential else res[-1] -@njit +@njit(cache=True) def epma_fast(source, period, offset): newseries = np.copy(source) for j in range(period + offset + 1 , source.shape[0]): diff --git a/jesse/indicators/frama.py b/jesse/indicators/frama.py index 9191d09d2..ff67e4135 100644 --- a/jesse/indicators/frama.py +++ b/jesse/indicators/frama.py @@ -39,7 +39,7 @@ def frama(candles: np.ndarray, window: int = 10, FC: int = 1, SC: int = 300, seq return res[-1] -@njit +@njit(cache=True) def frame_fast(candles, n, SC, FC): w = np.log(2.0 / (SC + 1)) diff --git a/jesse/indicators/gauss.py b/jesse/indicators/gauss.py index 799465477..7731fdb2d 100644 --- a/jesse/indicators/gauss.py +++ b/jesse/indicators/gauss.py @@ -39,7 +39,7 @@ def gauss(candles: np.ndarray, period: int = 14, poles: int = 4, source_type: st return res if sequential else res[-1] -@njit +@njit(cache=True) def gauss_fast(source, period, poles): N = source.size source = source[~np.isnan(source)] diff --git a/jesse/indicators/heikin_ashi_candles.py b/jesse/indicators/heikin_ashi_candles.py index 0e874c29c..a7f6fdebc 100755 --- a/jesse/indicators/heikin_ashi_candles.py +++ b/jesse/indicators/heikin_ashi_candles.py @@ -26,7 +26,7 @@ def heikin_ashi_candles(candles: np.ndarray, sequential: bool = False) -> HA: else: return HA(open[-1], close[-1], high[-1], low[-1]) -@njit +@njit(cache=True) def ha_fast(source): # index consts to facilitate reading the code @@ -44,8 +44,8 @@ def ha_fast(source): ha_candles[i][CLOSE] = (source[i][OPEN]+source[i][CLOSE]+source[i][HIGH]+source[i][LOW])/4 # Using builtins Python min,max and not numpy one since we get this Error: # No implementation of function Function() found for signature: - # Still fast since numba supports it + # Still fast since numba supports it ha_candles[i][HIGH] = max([source[i][HIGH], ha_candles[i][OPEN], ha_candles[i][CLOSE]]) ha_candles[i][LOW] = min([source[i][LOW], ha_candles[i][OPEN], ha_candles[i][CLOSE]]) - return ha_candles[:,OPEN], ha_candles[:,CLOSE], ha_candles[:,HIGH], ha_candles[:,LOW] \ No newline at end of file + return ha_candles[:,OPEN], ha_candles[:,CLOSE], ha_candles[:,HIGH], ha_candles[:,LOW] diff --git a/jesse/indicators/high_pass.py b/jesse/indicators/high_pass.py index e66451474..e06ca5f56 100644 --- a/jesse/indicators/high_pass.py +++ b/jesse/indicators/high_pass.py @@ -36,7 +36,7 @@ def high_pass(candles: np.ndarray, period: int = 48, source_type: str = "close", return None if np.isnan(hpf[-1]) else hpf[-1] -@njit +@njit(cache=True) def high_pass_fast(source, period): # Function is compiled to machine code when called the first time k = 1 alpha = 1 + (np.sin(2 * np.pi * k / period) - 1) / np.cos(2 * np.pi * k / period) diff --git a/jesse/indicators/high_pass_2_pole.py b/jesse/indicators/high_pass_2_pole.py index 68b8f41f4..278b873b4 100644 --- a/jesse/indicators/high_pass_2_pole.py +++ b/jesse/indicators/high_pass_2_pole.py @@ -37,7 +37,7 @@ def high_pass_2_pole(candles: np.ndarray, period: int = 48, source_type: str = " return None if np.isnan(hpf[-1]) else hpf[-1] -@njit +@njit(cache=True) def high_pass_2_pole_fast(source, period, K=0.707): # Function is compiled to machine code when called the first time alpha = 1 + (np.sin(2 * np.pi * K / period) - 1) / np.cos(2 * np.pi * K / period) newseries = np.copy(source) diff --git a/jesse/indicators/hurst_exponent.py b/jesse/indicators/hurst_exponent.py index c6e57e19b..b0a26979b 100644 --- a/jesse/indicators/hurst_exponent.py +++ b/jesse/indicators/hurst_exponent.py @@ -40,7 +40,7 @@ def hurst_exponent(candles: np.ndarray, min_chunksize: int = 8, max_chunksize: i return None if np.isnan(h) else h -@njit +@njit(cache=True) def hurst_rs(x, min_chunksize, max_chunksize, num_chunksize): """Estimate the Hurst exponent using R/S method. Estimates the Hurst (H) exponent using the R/S method from the time series. diff --git a/jesse/indicators/hwma.py b/jesse/indicators/hwma.py index ec989e72a..7ea3651ad 100644 --- a/jesse/indicators/hwma.py +++ b/jesse/indicators/hwma.py @@ -40,7 +40,7 @@ def hwma(candles: np.ndarray, na: float = 0.2, nb: float = 0.1, nc: float = 0.1, return res if sequential else res[-1] -@njit +@njit(cache=True) def hwma_fast(source, na, nb, nc): last_a = last_v = 0 last_f = source[0] diff --git a/jesse/indicators/itrend.py b/jesse/indicators/itrend.py index ee8fe0f2a..0fb837357 100644 --- a/jesse/indicators/itrend.py +++ b/jesse/indicators/itrend.py @@ -34,7 +34,7 @@ def itrend(candles: np.ndarray, alpha: float = 0.07, source_type: str = "hl2", s return ITREND(signal[-1], it[-1], trigger[-1]) -@njit +@njit(cache=True) def itrend_fast(source, alpha): it = np.copy(source) for i in range(2, 7): diff --git a/jesse/indicators/jma.py b/jesse/indicators/jma.py index 67cd83c9b..359c3451d 100644 --- a/jesse/indicators/jma.py +++ b/jesse/indicators/jma.py @@ -31,7 +31,7 @@ def jma(candles: np.ndarray, period:int=7, phase:float=50, power:int=2, source_t return res if sequential else res[-1] -@njit +@njit(cache=True) def jma_helper(src, phaseRatio, beta, alpha): jma_val = np.copy(src) diff --git a/jesse/indicators/lrsi.py b/jesse/indicators/lrsi.py index 5b9d46bee..c9c8f50b8 100644 --- a/jesse/indicators/lrsi.py +++ b/jesse/indicators/lrsi.py @@ -29,7 +29,7 @@ def lrsi(candles: np.ndarray, alpha: float = 0.2, sequential: bool = False) -> U return None if np.isnan(rsi[-1]) else rsi[-1] -@njit +@njit(cache=True) def lrsi_fast(alpha, candles): price = (candles[:, 3] + candles[:, 4]) / 2 l0 = np.copy(price) diff --git a/jesse/indicators/maaq.py b/jesse/indicators/maaq.py index 98e8aa50c..25b3fe571 100644 --- a/jesse/indicators/maaq.py +++ b/jesse/indicators/maaq.py @@ -50,7 +50,7 @@ def maaq(candles: np.ndarray, period: int = 11, fast_period: int = 2, slow_perio return res if sequential else res[-1] -@njit +@njit(cache=True) def maaq_fast(source, temp, period): newseries = np.copy(source) for i in range(period, source.shape[0]): diff --git a/jesse/indicators/mcginley_dynamic.py b/jesse/indicators/mcginley_dynamic.py index 3871d6450..37c2ef2ff 100644 --- a/jesse/indicators/mcginley_dynamic.py +++ b/jesse/indicators/mcginley_dynamic.py @@ -36,7 +36,7 @@ def mcginley_dynamic(candles: np.ndarray, period: int = 10, k: float = 0.6, sour return mg if sequential else mg[-1] -@njit +@njit(cache=True) def md_fast(source, k, period): mg = np.full_like(source, np.nan) for i in range(source.size): diff --git a/jesse/indicators/mwdx.py b/jesse/indicators/mwdx.py index ffa7664f5..d385d1089 100644 --- a/jesse/indicators/mwdx.py +++ b/jesse/indicators/mwdx.py @@ -38,7 +38,7 @@ def mwdx(candles: np.ndarray, factor: float = 0.2, source_type: str = "close", s return res if sequential else res[-1] -@njit +@njit(cache=True) def mwdx_fast(source, fac): newseries = np.copy(source) for i in range(1, source.shape[0]): diff --git a/jesse/indicators/nma.py b/jesse/indicators/nma.py index 9b418dc27..dc70c817f 100644 --- a/jesse/indicators/nma.py +++ b/jesse/indicators/nma.py @@ -32,7 +32,7 @@ def nma(candles: np.ndarray, period: int = 40, source_type: str = "close", seque return res if sequential else res[-1] -@njit +@njit(cache=True) def nma_fast(source, period): # Ensure source values are positive before taking log source = np.clip(source, a_min=1e-10, a_max=None) diff --git a/jesse/indicators/pma.py b/jesse/indicators/pma.py index e7a4e10c1..92b0e31ee 100644 --- a/jesse/indicators/pma.py +++ b/jesse/indicators/pma.py @@ -37,7 +37,7 @@ def pma(candles: np.ndarray, source_type: str = "hl2", sequential: bool = False) return PMA(predict[-1], trigger[-1]) -@njit +@njit(cache=True) def pma_fast(source): predict = np.full_like(source, np.nan) trigger = np.full_like(source, np.nan) diff --git a/jesse/indicators/reflex.py b/jesse/indicators/reflex.py index cf6eeee6c..492030646 100644 --- a/jesse/indicators/reflex.py +++ b/jesse/indicators/reflex.py @@ -39,7 +39,7 @@ def reflex(candles: np.ndarray, period: int = 20, source_type: str = "close", se return None if np.isnan(rf[-1]) else rf[-1] -@njit +@njit(cache=True) def reflex_fast(ssf, period): rf = np.full_like(ssf, 0) ms = np.full_like(ssf, 0) diff --git a/jesse/indicators/rma.py b/jesse/indicators/rma.py index 5fe5c16e0..712d5d1b2 100644 --- a/jesse/indicators/rma.py +++ b/jesse/indicators/rma.py @@ -37,7 +37,7 @@ def rma(candles: np.ndarray, length: int = 14, source_type="close", sequential=F return res if sequential else res[-1] -@njit +@njit(cache=True) def rma_fast(source, _length): alpha = 1 / _length newseries = np.copy(source) diff --git a/jesse/indicators/rsx.py b/jesse/indicators/rsx.py index e90f39d73..ed81814e1 100644 --- a/jesse/indicators/rsx.py +++ b/jesse/indicators/rsx.py @@ -13,7 +13,7 @@ def rsx(candles: np.ndarray, period: int = 14, source_type: str = "close", seque float, np.ndarray]: """ Relative Strength Xtra (rsx) - + :param candles: np.ndarray :param period: int - default: 14 :param source_type: str - default: "close" @@ -29,7 +29,7 @@ def rsx(candles: np.ndarray, period: int = 14, source_type: str = "close", seque return res if sequential else res[-1] -@njit +@njit(cache=True) def rsx_fast(source, period): # variables f0 = 0 diff --git a/jesse/indicators/sqwma.py b/jesse/indicators/sqwma.py index 76af36165..d647d2193 100644 --- a/jesse/indicators/sqwma.py +++ b/jesse/indicators/sqwma.py @@ -35,7 +35,7 @@ def sqwma(candles: np.ndarray, period: int = 14, source_type: str = "close", seq return res if sequential else res[-1] -@njit +@njit(cache=True) def sqwma_fast(source, period): newseries = np.copy(source) for j in range(period + 1, source.shape[0]): diff --git a/jesse/indicators/srwma.py b/jesse/indicators/srwma.py index cadc598c2..0351a98af 100644 --- a/jesse/indicators/srwma.py +++ b/jesse/indicators/srwma.py @@ -35,7 +35,7 @@ def srwma(candles: np.ndarray, period: int = 14, source_type: str = "close", seq return res if sequential else res[-1] -@njit +@njit(cache=True) def srwma_fast(source, period): newseries = np.copy(source) for j in range(period + 1, source.shape[0]): diff --git a/jesse/indicators/supersmoother.py b/jesse/indicators/supersmoother.py index e2fd59504..d89f73c45 100644 --- a/jesse/indicators/supersmoother.py +++ b/jesse/indicators/supersmoother.py @@ -36,7 +36,7 @@ def supersmoother(candles: np.ndarray, period: int = 14, source_type: str = "clo return res if sequential else res[-1] -@njit +@njit(cache=True) def supersmoother_fast(source, period): a = np.exp(-1.414 * np.pi / period) b = 2 * a * np.cos(1.414 * np.pi / period) diff --git a/jesse/indicators/supersmoother_3_pole.py b/jesse/indicators/supersmoother_3_pole.py index 20cd12c37..827eaf601 100644 --- a/jesse/indicators/supersmoother_3_pole.py +++ b/jesse/indicators/supersmoother_3_pole.py @@ -36,7 +36,7 @@ def supersmoother_3_pole(candles: np.ndarray, period: int = 14, source_type: str return res if sequential else res[-1] -@njit +@njit(cache=True) def supersmoother_fast(source, period): a = np.exp(-np.pi / period) b = 2 * a * np.cos(1.738 * np.pi / period) diff --git a/jesse/indicators/supertrend.py b/jesse/indicators/supertrend.py index cf7419109..863c8e908 100644 --- a/jesse/indicators/supertrend.py +++ b/jesse/indicators/supertrend.py @@ -35,7 +35,7 @@ def supertrend(candles: np.ndarray, period: int = 10, factor: float = 3, sequent return SuperTrend(super_trend[-1], changed[-1]) -@njit +@njit(cache=True) def supertrend_fast(candles, atr, factor, period): # Calculation of SuperTrend upper_basic = (candles[:, 3] + candles[:, 4]) / 2 + (factor * atr) @@ -94,4 +94,4 @@ def supertrend_fast(candles, atr, factor, period): else: super_trend[i] = currUpperBand # switch to DOWNTREND changed[i] = True - return super_trend, changed \ No newline at end of file + return super_trend, changed diff --git a/jesse/indicators/trendflex.py b/jesse/indicators/trendflex.py index e7336f666..5fedade6b 100644 --- a/jesse/indicators/trendflex.py +++ b/jesse/indicators/trendflex.py @@ -40,7 +40,7 @@ def trendflex(candles: np.ndarray, period: int = 20, source_type: str = "close", return None if np.isnan(tf[-1]) else tf[-1] -@njit +@njit(cache=True) def trendflex_fast(ssf, period): tf = np.full_like(ssf, 0) ms = np.full_like(ssf, 0) diff --git a/jesse/indicators/vi.py b/jesse/indicators/vi.py index 6f31adcdf..defdf0a35 100644 --- a/jesse/indicators/vi.py +++ b/jesse/indicators/vi.py @@ -31,7 +31,7 @@ def vi(candles: np.ndarray, period: int = 14, sequential: bool = False) -> VI: return VI(vpn_with_nan[-1], vmn_with_nan[-1]) -@njit +@njit(cache=True) def vi_fast(candles, period): candles_close = candles[:, 2] candles_high = candles[:, 3] diff --git a/jesse/indicators/vlma.py b/jesse/indicators/vlma.py index 31ff6faf2..e919db37b 100644 --- a/jesse/indicators/vlma.py +++ b/jesse/indicators/vlma.py @@ -56,7 +56,7 @@ def vlma(candles: np.ndarray, min_period: int = 5, max_period: int = 50, matype: return res if sequential else res[-1] -@njit +@njit(cache=True) def vlma_fast(source, a, b, c, d, min_period, max_period): newseries = np.copy(source) period = np.zeros_like(source) diff --git a/jesse/indicators/voss.py b/jesse/indicators/voss.py index 79574aae8..ee2494312 100644 --- a/jesse/indicators/voss.py +++ b/jesse/indicators/voss.py @@ -37,7 +37,7 @@ def voss(candles: np.ndarray, period: int = 20, predict: int = 3, bandwith: floa return VossFilter(voss_val[-1], filt[-1]) -@njit +@njit(cache=True) def voss_fast(source, period, predict, bandwith): voss = np.full_like(source, 0) filt = np.full_like(source, 0) diff --git a/jesse/indicators/vpwma.py b/jesse/indicators/vpwma.py index eb374c567..56638f4d6 100644 --- a/jesse/indicators/vpwma.py +++ b/jesse/indicators/vpwma.py @@ -36,7 +36,7 @@ def vpwma(candles: np.ndarray, period: int = 14, power: float = 0.382, source_ty return res if sequential else res[-1] -@njit +@njit(cache=True) def vpwma_fast(source, period, power): newseries = np.copy(source) for j in range(period + 1, source.shape[0]): From ffffb5201f9c3ed9d498c7b350f6da389537f49b Mon Sep 17 00:00:00 2001 From: Andy Date: Sun, 7 Apr 2024 09:56:13 +0200 Subject: [PATCH 4/4] Revert "adding cache fot njit decorators - the result is a 3x speed improvement in with pytest" This reverts commit 3bdb857565fd33d576fc3bddce418bc1020f0c01. --- jesse/indicators/bandpass.py | 2 +- jesse/indicators/cg.py | 2 +- jesse/indicators/correlation_cycle.py | 2 +- jesse/indicators/cwma.py | 2 +- jesse/indicators/damiani_volatmeter.py | 2 +- jesse/indicators/edcf.py | 2 +- jesse/indicators/efi.py | 2 +- jesse/indicators/emd.py | 4 ++-- jesse/indicators/epma.py | 2 +- jesse/indicators/frama.py | 2 +- jesse/indicators/gauss.py | 2 +- jesse/indicators/heikin_ashi_candles.py | 6 +++--- jesse/indicators/high_pass.py | 2 +- jesse/indicators/high_pass_2_pole.py | 2 +- jesse/indicators/hurst_exponent.py | 2 +- jesse/indicators/hwma.py | 2 +- jesse/indicators/itrend.py | 2 +- jesse/indicators/jma.py | 2 +- jesse/indicators/lrsi.py | 2 +- jesse/indicators/maaq.py | 2 +- jesse/indicators/mcginley_dynamic.py | 2 +- jesse/indicators/mwdx.py | 2 +- jesse/indicators/nma.py | 2 +- jesse/indicators/pma.py | 2 +- jesse/indicators/reflex.py | 2 +- jesse/indicators/rma.py | 2 +- jesse/indicators/rsx.py | 4 ++-- jesse/indicators/sqwma.py | 2 +- jesse/indicators/srwma.py | 2 +- jesse/indicators/supersmoother.py | 2 +- jesse/indicators/supersmoother_3_pole.py | 2 +- jesse/indicators/supertrend.py | 4 ++-- jesse/indicators/trendflex.py | 2 +- jesse/indicators/vi.py | 2 +- jesse/indicators/vlma.py | 2 +- jesse/indicators/voss.py | 2 +- jesse/indicators/vpwma.py | 2 +- 37 files changed, 42 insertions(+), 42 deletions(-) diff --git a/jesse/indicators/bandpass.py b/jesse/indicators/bandpass.py index e3510a312..4f8b3e055 100644 --- a/jesse/indicators/bandpass.py +++ b/jesse/indicators/bandpass.py @@ -49,7 +49,7 @@ def bandpass(candles: np.ndarray, period: int = 20, bandwidth: float = 0.3, sou return BandPass(bp[-1], bp_normalized[-1], signal[-1], trigger[-1]) -@njit(cache=True) +@njit def bp_fast(source, hp, alpha, beta): # Function is compiled to machine code when called the first time bp = np.copy(hp) diff --git a/jesse/indicators/cg.py b/jesse/indicators/cg.py index 32cdc94fb..81ba6b928 100644 --- a/jesse/indicators/cg.py +++ b/jesse/indicators/cg.py @@ -29,7 +29,7 @@ def cg(candles: np.ndarray, period: int = 10, source_type: str = "close", sequen return same_length(candles, res) if sequential else res[-1] -@njit(cache=True) +@njit def go_fast(source, period): # Function is compiled to machine code when called the first time res = np.full_like(source, fill_value=np.nan) for i in range(source.size): diff --git a/jesse/indicators/correlation_cycle.py b/jesse/indicators/correlation_cycle.py index 14e6be62c..2ce557581 100644 --- a/jesse/indicators/correlation_cycle.py +++ b/jesse/indicators/correlation_cycle.py @@ -42,7 +42,7 @@ def correlation_cycle(candles: np.ndarray, period: int = 20, threshold: int = 9, return CC(realPart[-1], imagPart[-1], angle[-1], state[-1]) -@njit(cache=True) +@njit def go_fast(source, period): # Function is compiled to machine code when called the first time # Correlation Cycle Function PIx2 = 4.0 * np.arcsin(1.0) diff --git a/jesse/indicators/cwma.py b/jesse/indicators/cwma.py index d3c0dd3f6..eeb5c5396 100644 --- a/jesse/indicators/cwma.py +++ b/jesse/indicators/cwma.py @@ -35,7 +35,7 @@ def cwma(candles: np.ndarray, period: int = 14, source_type: str = "close", sequ return res if sequential else res[-1] -@njit(cache=True) +@njit def vpwma_fast(source, period): newseries = np.copy(source) for j in range(period + 1, source.shape[0]): diff --git a/jesse/indicators/damiani_volatmeter.py b/jesse/indicators/damiani_volatmeter.py index 6a623bf9a..856ce19a2 100644 --- a/jesse/indicators/damiani_volatmeter.py +++ b/jesse/indicators/damiani_volatmeter.py @@ -46,7 +46,7 @@ def damiani_volatmeter(candles: np.ndarray, vis_atr: int = 13, vis_std: int = 20 return DamianiVolatmeter(vol[-1], t[-1]) -@njit(cache=True) +@njit def damiani_volatmeter_fast(source, sed_std, atrvis, atrsed, vis_std, threshold): # Function is compiled to machine code when called the first time lag_s = 0.5 diff --git a/jesse/indicators/edcf.py b/jesse/indicators/edcf.py index f48c0991f..bd23e3957 100644 --- a/jesse/indicators/edcf.py +++ b/jesse/indicators/edcf.py @@ -35,7 +35,7 @@ def edcf(candles: np.ndarray, period: int = 15, source_type: str = "hl2", sequen return res if sequential else res[-1] -@njit(cache=True) +@njit def edcf_fast(source, period): newseries = np.full_like(source, np.nan) diff --git a/jesse/indicators/efi.py b/jesse/indicators/efi.py index 17feda966..ba1677227 100644 --- a/jesse/indicators/efi.py +++ b/jesse/indicators/efi.py @@ -34,7 +34,7 @@ def efi(candles: np.ndarray, period: int = 13, source_type: str = "close", seque return res_with_nan if sequential else res_with_nan[-1] -@njit(cache=True) +@njit def efi_fast(source, volume): dif = np.zeros(source.size - 1) for i in range(1, source.size): diff --git a/jesse/indicators/emd.py b/jesse/indicators/emd.py index d2c1318d6..8ed48611d 100644 --- a/jesse/indicators/emd.py +++ b/jesse/indicators/emd.py @@ -42,7 +42,7 @@ def emd(candles: np.ndarray, period: int = 20, delta=0.5, fraction=0.1, sequenti return EMD(avg_peak[-1], mean[-1], avg_valley[-1]) -@njit(cache=True) +@njit def bp_fast(price, period, delta): # bandpass filter beta = np.cos(2 * np.pi / period) @@ -58,7 +58,7 @@ def bp_fast(price, period, delta): return bp -@njit(cache=True) +@njit def peak_valley_fast(bp, price): peak = np.copy(bp) valley = np.copy(bp) diff --git a/jesse/indicators/epma.py b/jesse/indicators/epma.py index 7ef51cf89..f19e73b7e 100644 --- a/jesse/indicators/epma.py +++ b/jesse/indicators/epma.py @@ -36,7 +36,7 @@ def epma(candles: np.ndarray, period: int = 11, offset: int = 4, source_type: st return res if sequential else res[-1] -@njit(cache=True) +@njit def epma_fast(source, period, offset): newseries = np.copy(source) for j in range(period + offset + 1 , source.shape[0]): diff --git a/jesse/indicators/frama.py b/jesse/indicators/frama.py index ff67e4135..9191d09d2 100644 --- a/jesse/indicators/frama.py +++ b/jesse/indicators/frama.py @@ -39,7 +39,7 @@ def frama(candles: np.ndarray, window: int = 10, FC: int = 1, SC: int = 300, seq return res[-1] -@njit(cache=True) +@njit def frame_fast(candles, n, SC, FC): w = np.log(2.0 / (SC + 1)) diff --git a/jesse/indicators/gauss.py b/jesse/indicators/gauss.py index 7731fdb2d..799465477 100644 --- a/jesse/indicators/gauss.py +++ b/jesse/indicators/gauss.py @@ -39,7 +39,7 @@ def gauss(candles: np.ndarray, period: int = 14, poles: int = 4, source_type: st return res if sequential else res[-1] -@njit(cache=True) +@njit def gauss_fast(source, period, poles): N = source.size source = source[~np.isnan(source)] diff --git a/jesse/indicators/heikin_ashi_candles.py b/jesse/indicators/heikin_ashi_candles.py index a7f6fdebc..0e874c29c 100755 --- a/jesse/indicators/heikin_ashi_candles.py +++ b/jesse/indicators/heikin_ashi_candles.py @@ -26,7 +26,7 @@ def heikin_ashi_candles(candles: np.ndarray, sequential: bool = False) -> HA: else: return HA(open[-1], close[-1], high[-1], low[-1]) -@njit(cache=True) +@njit def ha_fast(source): # index consts to facilitate reading the code @@ -44,8 +44,8 @@ def ha_fast(source): ha_candles[i][CLOSE] = (source[i][OPEN]+source[i][CLOSE]+source[i][HIGH]+source[i][LOW])/4 # Using builtins Python min,max and not numpy one since we get this Error: # No implementation of function Function() found for signature: - # Still fast since numba supports it + # Still fast since numba supports it ha_candles[i][HIGH] = max([source[i][HIGH], ha_candles[i][OPEN], ha_candles[i][CLOSE]]) ha_candles[i][LOW] = min([source[i][LOW], ha_candles[i][OPEN], ha_candles[i][CLOSE]]) - return ha_candles[:,OPEN], ha_candles[:,CLOSE], ha_candles[:,HIGH], ha_candles[:,LOW] + return ha_candles[:,OPEN], ha_candles[:,CLOSE], ha_candles[:,HIGH], ha_candles[:,LOW] \ No newline at end of file diff --git a/jesse/indicators/high_pass.py b/jesse/indicators/high_pass.py index e06ca5f56..e66451474 100644 --- a/jesse/indicators/high_pass.py +++ b/jesse/indicators/high_pass.py @@ -36,7 +36,7 @@ def high_pass(candles: np.ndarray, period: int = 48, source_type: str = "close", return None if np.isnan(hpf[-1]) else hpf[-1] -@njit(cache=True) +@njit def high_pass_fast(source, period): # Function is compiled to machine code when called the first time k = 1 alpha = 1 + (np.sin(2 * np.pi * k / period) - 1) / np.cos(2 * np.pi * k / period) diff --git a/jesse/indicators/high_pass_2_pole.py b/jesse/indicators/high_pass_2_pole.py index 278b873b4..68b8f41f4 100644 --- a/jesse/indicators/high_pass_2_pole.py +++ b/jesse/indicators/high_pass_2_pole.py @@ -37,7 +37,7 @@ def high_pass_2_pole(candles: np.ndarray, period: int = 48, source_type: str = " return None if np.isnan(hpf[-1]) else hpf[-1] -@njit(cache=True) +@njit def high_pass_2_pole_fast(source, period, K=0.707): # Function is compiled to machine code when called the first time alpha = 1 + (np.sin(2 * np.pi * K / period) - 1) / np.cos(2 * np.pi * K / period) newseries = np.copy(source) diff --git a/jesse/indicators/hurst_exponent.py b/jesse/indicators/hurst_exponent.py index b0a26979b..c6e57e19b 100644 --- a/jesse/indicators/hurst_exponent.py +++ b/jesse/indicators/hurst_exponent.py @@ -40,7 +40,7 @@ def hurst_exponent(candles: np.ndarray, min_chunksize: int = 8, max_chunksize: i return None if np.isnan(h) else h -@njit(cache=True) +@njit def hurst_rs(x, min_chunksize, max_chunksize, num_chunksize): """Estimate the Hurst exponent using R/S method. Estimates the Hurst (H) exponent using the R/S method from the time series. diff --git a/jesse/indicators/hwma.py b/jesse/indicators/hwma.py index 7ea3651ad..ec989e72a 100644 --- a/jesse/indicators/hwma.py +++ b/jesse/indicators/hwma.py @@ -40,7 +40,7 @@ def hwma(candles: np.ndarray, na: float = 0.2, nb: float = 0.1, nc: float = 0.1, return res if sequential else res[-1] -@njit(cache=True) +@njit def hwma_fast(source, na, nb, nc): last_a = last_v = 0 last_f = source[0] diff --git a/jesse/indicators/itrend.py b/jesse/indicators/itrend.py index 0fb837357..ee8fe0f2a 100644 --- a/jesse/indicators/itrend.py +++ b/jesse/indicators/itrend.py @@ -34,7 +34,7 @@ def itrend(candles: np.ndarray, alpha: float = 0.07, source_type: str = "hl2", s return ITREND(signal[-1], it[-1], trigger[-1]) -@njit(cache=True) +@njit def itrend_fast(source, alpha): it = np.copy(source) for i in range(2, 7): diff --git a/jesse/indicators/jma.py b/jesse/indicators/jma.py index 359c3451d..67cd83c9b 100644 --- a/jesse/indicators/jma.py +++ b/jesse/indicators/jma.py @@ -31,7 +31,7 @@ def jma(candles: np.ndarray, period:int=7, phase:float=50, power:int=2, source_t return res if sequential else res[-1] -@njit(cache=True) +@njit def jma_helper(src, phaseRatio, beta, alpha): jma_val = np.copy(src) diff --git a/jesse/indicators/lrsi.py b/jesse/indicators/lrsi.py index c9c8f50b8..5b9d46bee 100644 --- a/jesse/indicators/lrsi.py +++ b/jesse/indicators/lrsi.py @@ -29,7 +29,7 @@ def lrsi(candles: np.ndarray, alpha: float = 0.2, sequential: bool = False) -> U return None if np.isnan(rsi[-1]) else rsi[-1] -@njit(cache=True) +@njit def lrsi_fast(alpha, candles): price = (candles[:, 3] + candles[:, 4]) / 2 l0 = np.copy(price) diff --git a/jesse/indicators/maaq.py b/jesse/indicators/maaq.py index 25b3fe571..98e8aa50c 100644 --- a/jesse/indicators/maaq.py +++ b/jesse/indicators/maaq.py @@ -50,7 +50,7 @@ def maaq(candles: np.ndarray, period: int = 11, fast_period: int = 2, slow_perio return res if sequential else res[-1] -@njit(cache=True) +@njit def maaq_fast(source, temp, period): newseries = np.copy(source) for i in range(period, source.shape[0]): diff --git a/jesse/indicators/mcginley_dynamic.py b/jesse/indicators/mcginley_dynamic.py index 37c2ef2ff..3871d6450 100644 --- a/jesse/indicators/mcginley_dynamic.py +++ b/jesse/indicators/mcginley_dynamic.py @@ -36,7 +36,7 @@ def mcginley_dynamic(candles: np.ndarray, period: int = 10, k: float = 0.6, sour return mg if sequential else mg[-1] -@njit(cache=True) +@njit def md_fast(source, k, period): mg = np.full_like(source, np.nan) for i in range(source.size): diff --git a/jesse/indicators/mwdx.py b/jesse/indicators/mwdx.py index d385d1089..ffa7664f5 100644 --- a/jesse/indicators/mwdx.py +++ b/jesse/indicators/mwdx.py @@ -38,7 +38,7 @@ def mwdx(candles: np.ndarray, factor: float = 0.2, source_type: str = "close", s return res if sequential else res[-1] -@njit(cache=True) +@njit def mwdx_fast(source, fac): newseries = np.copy(source) for i in range(1, source.shape[0]): diff --git a/jesse/indicators/nma.py b/jesse/indicators/nma.py index dc70c817f..9b418dc27 100644 --- a/jesse/indicators/nma.py +++ b/jesse/indicators/nma.py @@ -32,7 +32,7 @@ def nma(candles: np.ndarray, period: int = 40, source_type: str = "close", seque return res if sequential else res[-1] -@njit(cache=True) +@njit def nma_fast(source, period): # Ensure source values are positive before taking log source = np.clip(source, a_min=1e-10, a_max=None) diff --git a/jesse/indicators/pma.py b/jesse/indicators/pma.py index 92b0e31ee..e7a4e10c1 100644 --- a/jesse/indicators/pma.py +++ b/jesse/indicators/pma.py @@ -37,7 +37,7 @@ def pma(candles: np.ndarray, source_type: str = "hl2", sequential: bool = False) return PMA(predict[-1], trigger[-1]) -@njit(cache=True) +@njit def pma_fast(source): predict = np.full_like(source, np.nan) trigger = np.full_like(source, np.nan) diff --git a/jesse/indicators/reflex.py b/jesse/indicators/reflex.py index 492030646..cf6eeee6c 100644 --- a/jesse/indicators/reflex.py +++ b/jesse/indicators/reflex.py @@ -39,7 +39,7 @@ def reflex(candles: np.ndarray, period: int = 20, source_type: str = "close", se return None if np.isnan(rf[-1]) else rf[-1] -@njit(cache=True) +@njit def reflex_fast(ssf, period): rf = np.full_like(ssf, 0) ms = np.full_like(ssf, 0) diff --git a/jesse/indicators/rma.py b/jesse/indicators/rma.py index 712d5d1b2..5fe5c16e0 100644 --- a/jesse/indicators/rma.py +++ b/jesse/indicators/rma.py @@ -37,7 +37,7 @@ def rma(candles: np.ndarray, length: int = 14, source_type="close", sequential=F return res if sequential else res[-1] -@njit(cache=True) +@njit def rma_fast(source, _length): alpha = 1 / _length newseries = np.copy(source) diff --git a/jesse/indicators/rsx.py b/jesse/indicators/rsx.py index ed81814e1..e90f39d73 100644 --- a/jesse/indicators/rsx.py +++ b/jesse/indicators/rsx.py @@ -13,7 +13,7 @@ def rsx(candles: np.ndarray, period: int = 14, source_type: str = "close", seque float, np.ndarray]: """ Relative Strength Xtra (rsx) - + :param candles: np.ndarray :param period: int - default: 14 :param source_type: str - default: "close" @@ -29,7 +29,7 @@ def rsx(candles: np.ndarray, period: int = 14, source_type: str = "close", seque return res if sequential else res[-1] -@njit(cache=True) +@njit def rsx_fast(source, period): # variables f0 = 0 diff --git a/jesse/indicators/sqwma.py b/jesse/indicators/sqwma.py index d647d2193..76af36165 100644 --- a/jesse/indicators/sqwma.py +++ b/jesse/indicators/sqwma.py @@ -35,7 +35,7 @@ def sqwma(candles: np.ndarray, period: int = 14, source_type: str = "close", seq return res if sequential else res[-1] -@njit(cache=True) +@njit def sqwma_fast(source, period): newseries = np.copy(source) for j in range(period + 1, source.shape[0]): diff --git a/jesse/indicators/srwma.py b/jesse/indicators/srwma.py index 0351a98af..cadc598c2 100644 --- a/jesse/indicators/srwma.py +++ b/jesse/indicators/srwma.py @@ -35,7 +35,7 @@ def srwma(candles: np.ndarray, period: int = 14, source_type: str = "close", seq return res if sequential else res[-1] -@njit(cache=True) +@njit def srwma_fast(source, period): newseries = np.copy(source) for j in range(period + 1, source.shape[0]): diff --git a/jesse/indicators/supersmoother.py b/jesse/indicators/supersmoother.py index d89f73c45..e2fd59504 100644 --- a/jesse/indicators/supersmoother.py +++ b/jesse/indicators/supersmoother.py @@ -36,7 +36,7 @@ def supersmoother(candles: np.ndarray, period: int = 14, source_type: str = "clo return res if sequential else res[-1] -@njit(cache=True) +@njit def supersmoother_fast(source, period): a = np.exp(-1.414 * np.pi / period) b = 2 * a * np.cos(1.414 * np.pi / period) diff --git a/jesse/indicators/supersmoother_3_pole.py b/jesse/indicators/supersmoother_3_pole.py index 827eaf601..20cd12c37 100644 --- a/jesse/indicators/supersmoother_3_pole.py +++ b/jesse/indicators/supersmoother_3_pole.py @@ -36,7 +36,7 @@ def supersmoother_3_pole(candles: np.ndarray, period: int = 14, source_type: str return res if sequential else res[-1] -@njit(cache=True) +@njit def supersmoother_fast(source, period): a = np.exp(-np.pi / period) b = 2 * a * np.cos(1.738 * np.pi / period) diff --git a/jesse/indicators/supertrend.py b/jesse/indicators/supertrend.py index 863c8e908..cf7419109 100644 --- a/jesse/indicators/supertrend.py +++ b/jesse/indicators/supertrend.py @@ -35,7 +35,7 @@ def supertrend(candles: np.ndarray, period: int = 10, factor: float = 3, sequent return SuperTrend(super_trend[-1], changed[-1]) -@njit(cache=True) +@njit def supertrend_fast(candles, atr, factor, period): # Calculation of SuperTrend upper_basic = (candles[:, 3] + candles[:, 4]) / 2 + (factor * atr) @@ -94,4 +94,4 @@ def supertrend_fast(candles, atr, factor, period): else: super_trend[i] = currUpperBand # switch to DOWNTREND changed[i] = True - return super_trend, changed + return super_trend, changed \ No newline at end of file diff --git a/jesse/indicators/trendflex.py b/jesse/indicators/trendflex.py index 5fedade6b..e7336f666 100644 --- a/jesse/indicators/trendflex.py +++ b/jesse/indicators/trendflex.py @@ -40,7 +40,7 @@ def trendflex(candles: np.ndarray, period: int = 20, source_type: str = "close", return None if np.isnan(tf[-1]) else tf[-1] -@njit(cache=True) +@njit def trendflex_fast(ssf, period): tf = np.full_like(ssf, 0) ms = np.full_like(ssf, 0) diff --git a/jesse/indicators/vi.py b/jesse/indicators/vi.py index defdf0a35..6f31adcdf 100644 --- a/jesse/indicators/vi.py +++ b/jesse/indicators/vi.py @@ -31,7 +31,7 @@ def vi(candles: np.ndarray, period: int = 14, sequential: bool = False) -> VI: return VI(vpn_with_nan[-1], vmn_with_nan[-1]) -@njit(cache=True) +@njit def vi_fast(candles, period): candles_close = candles[:, 2] candles_high = candles[:, 3] diff --git a/jesse/indicators/vlma.py b/jesse/indicators/vlma.py index e919db37b..31ff6faf2 100644 --- a/jesse/indicators/vlma.py +++ b/jesse/indicators/vlma.py @@ -56,7 +56,7 @@ def vlma(candles: np.ndarray, min_period: int = 5, max_period: int = 50, matype: return res if sequential else res[-1] -@njit(cache=True) +@njit def vlma_fast(source, a, b, c, d, min_period, max_period): newseries = np.copy(source) period = np.zeros_like(source) diff --git a/jesse/indicators/voss.py b/jesse/indicators/voss.py index ee2494312..79574aae8 100644 --- a/jesse/indicators/voss.py +++ b/jesse/indicators/voss.py @@ -37,7 +37,7 @@ def voss(candles: np.ndarray, period: int = 20, predict: int = 3, bandwith: floa return VossFilter(voss_val[-1], filt[-1]) -@njit(cache=True) +@njit def voss_fast(source, period, predict, bandwith): voss = np.full_like(source, 0) filt = np.full_like(source, 0) diff --git a/jesse/indicators/vpwma.py b/jesse/indicators/vpwma.py index 56638f4d6..eb374c567 100644 --- a/jesse/indicators/vpwma.py +++ b/jesse/indicators/vpwma.py @@ -36,7 +36,7 @@ def vpwma(candles: np.ndarray, period: int = 14, power: float = 0.382, source_ty return res if sequential else res[-1] -@njit(cache=True) +@njit def vpwma_fast(source, period, power): newseries = np.copy(source) for j in range(period + 1, source.shape[0]):