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.
Files changed (444) hide show
  1. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/PKG-INFO +17 -1
  2. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/README.md +16 -0
  3. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/eq.py +34 -53
  4. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/order.py +63 -17
  5. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/version.py +1 -1
  6. backtrader_next-2.2.1/examples/3_perf_compare/.gitignore +10 -0
  7. backtrader_next-2.2.1/examples/3_perf_compare/.python-version +1 -0
  8. backtrader_next-2.2.1/examples/3_perf_compare/README.md +70 -0
  9. backtrader_next-2.2.1/examples/3_perf_compare/STOCK_M1.csv.zip +0 -0
  10. backtrader_next-2.2.1/examples/3_perf_compare/main_backtesting.py +52 -0
  11. backtrader_next-2.2.1/examples/3_perf_compare/main_backtrader.py +69 -0
  12. backtrader_next-2.2.1/examples/3_perf_compare/main_backtrader_next.py +72 -0
  13. backtrader_next-2.2.1/examples/3_perf_compare/pyproject.toml +11 -0
  14. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/pyproject.toml +1 -1
  15. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/.github/FUNDING.yml +0 -0
  16. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/.gitignore +0 -0
  17. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/.travis.yml +0 -0
  18. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/LICENSE +0 -0
  19. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/__init__.py +0 -0
  20. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzer.py +0 -0
  21. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/__init__.py +0 -0
  22. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/annualreturn.py +0 -0
  23. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/calmar.py +0 -0
  24. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/drawdown.py +0 -0
  25. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/leverage.py +0 -0
  26. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/logreturnsrolling.py +0 -0
  27. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/periodstats.py +0 -0
  28. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/positions.py +0 -0
  29. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/pyfolio.py +0 -0
  30. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/returns.py +0 -0
  31. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/sharpe.py +0 -0
  32. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/sqn.py +0 -0
  33. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/timereturn.py +0 -0
  34. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/tradeanalyzer.py +0 -0
  35. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/transactions.py +0 -0
  36. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/analyzers/vwr.py +0 -0
  37. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/broker.py +0 -0
  38. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/__init__.py +0 -0
  39. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/bbroker.py +0 -0
  40. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/ibbroker.py +0 -0
  41. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/oandabroker.py +0 -0
  42. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/brokers/vcbroker.py +0 -0
  43. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/btrun/__init__.py +0 -0
  44. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/btrun/btrun.py +0 -0
  45. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/cerebro.py +0 -0
  46. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/comminfo.py +0 -0
  47. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/commissions/__init__.py +0 -0
  48. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/dataseries.py +0 -0
  49. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/errors.py +0 -0
  50. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feed.py +0 -0
  51. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/__init__.py +0 -0
  52. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/blaze.py +0 -0
  53. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/btcsv.py +0 -0
  54. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/chainer.py +0 -0
  55. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/csvgeneric.py +0 -0
  56. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/ibdata.py +0 -0
  57. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/influxfeed.py +0 -0
  58. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/mt4csv.py +0 -0
  59. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/oanda.py +0 -0
  60. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/pandafeed.py +0 -0
  61. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/quandl.py +0 -0
  62. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/rollover.py +0 -0
  63. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/sierrachart.py +0 -0
  64. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/vcdata.py +0 -0
  65. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/vchart.py +0 -0
  66. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/vchartcsv.py +0 -0
  67. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/vchartfile.py +0 -0
  68. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/feeds/yahoo.py +0 -0
  69. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/fillers.py +0 -0
  70. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/__init__.py +0 -0
  71. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/bsplitter.py +0 -0
  72. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/calendardays.py +0 -0
  73. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/datafiller.py +0 -0
  74. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/datafilter.py +0 -0
  75. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/daysteps.py +0 -0
  76. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/heikinashi.py +0 -0
  77. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/renko.py +0 -0
  78. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/filters/session.py +0 -0
  79. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/flt.py +0 -0
  80. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/functions.py +0 -0
  81. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/futures/__init__.py +0 -0
  82. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/futures/futures.py +0 -0
  83. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicator.py +0 -0
  84. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/__init__.py +0 -0
  85. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/accdecoscillator.py +0 -0
  86. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/aroon.py +0 -0
  87. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/atr.py +0 -0
  88. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/awesomeoscillator.py +0 -0
  89. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/basicops.py +0 -0
  90. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/bollinger.py +0 -0
  91. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/cci.py +0 -0
  92. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/contrib/__init__.py +0 -0
  93. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/contrib/vortex.py +0 -0
  94. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/crossover.py +0 -0
  95. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/dema.py +0 -0
  96. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/deviation.py +0 -0
  97. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/directionalmove.py +0 -0
  98. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/dma.py +0 -0
  99. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/dpo.py +0 -0
  100. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/dv2.py +0 -0
  101. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/ema.py +0 -0
  102. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/envelope.py +0 -0
  103. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/hadelta.py +0 -0
  104. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/heikinashi.py +0 -0
  105. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/hma.py +0 -0
  106. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/hurst.py +0 -0
  107. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/ichimoku.py +0 -0
  108. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/kama.py +0 -0
  109. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/kst.py +0 -0
  110. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/lrsi.py +0 -0
  111. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/mabase.py +0 -0
  112. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/macd.py +0 -0
  113. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/momentum.py +0 -0
  114. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/ols.py +0 -0
  115. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/oscillator.py +0 -0
  116. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/percentchange.py +0 -0
  117. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/percentrank.py +0 -0
  118. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/pivotpoint.py +0 -0
  119. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/prettygoodoscillator.py +0 -0
  120. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/priceoscillator.py +0 -0
  121. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/psar.py +0 -0
  122. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/rmi.py +0 -0
  123. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/rsi.py +0 -0
  124. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/sma.py +0 -0
  125. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/smma.py +0 -0
  126. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/stochastic.py +0 -0
  127. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/trix.py +0 -0
  128. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/tsi.py +0 -0
  129. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/ultimateoscillator.py +0 -0
  130. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/vortex.py +0 -0
  131. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/williams.py +0 -0
  132. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/wma.py +0 -0
  133. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/zlema.py +0 -0
  134. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/indicators/zlind.py +0 -0
  135. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/linebuffer.py +0 -0
  136. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/lineiterator.py +0 -0
  137. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/lineroot.py +0 -0
  138. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/lineseries.py +0 -0
  139. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/mathsupport.py +0 -0
  140. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/metabase.py +0 -0
  141. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/__init__.py +0 -0
  142. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/bandpass.py +0 -0
  143. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/correlation_trend.py +0 -0
  144. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/correlation_trend_ssf.py +0 -0
  145. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/cybernetic_oscillator.py +0 -0
  146. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/dsma.py +0 -0
  147. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ema.py +0 -0
  148. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/laguerre_filter.py +0 -0
  149. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/laguerre_oscillator.py +0 -0
  150. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/macd.py +0 -0
  151. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/mama_fama.py +0 -0
  152. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/mesa_stochastic.py +0 -0
  153. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/momentum.py +0 -0
  154. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/roc.py +0 -0
  155. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/roofing_filter.py +0 -0
  156. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/second_derivative.py +0 -0
  157. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/sma.py +0 -0
  158. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/supersmoother.py +0 -0
  159. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/trunc_bandpass.py +0 -0
  160. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ultimate_bands.py +0 -0
  161. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ultimate_channel.py +0 -0
  162. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ultimate_oscillator.py +0 -0
  163. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/ultimate_smoother.py +0 -0
  164. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nind/utils.py +0 -0
  165. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/__init__.py +0 -0
  166. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/nplot.py +0 -0
  167. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/nscheme.py +0 -0
  168. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/stats.py +0 -0
  169. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/nplot/utils.py +0 -0
  170. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observer.py +0 -0
  171. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/__init__.py +0 -0
  172. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/benchmark.py +0 -0
  173. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/broker.py +0 -0
  174. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/buysell.py +0 -0
  175. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/drawdown.py +0 -0
  176. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/logreturns.py +0 -0
  177. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/timereturn.py +0 -0
  178. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/observers/trades.py +0 -0
  179. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/__init__.py +0 -0
  180. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/finance.py +0 -0
  181. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/formatters.py +0 -0
  182. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/locator.py +0 -0
  183. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/multicursor.py +0 -0
  184. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/plot.py +0 -0
  185. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/scheme.py +0 -0
  186. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/plot/utils.py +0 -0
  187. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/position.py +0 -0
  188. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/resamplerfilter.py +0 -0
  189. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/signal.py +0 -0
  190. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/signals/__init__.py +0 -0
  191. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/sizer.py +0 -0
  192. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/sizers/__init__.py +0 -0
  193. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/sizers/fixedsize.py +0 -0
  194. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/sizers/percents_sizer.py +0 -0
  195. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/store.py +0 -0
  196. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/__init__.py +0 -0
  197. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/ibstore.py +0 -0
  198. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/oandastore.py +0 -0
  199. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/vchartfile.py +0 -0
  200. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/stores/vcstore.py +0 -0
  201. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/strategies/__init__.py +0 -0
  202. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/strategies/sma_crossover.py +0 -0
  203. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/strategy.py +0 -0
  204. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/studies/__init__.py +0 -0
  205. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/studies/contrib/__init__.py +0 -0
  206. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/studies/contrib/fractal.py +0 -0
  207. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/talib.py +0 -0
  208. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/timer.py +0 -0
  209. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/trade.py +0 -0
  210. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/tradingcal.py +0 -0
  211. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/__init__.py +0 -0
  212. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/autodict.py +0 -0
  213. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/date.py +0 -0
  214. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/dateintern.py +0 -0
  215. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/flushfile.py +0 -0
  216. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/ordereddefaultdict.py +0 -0
  217. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/utils/py3.py +0 -0
  218. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/backtrader_next/writer.py +0 -0
  219. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/changelog.txt +0 -0
  220. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/datas/daily-KO.csv +0 -0
  221. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/datas/daily-PEP.csv +0 -0
  222. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/samples/pair-trading/pair-trading.py +0 -0
  223. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/utils/influxdb-import.py +0 -0
  224. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/contrib/utils/iqfeed-to-influxdb.py +0 -0
  225. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2005-2006-day-001.txt +0 -0
  226. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-01-02-volume-min-001.txt +0 -0
  227. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-day-001-optix.txt +0 -0
  228. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-day-001.txt +0 -0
  229. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-day-002.txt +0 -0
  230. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-min-005.txt +0 -0
  231. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-month-001.txt +0 -0
  232. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-volume-day-001.txt +0 -0
  233. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-week-001.txt +0 -0
  234. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/2006-week-002.txt +0 -0
  235. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/bidask.csv +0 -0
  236. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/bidask2.csv +0 -0
  237. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/nvda-1999-2014.txt +0 -0
  238. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/nvda-2014.txt +0 -0
  239. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/orcl-1995-2014.txt +0 -0
  240. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/orcl-2003-2005.txt +0 -0
  241. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/orcl-2014.txt +0 -0
  242. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/ticksample.csv +0 -0
  243. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/yhoo-1996-2014.txt +0 -0
  244. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/yhoo-1996-2015.txt +0 -0
  245. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/yhoo-2003-2005.txt +0 -0
  246. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/datas/yhoo-2014.txt +0 -0
  247. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/1_smacross/smacross.html +0 -0
  248. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/1_smacross/smacross_stats.html +0 -0
  249. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/2_optimize/smacross.html +0 -0
  250. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/2_optimize/smacross_stats.html +0 -0
  251. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/docs/README.md +0 -0
  252. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/AAPL_1d.csv.zip +0 -0
  253. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/README.md +0 -0
  254. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/main.py +0 -0
  255. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/pyproject.toml +0 -0
  256. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/scr1.png +0 -0
  257. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/scr2.png +0 -0
  258. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/scr3.png +0 -0
  259. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/scr4.png +0 -0
  260. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/smacross.html +0 -0
  261. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/1_smacross/smacross_stats.html +0 -0
  262. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/.gitignore +0 -0
  263. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/.python-version +0 -0
  264. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/MSFT_1d.csv.zip +0 -0
  265. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/README.md +0 -0
  266. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/opt_results.csv +0 -0
  267. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/pyproject.toml +0 -0
  268. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/run_optimize.py +0 -0
  269. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/run_strategy.py +0 -0
  270. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/smacross.html +0 -0
  271. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/smacross_stats.html +0 -0
  272. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/examples/2_optimize/strategy.py +0 -0
  273. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/analyzer-annualreturn/analyzer-annualreturn.py +0 -0
  274. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/bidask-to-ohlc/bidask-to-ohlc.py +0 -0
  275. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/bracket/bracket.py +0 -0
  276. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/btfd/btfd.py +0 -0
  277. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/calendar-days/calendar-days.py +0 -0
  278. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/calmar/calmar-test.py +0 -0
  279. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/cheat-on-open/cheat-on-open.py +0 -0
  280. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/commission-schemes/commission-schemes.py +0 -0
  281. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/credit-interest/credit-interest.py +0 -0
  282. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-bid-ask/bidask.py +0 -0
  283. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-filler/data-filler.py +0 -0
  284. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-filler/relativevolume.py +0 -0
  285. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-multitimeframe/data-multitimeframe.py +0 -0
  286. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-pandas/data-pandas-optix.py +0 -0
  287. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-pandas/data-pandas.py +0 -0
  288. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-replay/data-replay.py +0 -0
  289. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/data-resample/data-resample.py +0 -0
  290. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/daysteps/daysteps.py +0 -0
  291. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/future-spot/future-spot.py +0 -0
  292. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/gold-vs-sp500/gold-vs-sp500.py +0 -0
  293. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/ib-cash-bid-ask/ib-cash-bid-ask.py +0 -0
  294. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/ibtest/ibtest.py +0 -0
  295. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/kselrsi/ksignal.py +0 -0
  296. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/lineplotter/lineplotter.py +0 -0
  297. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/lrsi/lrsi-test.py +0 -0
  298. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/macd-settings/macd-settings.py +0 -0
  299. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/memory-savings/memory-savings.py +0 -0
  300. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/mixing-timeframes/mixing-timeframes.py +0 -0
  301. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multi-copy/multi-copy.py +0 -0
  302. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multi-example/mult-values.py +0 -0
  303. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multidata-strategy/multidata-strategy-unaligned.py +0 -0
  304. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multidata-strategy/multidata-strategy.py +0 -0
  305. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multitrades/mtradeobserver.py +0 -0
  306. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/multitrades/multitrades.py +0 -0
  307. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/oandatest/oandatest.py +0 -0
  308. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observer-benchmark/observer-benchmark.py +0 -0
  309. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observers/observers-default-drawdown.py +0 -0
  310. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observers/observers-default.py +0 -0
  311. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observers/observers-orderobserver.py +0 -0
  312. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/observers/orderobserver.py +0 -0
  313. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/oco/oco.py +0 -0
  314. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/optimization/optimization.py +0 -0
  315. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order-close/close-daily.py +0 -0
  316. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order-close/close-minute.py +0 -0
  317. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order-execution/order-execution.py +0 -0
  318. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order-history/order-history.py +0 -0
  319. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/order_target/order_target.py +0 -0
  320. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/partial-plot/partial-plot.py +0 -0
  321. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pinkfish-challenge/pinkfish-challenge.py +0 -0
  322. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pivot-point/pivotpoint.py +0 -0
  323. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pivot-point/ppsample.py +0 -0
  324. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/plot-same-axis/plot-same-axis.py +0 -0
  325. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/psar/psar-intraday.py +0 -0
  326. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/psar/psar.py +0 -0
  327. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pyfolio2/backtrader-pyfolio.ipynb +0 -0
  328. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pyfolio2/pyfoliotest.py +0 -0
  329. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pyfoliotest/backtrader-pyfolio.ipynb +0 -0
  330. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/pyfoliotest/pyfoliotest.py +0 -0
  331. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/relative-volume/relative-volume.py +0 -0
  332. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/relative-volume/relvolbybar.py +0 -0
  333. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/renko/renko.py +0 -0
  334. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/resample-tickdata/resample-tickdata.py +0 -0
  335. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/rollover/rollover.py +0 -0
  336. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sharpe-timereturn/sharpe-timereturn.py +0 -0
  337. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/signals-strategy/signals-strategy.py +0 -0
  338. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sigsmacross/sigsmacross.py +0 -0
  339. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sigsmacross/sigsmacross2.py +0 -0
  340. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sizertest/sizertest.py +0 -0
  341. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/slippage/slippage.py +0 -0
  342. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/sratio/sratio.py +0 -0
  343. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/stop-trading/stop-loss-approaches.py +0 -0
  344. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/stoptrail/trail.py +0 -0
  345. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/strategy-selection/strategy-selection.py +0 -0
  346. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/talib/tablibsartest.py +0 -0
  347. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/talib/talibtest.py +0 -0
  348. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/timers/scheduled-min.py +0 -0
  349. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/timers/scheduled.py +0 -0
  350. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/tradingcalendar/tcal-intra.py +0 -0
  351. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/tradingcalendar/tcal.py +0 -0
  352. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/vctest/vctest.py +0 -0
  353. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/volumefilling/volumefilling.py +0 -0
  354. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/vwr/vwr.py +0 -0
  355. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/weekdays-filler/weekdaysaligner.py +0 -0
  356. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/weekdays-filler/weekdaysfiller.py +0 -0
  357. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/writer-test/writer-test.py +0 -0
  358. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/samples_old/yahoo-test/yahoo-test.py +0 -0
  359. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_analyzer-sqn.py +0 -0
  360. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_analyzer-timereturn.py +0 -0
  361. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_comminfo.py +0 -0
  362. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_data_multiframe.py +0 -0
  363. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_data_replay.py +0 -0
  364. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_data_resample.py +0 -0
  365. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_accdecosc.py +0 -0
  366. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_aroonoscillator.py +0 -0
  367. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_aroonupdown.py +0 -0
  368. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_atr.py +0 -0
  369. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_awesomeoscillator.py +0 -0
  370. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_bbands.py +0 -0
  371. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_cci.py +0 -0
  372. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dema.py +0 -0
  373. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_demaenvelope.py +0 -0
  374. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_demaosc.py +0 -0
  375. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dm.py +0 -0
  376. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dma.py +0 -0
  377. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_downmove.py +0 -0
  378. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dpo.py +0 -0
  379. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_dv2.py +0 -0
  380. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_ema.py +0 -0
  381. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_emaenvelope.py +0 -0
  382. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_emaosc.py +0 -0
  383. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_envelope.py +0 -0
  384. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_heikinashi.py +0 -0
  385. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_highest.py +0 -0
  386. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_hma.py +0 -0
  387. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_ichimoku.py +0 -0
  388. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_kama.py +0 -0
  389. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_kamaenvelope.py +0 -0
  390. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_kamaosc.py +0 -0
  391. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_kst.py +0 -0
  392. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_lowest.py +0 -0
  393. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_lrsi.py +0 -0
  394. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_macdhisto.py +0 -0
  395. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_minperiod.py +0 -0
  396. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_momentum.py +0 -0
  397. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_momentumoscillator.py +0 -0
  398. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_oscillator.py +0 -0
  399. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_pctchange.py +0 -0
  400. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_pctrank.py +0 -0
  401. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_pgo.py +0 -0
  402. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_ppo.py +0 -0
  403. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_pposhort.py +0 -0
  404. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_priceosc.py +0 -0
  405. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_rmi.py +0 -0
  406. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_roc.py +0 -0
  407. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_rsi.py +0 -0
  408. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_rsi_safe.py +0 -0
  409. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_sma.py +0 -0
  410. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smaenvelope.py +0 -0
  411. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smaosc.py +0 -0
  412. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smma.py +0 -0
  413. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smmaenvelope.py +0 -0
  414. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_smmaosc.py +0 -0
  415. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_stochastic.py +0 -0
  416. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_stochasticfull.py +0 -0
  417. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_sumn.py +0 -0
  418. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_tema.py +0 -0
  419. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_temaenvelope.py +0 -0
  420. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_temaosc.py +0 -0
  421. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_trix.py +0 -0
  422. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_tsi.py +0 -0
  423. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_ultosc.py +0 -0
  424. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_upmove.py +0 -0
  425. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_vortex.py +0 -0
  426. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_williamsad.py +0 -0
  427. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_williamsr.py +0 -0
  428. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_wma.py +0 -0
  429. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_wmaenvelope.py +0 -0
  430. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_wmaosc.py +0 -0
  431. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_zlema.py +0 -0
  432. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_ind_zlind.py +0 -0
  433. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_metaclass.py +0 -0
  434. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_order.py +0 -0
  435. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_position.py +0 -0
  436. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_strategy_optimized.py +0 -0
  437. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_strategy_unoptimized.py +0 -0
  438. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_study_fractal.py +0 -0
  439. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_trade.py +0 -0
  440. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/test_writer.py +0 -0
  441. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tests/testcommon.py +0 -0
  442. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tools/bt-run.py +0 -0
  443. {backtrader_next-2.1.1 → backtrader_next-2.2.1}/tools/rewrite-data.py +0 -0
  444. {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.1.1
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 Dict, List, Optional, Sequence, Union, cast
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 drawdowns stats such as drawdown
17
- values in %s and in dollars, max drawdown in %s and in dollars, drawdown
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
- - ``get_analysis``
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
- Returns a dictionary (with . notation support and subdctionaries) with
36
- drawdown stats as values, the following keys/attributes are available:
58
+ - ``gen_trades(data_name=None, pct=False)``
37
59
 
38
- - ``drawdown`` - drawdown value in 0.xx %
39
- - ``moneydown`` - drawdown value in monetary units
40
- - ``len`` - drawdown length
60
+ Returns trade-level statistics as a pandas DataFrame.
41
61
 
42
- - ``max.drawdown`` - max drawdown value in 0.xx %
43
- - ``max.moneydown`` - max drawdown value in monetary units
44
- - ``max.len`` - max drawdown length
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 in ('parent',):
665
- odict[k] = v.ref if v else None
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
- pass
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
- return None
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 == 'created' or key == 'executed':
688
- ord.created = OrderData(
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 = val #?? string representation only
747
+ ord.comminfo = None
701
748
  elif key == 'parent':
702
- ref = val
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
@@ -22,6 +22,6 @@ from __future__ import (absolute_import, division, print_function,
22
22
  unicode_literals)
23
23
 
24
24
 
25
- __version__ = '2.1.0'
25
+ __version__ = '2.2.1'
26
26
 
27
27
  __btversion__ = tuple(int(x) for x in __version__.split('.'))
@@ -0,0 +1,10 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
@@ -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
+
@@ -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
+
@@ -0,0 +1,11 @@
1
+ [project]
2
+ name = "3-perf-compare"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13"
7
+ dependencies = [
8
+ "backtesting>=0.6.5",
9
+ "backtrader>=1.9.78.123",
10
+ "backtrader-next>=2.1.1",
11
+ ]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "backtrader_next"
3
- version = "2.1.1"
3
+ version = "2.2.1"
4
4
  description = "Live Trading and backtesting platform in Python"
5
5
  readme = "README.md"
6
6
  license = { text = "GPL-3.0-or-later" }
File without changes