backtrader-next 2.1.1__tar.gz → 2.2.1__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.
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/PKG-INFO +17 -1
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/README.md +16 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/eq.py +34 -53
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/order.py +63 -17
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/version.py +1 -1
- backtrader_next-2.2.1/examples/3_perf_compare/.gitignore +10 -0
- backtrader_next-2.2.1/examples/3_perf_compare/.python-version +1 -0
- backtrader_next-2.2.1/examples/3_perf_compare/README.md +70 -0
- backtrader_next-2.2.1/examples/3_perf_compare/STOCK_M1.csv.zip +0 -0
- backtrader_next-2.2.1/examples/3_perf_compare/main_backtesting.py +52 -0
- backtrader_next-2.2.1/examples/3_perf_compare/main_backtrader.py +69 -0
- backtrader_next-2.2.1/examples/3_perf_compare/main_backtrader_next.py +72 -0
- backtrader_next-2.2.1/examples/3_perf_compare/pyproject.toml +11 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/pyproject.toml +1 -1
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/.github/FUNDING.yml +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/.gitignore +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/.travis.yml +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/LICENSE +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/annualreturn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/calmar.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/drawdown.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/leverage.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/logreturnsrolling.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/periodstats.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/positions.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/pyfolio.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/returns.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/sharpe.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/sqn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/timereturn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/tradeanalyzer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/transactions.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/vwr.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/broker.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/bbroker.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/ibbroker.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/oandabroker.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/vcbroker.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/btrun/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/btrun/btrun.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/cerebro.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/comminfo.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/commissions/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/dataseries.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/errors.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feed.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/blaze.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/btcsv.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/chainer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/csvgeneric.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/ibdata.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/influxfeed.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/mt4csv.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/oanda.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/pandafeed.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/quandl.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/rollover.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/sierrachart.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/vcdata.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/vchart.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/vchartcsv.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/vchartfile.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/yahoo.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/fillers.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/bsplitter.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/calendardays.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/datafiller.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/datafilter.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/daysteps.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/heikinashi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/renko.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/session.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/flt.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/functions.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/futures/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/futures/futures.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/accdecoscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/aroon.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/atr.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/awesomeoscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/basicops.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/bollinger.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/cci.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/contrib/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/contrib/vortex.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/crossover.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/dema.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/deviation.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/directionalmove.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/dma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/dpo.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/dv2.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/ema.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/envelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/hadelta.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/heikinashi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/hma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/hurst.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/ichimoku.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/kama.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/kst.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/lrsi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/mabase.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/macd.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/momentum.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/ols.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/oscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/percentchange.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/percentrank.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/pivotpoint.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/prettygoodoscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/priceoscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/psar.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/rmi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/rsi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/sma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/smma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/stochastic.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/trix.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/tsi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/ultimateoscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/vortex.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/williams.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/wma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/zlema.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/zlind.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/linebuffer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/lineiterator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/lineroot.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/lineseries.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/mathsupport.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/metabase.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/bandpass.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/correlation_trend.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/correlation_trend_ssf.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/cybernetic_oscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/dsma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ema.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/laguerre_filter.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/laguerre_oscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/macd.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/mama_fama.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/mesa_stochastic.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/momentum.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/roc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/roofing_filter.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/second_derivative.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/sma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/supersmoother.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/trunc_bandpass.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ultimate_bands.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ultimate_channel.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ultimate_oscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ultimate_smoother.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/utils.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/nplot.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/nscheme.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/stats.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/utils.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/benchmark.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/broker.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/buysell.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/drawdown.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/logreturns.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/timereturn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/trades.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/finance.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/formatters.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/locator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/multicursor.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/plot.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/scheme.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/utils.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/position.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/resamplerfilter.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/signal.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/signals/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/sizer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/sizers/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/sizers/fixedsize.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/sizers/percents_sizer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/store.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/ibstore.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/oandastore.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/vchartfile.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/vcstore.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/strategies/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/strategies/sma_crossover.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/strategy.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/studies/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/studies/contrib/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/studies/contrib/fractal.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/talib.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/timer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/trade.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/tradingcal.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/__init__.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/autodict.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/date.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/dateintern.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/flushfile.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/ordereddefaultdict.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/py3.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/writer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/changelog.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/datas/daily-KO.csv +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/datas/daily-PEP.csv +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/samples/pair-trading/pair-trading.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/utils/influxdb-import.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/utils/iqfeed-to-influxdb.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2005-2006-day-001.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-01-02-volume-min-001.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-day-001-optix.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-day-001.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-day-002.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-min-005.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-month-001.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-volume-day-001.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-week-001.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-week-002.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/bidask.csv +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/bidask2.csv +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/nvda-1999-2014.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/nvda-2014.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/orcl-1995-2014.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/orcl-2003-2005.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/orcl-2014.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/ticksample.csv +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/yhoo-1996-2014.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/yhoo-1996-2015.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/yhoo-2003-2005.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/yhoo-2014.txt +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/1_smacross/smacross.html +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/1_smacross/smacross_stats.html +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/2_optimize/smacross.html +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/2_optimize/smacross_stats.html +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/README.md +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/AAPL_1d.csv.zip +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/README.md +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/main.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/pyproject.toml +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/scr1.png +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/scr2.png +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/scr3.png +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/scr4.png +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/smacross.html +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/smacross_stats.html +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/.gitignore +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/.python-version +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/MSFT_1d.csv.zip +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/README.md +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/opt_results.csv +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/pyproject.toml +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/run_optimize.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/run_strategy.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/smacross.html +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/smacross_stats.html +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/strategy.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/analyzer-annualreturn/analyzer-annualreturn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/bidask-to-ohlc/bidask-to-ohlc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/bracket/bracket.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/btfd/btfd.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/calendar-days/calendar-days.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/calmar/calmar-test.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/cheat-on-open/cheat-on-open.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/commission-schemes/commission-schemes.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/credit-interest/credit-interest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-bid-ask/bidask.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-filler/data-filler.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-filler/relativevolume.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-multitimeframe/data-multitimeframe.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-pandas/data-pandas-optix.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-pandas/data-pandas.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-replay/data-replay.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-resample/data-resample.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/daysteps/daysteps.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/future-spot/future-spot.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/gold-vs-sp500/gold-vs-sp500.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/ib-cash-bid-ask/ib-cash-bid-ask.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/ibtest/ibtest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/kselrsi/ksignal.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/lineplotter/lineplotter.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/lrsi/lrsi-test.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/macd-settings/macd-settings.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/memory-savings/memory-savings.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/mixing-timeframes/mixing-timeframes.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multi-copy/multi-copy.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multi-example/mult-values.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multidata-strategy/multidata-strategy-unaligned.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multidata-strategy/multidata-strategy.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multitrades/mtradeobserver.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multitrades/multitrades.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/oandatest/oandatest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observer-benchmark/observer-benchmark.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observers/observers-default-drawdown.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observers/observers-default.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observers/observers-orderobserver.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observers/orderobserver.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/oco/oco.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/optimization/optimization.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order-close/close-daily.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order-close/close-minute.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order-execution/order-execution.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order-history/order-history.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order_target/order_target.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/partial-plot/partial-plot.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pinkfish-challenge/pinkfish-challenge.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pivot-point/pivotpoint.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pivot-point/ppsample.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/plot-same-axis/plot-same-axis.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/psar/psar-intraday.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/psar/psar.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pyfolio2/backtrader-pyfolio.ipynb +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pyfolio2/pyfoliotest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pyfoliotest/backtrader-pyfolio.ipynb +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pyfoliotest/pyfoliotest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/relative-volume/relative-volume.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/relative-volume/relvolbybar.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/renko/renko.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/resample-tickdata/resample-tickdata.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/rollover/rollover.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sharpe-timereturn/sharpe-timereturn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/signals-strategy/signals-strategy.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sigsmacross/sigsmacross.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sigsmacross/sigsmacross2.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sizertest/sizertest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/slippage/slippage.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sratio/sratio.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/stop-trading/stop-loss-approaches.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/stoptrail/trail.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/strategy-selection/strategy-selection.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/talib/tablibsartest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/talib/talibtest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/timers/scheduled-min.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/timers/scheduled.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/tradingcalendar/tcal-intra.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/tradingcalendar/tcal.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/vctest/vctest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/volumefilling/volumefilling.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/vwr/vwr.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/weekdays-filler/weekdaysaligner.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/weekdays-filler/weekdaysfiller.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/writer-test/writer-test.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/yahoo-test/yahoo-test.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_analyzer-sqn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_analyzer-timereturn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_comminfo.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_data_multiframe.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_data_replay.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_data_resample.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_accdecosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_aroonoscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_aroonupdown.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_atr.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_awesomeoscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_bbands.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_cci.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dema.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_demaenvelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_demaosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dm.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_downmove.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dpo.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dv2.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_ema.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_emaenvelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_emaosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_envelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_heikinashi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_highest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_hma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_ichimoku.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_kama.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_kamaenvelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_kamaosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_kst.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_lowest.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_lrsi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_macdhisto.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_minperiod.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_momentum.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_momentumoscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_oscillator.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_pctchange.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_pctrank.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_pgo.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_ppo.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_pposhort.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_priceosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_rmi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_roc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_rsi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_rsi_safe.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_sma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smaenvelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smaosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smmaenvelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smmaosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_stochastic.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_stochasticfull.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_sumn.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_tema.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_temaenvelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_temaosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_trix.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_tsi.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_ultosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_upmove.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_vortex.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_williamsad.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_williamsr.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_wma.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_wmaenvelope.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_wmaosc.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_zlema.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_zlind.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_metaclass.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_order.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_position.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_strategy_optimized.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_strategy_unoptimized.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_study_fractal.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_trade.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_writer.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/testcommon.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tools/bt-run.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tools/rewrite-data.py +0 -0
- {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tools/yahoodownload.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: backtrader_next
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.1
|
|
4
4
|
Summary: Live Trading and backtesting platform in Python
|
|
5
5
|
Project-URL: Homepage, https://github.com/smalinin/backtrader_next
|
|
6
6
|
Project-URL: Source, https://github.com/smalinin/backtrader_next
|
|
@@ -37,6 +37,7 @@ Live Trading and backtesting platform written in Python.
|
|
|
37
37
|
```
|
|
38
38
|
pip install backtrader-next
|
|
39
39
|
```
|
|
40
|
+
|
|
40
41
|
## History
|
|
41
42
|
Package is based on [backtrader](https://github.com/mementum/backtrader)
|
|
42
43
|
|
|
@@ -51,6 +52,21 @@ Changes:
|
|
|
51
52
|
- Detailed results
|
|
52
53
|
- Interactive visualizations
|
|
53
54
|
|
|
55
|
+
## Performance
|
|
56
|
+
|
|
57
|
+
Performance comparison using the [perf_compare](https://github.com/smalinin/backtrader_next/tree/master/examples/3_perf_compare) benchmark.
|
|
58
|
+
|
|
59
|
+
- **Backtrader-next** using an optimized **PandasData** feed
|
|
60
|
+
- [Backtrader](https://github.com/mementum/backtrader) with **PandasData** feed
|
|
61
|
+
- [Backtesting.py](https://github.com/kernc/backtesting.py)
|
|
62
|
+
|
|
63
|
+
| Framework | Execution Time | Relative Speed |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| Backtesting | 2.95 sec | 14.3x faster than Backtrader |
|
|
66
|
+
| Backtrader-next | 12.33 sec | 3.4x faster than Backtrader |
|
|
67
|
+
| Backtrader | 42.25 sec | Baseline |
|
|
68
|
+
|
|
69
|
+
|
|
54
70
|
## Here a snippet of a Simple Moving Average CrossOver.
|
|
55
71
|
```python
|
|
56
72
|
import pandas as pd
|
|
@@ -15,6 +15,7 @@ Live Trading and backtesting platform written in Python.
|
|
|
15
15
|
```
|
|
16
16
|
pip install backtrader-next
|
|
17
17
|
```
|
|
18
|
+
|
|
18
19
|
## History
|
|
19
20
|
Package is based on [backtrader](https://github.com/mementum/backtrader)
|
|
20
21
|
|
|
@@ -29,6 +30,21 @@ Changes:
|
|
|
29
30
|
- Detailed results
|
|
30
31
|
- Interactive visualizations
|
|
31
32
|
|
|
33
|
+
## Performance
|
|
34
|
+
|
|
35
|
+
Performance comparison using the [perf_compare](https://github.com/smalinin/backtrader_next/tree/master/examples/3_perf_compare) benchmark.
|
|
36
|
+
|
|
37
|
+
- **Backtrader-next** using an optimized **PandasData** feed
|
|
38
|
+
- [Backtrader](https://github.com/mementum/backtrader) with **PandasData** feed
|
|
39
|
+
- [Backtesting.py](https://github.com/kernc/backtesting.py)
|
|
40
|
+
|
|
41
|
+
| Framework | Execution Time | Relative Speed |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| Backtesting | 2.95 sec | 14.3x faster than Backtrader |
|
|
44
|
+
| Backtrader-next | 12.33 sec | 3.4x faster than Backtrader |
|
|
45
|
+
| Backtrader | 42.25 sec | Baseline |
|
|
46
|
+
|
|
47
|
+
|
|
32
48
|
## Here a snippet of a Simple Moving Average CrossOver.
|
|
33
49
|
```python
|
|
34
50
|
import pandas as pd
|
|
@@ -7,15 +7,13 @@ import numpy as np
|
|
|
7
7
|
import pandas as pd
|
|
8
8
|
from pandas import DataFrame as df
|
|
9
9
|
from numbers import Number
|
|
10
|
-
from typing import
|
|
10
|
+
from typing import Union
|
|
11
11
|
import math
|
|
12
|
-
# from math import copysign
|
|
13
12
|
|
|
14
13
|
|
|
15
14
|
class Eq(bt.Analyzer):
|
|
16
|
-
'''This analyzer calculates trading system
|
|
17
|
-
|
|
18
|
-
length and drawdown max length
|
|
15
|
+
'''This analyzer calculates comprehensive trading system performance statistics
|
|
16
|
+
including equity curves, drawdown analysis, returns, risk metrics, and trade statistics.
|
|
19
17
|
|
|
20
18
|
Params:
|
|
21
19
|
|
|
@@ -28,20 +26,42 @@ class Eq(bt.Analyzer):
|
|
|
28
26
|
|
|
29
27
|
Set it to ``True`` or ``False`` for a specific behavior
|
|
30
28
|
|
|
29
|
+
- ``data`` (default: ``None``)
|
|
30
|
+
|
|
31
|
+
Specific data feed to analyze. If ``None``, all data is analyzed.
|
|
32
|
+
|
|
33
|
+
- ``cash`` (default: ``True``)
|
|
34
|
+
|
|
35
|
+
Whether to include cash information in equity tracking.
|
|
36
|
+
|
|
31
37
|
Methods:
|
|
32
38
|
|
|
33
|
-
- ``
|
|
39
|
+
- ``compute_stats(risk_free_rate=0.0)``
|
|
40
|
+
|
|
41
|
+
Returns a pandas Series with comprehensive trading statistics including:
|
|
42
|
+
|
|
43
|
+
- Equity metrics: Start, End, Duration, Peak equity
|
|
44
|
+
- Returns: Cumulative return %, Annualized return, CAGR
|
|
45
|
+
- Risk metrics: Volatility (Ann.), Sharpe Ratio, Sortino Ratio, Smart Sharpe Ratio
|
|
46
|
+
- Drawdown stats: Max Drawdown %, Avg Drawdown %, Drawdown Duration
|
|
47
|
+
- Trade statistics: Win Rate, Best/Worst/Avg Trade, # of Trades
|
|
48
|
+
- Performance ratios: Calmar Ratio, VWR Ratio, Profit Factor, SQN, Kelly Criterion
|
|
49
|
+
|
|
50
|
+
- ``gen_eq()``
|
|
51
|
+
|
|
52
|
+
Returns equity curve as a pandas DataFrame with datetime index.
|
|
53
|
+
|
|
54
|
+
- ``gen_eq_dd()``
|
|
55
|
+
|
|
56
|
+
Returns equity and drawdown data as a pandas DataFrame.
|
|
34
57
|
|
|
35
|
-
|
|
36
|
-
drawdown stats as values, the following keys/attributes are available:
|
|
58
|
+
- ``gen_trades(data_name=None, pct=False)``
|
|
37
59
|
|
|
38
|
-
-
|
|
39
|
-
- ``moneydown`` - drawdown value in monetary units
|
|
40
|
-
- ``len`` - drawdown length
|
|
60
|
+
Returns trade-level statistics as a pandas DataFrame.
|
|
41
61
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
62
|
+
- ``gen_orders(data_name=None)``
|
|
63
|
+
|
|
64
|
+
Returns order history as a pandas DataFrame.
|
|
45
65
|
'''
|
|
46
66
|
|
|
47
67
|
params = (
|
|
@@ -136,7 +156,6 @@ class Eq(bt.Analyzer):
|
|
|
136
156
|
def gen_trades(self, data_name=None, pct=False) -> 'DataFrame':
|
|
137
157
|
if self.trades_df is None:
|
|
138
158
|
self.trades_df = df.from_records(self.trades, columns=self.trades_header)
|
|
139
|
-
# self.trades_df = df.from_records(self.trades, index=self.trades_header[0], columns=self.trades_header)
|
|
140
159
|
if data_name is None:
|
|
141
160
|
rdf = self.trades_df.copy()
|
|
142
161
|
else:
|
|
@@ -211,7 +230,6 @@ class Eq(bt.Analyzer):
|
|
|
211
230
|
# our risk doesn't; they use the simpler approach below.
|
|
212
231
|
annualized_return = (1 + gmean_day_return) ** annual_trading_days - 1
|
|
213
232
|
s.loc['Return (Ann.) [%]'] = round(annualized_return * 100, 4)
|
|
214
|
-
# s.loc['Risk (Ann.) [%]'] = day_returns.std(ddof=1) * np.sqrt(annual_trading_days) * 100
|
|
215
233
|
s.loc['Volatility (Ann.) [%]'] = volatility = round(day_returns.std(ddof=1) * np.sqrt(annual_trading_days) * 100, 4)
|
|
216
234
|
|
|
217
235
|
# CAGR from quantstats
|
|
@@ -286,10 +304,6 @@ class Eq(bt.Analyzer):
|
|
|
286
304
|
else:
|
|
287
305
|
s.loc['Kelly Criterion [%]'] = np.nan
|
|
288
306
|
|
|
289
|
-
# s.loc['_strategy'] = strategy_instance
|
|
290
|
-
# s.loc['_equity_curve'] = equity_df
|
|
291
|
-
# s.loc['_trades'] = trades_df
|
|
292
|
-
#
|
|
293
307
|
return s
|
|
294
308
|
|
|
295
309
|
|
|
@@ -322,39 +336,6 @@ def geometric_mean(returns: pd.Series) -> float:
|
|
|
322
336
|
return np.exp(np.log(returns).sum() / (len(returns) or np.nan)) - 1
|
|
323
337
|
|
|
324
338
|
|
|
325
|
-
def calc_vwr0(eq_days: np.array, sdev_max=2.0, tau=0.20) -> float:
|
|
326
|
-
eq = eq_days #.to_numpy()
|
|
327
|
-
eq_0 = eq_days.shift().to_numpy()
|
|
328
|
-
|
|
329
|
-
try:
|
|
330
|
-
nlrtot = eq[-1] / eq[0]
|
|
331
|
-
except ZeroDivisionError:
|
|
332
|
-
rtot = float('-inf')
|
|
333
|
-
else:
|
|
334
|
-
if nlrtot <= 0.0:
|
|
335
|
-
rtot = float('-inf')
|
|
336
|
-
else:
|
|
337
|
-
rtot = math.log(nlrtot)
|
|
338
|
-
|
|
339
|
-
ravg = rtot / len(eq)
|
|
340
|
-
rnorm = math.expm1(ravg * 252)
|
|
341
|
-
rnorm100 = rnorm * 100.0
|
|
342
|
-
|
|
343
|
-
dts = []
|
|
344
|
-
for n, zip_data in enumerate(zip(eq_0, eq), 0):
|
|
345
|
-
eq0, eq1 = zip_data
|
|
346
|
-
if (n > 0):
|
|
347
|
-
_v = (eq0 * math.exp(ravg * n))
|
|
348
|
-
if _v != 0:
|
|
349
|
-
dt = eq1 / (eq0 * math.exp(ravg * n)) - 1.0
|
|
350
|
-
dts.append(dt)
|
|
351
|
-
else:
|
|
352
|
-
dts.append(0.0)
|
|
353
|
-
|
|
354
|
-
sdev_p = np.array(dts).std(ddof=True)
|
|
355
|
-
vwr = rnorm100 * (1.0 - pow(sdev_p / sdev_max, tau))
|
|
356
|
-
return vwr
|
|
357
|
-
|
|
358
339
|
# calc VariabilityWeightedReturn
|
|
359
340
|
# See:
|
|
360
341
|
# - https://www.crystalbull.com/sharpe-ratio-better-with-log-returns/
|
|
@@ -283,6 +283,21 @@ class OrderBase(with_metaclass(MetaParams, object)):
|
|
|
283
283
|
self._plimit = val
|
|
284
284
|
|
|
285
285
|
plimit = property(_getplimit, _setplimit)
|
|
286
|
+
|
|
287
|
+
@property
|
|
288
|
+
def owner(self):
|
|
289
|
+
if self._owner_classname and not self.p.owner:
|
|
290
|
+
class_name = self._owner_classname
|
|
291
|
+
for s in self.broker.cerebro.runningstrategies:
|
|
292
|
+
if s.__class__.__name__ == class_name:
|
|
293
|
+
self.p.owner = s
|
|
294
|
+
self._owner_classname = None
|
|
295
|
+
break
|
|
296
|
+
return self.p.owner
|
|
297
|
+
|
|
298
|
+
@owner.setter
|
|
299
|
+
def owner(self, value):
|
|
300
|
+
self.p.owner = value
|
|
286
301
|
|
|
287
302
|
def __getattr__(self, name):
|
|
288
303
|
# Return attr from params if not found in order
|
|
@@ -323,6 +338,9 @@ class OrderBase(with_metaclass(MetaParams, object)):
|
|
|
323
338
|
self.info = AutoOrderedDict()
|
|
324
339
|
self.comminfo = None
|
|
325
340
|
self.triggered = False
|
|
341
|
+
self.parent_ref = None
|
|
342
|
+
self._owner_classname = None
|
|
343
|
+
self._restored = False
|
|
326
344
|
|
|
327
345
|
self._active = self.parent is None
|
|
328
346
|
self.status = Order.Created
|
|
@@ -337,10 +355,10 @@ class OrderBase(with_metaclass(MetaParams, object)):
|
|
|
337
355
|
|
|
338
356
|
# Set a reference price if price is not set using
|
|
339
357
|
# the close price
|
|
340
|
-
pclose = self.data.close[0] if not self.p.simulated else self.price
|
|
358
|
+
pclose = self.data.close[0] if not self.p.simulated and not self._restored else self.price
|
|
341
359
|
price = pclose if not self.price and not self.pricelimit else self.price
|
|
342
360
|
|
|
343
|
-
dcreated = self.data.datetime[0] if not self.p.simulated else 0.0
|
|
361
|
+
dcreated = self.data.datetime[0] if not self.p.simulated and not self._restored else 0.0
|
|
344
362
|
self.created = OrderData(dt=dcreated,
|
|
345
363
|
size=self.size,
|
|
346
364
|
price=price,
|
|
@@ -382,7 +400,7 @@ class OrderBase(with_metaclass(MetaParams, object)):
|
|
|
382
400
|
else: # assume float
|
|
383
401
|
valid = self.data.datetime[0] + self.valid
|
|
384
402
|
|
|
385
|
-
if not self.p.simulated:
|
|
403
|
+
if not self.p.simulated and not self._restored:
|
|
386
404
|
# provisional end-of-session
|
|
387
405
|
# get next session end
|
|
388
406
|
dtime = self.data.datetime.datetime(0)
|
|
@@ -655,52 +673,80 @@ class Order(OrderBase):
|
|
|
655
673
|
'price': v.price,
|
|
656
674
|
'pricelimit': v.pricelimit,
|
|
657
675
|
'remsize': v.remsize,
|
|
676
|
+
'pclose': v.pclose,
|
|
658
677
|
'trailamount': v.trailamount,
|
|
659
678
|
'trailpercent': v.trailpercent,
|
|
679
|
+
'value': v.value,
|
|
680
|
+
'comm': v.comm,
|
|
681
|
+
'margin': v.margin,
|
|
682
|
+
'pnl': v.pnl,
|
|
683
|
+
'psize': v.psize,
|
|
684
|
+
'pprice': v.pprice,
|
|
660
685
|
}
|
|
661
|
-
elif k in ('broker', 'data'):
|
|
686
|
+
elif k in ('broker', 'data','params','comminfo','info',):
|
|
662
687
|
# handled below
|
|
663
688
|
pass
|
|
664
|
-
elif k
|
|
665
|
-
odict[
|
|
689
|
+
elif k == 'parent':
|
|
690
|
+
odict['parent'] = None
|
|
691
|
+
if v is not None:
|
|
692
|
+
odict['parent_ref'] = v.ref
|
|
666
693
|
# handled below
|
|
667
|
-
|
|
694
|
+
elif k in ('p',):
|
|
695
|
+
odict['params'] = vars(v).copy()
|
|
696
|
+
odict['params']['_owner_classname'] = v.owner.__class__.__qualname__ if v.owner else None
|
|
697
|
+
odict['params']['owner'] = None
|
|
698
|
+
odict['params']['data'] = v.data._name if v.data else None
|
|
668
699
|
else:
|
|
669
700
|
odict[k] = v
|
|
701
|
+
odict['ordtype'] = self.ordtype
|
|
670
702
|
return odict
|
|
671
703
|
|
|
672
704
|
@classmethod
|
|
673
|
-
def from_dict(cls, odict):
|
|
705
|
+
def from_dict(cls, params, odict):
|
|
674
706
|
'''Loads the order data from a dictionary representation'''
|
|
707
|
+
odict['_restored'] = True
|
|
675
708
|
ordtype = odict.get('ordtype', None)
|
|
676
709
|
ord = None
|
|
677
710
|
if ordtype is None:
|
|
678
|
-
|
|
711
|
+
ord = Order(**params)
|
|
679
712
|
if ordtype == cls.Buy:
|
|
680
|
-
ord = BuyOrder()
|
|
713
|
+
ord = BuyOrder(**params)
|
|
681
714
|
elif ordtype == cls.Sell:
|
|
682
|
-
ord = SellOrder()
|
|
715
|
+
ord = SellOrder(**params)
|
|
683
716
|
else:
|
|
684
|
-
ord = Order()
|
|
717
|
+
ord = Order(**params)
|
|
685
718
|
|
|
686
719
|
for key, val in odict.items():
|
|
687
|
-
if key
|
|
688
|
-
|
|
720
|
+
if key in ('created', 'executed'):
|
|
721
|
+
odata = OrderData(
|
|
689
722
|
dt=val.get('dt', None),
|
|
690
723
|
size=val.get('size', 0),
|
|
691
724
|
price=val.get('price', 0.0),
|
|
692
725
|
pricelimit=val.get('pricelimit', 0.0),
|
|
726
|
+
remsize=val.get('remsize', 0),
|
|
727
|
+
pclose=val.get('pclose', 0.0),
|
|
693
728
|
trailamount=val.get('trailamount', 0.0),
|
|
694
729
|
trailpercent=val.get('trailpercent', 0.0),
|
|
695
730
|
)
|
|
731
|
+
odata.value = val.get('value', 0.0)
|
|
732
|
+
odata.comm = val.get('comm', 0.0)
|
|
733
|
+
odata.margin = val.get('margin', None)
|
|
734
|
+
odata.pnl = val.get('pnl', 0.0)
|
|
735
|
+
odata.psize = val.get('psize', 0)
|
|
736
|
+
odata.pprice = val.get('pprice', 0.0)
|
|
737
|
+
if key == 'created':
|
|
738
|
+
ord.created = odata
|
|
739
|
+
else:
|
|
740
|
+
ord.executed = odata
|
|
741
|
+
elif key in ('ordtype', 'params'):
|
|
742
|
+
pass # already handled
|
|
696
743
|
elif key == 'info':
|
|
697
744
|
for ik, iv in val.items():
|
|
698
745
|
ord.info[ik] = iv
|
|
699
746
|
elif key == 'comminfo':
|
|
700
|
-
ord.comminfo =
|
|
747
|
+
ord.comminfo = None
|
|
701
748
|
elif key == 'parent':
|
|
702
|
-
|
|
703
|
-
ord.parent = None #??TODO
|
|
749
|
+
ord.parent = None
|
|
704
750
|
elif hasattr(ord, key):
|
|
705
751
|
setattr(ord, key, val)
|
|
706
752
|
return ord
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
|
|
2
|
+
# Trading Strategy Performance Comparison: Dual Moving Averages
|
|
3
|
+
|
|
4
|
+
This project provides a comprehensive performance benchmark comparing three Python backtesting frameworks: **Backtesting**, **Backtrader**, and **Backtrader-next**.
|
|
5
|
+
The comparison is based on a dual moving average crossover strategy tested on 430,000 historical price candles.
|
|
6
|
+
|
|
7
|
+
## Backtesting Frameworks
|
|
8
|
+
|
|
9
|
+
1. [Backtesting.py](https://github.com/kernc/backtesting.py) - Lightweight and easy-to-use framework (doesn't support trading, only for backtesting)
|
|
10
|
+
2. [Backtrader](https://github.com/mementum/backtrader) - Feature-rich framework with extensive capabilities
|
|
11
|
+
3. [Backtrader-next](https://github.com/smalinin/backtrader_next) - Modern fork of Backtrader with optimizations
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## Testing Parameters
|
|
15
|
+
|
|
16
|
+
The performance test was conducted with the following specifications:
|
|
17
|
+
|
|
18
|
+
- **Python Version:** 3.13
|
|
19
|
+
- **Asset Type:** Stock / Equity
|
|
20
|
+
- **Historical Data Period:** January 1, 2024 - October 10, 2025 (~21 months)
|
|
21
|
+
- **Dataset Size:** 430,000 price candles
|
|
22
|
+
- **Position Size:** 1 contract per trade
|
|
23
|
+
- **Strategy:** Dual Simple Moving Average (SMA) Crossover
|
|
24
|
+
- **SMA1 (Fast):** 15 periods
|
|
25
|
+
- **SMA2 (Slow):** 91 periods
|
|
26
|
+
- **Backtest Mode:** Single full pass through historical data (no re-optimization)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## Installation and Usage
|
|
30
|
+
|
|
31
|
+
### Prerequisites
|
|
32
|
+
|
|
33
|
+
Ensure you have Python 3.13 installed on your system.
|
|
34
|
+
|
|
35
|
+
### 1. Install the `uv` Package Manager
|
|
36
|
+
|
|
37
|
+
We use `uv` for fast and efficient dependency management:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pip install uv
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 2. Run the Backtest
|
|
44
|
+
|
|
45
|
+
Execute any of the three frameworks:
|
|
46
|
+
|
|
47
|
+
**Backtesting** - Fastest execution
|
|
48
|
+
```bash
|
|
49
|
+
uv run main_backtesting.py
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Backtrader** - Feature-rich but slower
|
|
53
|
+
```bash
|
|
54
|
+
uv run main_backtrader.py
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Backtrader-next** - Modern optimized version
|
|
58
|
+
```bash
|
|
59
|
+
uv run main_backtrader_next.py
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 3. Performance Results
|
|
63
|
+
|
|
64
|
+
| Framework | Execution Time | Relative Speed |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| Backtesting | 2.95 sec | 14.3x faster than Backtrader |
|
|
67
|
+
| Backtrader-next | 12.33 sec | 3.4x faster than Backtrader |
|
|
68
|
+
| Backtrader | 42.25 sec | Baseline |
|
|
69
|
+
|
|
70
|
+
|
|
Binary file
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import pandas as pd
|
|
3
|
+
from backtesting import Strategy, Backtest
|
|
4
|
+
from backtesting.lib import crossover
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def SMA(values, n):
|
|
8
|
+
"""
|
|
9
|
+
Return simple moving average of `values`, at
|
|
10
|
+
each step taking into account `n` previous values.
|
|
11
|
+
"""
|
|
12
|
+
return pd.Series(values).rolling(n).mean()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SmaCross(Strategy):
|
|
17
|
+
n1 = 15
|
|
18
|
+
n2 = 91
|
|
19
|
+
|
|
20
|
+
def init(self):
|
|
21
|
+
# Precompute the two moving averages
|
|
22
|
+
self.sma1 = self.I(SMA, self.data.df['Close'], self.n1)
|
|
23
|
+
self.sma2 = self.I(SMA, self.data.df['Close'], self.n2)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def next(self):
|
|
27
|
+
# If sma1 crosses above sma2, close any existing
|
|
28
|
+
# short trades, and buy the asset
|
|
29
|
+
if crossover(self.sma1, self.sma2):
|
|
30
|
+
self.position.close()
|
|
31
|
+
self.buy(size=1)
|
|
32
|
+
|
|
33
|
+
# Else, if sma1 crosses below sma2, close any existing
|
|
34
|
+
# long trades, and sell the asset
|
|
35
|
+
elif crossover(self.sma2, self.sma1):
|
|
36
|
+
self.position.close()
|
|
37
|
+
#self.sell(size=1)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
start = time.perf_counter()
|
|
41
|
+
dt = pd.read_csv("./STOCK_M1.csv.zip", sep=";", parse_dates=["Datetime"], index_col=0)
|
|
42
|
+
|
|
43
|
+
# set commision 0.04% per trade
|
|
44
|
+
bt = Backtest(dt, SmaCross, cash=1_000_000, commission=0.0004, margin=1)
|
|
45
|
+
stats = bt.run()
|
|
46
|
+
|
|
47
|
+
end = time.perf_counter()
|
|
48
|
+
print(f"Execution time for sum_list: {end - start:.4f} seconds\n\n")
|
|
49
|
+
|
|
50
|
+
#print(stats)
|
|
51
|
+
|
|
52
|
+
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import pandas as pd
|
|
3
|
+
import backtrader as bt
|
|
4
|
+
from backtrader.feeds import PandasData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SmaCross(bt.Strategy):
|
|
8
|
+
params = (
|
|
9
|
+
('MA1', 15),
|
|
10
|
+
('MA2', 91),
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self.Order = None
|
|
15
|
+
self.ma1 = bt.indicators.SMA(self.data.close, period=self.p.MA1)
|
|
16
|
+
self.ma2 = bt.indicators.SMA(self.data.close, period=self.p.MA2)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def notify_order(self, order):
|
|
20
|
+
if order.status in [order.Submitted, order.Accepted]: # Order is submitted/accepted
|
|
21
|
+
return # Do nothing until the order is completed
|
|
22
|
+
|
|
23
|
+
elif order.status in [order.Canceled, order.Margin, order.Rejected]: # Canceled, Margin, Rejected
|
|
24
|
+
print('Order was Canceled/Margin/Rejected')
|
|
25
|
+
|
|
26
|
+
self.Order = None # Reset order
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def next(self):
|
|
31
|
+
# Use ONLY Long Positions
|
|
32
|
+
if self.crossover(self.ma1, self.ma2):
|
|
33
|
+
pos = self.getposition()
|
|
34
|
+
if pos:
|
|
35
|
+
self.close(size=pos.size)
|
|
36
|
+
self.Order = self.buy(size=1)
|
|
37
|
+
elif self.crossover(self.ma2, self.ma1):
|
|
38
|
+
pos = self.getposition()
|
|
39
|
+
if pos:
|
|
40
|
+
self.close(size=pos.size)
|
|
41
|
+
# self.Order = self.sell()
|
|
42
|
+
|
|
43
|
+
def crossover(self, ma1, ma2):
|
|
44
|
+
try:
|
|
45
|
+
return ma1[-1] <= ma2[-1] and ma1[0] > ma2[0]
|
|
46
|
+
except IndexError:
|
|
47
|
+
return False
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
if __name__ == '__main__':
|
|
52
|
+
cerebro = bt.Cerebro()
|
|
53
|
+
cerebro.broker.setcash(1_000_000.0)
|
|
54
|
+
cerebro.broker.set_shortcash(False)
|
|
55
|
+
cerebro.broker.setcommission(commission=0.0004, leverage=1) # 0.04% per trade
|
|
56
|
+
|
|
57
|
+
start = time.perf_counter()
|
|
58
|
+
df = pd.read_csv(f"STOCK_M1.csv.zip", sep=";", parse_dates=["Datetime"], index_col=0)
|
|
59
|
+
|
|
60
|
+
data = PandasData(dataname=df, timeframe=bt.TimeFrame.Minutes, compression=1)
|
|
61
|
+
cerebro.adddata(data, name='STOCK')
|
|
62
|
+
|
|
63
|
+
cerebro.addstrategy(SmaCross, )
|
|
64
|
+
|
|
65
|
+
results = cerebro.run(runonce=True)
|
|
66
|
+
end = time.perf_counter()
|
|
67
|
+
print(f"Execution time for sum_list: {end - start:.4f} seconds\n\n")
|
|
68
|
+
|
|
69
|
+
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import pandas as pd
|
|
3
|
+
import backtrader_next as bt
|
|
4
|
+
from backtrader_next.feeds import PandasData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SmaCross(bt.Strategy):
|
|
8
|
+
params = (
|
|
9
|
+
('MA1', 15),
|
|
10
|
+
('MA2', 91),
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self.Order = None
|
|
15
|
+
# self.ma1 = bt.indicators.SMA(self.data.close, period=self.p.MA1)
|
|
16
|
+
# self.ma2 = bt.indicators.SMA(self.data.close, period=self.p.MA2)
|
|
17
|
+
self.ma1 = bt.nind.SMA(self.data.close, period=self.p.MA1) #Numba based indicator
|
|
18
|
+
self.ma2 = bt.nind.SMA(self.data.close, period=self.p.MA2) #Numba based indicator
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def notify_order(self, order):
|
|
22
|
+
if order.status in [order.Submitted, order.Accepted]: # Order is submitted/accepted
|
|
23
|
+
return # Do nothing until the order is completed
|
|
24
|
+
|
|
25
|
+
elif order.status in [order.Canceled, order.Margin, order.Rejected]: # Canceled, Margin, Rejected
|
|
26
|
+
print('Order was Canceled/Margin/Rejected')
|
|
27
|
+
|
|
28
|
+
self.Order = None # Reset order
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def next(self):
|
|
33
|
+
# Use ONLY Long Positions
|
|
34
|
+
if self.crossover(self.ma1, self.ma2):
|
|
35
|
+
pos = self.getposition()
|
|
36
|
+
if pos:
|
|
37
|
+
self.close(size=pos.size)
|
|
38
|
+
self.Order = self.buy(size=1)
|
|
39
|
+
elif self.crossover(self.ma2, self.ma1):
|
|
40
|
+
pos = self.getposition()
|
|
41
|
+
if pos:
|
|
42
|
+
self.close(size=pos.size)
|
|
43
|
+
# self.Order = self.sell()
|
|
44
|
+
|
|
45
|
+
def crossover(self, ma1, ma2):
|
|
46
|
+
try:
|
|
47
|
+
return ma1[-1] <= ma2[-1] and ma1[0] > ma2[0]
|
|
48
|
+
except IndexError:
|
|
49
|
+
return False
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
if __name__ == '__main__':
|
|
54
|
+
cerebro = bt.Cerebro()
|
|
55
|
+
cerebro.broker.setcash(1_000_000.0)
|
|
56
|
+
cerebro.broker.set_shortcash(False)
|
|
57
|
+
cerebro.broker.setcommission(commission=0.0004, leverage=1) # 0.04% per trade
|
|
58
|
+
|
|
59
|
+
start = time.perf_counter()
|
|
60
|
+
df = pd.read_csv(f"STOCK_M1.csv.zip", sep=";", parse_dates=["Datetime"], index_col=0)
|
|
61
|
+
|
|
62
|
+
data = PandasData(dataframe=df, timeframe=bt.TimeFrame.Minutes, compression=1)
|
|
63
|
+
cerebro.adddata(data, name='STOCK')
|
|
64
|
+
|
|
65
|
+
cerebro.addstrategy(SmaCross, )
|
|
66
|
+
|
|
67
|
+
results = cerebro.run()
|
|
68
|
+
end = time.perf_counter()
|
|
69
|
+
print(f"Execution time for sum_list: {end - start:.4f} seconds\n\n")
|
|
70
|
+
#print(cerebro.statistics)
|
|
71
|
+
|
|
72
|
+
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|