jesse 2.2.0__tar.gz → 2.2.2__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.
- {jesse-2.2.0/jesse.egg-info → jesse-2.2.2}/PKG-INFO +1 -1
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/backtest_controller.py +1 -1
- {jesse-2.2.0 → jesse-2.2.2}/jesse/libs/dynamic_numpy_array/__init__.py +26 -17
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/installer.py +7 -5
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/order_service.py +13 -2
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/position_service.py +3 -1
- jesse-2.2.2/jesse/strategies/TestBaseAndQuoteAssetProperties/__init__.py +17 -0
- jesse-2.2.2/jesse/strategies/TestOversizedReduceOnlyExitAccounting/__init__.py +43 -0
- jesse-2.2.2/jesse/version.py +1 -0
- {jesse-2.2.0 → jesse-2.2.2/jesse.egg-info}/PKG-INFO +1 -1
- {jesse-2.2.0 → jesse-2.2.2}/jesse.egg-info/SOURCES.txt +3 -0
- {jesse-2.2.0 → jesse-2.2.2}/setup.py +1 -1
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_broker.py +60 -0
- jesse-2.2.2/tests/test_chart_data_serialization.py +84 -0
- jesse-2.2.2/tests/test_dynamic_numpy_array.py +254 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_parent_strategy.py +8 -0
- jesse-2.2.0/jesse/version.py +0 -1
- jesse-2.2.0/tests/test_dynamic_numpy_array.py +0 -130
- {jesse-2.2.0 → jesse-2.2.2}/LICENSE +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/MANIFEST.in +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/README.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/candle_pipelines/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/candle_pipelines/base_candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/candle_pipelines/gaussian_noise.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/candle_pipelines/gaussian_resampler.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/candle_pipelines/moving_block_bootstrap.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/cli.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/config.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/constants.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/ai_model_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/auth_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/candles_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/closed_trade_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/config_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/exchange_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/file_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/live_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/lsp_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/monte_carlo_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/notification_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/optimization_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/order_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/significance_test_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/strategy_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/system_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/tabs_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/controllers/websocket_controller.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/enums/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/exceptions/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/exchanges/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/exchanges/exchange.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/exchanges/sandbox/Sandbox.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/exchanges/sandbox/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/factories/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/factories/candle_factory.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/factories/order_factory.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/helpers.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/acosc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ad.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/adosc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/adx.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/adxr.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/alligator.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/alma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ao.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/apo.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/aroon.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/aroonosc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/atr.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/avgprice.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/bandpass.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/beta.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/bollinger_bands.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/bollinger_bands_width.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/bop.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/cc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/cci.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/cfo.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/cg.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/chande.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/chop.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/cksp.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/cmo.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/correl.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/correlation_cycle.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/cvi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/cwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/damiani_volatmeter.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/dec_osc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/decycler.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/dema.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/devstop.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/di.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/dm.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/donchian.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/dpo.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/dti.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/dx.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/edcf.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/efi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ema.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/emd.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/emv.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/epma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/er.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/eri.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/fisher.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/fosc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/frama.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/fwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/gatorosc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/gauss.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/heikin_ashi_candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/high_pass.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/high_pass_2_pole.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/hma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/hull_suit.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/hurst_exponent.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/hwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ichimoku_cloud.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ichimoku_cloud_seq.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ift_rsi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/itrend.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/jma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/jsa.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/kama.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/kaufmanstop.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/kdj.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/keltner.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/kst.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/kurtosis.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/kvo.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/linearreg.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/linearreg_angle.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/linearreg_intercept.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/linearreg_slope.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/lrsi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/maaq.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/mab.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/macd.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/mama.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/marketfi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/mass.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/mcginley_dynamic.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/mean_ad.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/median_ad.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/medprice.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/mfi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/midpoint.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/midprice.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/minmax.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/mom.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/mwdx.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/natr.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/nma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/nvi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/obv.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/pfe.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/pivot.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/pma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ppo.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/pvi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/pwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/qstick.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/reflex.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/rma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/roc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/rocp.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/rocr.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/rocr100.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/roofing.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/rsi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/rsmk.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/rsx.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/rvi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/safezonestop.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/sar.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/sinwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/skew.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/sma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/smma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/squeeze_momentum.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/sqwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/srsi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/srwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/stc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/stddev.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/stiffness.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/stochastic.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/stochf.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/supersmoother.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/supersmoother_3_pole.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/supertrend.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/support_resistance_with_break.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/swma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/t3.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/tema.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/trange.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/trendflex.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/trima.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/trix.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/tsf.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/tsi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ttm_squeeze.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ttm_trend.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/typprice.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ui.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/ultosc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/var.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vi.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vidya.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vlma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/volume.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vosc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/voss.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vpci.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vpt.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vpwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vwap.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vwma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/vwmacd.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/wad.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/waddah_attr_explosion.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/wclprice.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/wilders.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/willr.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/wma.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/wt.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/zlema.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/indicators/zscore.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/info.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/libs/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/libs/custom_json/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/agent_rules.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/agent_rules.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/manager.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/mcp_config.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/backtest_management.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/backtest_metrics.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/candle.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/configuration.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/indicator.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/monte_carlo.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/position_risk.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/significance_test.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/strategy.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/resources/utilities.md +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/server.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/test.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/backtest.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/config.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/general.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/indicator.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/monte_carlo.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/auth.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/backtest.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/config.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/general.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/indicator.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/monte_carlo.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/significance_test.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/services/strategy.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/significance_test.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/mcp/tools/strategy.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/AiModel.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/BacktestSession.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Candle.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/ClosedTrade.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Exchange.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/ExchangeApiKeys.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/FuturesExchange.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/LiveEquitySnapshot.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/LiveSession.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Log.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/MonteCarloSession.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/NotificationApiKeys.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/OpenTab.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/OptimizationSession.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Option.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Order.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Orderbook.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Position.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Route.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/SignificanceTestSession.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/SpotExchange.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Ticker.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/Trade.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/models/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/backtest_mode.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/data_provider.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/exchange_api_keys.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/ApexOmniPerpetual.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/ApexOmniPerpetualTestnet.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/ApexProMain.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetual.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetualTestnet.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/apex_pro_utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk-arm.dylib +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk-x86.dylib +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk.dylib +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk.so +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-arm.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-pc.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-x86.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk.dll +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Binance/BinanceMain.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Binance/BinancePerpetualFutures.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Binance/BinancePerpetualFuturesTestnet.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Binance/BinanceSpot.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Binance/BinanceUSSpot.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Binance/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Binance/binance_utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bitfinex/BitfinexSpot.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bitfinex/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bitfinex/bitfinex_utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/BybitMain.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/BybitSpot.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/BybitSpotTestnet.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/BybitUSDCPerpetual.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/BybitUSDCPerpetualTestnet.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/BybitUSDTPerpetual.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/BybitUSDTPerpetualTestnet.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Bybit/bybit_utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Coinbase/CoinbaseSpot.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Coinbase/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Coinbase/coinbase_utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Gate/GateSpot.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Gate/GateSpotMain.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Gate/GateUSDTMain.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Gate/GateUSDTPerpetual.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Gate/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Gate/gate_utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Hyperliquid/HyperliquidPerpetual.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Hyperliquid/HyperliquidPerpetualMain.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Hyperliquid/HyperliquidPerpetualTestnet.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Hyperliquid/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/Hyperliquid/hyperliquid_utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/import_candles_mode/drivers/interface.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/monte_carlo_mode/MonteCarloRunner.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/monte_carlo_mode/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/notification_api_keys.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/optimize_mode/Optimize.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/optimize_mode/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/optimize_mode/fitness.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/significance_test_mode/SignificanceTestRunner.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/significance_test_mode/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/modes/utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/repositories/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/repositories/candle_repository.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/repositories/closed_trade_repository.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/repositories/live_equity_repository.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/repositories/live_session_repository.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/repositories/open_tab_repository.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/repositories/order_repository.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/backtest.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/import_candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/ml.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/monte_carlo/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/monte_carlo/common.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/monte_carlo/monte_carlo_candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/monte_carlo/monte_carlo_trades.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/optimize/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/rule_significance_testing/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/rule_significance_testing/bootstrap.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/rule_significance_testing/common.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/rule_significance_testing/plots.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/rule_significance_testing/rule_significance.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/research/rule_significance_testing/simulator.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/routes/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/api.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/auth.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/broker.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/cache.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/candle_service.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/charts.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/closed_trade_service.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/color.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/db.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/env.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/exchange_service.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/failure.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/file.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/general_info.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/jesse_trade.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/logger.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/lsp.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/metrics.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/migrator.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/multiprocessing.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/notifier.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/progressbar.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/redis.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/report.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/strategy_handler/ExampleStrategy/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/strategy_handler/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/strategy_service.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/table.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/tradingview.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/transformers.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/validators.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/web.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/services/ws_manager.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/200.html +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/404.html +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/-30QC5Em.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/2oJWbEOo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/3TATJI7h.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/3e1v2bzS.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/3kbuJQcV.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/3xVqZejG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/5LuOXUq_.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/5y4Vyg26.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/727ZlQH0.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/7A4Fjokl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/7O62HKoU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/7ZYwO1wL.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/9AS84p_J.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/9C6ErRqt.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ALS-8XQs.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B-DoSBHF.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B-k3dvlD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B-lZjTdr.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B08HEjoJ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B0XVJmRM.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B0m2ddpp.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B0qRVHPH.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B14Poo8t.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B1SYOhNW.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B1bQXN8T.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B2Cf9XSq.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B2vK47Ag.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B3ZDOciz.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B430Bg39.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B48N-Iqd.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B4VqtPa2.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B5auBHZD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B5lbUyaz.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B5uW3Zvf.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B6PwfRVo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B6W0miNI.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B6cCR3B0.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B7alP455.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B7mTdjB0.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B8ssZoUh.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B9WNnh9E.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B9tAzFk8.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B9wLZaAG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BAng5TT0.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BC5c_5Pe.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BE9QQhgF.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BEBZ7ncR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BEhvmC7f.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BFLt1xDp.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BFOHcciG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BFk9XlIc.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BGLI1Hdo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BHOwM8T6.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BI9oDWm9.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BIEUsx6d.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BILxekzW.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BJ4Li9vH.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BJGe-b2p.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BK9xJ97g.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BLhTXw86.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BLuZWbUW.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BLxaRREJ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BMR_PYu6.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BMYPR7BL.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BMj5Y0dO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BNHBcdi1.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BNioltXt.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BPT9niGB.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BPhBrDlE.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BQHEbijl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BQj7hEmF.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BQoSv7ci.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BQwtg7Y-.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BQyhglpn.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BRk-K-rg.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BSxZ-RaX.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BTpWsGps.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BUEGK8hf.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BVUVsWT6.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BVr_1_27.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BVz_zdnA.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BWBTHuhh.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BX77sIaO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BXW1EomU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BXYnMxBe.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BXkSAIEj.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BY-TUvya.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BY6pwuIY.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BYfEzaKc.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BYtUz8ZP.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BZ3mVgh7.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B_2NBH8x.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B_U3BDh3.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B_i9asfM.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/B_m7g4N7.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BacktestTabs.XpCeWK_e.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BbSNqyBO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bc5xkKR1.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BcVrDPqo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BdDjvGPZ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BdxkyMLR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Be6lgOlo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BeQkCIfX.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BeX6IBQN.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BeosxbBR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BfCpw3nA.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BfHTSMKl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BfLuTCmN.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BfazEYIx.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BfivnA6A.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BfjtVDDH.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bg-kzb6g.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BgDCqdQA.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BgYniUM_.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BiA0Vjwq.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BiFfXF7O.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bid6LQhH.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BjABl1g7.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BjQB5zDj.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BknIz3MU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bkuqu6BP.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bl1h29GH.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BlxRB_8X.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BoXegm-a.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bp6g37R7.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BpR4rFUe.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BpV-U7xH.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BpWG_bgh.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bri7RVrZ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BsOYHjMa.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BsZeLSAC.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BthQWCQV.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bu5BbsvL.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bu73EIfS.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BuapDI9Y.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BupSXVCO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bvotw-X0.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bw0wYZmb.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bw305WKR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BwXTMy5W.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BxUR8wTn.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Byb2_aFw.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BygKL3ZF.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BypH-vXm.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/BzJJZx-M.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Bzb7OGdO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C-_shW-Y.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C-nORZOA.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C-wny61x.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C0nbwVuJ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C1XDQQGZ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C1tVc3UG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C1w2a3ep.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C30yJ1fx.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C39BiMTA.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C3FkfJm5.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C3khCPGq.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C3mMm8J8.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C3spBWn3.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C3t2pwGQ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C5Y8tDhP.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C5wWYbrZ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C6j12Q_x.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C75U4IDy.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C7L56vO4.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C7gG9l05.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C8M2exoo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C8lEn-DE.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C9L3yaDO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CAQ2eGtk.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CAqdCCoA.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CB0Krxn9.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CB2ApiWb.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CCBS_C5_.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CCaADRuf.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CD_QflpE.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CG6Dc4jp.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CGVVOGHx.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CHxWgl8u.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CJaU5se_.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CKg9tqCS.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CM8KxXT1.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CMgmWNdv.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CMt9yHYq.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/COJ4H7py.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/COK4E0Yg.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/COcR7UxN.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/COyJrUc7.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CPj6Oxyc.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CQ0soPOq.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CQjiPCtT.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CS3Unz2-.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CSHBycmS.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CSp6iqVD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CTNlIIiR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CTRr51gU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CUnW07Te.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CV9EbfTh.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CVO1_9PV.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CVw76BM1.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CXKOl_mN.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CYFUjXW1.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CYgUR4L5.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CZe0XNBd.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/C_scCXcs.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CafNBF8u.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CbfX1IO0.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Cc5clBb7.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CdO5JTpU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Cf8iN4DR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CfA6H1iD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CfQXZHmo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CfnpWUYo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CgoVc2CE.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ChA_izKI.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Ci6OQyBP.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CiLwMR9c.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CircleProgressbar.Bqs-YaMH.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CjDtw9vr.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CjZ9rSJP.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CjjU3m-a.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CkXjmgJE.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Ckkbw-AO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Cl4mw-2c.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ClGRhx96.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CmCqftbK.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CmUaXb8e.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CqwBQo24.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CrQ5KHDe.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CrrKwR0a.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CruqBWKG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CsSk9TLD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Csfq5Kiy.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CtHLcuxG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CuFlys0T.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Cuk6v7N8.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Cv8gVKYl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Cv9koXgw.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CwjWoCRV.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CyIGOvEh.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CyVeKkvQ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CyktbL80.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Cz8P-rqG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CzF1MCbP.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Cza_XSSt.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/CzouJOBO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D-2ljcwZ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D0UiDa5C.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D0r3Knsf.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D2PfwrvU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D2Z7JJdl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D4Tzg5kh.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D4d0bmRY.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D4h5O-jR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D5KoaKCx.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D5ZsypWT.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D5pd2Owo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D7lU1fdU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D7oLnXFd.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D8SARrrT.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D8mZ0lfy.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D9-PGadD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D9R-vmeu.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D9lg42C_.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D9yiNO04.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DAi9KRSo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DB0RB20n.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DBIdNJb1.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DBQeEorK.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DB_GagMm.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DCE3LsBG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DDA0whWr.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DDpSJMW6.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DDrv2Hr-.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DDtJtuOZ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DEIpsLCJ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DEsW6eUH.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DGfQJd6p.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DH5Ifo-i.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DHJKELXO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DHo0CJ0O.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DIHTwG2N.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DIovg4uR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DJ6C8EHK.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DJQgcT-d.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DJlmqQ1C.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DKOGybHv.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DKXYxT9g.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DKykz6zU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DL8Ve5HW.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DLPipH_Q.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DLbgOhZU.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DLs3tTet.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DNPblYf5.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DNquZEk8.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DOAuugfS.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DOk3G3cc.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DPvbFsQx.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DQ1-QYvQ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DQVVAn-B.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DRC6TkPh.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DRCs4cJW.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DREVFZK8.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DRNBmV_Q.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DRVtMX6w.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DRW-0cLl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DRhBOlRY.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DUszq2jm.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DUuF8ec2.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DVG02705.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DVYH6Lj_.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DWGz5Zuj.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DWJ3fJO_.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DWedfzmr.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DXbdFlpD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DYoNaHQp.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DYvnoCeB.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D_OY6ada.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D_y4Iqca.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/D_z4Izcz.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dayu4EKP.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DbXoA79R.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dbxjm_CC.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Ddv68eIx.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DeYg-96x.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Deuh7S70.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DfxzS6Rs.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dgyr3wWZ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DhMKtDLN.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DhUJRlN_.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dhn9LcZ4.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DiytYwWf.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dj6nwHGl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DjHMNizO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DkBy-JyN.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DkLiglaE.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DmdQbaLT.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dmy2k9nq.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dn00JSTd.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DnULxvSX.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DoFvH58O.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DpC8jOIg.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DpwXO0Z8.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DqHb_Lsi.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DqwNpetd.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DrMooDfm.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DrRCxMg5.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Drsz93k2.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Ds-gbosJ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DsBKuouk.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DsWjAdsX.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dsg_Bt_b.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DtFQj3wx.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DtpSKk35.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Du268qiB.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Du5NY7AG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DvSxYeG4.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DxSadP1t.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Dy-ATyBD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/DyKutqhl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/E3gJ1_iC.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/FNqbgIOG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/GBQ2dnAY.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/GnDLJWeX.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/HNqc6WRo.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/HnGAYVZD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/HzYwdGDm.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/IconCSS.RN4HczVp.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Inter-VariableFont_slnt_wght.Cl4AQHp9.ttf +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/IuBKFhSY.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/JqZropPD.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/KXmA5gEz.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/L9t79GZl.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/LGGdnPYs.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/LKU2TuZ1.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/LiveTabs.15UVtLVQ.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/P4WzXJd0.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Pj9gCBS1.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/PoHY5YXO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Progress.CWZn3LuJ.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/QhoSD0DR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/R900dpIa.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/SKMF96pI.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/SPD3sf1n.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/StrategiesSidebar.-h7ix9-v.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/T-Tgc4AT.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/TU54ms6u.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Tz6hzZYG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/UIAJJxZW.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/UL5zprDm.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/UMmp-gVE.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Ua_dVQ2E.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/VuadG5SK.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/XBlWyCtg.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/XVrfe6Qe.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/Y6DubyxG.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/YJb9dmdj.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ZlaFEk-P.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/_WwNv8Gt.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/_id_.BY-NJHml.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/_id_.DM7QJcru.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/_id_.J2oYSFWN.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ahYVQIuB.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ajMbGru0.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/atvbtKCR.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/bCA53EVm.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/bN70gL4F.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/cPjAOO0u.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/codicon.DCmgc-ay.ttf +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/din0uRiO.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/e4jU7D2d.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/eg146-Ew.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/entry.DZ1VJD8l.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/error-404.DZraUJun.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/error-500.XmAVHPl_.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/fje9CFhw.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/gRuQeaLk.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ifBTmRxC.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/index.BCxjJPBI.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/index.BujPmbc0.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/index.DGzxCzt4.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/index.K8JdO5jA.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/index.lQPmb1y9.css +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/jN37G9_2.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/logo-dark.tKoQPl1k.svg +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/logo-light.CS4l4ePq.png +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/m09vb5r-.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/m2LEI-9-.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/m4gc_qpA.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/m4uW47V2.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/mebxcVVE.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/nyqBNV6O.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/qmhIZ77x.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/qpfuy3xp.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/r--hdCBL.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/r4BD7fzp.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/sacFqUAJ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/sdHcTMYB.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/shcSOmrb.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ul-Lp4lw.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/w-ucz2PV.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/w8dY5SsB.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/wI6OXr6j.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/xI-RfyKK.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/xW4inM5L.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/xgbdnDAz.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/ySlJ1b_l.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/yf5bffbF.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/_nuxt/zocC4JxJ.js +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/favicon.ico +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/favicons/android-chrome-192x192.png +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/favicons/android-chrome-512x512.png +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/favicons/apple-touch-icon.png +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/favicons/favicon-16x16.png +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/favicons/favicon-32x32.png +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/index.html +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/static/robots.txt +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_app.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_closed_trades.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_exchanges.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_logs.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_orderbook.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_orders.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_positions.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_tickers.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/store/state_trades.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/CanAddClosedTradeToStore/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Strategy.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test01/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test02/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test04/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test05/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test06/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test07/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test08/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test09/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test10/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test11/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test12/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test13/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test14/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test15/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test16/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test17/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test18/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test19/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test20/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test21/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test22/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test23/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test24/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test25/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test26/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test27/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test28/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test29/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test30/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test31/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test32/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test33/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test34/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test35/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test36/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test37/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test38/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test39/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test40/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test41/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test44/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test45/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test46/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test47/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/Test48/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestAddHorizontalLineToCandleChart/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestAddHorizontalLineToExtraChart/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestAddLineToCandleChart/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestAddLineToExtraChart/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestAfterMethod/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestAverageEntryPriceProperty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestBalanceAndFeeReductionWorksCorrectlyInSpotModeInBothBuyAndSellOrders/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestBalancesAreHandledCorrectlyForCancellingOrdersInSpot/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestBeforeMethod/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestBeforeTerminate/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanCancelEntryOrdersAfterOpenPositionLong1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanCancelEntryOrdersAfterOpenPositionLong2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanCancelEntryOrdersAfterOpenPositionShort1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanCancelEntryOrdersAfterOpenPositionShort2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanOpenANewPositionImmediatelyAfterClosingViaUpdatePosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanRunWithoutShorting/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanSubmitStopLossOrderWithSizeEqualToCurrentPositionQty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanSubmitStopLossOrderWithSizeLessThanCurrentPositionQty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanSubmitTakeProfitAndStopLossAtSameTimeInSpot/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanSubmitTakeProfitOrderWithSizeEqualToCurrentPositionQty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCanSubmitTakeProfitOrderWithSizeLessThanCurrentPositionQty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCannotSetStopLossOrderInGoLong/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCannotSetTakeProfitOrderInGoLong/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCannotSpendMoreThanAvailableBalance/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCannotSubmitStopLossOrderWithSizeMoreThanCurrentPositionQty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCannotSubmitTakeProfitOrderWithSizeMoreThanCurrentPositionQty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCapitalPropertyRaisesNotImplementedError/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestClosedTradeAfterExitingTrade/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCurrentRouteIndex1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestCurrentRouteIndex2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestDailyBalanceStoresPortfolioValue/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestDailyBalancesProperty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestDataRoutes1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestDataRoutes2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestDefaultHyperparameters/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestDnaMethod/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestEmptyStrategy/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestEntryOrdersAndExitOrdersProperties/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestExchangeTypeProperty1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestExchangeTypeProperty2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestFuturesExchangeAvailableMargin/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestHasLongAndShortEntryOrdersPropertiesInFilters/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestHasLongEntryOrdersProperty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestHasShortEntryOrdersProperty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestIncreasedAndReducedCount/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestIncreasingShortPosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestInsufficientMargin1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestInsufficientMargin2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestInsufficientMargin3/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestLeverageProperty1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestLeverageProperty2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestLiquidationInCrossModeForShortTrade/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestLiquidationInIsolatedModeForLongTrade/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestLiquidationInIsolatedModeForShortTrade/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestLogMethodInStrategyClass/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestMarkPrice/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestMarketOrderForLowPriceDifference/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestMetrics1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestMultipleEntryOrdersUpdateEntryLongPositions/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestMultipleEntryOrdersUpdateEntryShortPositions/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOnCancelMethod/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOnClosePosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOnRouteOpenPosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOnRouteOpenPosition2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOrderIsStopLossProperty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOrderIsTakeProfitProperty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOrderPriceCannotBeGreaterThanZero/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOrderValueProperty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestOrdersAreSortedBeforeExecution/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPortfolioValue/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPortfolioValueIncludesPositionValueAndOpenOrdersValue/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPositionExchangeTypeProperty1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPositionExchangeTypeProperty2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPositionOpenIncreaseReduceCloseEventsInSpot/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPositionTotalCostProperty/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPositionWithLeverage1/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPositionWithLeverage2/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestPositions/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestProperBalanceHanldingInSpotAfterOrderCancellation/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestReduceOnlyMarketOrders/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestShortInSpot/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestStopLossPriceIsReplacedWithMarketOrderForBetterPriceLongPosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestStopLossPriceIsReplacedWithMarketOrderForBetterPriceShortPosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestStopOrderShouldConsiderExecutedTakeProfitOrdersInSpot/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestStrategyVariablesAreResetBeforeOpeningNewPosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestTakeProfitPriceIsReplacedWithMarketOrderWhenMoreConvenientLongPosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestTakeProfitPriceIsReplacedWithMarketOrderWhenMoreConvenientShortPosition/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestTerminate/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestUsageOfShouldCancelRaisesNotImplementedError/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestVanillaStrategy/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestWalletBalance/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/TestWithoutCancelMethod/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/strategies/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/testing_utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse/utils.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse.egg-info/dependency_links.txt +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse.egg-info/entry_points.txt +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse.egg-info/requires.txt +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/jesse.egg-info/top_level.txt +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/requirements.txt +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/setup.cfg +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/data/__init__.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/data/test_candles_0.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/data/test_candles_1.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/data/test_candles_indicators.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_backtest.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_candle_service.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_completed_trade.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_conflicting_orders.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_exchange.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_helpers.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_import_candles.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_indicators.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_isolated_backtest.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_lsp.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_metrics.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_order.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_position.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_research.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_router.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_spot_mode.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_state_candle.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_state_exchanges.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_state_logs.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_state_orderbook.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_state_orders.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_state_ticker.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_state_trades.py +0 -0
- {jesse-2.2.0 → jesse-2.2.2}/tests/test_utils.py +0 -0
|
@@ -286,7 +286,7 @@ def get_backtest_session_chart_data(session_id: str, authorization: Optional[str
|
|
|
286
286
|
'error': f'Session with ID {session_id} not found'
|
|
287
287
|
}, status_code=404)
|
|
288
288
|
|
|
289
|
-
chart_data = jh.clean_infinite_values(json.loads(session.chart_data)) if session.chart_data else None
|
|
289
|
+
chart_data = jh.clean_nan_values(jh.clean_infinite_values(json.loads(session.chart_data))) if session.chart_data else None
|
|
290
290
|
|
|
291
291
|
return JSONResponse({
|
|
292
292
|
'chart_data': chart_data
|
|
@@ -69,10 +69,16 @@ class DynamicNumpyArray:
|
|
|
69
69
|
def append(self, item: np.ndarray) -> None:
|
|
70
70
|
self.index += 1
|
|
71
71
|
|
|
72
|
-
#
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
# Grow the buffer when full, doubling capacity (geometric growth) so
|
|
73
|
+
# that total bytes copied across all appends is O(N) rather than the
|
|
74
|
+
# O(N^2 / bucket_size) of linear-bucket growth via np.concatenate.
|
|
75
|
+
if self.index >= len(self.array):
|
|
76
|
+
new_size = max(len(self.array) * 2, max(self.bucket_size, 1))
|
|
77
|
+
new_shape = (new_size,) + tuple(self.array.shape[1:])
|
|
78
|
+
new_array = np.zeros(new_shape, dtype=self.array.dtype)
|
|
79
|
+
if self.index > 0:
|
|
80
|
+
new_array[:self.index] = self.array[:self.index]
|
|
81
|
+
self.array = new_array
|
|
76
82
|
|
|
77
83
|
# drop N% of the beginning values to free memory
|
|
78
84
|
if (
|
|
@@ -109,18 +115,21 @@ class DynamicNumpyArray:
|
|
|
109
115
|
self.bucket_size = self.shape[0]
|
|
110
116
|
|
|
111
117
|
def append_multiple(self, items: np.ndarray) -> None:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
118
|
+
n_new = len(items)
|
|
119
|
+
old_index = self.index
|
|
120
|
+
self.index += n_new
|
|
121
|
+
|
|
122
|
+
# Grow the buffer geometrically (double) when needed. Must accommodate
|
|
123
|
+
# `self.index + 1` total elements; ensure we double-or-better to avoid
|
|
124
|
+
# degrading to linear growth when many small batches are appended.
|
|
125
|
+
if self.index + 1 > len(self.array):
|
|
126
|
+
min_required = self.index + 1
|
|
127
|
+
new_size = max(min_required, len(self.array) * 2, max(self.bucket_size, 1))
|
|
128
|
+
new_shape = (new_size,) + tuple(self.array.shape[1:])
|
|
129
|
+
new_array = np.zeros(new_shape, dtype=self.array.dtype)
|
|
130
|
+
if old_index >= 0:
|
|
131
|
+
new_array[:old_index + 1] = self.array[:old_index + 1]
|
|
132
|
+
self.array = new_array
|
|
124
133
|
|
|
125
134
|
# drop N% of the beginning values to free memory
|
|
126
135
|
if (
|
|
@@ -132,7 +141,7 @@ class DynamicNumpyArray:
|
|
|
132
141
|
self.index -= shift_num
|
|
133
142
|
self.array = np_shift(self.array, -shift_num)
|
|
134
143
|
|
|
135
|
-
self.array[self.index -
|
|
144
|
+
self.array[self.index - n_new + 1 : self.index + 1] = items
|
|
136
145
|
|
|
137
146
|
def delete(self, index: int, axis=None) -> None:
|
|
138
147
|
self.array = np.delete(self.array, index, axis=axis)
|
|
@@ -49,17 +49,19 @@ def install(is_live_plugin_already_installed: bool, strict: bool):
|
|
|
49
49
|
if not is_64_bit:
|
|
50
50
|
raise NotImplementedError(f'Only 64-bit machines are supported')
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
# platform.machine() returns 'arm64' on macOS but 'aarch64' on Linux (e.g. an
|
|
53
|
+
# arm64 Docker container on Apple Silicon), so both must be matched.
|
|
54
|
+
is_arm = platform.machine().lower() in ('arm64', 'aarch64')
|
|
53
55
|
print('is_arm', is_arm)
|
|
54
|
-
#
|
|
55
|
-
if is_arm and
|
|
56
|
-
raise NotImplementedError(
|
|
56
|
+
# ARM is supported on macOS and Linux; Windows on ARM is not.
|
|
57
|
+
if is_arm and os_name == 'windows':
|
|
58
|
+
raise NotImplementedError('ARM versions of Windows are not supported. If you need them, send a request to contact@jesse.trade')
|
|
57
59
|
|
|
58
60
|
# format os_name to something acceptable for the API
|
|
59
61
|
if os_name == 'mac':
|
|
60
62
|
formatted_os_name = 'macOS - M1' if is_arm else 'macOS - Intel'
|
|
61
63
|
elif os_name == 'linux':
|
|
62
|
-
formatted_os_name = 'Linux - x86_64'
|
|
64
|
+
formatted_os_name = 'Linux - aarch64' if is_arm else 'Linux - x86_64'
|
|
63
65
|
# windows
|
|
64
66
|
else:
|
|
65
67
|
formatted_os_name = 'Windows 10 - 64 bit'
|
|
@@ -55,9 +55,20 @@ def execute_order(order: Order, silent: bool = False) -> None:
|
|
|
55
55
|
order.status = order_statuses.EXECUTED
|
|
56
56
|
order.fee = order.fee or None
|
|
57
57
|
|
|
58
|
-
# if it's not live trading, we set the filled qty to the qty.
|
|
58
|
+
# if it's not live trading, we set the filled qty to the qty.
|
|
59
59
|
if not jh.is_livetrading():
|
|
60
|
-
order.
|
|
60
|
+
# a reduce_only order can only fill up to the size of the open position. If its
|
|
61
|
+
# stated qty exceeds the remaining position (e.g. a stop-loss left oversized after
|
|
62
|
+
# partial take-profits), the actual fill is capped to what closes the position.
|
|
63
|
+
if order.reduce_only:
|
|
64
|
+
p = store.positions.get_position(order.exchange, order.symbol)
|
|
65
|
+
position_qty = p.qty if p else 0.0
|
|
66
|
+
if position_qty != 0 and abs(order.qty) > abs(position_qty):
|
|
67
|
+
order.filled_qty = -position_qty
|
|
68
|
+
else:
|
|
69
|
+
order.filled_qty = order.qty
|
|
70
|
+
else:
|
|
71
|
+
order.filled_qty = order.qty
|
|
61
72
|
|
|
62
73
|
# set order fee for non-live modes if not already set. In live trading, the fee is fetched by the exchange.
|
|
63
74
|
if not jh.is_livetrading() and order.fee is None:
|
|
@@ -177,7 +177,9 @@ def on_executed_order(position: Position, order: Order) -> None:
|
|
|
177
177
|
price = order.price
|
|
178
178
|
|
|
179
179
|
if position.exchange and position.exchange.type == 'futures':
|
|
180
|
-
|
|
180
|
+
# fee is charged on what actually filled, not the stated qty (a reduce_only
|
|
181
|
+
# order may fill less than its stated qty when it exceeds the open position).
|
|
182
|
+
position.exchange.charge_fee(order.filled_qty * price)
|
|
181
183
|
|
|
182
184
|
# order opens position
|
|
183
185
|
if position.qty == 0:
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from jesse.strategies import Strategy
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestBaseAndQuoteAssetProperties(Strategy):
|
|
5
|
+
def before(self) -> None:
|
|
6
|
+
if self.index == 0:
|
|
7
|
+
assert self.base_asset == 'BTC'
|
|
8
|
+
assert self.quote_asset == 'USDT'
|
|
9
|
+
|
|
10
|
+
def should_long(self) -> bool:
|
|
11
|
+
return False
|
|
12
|
+
|
|
13
|
+
def go_long(self):
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
def should_cancel_entry(self) -> bool:
|
|
17
|
+
return False
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from jesse.strategies import Strategy
|
|
2
|
+
from jesse.store import store
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class TestOversizedReduceOnlyExitAccounting(Strategy):
|
|
6
|
+
"""
|
|
7
|
+
Reproduces the oversized reduce_only exit bug: when a reduce_only order's stated qty
|
|
8
|
+
exceeds the remaining position, the engine caps the actual fill but must account for
|
|
9
|
+
the *capped* qty (not the stated qty) in both the exit_price VWAP and the fee.
|
|
10
|
+
|
|
11
|
+
Down-trend prices walk 100 -> 11. We open long at 100 with TWO stop-loss tiers that
|
|
12
|
+
intentionally over-sum the position (1 + 2 = 3 > entry qty 2). tier1 (@90) reduces the
|
|
13
|
+
position to 1; when tier2 (@80, stated qty 2) later fires, reduce_only caps the actual
|
|
14
|
+
fill to the remaining 1.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def should_long(self):
|
|
18
|
+
return self.price == 100
|
|
19
|
+
|
|
20
|
+
def go_long(self):
|
|
21
|
+
if self.price == 100:
|
|
22
|
+
self.buy = 2, self.price
|
|
23
|
+
|
|
24
|
+
def on_open_position(self, order):
|
|
25
|
+
# stated qtys sum to 3 while the position is only 2 -> the @80 tier is oversized
|
|
26
|
+
# once the @90 tier has reduced the position.
|
|
27
|
+
self.stop_loss = [(1, 90), (2, 80)]
|
|
28
|
+
|
|
29
|
+
def on_close_position(self, order, closed_trade) -> None:
|
|
30
|
+
assert closed_trade.type == 'long'
|
|
31
|
+
assert closed_trade.entry_price == 100
|
|
32
|
+
assert closed_trade.qty == 2
|
|
33
|
+
|
|
34
|
+
# exit VWAP must weight the second leg by the ACTUAL filled 1, not the stated 2:
|
|
35
|
+
# correct: (1*90 + 1*80) / (1 + 1) = 85
|
|
36
|
+
# buggy: (1*90 + 2*80) / (1 + 2) = 83.333...
|
|
37
|
+
assert round(closed_trade.exit_price, 8) == 85
|
|
38
|
+
|
|
39
|
+
# headline invariant: per-trade pnl must equal the real wallet balance change.
|
|
40
|
+
# this fails if either the exit_price VWAP or the fee is computed on the stated qty.
|
|
41
|
+
e = store.exchanges.get_exchange(self.exchange)
|
|
42
|
+
wallet_delta = e.wallet_balance - 10_000
|
|
43
|
+
assert round(closed_trade.pnl, 8) == round(wallet_delta, 8)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.2.2"
|
|
@@ -944,6 +944,7 @@ jesse/strategies/TestAfterMethod/__init__.py
|
|
|
944
944
|
jesse/strategies/TestAverageEntryPriceProperty/__init__.py
|
|
945
945
|
jesse/strategies/TestBalanceAndFeeReductionWorksCorrectlyInSpotModeInBothBuyAndSellOrders/__init__.py
|
|
946
946
|
jesse/strategies/TestBalancesAreHandledCorrectlyForCancellingOrdersInSpot/__init__.py
|
|
947
|
+
jesse/strategies/TestBaseAndQuoteAssetProperties/__init__.py
|
|
947
948
|
jesse/strategies/TestBeforeMethod/__init__.py
|
|
948
949
|
jesse/strategies/TestBeforeTerminate/__init__.py
|
|
949
950
|
jesse/strategies/TestCanCancelEntryOrdersAfterOpenPositionLong1/__init__.py
|
|
@@ -1005,6 +1006,7 @@ jesse/strategies/TestOrderIsTakeProfitProperty/__init__.py
|
|
|
1005
1006
|
jesse/strategies/TestOrderPriceCannotBeGreaterThanZero/__init__.py
|
|
1006
1007
|
jesse/strategies/TestOrderValueProperty/__init__.py
|
|
1007
1008
|
jesse/strategies/TestOrdersAreSortedBeforeExecution/__init__.py
|
|
1009
|
+
jesse/strategies/TestOversizedReduceOnlyExitAccounting/__init__.py
|
|
1008
1010
|
jesse/strategies/TestPortfolioValue/__init__.py
|
|
1009
1011
|
jesse/strategies/TestPortfolioValueIncludesPositionValueAndOpenOrdersValue/__init__.py
|
|
1010
1012
|
jesse/strategies/TestPositionExchangeTypeProperty1/__init__.py
|
|
@@ -1032,6 +1034,7 @@ tests/__init__.py
|
|
|
1032
1034
|
tests/test_backtest.py
|
|
1033
1035
|
tests/test_broker.py
|
|
1034
1036
|
tests/test_candle_service.py
|
|
1037
|
+
tests/test_chart_data_serialization.py
|
|
1035
1038
|
tests/test_completed_trade.py
|
|
1036
1039
|
tests/test_conflicting_orders.py
|
|
1037
1040
|
tests/test_dynamic_numpy_array.py
|
|
@@ -211,3 +211,63 @@ def test_should_not_submit_reduce_only_orders_when_position_is_closed():
|
|
|
211
211
|
|
|
212
212
|
with pytest.raises(OrderNotAllowed):
|
|
213
213
|
broker.reduce_position_at(1, 20, 20)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def test_oversized_reduce_only_order_uses_actual_filled_qty():
|
|
217
|
+
"""
|
|
218
|
+
Regression: when a reduce_only stop-loss is left with a stated qty larger than the
|
|
219
|
+
remaining position (e.g. a stop-loss not resized after a partial take-profit), the
|
|
220
|
+
engine caps the actual fill via reduce_only. The trade's exit_price VWAP and fee must
|
|
221
|
+
use that capped (actual) qty, not the stated qty — otherwise net_profit drifts below
|
|
222
|
+
the real wallet balance change.
|
|
223
|
+
"""
|
|
224
|
+
set_up_with_fee(is_futures_trading=True)
|
|
225
|
+
|
|
226
|
+
starting_balance = exchange.wallet_balance
|
|
227
|
+
assert starting_balance == 1000
|
|
228
|
+
|
|
229
|
+
# open a long position of qty 1 @ 50
|
|
230
|
+
broker.buy_at_market(1)
|
|
231
|
+
for o in store.orders.to_execute:
|
|
232
|
+
order_service.execute_order(o)
|
|
233
|
+
store.orders.to_execute = []
|
|
234
|
+
assert position.qty == 1
|
|
235
|
+
assert position.entry_price == 50
|
|
236
|
+
|
|
237
|
+
# take partial profit: sell 0.7 @ 80 (limit), position -> 0.3
|
|
238
|
+
position.current_price = 50
|
|
239
|
+
tp_order = broker.reduce_position_at(0.7, 80, 50)
|
|
240
|
+
order_service.execute_order(tp_order)
|
|
241
|
+
position.current_price = 80
|
|
242
|
+
assert round(position.qty, 8) == 0.3
|
|
243
|
+
|
|
244
|
+
# submit an OVERSIZED stop-loss: stated qty 1 (full) while only 0.3 remains, @ 40
|
|
245
|
+
sl_order = broker.reduce_position_at(1, 40, 80)
|
|
246
|
+
assert sl_order.reduce_only is True
|
|
247
|
+
assert sl_order.qty == -1 # stated qty is oversized vs the remaining 0.3
|
|
248
|
+
|
|
249
|
+
# execute the stop -> reduce_only caps the actual fill to the remaining 0.3
|
|
250
|
+
order_service.execute_order(sl_order)
|
|
251
|
+
position.current_price = 40
|
|
252
|
+
assert position.is_close is True
|
|
253
|
+
|
|
254
|
+
# the actual fill is capped to the remaining position, not the stated qty
|
|
255
|
+
assert round(sl_order.filled_qty, 8) == -0.3
|
|
256
|
+
|
|
257
|
+
trade = store.closed_trades.trades[-1]
|
|
258
|
+
|
|
259
|
+
# exit_price VWAP must weight the SL leg by the ACTUAL 0.3, not the stated 1.0:
|
|
260
|
+
# (0.7*80 + 0.3*40) / (0.7+0.3) = 68, NOT (0.7*80 + 1.0*40) / 1.7 = 56.47
|
|
261
|
+
assert round(trade.exit_price, 8) == 68
|
|
262
|
+
|
|
263
|
+
# fee must be charged on the actual filled qty across all legs
|
|
264
|
+
expected_fee = (1 * 50 + 0.7 * 80 + 0.3 * 40) * 0.002
|
|
265
|
+
assert round(trade.fee, 8) == round(expected_fee, 8)
|
|
266
|
+
|
|
267
|
+
# headline check: per-trade net profit equals the real wallet balance change
|
|
268
|
+
wallet_delta = exchange.wallet_balance - starting_balance
|
|
269
|
+
assert round(trade.pnl, 8) == round(wallet_delta, 8)
|
|
270
|
+
|
|
271
|
+
# this test closes a position, so clean up the shared store to avoid leaking the
|
|
272
|
+
# closed trade into tests that assume an empty store at their start
|
|
273
|
+
store.reset()
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import math
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
import jesse.helpers as jh
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# This mirrors what Starlette's JSONResponse does internally: it renders with
|
|
11
|
+
# `allow_nan=False`, which raises `ValueError: Out of range float values are not
|
|
12
|
+
# JSON compliant` if NaN / Infinity / -Infinity reach the encoder. The
|
|
13
|
+
# `/backtest/sessions/{id}/chart-data` endpoint hit exactly this when a strategy's
|
|
14
|
+
# `after()` produced NaN values for a custom chart line (GitHub issue #563).
|
|
15
|
+
def _render_like_jsonresponse(content):
|
|
16
|
+
return json.dumps(content, ensure_ascii=False, allow_nan=False)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _sample_chart_data():
|
|
20
|
+
"""
|
|
21
|
+
Approximates the structure assembled in backtest_mode for the frontend:
|
|
22
|
+
custom lines added from a strategy's `after()` hook may legitimately contain
|
|
23
|
+
NaN (e.g. an indicator that is not warmed up yet) or +/-inf (e.g. division
|
|
24
|
+
by zero).
|
|
25
|
+
"""
|
|
26
|
+
return {
|
|
27
|
+
'add_line_to_candle_chart': {
|
|
28
|
+
'my_line': [
|
|
29
|
+
{'time': 1, 'value': 10.0},
|
|
30
|
+
{'time': 2, 'value': float('nan')},
|
|
31
|
+
{'time': 3, 'value': float('inf')},
|
|
32
|
+
{'time': 4, 'value': float('-inf')},
|
|
33
|
+
{'time': 5, 'value': np.float64('nan')},
|
|
34
|
+
{'time': 6, 'value': 20.5},
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
'add_extra_line_chart': [np.float64('nan'), 1.0, np.int64(3)],
|
|
38
|
+
'flag': True,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_raw_chart_data_with_nan_is_not_json_compliant():
|
|
43
|
+
"""Without sanitizing, the data reproduces the issue #563 failure."""
|
|
44
|
+
raw = _sample_chart_data()
|
|
45
|
+
with pytest.raises(ValueError):
|
|
46
|
+
_render_like_jsonresponse(raw)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_cleaned_chart_data_is_json_compliant():
|
|
50
|
+
"""
|
|
51
|
+
The chart-data endpoint must strip BOTH NaN and infinite values before
|
|
52
|
+
handing the payload to JSONResponse. `clean_infinite_values` alone leaves
|
|
53
|
+
NaN behind, which was the root cause of issue #563.
|
|
54
|
+
"""
|
|
55
|
+
raw = _sample_chart_data()
|
|
56
|
+
|
|
57
|
+
# Exactly the composition the controller now applies.
|
|
58
|
+
cleaned = jh.clean_nan_values(jh.clean_infinite_values(raw))
|
|
59
|
+
|
|
60
|
+
# Must not raise anymore.
|
|
61
|
+
serialized = _render_like_jsonresponse(cleaned)
|
|
62
|
+
reloaded = json.loads(serialized)
|
|
63
|
+
|
|
64
|
+
line = reloaded['add_line_to_candle_chart']['my_line']
|
|
65
|
+
assert line[0]['value'] == 10.0 # untouched valid float
|
|
66
|
+
assert line[1]['value'] is None # NaN -> None
|
|
67
|
+
assert line[2]['value'] is None # +inf -> None
|
|
68
|
+
assert line[3]['value'] is None # -inf -> None
|
|
69
|
+
assert line[4]['value'] is None # numpy NaN -> None
|
|
70
|
+
assert line[5]['value'] == 20.5 # untouched valid float
|
|
71
|
+
|
|
72
|
+
extra = reloaded['add_extra_line_chart']
|
|
73
|
+
assert extra[0] is None # numpy NaN -> None
|
|
74
|
+
assert extra[1] == 1.0
|
|
75
|
+
assert extra[2] == 3 # numpy int preserved
|
|
76
|
+
assert reloaded['flag'] is True # bool preserved (not coerced to int)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_clean_infinite_values_alone_leaves_nan():
|
|
80
|
+
"""Regression guard documenting why both cleaners are required."""
|
|
81
|
+
only_inf_cleaned = jh.clean_infinite_values({'v': float('nan')})
|
|
82
|
+
assert math.isnan(only_inf_cleaned['v'])
|
|
83
|
+
with pytest.raises(ValueError):
|
|
84
|
+
_render_like_jsonresponse(only_inf_cleaned)
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import pytest
|
|
3
|
+
|
|
4
|
+
from jesse.libs import DynamicNumpyArray
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_append():
|
|
8
|
+
a = DynamicNumpyArray((10, 6))
|
|
9
|
+
a.append(np.array([1, 2, 3, 4, 5, 6]))
|
|
10
|
+
assert a.index == 0
|
|
11
|
+
assert a.array[0][0] == 1
|
|
12
|
+
assert a.array[0][1] == 2
|
|
13
|
+
assert a.array[0][2] == 3
|
|
14
|
+
assert a.array[0][3] == 4
|
|
15
|
+
assert a.array[0][4] == 5
|
|
16
|
+
assert a.array[0][5] == 6
|
|
17
|
+
|
|
18
|
+
a.append(np.array([7, 8, 9, 10, 11, 12]))
|
|
19
|
+
assert a.index == 1
|
|
20
|
+
assert a.array[1][0] == 7
|
|
21
|
+
assert a.array[1][1] == 8
|
|
22
|
+
assert a.array[1][2] == 9
|
|
23
|
+
assert a.array[1][3] == 10
|
|
24
|
+
assert a.array[1][4] == 11
|
|
25
|
+
assert a.array[1][5] == 12
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_flush():
|
|
29
|
+
a = DynamicNumpyArray((10, 6))
|
|
30
|
+
a.append(np.array([1, 2, 3, 4, 5, 6]))
|
|
31
|
+
a.append(np.array([7, 8, 9, 10, 11, 12]))
|
|
32
|
+
assert a.index == 1
|
|
33
|
+
assert a.array[0][0] == 1
|
|
34
|
+
assert a.array[1][0] == 7
|
|
35
|
+
|
|
36
|
+
a.flush()
|
|
37
|
+
|
|
38
|
+
assert a.index == -1
|
|
39
|
+
assert a.array[0][0] == 0
|
|
40
|
+
assert a.array[1][0] == 0
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_get_last_item():
|
|
44
|
+
a = DynamicNumpyArray((10, 6))
|
|
45
|
+
|
|
46
|
+
with pytest.raises(IndexError):
|
|
47
|
+
a.get_last_item()
|
|
48
|
+
|
|
49
|
+
a.append(np.array([1, 2, 3, 4, 5, 6]))
|
|
50
|
+
a.append(np.array([7, 8, 9, 10, 11, 12]))
|
|
51
|
+
assert a.index == 1
|
|
52
|
+
assert a.array[0][0] == 1
|
|
53
|
+
assert a.array[1][0] == 7
|
|
54
|
+
|
|
55
|
+
np.testing.assert_array_equal(a.get_last_item(), np.array([7, 8, 9, 10, 11, 12]))
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_get_past_item():
|
|
59
|
+
a = DynamicNumpyArray((10, 6))
|
|
60
|
+
|
|
61
|
+
with pytest.raises(IndexError):
|
|
62
|
+
a.get_past_item(1)
|
|
63
|
+
|
|
64
|
+
a.append(np.array([1, 2, 3, 4, 5, 6]))
|
|
65
|
+
a.append(np.array([7, 8, 9, 10, 11, 12]))
|
|
66
|
+
assert a.index == 1
|
|
67
|
+
assert a.array[0][0] == 1
|
|
68
|
+
assert a.array[1][0] == 7
|
|
69
|
+
|
|
70
|
+
np.testing.assert_array_equal(a.get_past_item(1), np.array([1, 2, 3, 4, 5, 6]))
|
|
71
|
+
|
|
72
|
+
with pytest.raises(IndexError):
|
|
73
|
+
a.get_past_item(2)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_get_item():
|
|
77
|
+
a = DynamicNumpyArray((10, 6))
|
|
78
|
+
|
|
79
|
+
# test getting while array is empty
|
|
80
|
+
with pytest.raises(IndexError):
|
|
81
|
+
var = a[0]
|
|
82
|
+
|
|
83
|
+
a.append(np.array([1, 2, 3, 4, 5, 6]))
|
|
84
|
+
a.append(np.array([7, 8, 9, 10, 11, 12]))
|
|
85
|
+
assert a.index == 1
|
|
86
|
+
assert a.array[0][0] == 1
|
|
87
|
+
assert a.array[1][0] == 7
|
|
88
|
+
|
|
89
|
+
np.testing.assert_array_equal(a[0], np.array([1, 2, 3, 4, 5, 6]))
|
|
90
|
+
np.testing.assert_array_equal(a[1], np.array([7, 8, 9, 10, 11, 12]))
|
|
91
|
+
|
|
92
|
+
# test with an index that is out of range
|
|
93
|
+
with pytest.raises(IndexError):
|
|
94
|
+
var = a[2]
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def test_array_size_increases():
|
|
98
|
+
"""Verify the buffer grows to accommodate appends.
|
|
99
|
+
|
|
100
|
+
The exact post-grow shape is an implementation detail (linear-bucket vs
|
|
101
|
+
geometric); what matters behaviorally is that all appended values are
|
|
102
|
+
retained correctly and the buffer has at least enough capacity.
|
|
103
|
+
"""
|
|
104
|
+
a = DynamicNumpyArray((3, 6))
|
|
105
|
+
|
|
106
|
+
assert a.array.shape == (3, 6)
|
|
107
|
+
|
|
108
|
+
a.append(np.array([1, 2, 3, 4, 5, 6]))
|
|
109
|
+
a.append(np.array([7, 8, 9, 10, 11, 12]))
|
|
110
|
+
a.append(np.array([13, 14, 15, 16, 17, 18]))
|
|
111
|
+
assert a.array.shape[0] >= 3
|
|
112
|
+
assert a.array.shape[1] == 6
|
|
113
|
+
assert a.index == 2
|
|
114
|
+
np.testing.assert_array_equal(a[0], np.array([1, 2, 3, 4, 5, 6]))
|
|
115
|
+
np.testing.assert_array_equal(a[2], np.array([13, 14, 15, 16, 17, 18]))
|
|
116
|
+
|
|
117
|
+
a.append(np.array([19, 20, 21, 22, 23, 24]))
|
|
118
|
+
a.append(np.array([25, 26, 27, 28, 29, 30]))
|
|
119
|
+
a.append(np.array([31, 32, 33, 34, 35, 36]))
|
|
120
|
+
assert a.array.shape[0] >= 6
|
|
121
|
+
assert a.array.shape[1] == 6
|
|
122
|
+
assert a.index == 5
|
|
123
|
+
np.testing.assert_array_equal(a[5], np.array([31, 32, 33, 34, 35, 36]))
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def test_geometric_growth_pattern():
|
|
127
|
+
"""The number of buffer reallocations across N appends should be O(log N),
|
|
128
|
+
not O(N/bucket_size). This guards against accidental regression to linear
|
|
129
|
+
growth (which produces O(N^2) total memcpy on long backtests)."""
|
|
130
|
+
a = DynamicNumpyArray((4, 6))
|
|
131
|
+
n_appends = 5000
|
|
132
|
+
|
|
133
|
+
sizes_seen = [a.array.shape[0]]
|
|
134
|
+
for i in range(n_appends):
|
|
135
|
+
a.append(np.array([i, i + 1, i + 2, i + 3, i + 4, i + 5]))
|
|
136
|
+
if a.array.shape[0] != sizes_seen[-1]:
|
|
137
|
+
sizes_seen.append(a.array.shape[0])
|
|
138
|
+
|
|
139
|
+
# log2(5000/4) ≈ 10.3 — we should see at most ~12 distinct sizes.
|
|
140
|
+
assert len(sizes_seen) <= 14, (
|
|
141
|
+
f"too many growths ({len(sizes_seen)}): {sizes_seen}"
|
|
142
|
+
)
|
|
143
|
+
# Each growth at least 1.5× the prior — prevents accidental linear growth
|
|
144
|
+
for prev, nxt in zip(sizes_seen, sizes_seen[1:]):
|
|
145
|
+
assert nxt >= prev * 1.5, (
|
|
146
|
+
f"growth from {prev} to {nxt} is sub-geometric"
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# Spot-check correctness — appends should be intact in order
|
|
150
|
+
np.testing.assert_array_equal(a[0], np.array([0, 1, 2, 3, 4, 5]))
|
|
151
|
+
np.testing.assert_array_equal(a[2500], np.array([2500, 2501, 2502, 2503, 2504, 2505]))
|
|
152
|
+
np.testing.assert_array_equal(a[n_appends - 1], np.array([4999, 5000, 5001, 5002, 5003, 5004]))
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def test_append_multiple_grows_geometrically():
|
|
156
|
+
"""append_multiple should also use geometric growth and produce identical
|
|
157
|
+
final state to the equivalent sequence of append() calls."""
|
|
158
|
+
via_multiple = DynamicNumpyArray((10, 6))
|
|
159
|
+
via_single = DynamicNumpyArray((10, 6))
|
|
160
|
+
|
|
161
|
+
rng = np.random.default_rng(seed=42)
|
|
162
|
+
n_batches = 30
|
|
163
|
+
batch_size = 25
|
|
164
|
+
for _ in range(n_batches):
|
|
165
|
+
batch = rng.standard_normal((batch_size, 6))
|
|
166
|
+
via_multiple.append_multiple(batch)
|
|
167
|
+
for row in batch:
|
|
168
|
+
via_single.append(row)
|
|
169
|
+
|
|
170
|
+
assert via_multiple.index == via_single.index
|
|
171
|
+
np.testing.assert_array_equal(
|
|
172
|
+
via_multiple.array[:via_multiple.index + 1],
|
|
173
|
+
via_single.array[:via_single.index + 1],
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def test_append_multiple_varied_batch_sizes():
|
|
178
|
+
"""append_multiple must hold the correct valid data regardless of batch
|
|
179
|
+
sizes relative to the bucket size (small, equal, and much larger batches),
|
|
180
|
+
including a single batch larger than the current capacity."""
|
|
181
|
+
a = DynamicNumpyArray((10, 6))
|
|
182
|
+
expected = []
|
|
183
|
+
rng = np.random.default_rng(seed=7)
|
|
184
|
+
for bs in [1, 5, 10, 23, 100, 3, 50, 7, 200]:
|
|
185
|
+
batch = rng.standard_normal((bs, 6))
|
|
186
|
+
a.append_multiple(batch)
|
|
187
|
+
expected.extend(batch.tolist())
|
|
188
|
+
|
|
189
|
+
assert a.index == len(expected) - 1
|
|
190
|
+
np.testing.assert_array_equal(a.array[:a.index + 1], np.array(expected))
|
|
191
|
+
# capacity must always be large enough to hold the valid region
|
|
192
|
+
assert a.array.shape[0] >= a.index + 1
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def test_geometric_growth_never_overflows():
|
|
196
|
+
"""After every append the write index must remain within capacity — guards
|
|
197
|
+
against an off-by-one in the doubling condition."""
|
|
198
|
+
a = DynamicNumpyArray((4, 6))
|
|
199
|
+
for i in range(3000):
|
|
200
|
+
a.append(np.arange(6, dtype=float) + i)
|
|
201
|
+
assert a.index < a.array.shape[0]
|
|
202
|
+
np.testing.assert_array_equal(a[2999], np.arange(6, dtype=float) + 2999)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def test_append_multiple_then_append_no_overflow():
|
|
206
|
+
"""Mirror the real backtest flow: candles are warmed up in chunks via
|
|
207
|
+
append_multiple() and then streamed in one-by-one via append() on the SAME
|
|
208
|
+
storage (see candle_service.add_multiple_1m_candles -> add_candle).
|
|
209
|
+
|
|
210
|
+
The previous linear-bucket implementation assumed capacity stayed a
|
|
211
|
+
multiple of bucket_size, an invariant append_multiple could break, so a
|
|
212
|
+
chunked warmup (e.g. 1500 + 800 into a bucket_size=1000 array) followed by
|
|
213
|
+
single appends overflowed with an IndexError. Geometric growth keys off the
|
|
214
|
+
actual capacity, so it must keep correct data without ever overflowing.
|
|
215
|
+
"""
|
|
216
|
+
a = DynamicNumpyArray((1000, 6))
|
|
217
|
+
expected = []
|
|
218
|
+
|
|
219
|
+
# chunked warmup via append_multiple
|
|
220
|
+
for chunk in (1500, 800):
|
|
221
|
+
batch = np.arange(len(expected) * 6, (len(expected) + chunk) * 6, dtype=float).reshape(chunk, 6)
|
|
222
|
+
a.append_multiple(batch)
|
|
223
|
+
expected.extend(batch.tolist())
|
|
224
|
+
|
|
225
|
+
# then stream single candles in, well past the warmed-up capacity
|
|
226
|
+
for i in range(5000):
|
|
227
|
+
row = np.full(6, 1_000_000.0 + i)
|
|
228
|
+
a.append(row)
|
|
229
|
+
expected.append(row.tolist())
|
|
230
|
+
# the write index must always stay within the allocated buffer
|
|
231
|
+
assert a.index < a.array.shape[0]
|
|
232
|
+
|
|
233
|
+
assert a.index == len(expected) - 1
|
|
234
|
+
np.testing.assert_array_equal(a.array[:a.index + 1], np.array(expected))
|
|
235
|
+
np.testing.assert_array_equal(a[0], np.array([0, 1, 2, 3, 4, 5], dtype=float))
|
|
236
|
+
np.testing.assert_array_equal(a[-1], np.full(6, 1_000_000.0 + 4999))
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def test_drop_at():
|
|
240
|
+
a = DynamicNumpyArray((100, 6), drop_at=6)
|
|
241
|
+
|
|
242
|
+
# add 5 items
|
|
243
|
+
a.append(np.array([1, 2, 3, 4, 5, 6]))
|
|
244
|
+
a.append(np.array([7, 8, 9, 10, 11, 12]))
|
|
245
|
+
a.append(np.array([13, 14, 15, 16, 17, 18]))
|
|
246
|
+
a.append(np.array([19, 20, 21, 22, 23, 24]))
|
|
247
|
+
a.append(np.array([25, 26, 27, 28, 29, 30]))
|
|
248
|
+
assert a.get_last_item()[0] == 25
|
|
249
|
+
assert a[0][0] == 1
|
|
250
|
+
|
|
251
|
+
# add 6th item. when it reaches the drop_at limit, it should drop drop_at/2 items
|
|
252
|
+
a.append(np.array([31, 32, 33, 34, 35, 36]))
|
|
253
|
+
assert a[0][0] == 19
|
|
254
|
+
|