back-trader-python 1.4.0__py3-none-any.whl

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 (465) hide show
  1. back_trader_python-1.4.0.dist-info/METADATA +1491 -0
  2. back_trader_python-1.4.0.dist-info/RECORD +465 -0
  3. back_trader_python-1.4.0.dist-info/WHEEL +5 -0
  4. back_trader_python-1.4.0.dist-info/licenses/LICENSE +674 -0
  5. back_trader_python-1.4.0.dist-info/top_level.txt +1 -0
  6. backtrader/__init__.py +148 -0
  7. backtrader/_cerebro/__init__.py +5 -0
  8. backtrader/_cerebro/channel.py +382 -0
  9. backtrader/_cerebro/execution.py +377 -0
  10. backtrader/_cerebro/lifecycle.py +143 -0
  11. backtrader/_cerebro/notifications.py +150 -0
  12. backtrader/_cerebro/presentation.py +230 -0
  13. backtrader/_cerebro/registry.py +593 -0
  14. backtrader/_cerebro/runnext.py +551 -0
  15. backtrader/_cerebro/runonce.py +142 -0
  16. backtrader/analyzer.py +594 -0
  17. backtrader/analyzers/__init__.py +50 -0
  18. backtrader/analyzers/annualreturn.py +226 -0
  19. backtrader/analyzers/calmar.py +165 -0
  20. backtrader/analyzers/drawdown.py +287 -0
  21. backtrader/analyzers/leverage.py +112 -0
  22. backtrader/analyzers/logreturnsrolling.py +190 -0
  23. backtrader/analyzers/periodstats.py +153 -0
  24. backtrader/analyzers/positions.py +119 -0
  25. backtrader/analyzers/pyfolio.py +470 -0
  26. backtrader/analyzers/returns.py +192 -0
  27. backtrader/analyzers/sharpe.py +307 -0
  28. backtrader/analyzers/sharpe_ratio_stats.py +534 -0
  29. backtrader/analyzers/sqn.py +112 -0
  30. backtrader/analyzers/timereturn.py +192 -0
  31. backtrader/analyzers/total_value.py +75 -0
  32. backtrader/analyzers/tradeanalyzer.py +278 -0
  33. backtrader/analyzers/transactions.py +141 -0
  34. backtrader/analyzers/vwr.py +245 -0
  35. backtrader/bokeh/__init__.py +155 -0
  36. backtrader/bokeh/analyzers/__init__.py +13 -0
  37. backtrader/bokeh/analyzers/plot.py +192 -0
  38. backtrader/bokeh/analyzers/recorder.py +181 -0
  39. backtrader/bokeh/app.py +1094 -0
  40. backtrader/bokeh/live/__init__.py +11 -0
  41. backtrader/bokeh/live/client.py +352 -0
  42. backtrader/bokeh/live/datahandler.py +346 -0
  43. backtrader/bokeh/plot_adapter.py +200 -0
  44. backtrader/bokeh/schemes/__init__.py +14 -0
  45. backtrader/bokeh/schemes/blackly.py +76 -0
  46. backtrader/bokeh/schemes/scheme.py +150 -0
  47. backtrader/bokeh/schemes/tradimo.py +82 -0
  48. backtrader/bokeh/tab.py +125 -0
  49. backtrader/bokeh/tabs/__init__.py +30 -0
  50. backtrader/bokeh/tabs/analyzer.py +120 -0
  51. backtrader/bokeh/tabs/config.py +154 -0
  52. backtrader/bokeh/tabs/live.py +109 -0
  53. backtrader/bokeh/tabs/log.py +185 -0
  54. backtrader/bokeh/tabs/metadata.py +182 -0
  55. backtrader/bokeh/tabs/performance.py +359 -0
  56. backtrader/bokeh/tabs/source.py +70 -0
  57. backtrader/bokeh/utils/__init__.py +8 -0
  58. backtrader/bokeh/utils/helpers.py +167 -0
  59. backtrader/bokeh/webapp.py +164 -0
  60. backtrader/broker.py +478 -0
  61. backtrader/brokers/__init__.py +36 -0
  62. backtrader/brokers/bbroker.py +2576 -0
  63. backtrader/brokers/btapibroker.py +8227 -0
  64. backtrader/brokers/hft/__init__.py +89 -0
  65. backtrader/brokers/hft/binance_bbo.py +625 -0
  66. backtrader/brokers/hft/binance_bbo_compare.py +1398 -0
  67. backtrader/brokers/hft/examples.py +1228 -0
  68. backtrader/brokers/hft/exchange.py +380 -0
  69. backtrader/brokers/hft/latency.py +309 -0
  70. backtrader/brokers/hft/matching_core.py +572 -0
  71. backtrader/brokers/hft/queue.py +238 -0
  72. backtrader/brokers/hft/recorder.py +88 -0
  73. backtrader/brokers/hft/state.py +138 -0
  74. backtrader/brokers/impact_models.py +118 -0
  75. backtrader/brokers/mixbroker.py +895 -0
  76. backtrader/brokers/tickbroker.py +1991 -0
  77. backtrader/btrun/__init__.py +12 -0
  78. backtrader/btrun/btrun.py +1218 -0
  79. backtrader/cerebro.py +828 -0
  80. backtrader/channel.py +682 -0
  81. backtrader/channels/__init__.py +23 -0
  82. backtrader/channels/bridge.py +186 -0
  83. backtrader/channels/funding.py +248 -0
  84. backtrader/channels/live_queue.py +216 -0
  85. backtrader/channels/live_validator.py +294 -0
  86. backtrader/channels/orderbook.py +257 -0
  87. backtrader/channels/tick.py +202 -0
  88. backtrader/comminfo.py +665 -0
  89. backtrader/commissions/__init__.py +106 -0
  90. backtrader/commissions/ctpoption.py +993 -0
  91. backtrader/configs/account_config_example.yaml +8 -0
  92. backtrader/dataseries.py +379 -0
  93. backtrader/errors.py +106 -0
  94. backtrader/events.py +980 -0
  95. backtrader/feed.py +1523 -0
  96. backtrader/feeds/__init__.py +75 -0
  97. backtrader/feeds/barrier.py +2006 -0
  98. backtrader/feeds/blaze.py +118 -0
  99. backtrader/feeds/btapifeed.py +1538 -0
  100. backtrader/feeds/btcsv.py +203 -0
  101. backtrader/feeds/chainer.py +114 -0
  102. backtrader/feeds/cryptohftdata.py +164 -0
  103. backtrader/feeds/csvgeneric.py +1205 -0
  104. backtrader/feeds/ctpcohort.py +1051 -0
  105. backtrader/feeds/influxfeed.py +158 -0
  106. backtrader/feeds/livefeed.py +71 -0
  107. backtrader/feeds/mixed_channel.py +108 -0
  108. backtrader/feeds/mt4csv.py +42 -0
  109. backtrader/feeds/pandafeed.py +381 -0
  110. backtrader/feeds/quandl.py +256 -0
  111. backtrader/feeds/rollover.py +229 -0
  112. backtrader/feeds/sierrachart.py +30 -0
  113. backtrader/feeds/vchart.py +162 -0
  114. backtrader/feeds/vchartcsv.py +84 -0
  115. backtrader/feeds/vchartfile.py +153 -0
  116. backtrader/feeds/yahoo.py +399 -0
  117. backtrader/fillers.py +148 -0
  118. backtrader/filters/__init__.py +34 -0
  119. backtrader/filters/bsplitter.py +127 -0
  120. backtrader/filters/calendardays.py +121 -0
  121. backtrader/filters/datafiller.py +192 -0
  122. backtrader/filters/datafilter.py +74 -0
  123. backtrader/filters/daysteps.py +96 -0
  124. backtrader/filters/heikinashi.py +63 -0
  125. backtrader/filters/renko.py +164 -0
  126. backtrader/filters/session.py +289 -0
  127. backtrader/flt.py +80 -0
  128. backtrader/functions.py +960 -0
  129. backtrader/indicator.py +449 -0
  130. backtrader/indicators/__init__.py +148 -0
  131. backtrader/indicators/accdecoscillator.py +110 -0
  132. backtrader/indicators/aroon.py +300 -0
  133. backtrader/indicators/atr.py +315 -0
  134. backtrader/indicators/awesomeoscillator.py +122 -0
  135. backtrader/indicators/basicops.py +834 -0
  136. backtrader/indicators/bollinger.py +223 -0
  137. backtrader/indicators/cci.py +89 -0
  138. backtrader/indicators/channels_ext.py +83 -0
  139. backtrader/indicators/contrib/__init__.py +228 -0
  140. backtrader/indicators/contrib/absolutely_no_lag_lwma.py +28 -0
  141. backtrader/indicators/contrib/absolutely_no_lag_lwma_color.py +44 -0
  142. backtrader/indicators/contrib/accumulation_distribution_line.py +92 -0
  143. backtrader/indicators/contrib/adx_cross_hull_style_indicator.py +249 -0
  144. backtrader/indicators/contrib/adxdmi.py +34 -0
  145. backtrader/indicators/contrib/ai_acceleration_deceleration_oscillator.py +34 -0
  146. backtrader/indicators/contrib/altr_trend_signal_v22.py +85 -0
  147. backtrader/indicators/contrib/anchored_momentum_line.py +115 -0
  148. backtrader/indicators/contrib/any_range_cld_tail_indicator.py +82 -0
  149. backtrader/indicators/contrib/aroon_horn_sign_indicator.py +96 -0
  150. backtrader/indicators/contrib/aroon_oscillator_sign_alert.py +50 -0
  151. backtrader/indicators/contrib/arrows_curves_indicator.py +112 -0
  152. backtrader/indicators/contrib/as_ctrend_indicator.py +143 -0
  153. backtrader/indicators/contrib/asimmetric_stoch_nr_indicator.py +187 -0
  154. backtrader/indicators/contrib/atr_normalize_histogram.py +118 -0
  155. backtrader/indicators/contrib/average_change_candle.py +165 -0
  156. backtrader/indicators/contrib/bb_squeeze_indicator.py +60 -0
  157. backtrader/indicators/contrib/bezier_st_dev_indicator.py +135 -0
  158. backtrader/indicators/contrib/binary_wave_indicator.py +233 -0
  159. backtrader/indicators/contrib/blau_c_momentum_indicator.py +123 -0
  160. backtrader/indicators/contrib/blau_cmi_indicator.py +141 -0
  161. backtrader/indicators/contrib/blau_csi.py +76 -0
  162. backtrader/indicators/contrib/blau_ergodic.py +53 -0
  163. backtrader/indicators/contrib/blau_t_stoch_i.py +72 -0
  164. backtrader/indicators/contrib/blau_ts_stochastic.py +85 -0
  165. backtrader/indicators/contrib/blau_tvi.py +55 -0
  166. backtrader/indicators/contrib/brain_trend2_indicator.py +128 -0
  167. backtrader/indicators/contrib/brain_trend_signal_proxy.py +47 -0
  168. backtrader/indicators/contrib/brake_parb_indicator.py +85 -0
  169. backtrader/indicators/contrib/breakout_bars_trend_v2.py +121 -0
  170. backtrader/indicators/contrib/bsi_indicator.py +87 -0
  171. backtrader/indicators/contrib/bulls_bears_eyes.py +67 -0
  172. backtrader/indicators/contrib/bulls_power.py +56 -0
  173. backtrader/indicators/contrib/bw_wise_man1_signal.py +102 -0
  174. backtrader/indicators/contrib/bykov_trend_indicator.py +85 -0
  175. backtrader/indicators/contrib/candle_stop_color.py +46 -0
  176. backtrader/indicators/contrib/candles_x_smoothed_indicator.py +69 -0
  177. backtrader/indicators/contrib/candlesticks_bw.py +45 -0
  178. backtrader/indicators/contrib/caudate_x_period_candle_color.py +56 -0
  179. backtrader/indicators/contrib/cci_histogram_indicator.py +53 -0
  180. backtrader/indicators/contrib/cci_woodies_indicator.py +80 -0
  181. backtrader/indicators/contrib/center_of_gravity_candle_indicator.py +83 -0
  182. backtrader/indicators/contrib/center_of_gravity_indicator.py +70 -0
  183. backtrader/indicators/contrib/cg_oscillator.py +40 -0
  184. backtrader/indicators/contrib/close_line_cci.py +38 -0
  185. backtrader/indicators/contrib/close_price_fractals.py +47 -0
  186. backtrader/indicators/contrib/color3rd_gen_xma_indicator.py +122 -0
  187. backtrader/indicators/contrib/color_bb_candles_indicator.py +108 -0
  188. backtrader/indicators/contrib/color_coppock_indicator.py +157 -0
  189. backtrader/indicators/contrib/color_hma.py +71 -0
  190. backtrader/indicators/contrib/color_j_variation_indicator.py +53 -0
  191. backtrader/indicators/contrib/color_metro_de_marker_indicator.py +78 -0
  192. backtrader/indicators/contrib/color_metro_stochastic_indicator.py +93 -0
  193. backtrader/indicators/contrib/color_metro_wpr_indicator.py +85 -0
  194. backtrader/indicators/contrib/color_schaff_de_marker_trend_cycle.py +92 -0
  195. backtrader/indicators/contrib/color_schaff_trend_cycle_indicator.py +203 -0
  196. backtrader/indicators/contrib/color_step_xccx_indicator.py +193 -0
  197. backtrader/indicators/contrib/color_x2_ma.py +49 -0
  198. backtrader/indicators/contrib/color_x_derivative.py +63 -0
  199. backtrader/indicators/contrib/color_zerolag_de_marker.py +84 -0
  200. backtrader/indicators/contrib/corrected_average_indicator.py +127 -0
  201. backtrader/indicators/contrib/darvas_boxes_system.py +73 -0
  202. backtrader/indicators/contrib/dema_range_channel_color.py +42 -0
  203. backtrader/indicators/contrib/derivative_indicator.py +95 -0
  204. backtrader/indicators/contrib/digital_ft01_indicator.py +112 -0
  205. backtrader/indicators/contrib/digital_macd.py +200 -0
  206. backtrader/indicators/contrib/donchian_channels_system.py +45 -0
  207. backtrader/indicators/contrib/dots_indicator.py +93 -0
  208. backtrader/indicators/contrib/ef_distance_indicator.py +82 -0
  209. backtrader/indicators/contrib/ema_rsi_va.py +80 -0
  210. backtrader/indicators/contrib/envelopes_jp_alonso.py +32 -0
  211. backtrader/indicators/contrib/f2a_ao_indicator.py +120 -0
  212. backtrader/indicators/contrib/fatl_filter.py +179 -0
  213. backtrader/indicators/contrib/fibo_candles_indicator.py +78 -0
  214. backtrader/indicators/contrib/fine_tuning_ma.py +100 -0
  215. backtrader/indicators/contrib/fisher_org_v1.py +102 -0
  216. backtrader/indicators/contrib/fisher_org_v1_sign.py +118 -0
  217. backtrader/indicators/contrib/force_index_ema.py +96 -0
  218. backtrader/indicators/contrib/force_index_ema_2.py +27 -0
  219. backtrader/indicators/contrib/forecast_oscilator.py +145 -0
  220. backtrader/indicators/contrib/fractal_amambk.py +81 -0
  221. backtrader/indicators/contrib/frama_series.py +84 -0
  222. backtrader/indicators/contrib/frasm_av2_indicator.py +104 -0
  223. backtrader/indicators/contrib/go_indicator.py +93 -0
  224. backtrader/indicators/contrib/hlr_indicator.py +95 -0
  225. backtrader/indicators/contrib/hma.py +50 -0
  226. backtrader/indicators/contrib/i4_drfv2.py +34 -0
  227. backtrader/indicators/contrib/i4_drfv3.py +38 -0
  228. backtrader/indicators/contrib/i_anch_mom_indicator.py +72 -0
  229. backtrader/indicators/contrib/i_de_marker_sign_indicator.py +64 -0
  230. backtrader/indicators/contrib/i_gap_indicator.py +45 -0
  231. backtrader/indicators/contrib/i_stoch_komposter_indicator.py +77 -0
  232. backtrader/indicators/contrib/i_trend_indicator.py +125 -0
  233. backtrader/indicators/contrib/iamma_indicator.py +39 -0
  234. backtrader/indicators/contrib/indexed_moving_average.py +33 -0
  235. backtrader/indicators/contrib/instantaneous_trend_filter_indicator.py +51 -0
  236. backtrader/indicators/contrib/inverse_reaction_indicator.py +41 -0
  237. backtrader/indicators/contrib/irsi_sign_indicator.py +95 -0
  238. backtrader/indicators/contrib/iwpr_sign_indicator.py +59 -0
  239. backtrader/indicators/contrib/j_brain_trend1_sig_indicator.py +233 -0
  240. backtrader/indicators/contrib/j_tpo_proxy.py +32 -0
  241. backtrader/indicators/contrib/jma_slope_indicator.py +73 -0
  242. backtrader/indicators/contrib/kalman_filter_indicator.py +119 -0
  243. backtrader/indicators/contrib/kalman_filter_line.py +127 -0
  244. backtrader/indicators/contrib/kama_indicator.py +150 -0
  245. backtrader/indicators/contrib/karacatica_indicator.py +99 -0
  246. backtrader/indicators/contrib/kdj_indicator.py +59 -0
  247. backtrader/indicators/contrib/kwan_ccc_indicator.py +195 -0
  248. backtrader/indicators/contrib/kwan_nrp_indicator.py +113 -0
  249. backtrader/indicators/contrib/kwan_rdp_indicator.py +192 -0
  250. backtrader/indicators/contrib/laguerre_adx_indicator.py +85 -0
  251. backtrader/indicators/contrib/laguerre_filter_indicator.py +66 -0
  252. backtrader/indicators/contrib/laguerre_plus_di_proxy.py +57 -0
  253. backtrader/indicators/contrib/laguerre_roc_indicator.py +81 -0
  254. backtrader/indicators/contrib/le_man_signal_indicator.py +63 -0
  255. backtrader/indicators/contrib/linear_reg_slope_v2_indicator.py +136 -0
  256. backtrader/indicators/contrib/loco_indicator.py +88 -0
  257. backtrader/indicators/contrib/lrma_indicator.py +185 -0
  258. backtrader/indicators/contrib/lsma_angle_indicator.py +106 -0
  259. backtrader/indicators/contrib/ma_rounding_channel_indicator.py +149 -0
  260. backtrader/indicators/contrib/macd2_indicator.py +61 -0
  261. backtrader/indicators/contrib/macd_candle_indicator.py +80 -0
  262. backtrader/indicators/contrib/malr_indicator.py +77 -0
  263. backtrader/indicators/contrib/momentum_candle_sign_indicator.py +51 -0
  264. backtrader/indicators/contrib/moving_average_fn_indicator.py +139 -0
  265. backtrader/indicators/contrib/mt5_stochastic_close_close.py +57 -0
  266. backtrader/indicators/contrib/muv_nor_diff_cloud_indicator.py +107 -0
  267. backtrader/indicators/contrib/non_lag_dot_indicator.py +124 -0
  268. backtrader/indicators/contrib/nrtr_extr_indicator.py +95 -0
  269. backtrader/indicators/contrib/nrtr_indicator.py +95 -0
  270. backtrader/indicators/contrib/p_channel_system.py +40 -0
  271. backtrader/indicators/contrib/percent_envelope.py +37 -0
  272. backtrader/indicators/contrib/percentage_crossover_channel.py +47 -0
  273. backtrader/indicators/contrib/pivot_zig_zag_proxy.py +47 -0
  274. backtrader/indicators/contrib/price_channel_stop_indicator.py +104 -0
  275. backtrader/indicators/contrib/price_extreme_channel.py +35 -0
  276. backtrader/indicators/contrib/qqe_cloud_indicator.py +129 -0
  277. backtrader/indicators/contrib/ravi_indicator.py +40 -0
  278. backtrader/indicators/contrib/raw_close_close_stochastic.py +74 -0
  279. backtrader/indicators/contrib/rd_trend_trigger_indicator.py +51 -0
  280. backtrader/indicators/contrib/renko_level.py +85 -0
  281. backtrader/indicators/contrib/renko_line_break.py +91 -0
  282. backtrader/indicators/contrib/rftl_indicator.py +41 -0
  283. backtrader/indicators/contrib/rkd_indicator.py +53 -0
  284. backtrader/indicators/contrib/roc2_vg_indicator.py +68 -0
  285. backtrader/indicators/contrib/rsi_histogram_indicator.py +43 -0
  286. backtrader/indicators/contrib/rsi_slowdown.py +57 -0
  287. backtrader/indicators/contrib/rsioma_v2.py +41 -0
  288. backtrader/indicators/contrib/rvi_histogram_indicator.py +107 -0
  289. backtrader/indicators/contrib/safe_adx.py +89 -0
  290. backtrader/indicators/contrib/shared_strategy_indicators.py +1651 -0
  291. backtrader/indicators/contrib/sidus_indicator.py +105 -0
  292. backtrader/indicators/contrib/silver_trend_indicator.py +79 -0
  293. backtrader/indicators/contrib/sliding_range_color.py +56 -0
  294. backtrader/indicators/contrib/slow_stoch.py +42 -0
  295. backtrader/indicators/contrib/smoothed_adx_indicator.py +86 -0
  296. backtrader/indicators/contrib/smoothed_rsi.py +31 -0
  297. backtrader/indicators/contrib/spearman_rank_correlation_histogram.py +60 -0
  298. backtrader/indicators/contrib/stalin_indicator.py +152 -0
  299. backtrader/indicators/contrib/starter_laguerre_filter.py +62 -0
  300. backtrader/indicators/contrib/step_manrtr_indicator.py +137 -0
  301. backtrader/indicators/contrib/stochastic_histogram_indicator.py +143 -0
  302. backtrader/indicators/contrib/t3_alarm_indicator.py +125 -0
  303. backtrader/indicators/contrib/t3_average.py +76 -0
  304. backtrader/indicators/contrib/t3_indicator.py +40 -0
  305. backtrader/indicators/contrib/the20s_v020_signal.py +93 -0
  306. backtrader/indicators/contrib/three_candles_indicator.py +70 -0
  307. backtrader/indicators/contrib/three_line_break_indicator.py +64 -0
  308. backtrader/indicators/contrib/time_line.py +57 -0
  309. backtrader/indicators/contrib/trading_channel_index_proxy.py +48 -0
  310. backtrader/indicators/contrib/trend_arrows_indicator.py +109 -0
  311. backtrader/indicators/contrib/trend_continuation_indicator.py +127 -0
  312. backtrader/indicators/contrib/trend_intensity_index_proxy.py +51 -0
  313. backtrader/indicators/contrib/trend_manager_indicator.py +39 -0
  314. backtrader/indicators/contrib/tri_x_candle_indicator.py +51 -0
  315. backtrader/indicators/contrib/trigger_line.py +66 -0
  316. backtrader/indicators/contrib/triple_ema_rate.py +34 -0
  317. backtrader/indicators/contrib/trvi_indicator.py +194 -0
  318. backtrader/indicators/contrib/two_pb_ideal_xosma_indicator.py +127 -0
  319. backtrader/indicators/contrib/ultra_absolutely_no_lag_lwma_color.py +92 -0
  320. backtrader/indicators/contrib/ultra_wpr_indicator.py +173 -0
  321. backtrader/indicators/contrib/up_down_candle_strength.py +68 -0
  322. backtrader/indicators/contrib/vinin_i_trend_indicator.py +139 -0
  323. backtrader/indicators/contrib/volume_weighted_ma_indicator.py +78 -0
  324. backtrader/indicators/contrib/volume_weighted_ma_st_dev_indicator.py +111 -0
  325. backtrader/indicators/contrib/vwap_close_indicator.py +65 -0
  326. backtrader/indicators/contrib/vwma_candle.py +57 -0
  327. backtrader/indicators/contrib/vwma_digit_system.py +70 -0
  328. backtrader/indicators/contrib/wami.py +43 -0
  329. backtrader/indicators/contrib/wprsi_signal_indicator.py +105 -0
  330. backtrader/indicators/contrib/x_de_marker_histogram_vol_direct_indicator.py +145 -0
  331. backtrader/indicators/contrib/x_fisher_indicator.py +64 -0
  332. backtrader/indicators/contrib/xcci_histogram_vol_direct_indicator.py +56 -0
  333. backtrader/indicators/contrib/xcci_histogram_vol_indicator.py +85 -0
  334. backtrader/indicators/contrib/xma_ichimoku.py +163 -0
  335. backtrader/indicators/contrib/xma_ishimoku_channel_indicator.py +65 -0
  336. backtrader/indicators/contrib/xma_ishimoku_line.py +68 -0
  337. backtrader/indicators/contrib/xma_range_bands_indicator.py +107 -0
  338. backtrader/indicators/contrib/xmacd_indicator.py +70 -0
  339. backtrader/indicators/contrib/xrsi_de_marker_histogram.py +67 -0
  340. backtrader/indicators/contrib/xrsi_histogram_vol_direct_indicator.py +52 -0
  341. backtrader/indicators/contrib/xrsi_histogram_vol_indicator.py +81 -0
  342. backtrader/indicators/contrib/xrvi_indicator.py +130 -0
  343. backtrader/indicators/contrib/zero_lag_macd.py +36 -0
  344. backtrader/indicators/contrib/zig_zag_recent_pivot_signal.py +90 -0
  345. backtrader/indicators/contrib/zpf_indicator.py +115 -0
  346. backtrader/indicators/crossover.py +337 -0
  347. backtrader/indicators/dema.py +175 -0
  348. backtrader/indicators/demarker.py +270 -0
  349. backtrader/indicators/deviation.py +284 -0
  350. backtrader/indicators/directionalmove.py +1071 -0
  351. backtrader/indicators/dma.py +112 -0
  352. backtrader/indicators/dpo.py +96 -0
  353. backtrader/indicators/dv2.py +56 -0
  354. backtrader/indicators/ema.py +145 -0
  355. backtrader/indicators/envelope.py +475 -0
  356. backtrader/indicators/hadelta.py +198 -0
  357. backtrader/indicators/heikinashi.py +153 -0
  358. backtrader/indicators/hma.py +153 -0
  359. backtrader/indicators/hurst.py +151 -0
  360. backtrader/indicators/ichimoku.py +267 -0
  361. backtrader/indicators/kama.py +181 -0
  362. backtrader/indicators/kst.py +159 -0
  363. backtrader/indicators/lrsi.py +125 -0
  364. backtrader/indicators/mabase.py +147 -0
  365. backtrader/indicators/macd.py +322 -0
  366. backtrader/indicators/momentum.py +267 -0
  367. backtrader/indicators/moneyflow.py +237 -0
  368. backtrader/indicators/mt5atr.py +124 -0
  369. backtrader/indicators/myind.py +179 -0
  370. backtrader/indicators/obv.py +94 -0
  371. backtrader/indicators/ols.py +265 -0
  372. backtrader/indicators/oscillator.py +161 -0
  373. backtrader/indicators/percentchange.py +83 -0
  374. backtrader/indicators/percentrank.py +46 -0
  375. backtrader/indicators/pivotpoint.py +469 -0
  376. backtrader/indicators/prettygoodoscillator.py +113 -0
  377. backtrader/indicators/priceops_ext.py +123 -0
  378. backtrader/indicators/priceoscillator.py +262 -0
  379. backtrader/indicators/psar.py +212 -0
  380. backtrader/indicators/rmi.py +69 -0
  381. backtrader/indicators/rsi.py +440 -0
  382. backtrader/indicators/sma.py +141 -0
  383. backtrader/indicators/smma.py +116 -0
  384. backtrader/indicators/spread.py +54 -0
  385. backtrader/indicators/stochastic.py +263 -0
  386. backtrader/indicators/supertrend.py +436 -0
  387. backtrader/indicators/trend_ext.py +105 -0
  388. backtrader/indicators/trix.py +202 -0
  389. backtrader/indicators/tsi.py +155 -0
  390. backtrader/indicators/ultimateoscillator.py +158 -0
  391. backtrader/indicators/vortex.py +62 -0
  392. backtrader/indicators/williams.py +194 -0
  393. backtrader/indicators/wma.py +103 -0
  394. backtrader/indicators/zlema.py +135 -0
  395. backtrader/indicators/zlind.py +104 -0
  396. backtrader/linebuffer.py +3155 -0
  397. backtrader/lineiterator.py +2911 -0
  398. backtrader/lineroot.py +1106 -0
  399. backtrader/lineseries.py +2559 -0
  400. backtrader/live_trading/__init__.py +31 -0
  401. backtrader/live_trading/interface.py +404 -0
  402. backtrader/mathsupport.py +94 -0
  403. backtrader/metabase.py +1804 -0
  404. backtrader/mixins/__init__.py +21 -0
  405. backtrader/mixins/singleton.py +118 -0
  406. backtrader/observer.py +106 -0
  407. backtrader/observers/__init__.py +45 -0
  408. backtrader/observers/benchmark.py +126 -0
  409. backtrader/observers/broker.py +184 -0
  410. backtrader/observers/buysell.py +144 -0
  411. backtrader/observers/drawdown.py +161 -0
  412. backtrader/observers/logreturns.py +113 -0
  413. backtrader/observers/timereturn.py +86 -0
  414. backtrader/observers/trade_logger.py +2972 -0
  415. backtrader/observers/tradelogger.py +6 -0
  416. backtrader/observers/trades.py +258 -0
  417. backtrader/order.py +1114 -0
  418. backtrader/parameters.py +2345 -0
  419. backtrader/plot/__init__.py +54 -0
  420. backtrader/plot/finance.py +1022 -0
  421. backtrader/plot/formatters.py +200 -0
  422. backtrader/plot/locator.py +353 -0
  423. backtrader/plot/multicursor.py +495 -0
  424. backtrader/plot/plot.py +2500 -0
  425. backtrader/plot/plot_plotly.py +1351 -0
  426. backtrader/plot/scheme.py +253 -0
  427. backtrader/plot/utils.py +104 -0
  428. backtrader/position.py +290 -0
  429. backtrader/position_modes.py +132 -0
  430. backtrader/profiles.py +254 -0
  431. backtrader/reports/__init__.py +39 -0
  432. backtrader/reports/charts.py +371 -0
  433. backtrader/reports/performance.py +620 -0
  434. backtrader/reports/reporter.py +660 -0
  435. backtrader/resamplerfilter.py +1001 -0
  436. backtrader/signal.py +118 -0
  437. backtrader/signals/__init__.py +17 -0
  438. backtrader/sizer.py +114 -0
  439. backtrader/sizers/__init__.py +26 -0
  440. backtrader/sizers/fixedsize.py +161 -0
  441. backtrader/sizers/percents_sizer.py +119 -0
  442. backtrader/store.py +221 -0
  443. backtrader/stores/__init__.py +33 -0
  444. backtrader/stores/btapistore.py +15506 -0
  445. backtrader/stores/livestore.py +137 -0
  446. backtrader/stores/vchartfile.py +96 -0
  447. backtrader/strategy.py +3655 -0
  448. backtrader/talib.py +280 -0
  449. backtrader/test_helpers.py +96 -0
  450. backtrader/timer.py +358 -0
  451. backtrader/trade.py +442 -0
  452. backtrader/tradingcal.py +361 -0
  453. backtrader/utils/__init__.py +68 -0
  454. backtrader/utils/autodict.py +251 -0
  455. backtrader/utils/date.py +71 -0
  456. backtrader/utils/dateintern.py +509 -0
  457. backtrader/utils/flushfile.py +94 -0
  458. backtrader/utils/fractal.py +101 -0
  459. backtrader/utils/get_metrics.py +101 -0
  460. backtrader/utils/load_data.py +209 -0
  461. backtrader/utils/log_message.py +998 -0
  462. backtrader/utils/ordereddefaultdict.py +75 -0
  463. backtrader/utils/py3.py +296 -0
  464. backtrader/version.py +21 -0
  465. backtrader/writer.py +372 -0
backtrader/timer.py ADDED
@@ -0,0 +1,358 @@
1
+ #!/usr/bin/env python
2
+ """Timer Module - Time-based event scheduling.
3
+
4
+ This module provides the Timer class for scheduling time-based notifications
5
+ during backtesting. Timers can trigger at specific times, session start/end,
6
+ or at repeating intervals.
7
+
8
+ Constants:
9
+ SESSION_TIME: Timer triggers at a specific time.
10
+ SESSION_START: Timer triggers at session start.
11
+ SESSION_END: Timer triggers at session end.
12
+
13
+ Example:
14
+ Creating a timer that triggers at session start:
15
+ >>> timer = bt.Timer(when=bt.Timer.SESSION_START, weekdays=[0, 1, 2, 3, 4])
16
+ >>> cerebro.add_timer(timer)
17
+ """
18
+
19
+ import bisect
20
+ import collections
21
+ from datetime import date, datetime, timedelta
22
+
23
+ from .feed import AbstractDataBase
24
+ from .parameters import ParameterDescriptor, ParameterizedBase
25
+ from .utils import TIME_MAX, date2num, num2date
26
+ from .utils.py3 import integer_types, range
27
+
28
+ # from timer import * can only import these constants and classes
29
+ __all__ = ["SESSION_TIME", "SESSION_START", "SESSION_END", "Timer"]
30
+
31
+ # Values of these three constants
32
+ SESSION_TIME, SESSION_START, SESSION_END = range(3)
33
+
34
+
35
+ # Timer class - refactored to use new parameter system
36
+ class Timer(ParameterizedBase):
37
+ """Timer class for scheduling time-based notifications in backtrader.
38
+
39
+ Timers can trigger at specific times of day, session boundaries, or at
40
+ repeating intervals. They can filter by weekdays and monthdays.
41
+
42
+ Params:
43
+ tid: Timer ID for identification.
44
+ owner: Owner object of the timer.
45
+ strats: Whether to notify strategies (default: False).
46
+ when: When to trigger (time, SESSION_START, or SESSION_END).
47
+ offset: Time offset for the trigger.
48
+ repeat: Repeat interval for recurring timers.
49
+ weekdays: List of weekdays when timer is active (0=Monday, 6=Sunday).
50
+ weekcarry: Whether to carry over to next weekday if missed.
51
+ monthdays: List of month days when timer is active.
52
+ monthcarry: Whether to carry over to next month day if missed.
53
+ allow: Callback function to allow/disallow timer on specific dates.
54
+ tzdata: Timezone data for the timer.
55
+ cheat: Whether timer can execute before broker.
56
+
57
+ Example:
58
+ >>> timer = bt.Timer(when=datetime.time(9, 30), weekdays=[0, 1, 2, 3, 4])
59
+ >>> cerebro.add_timer(timer)
60
+ """
61
+
62
+ # Use new parameter descriptor system to define parameters
63
+ tid = ParameterDescriptor(default=None, doc="Timer ID")
64
+ owner = ParameterDescriptor(default=None, doc="Owner object of the timer")
65
+ strats = ParameterDescriptor(default=False, type_=bool, doc="Whether to notify strategies")
66
+ when = ParameterDescriptor(
67
+ default=None, doc="When to trigger the timer (time, SESSION_START, or SESSION_END)"
68
+ )
69
+ offset = ParameterDescriptor(
70
+ default=timedelta(), type_=timedelta, doc="Time offset for the timer"
71
+ )
72
+ repeat = ParameterDescriptor(
73
+ default=timedelta(), type_=timedelta, doc="Repeat interval for the timer"
74
+ )
75
+ weekdays = ParameterDescriptor(
76
+ default=None, type_=(list, type(None)), doc="List of weekdays when timer is active"
77
+ )
78
+ weekcarry = ParameterDescriptor(
79
+ default=False, type_=bool, doc="Whether to carry over to next weekday if missed"
80
+ )
81
+ monthdays = ParameterDescriptor(
82
+ default=None, type_=(list, type(None)), doc="List of month days when timer is active"
83
+ )
84
+ monthcarry = ParameterDescriptor(
85
+ default=True, type_=bool, doc="Whether to carry over to next month day if missed"
86
+ )
87
+ allow = ParameterDescriptor(
88
+ default=None, doc="Callback function to allow/disallow timer on specific dates"
89
+ )
90
+ tzdata = ParameterDescriptor(default=None, doc="Timezone data for the timer")
91
+ cheat = ParameterDescriptor(
92
+ default=False, type_=bool, doc="Whether timer can cheat (execute before broker)"
93
+ )
94
+
95
+ # Values of these three constants
96
+ SESSION_TIME, SESSION_START, SESSION_END = range(3)
97
+
98
+ # Initialize
99
+ def __init__(self, *args, **kwargs):
100
+ """Initialize the Timer instance.
101
+
102
+ Args:
103
+ *args: Positional arguments.
104
+ **kwargs: Keyword arguments for timer parameters.
105
+ """
106
+ # Save passed parameters
107
+ self.args = args
108
+ self.kwargs = kwargs
109
+
110
+ # Call parent class initialization
111
+ super().__init__(**kwargs)
112
+
113
+ # Initialize internal state variables
114
+ self._weekmask: collections.deque = collections.deque()
115
+ self._dwhen = None
116
+ self._dtwhen = None
117
+ self.lastwhen = None
118
+ self._curweek = None
119
+ self._monthmask: collections.deque = collections.deque()
120
+ self._curmonth = None
121
+ self._curdate = None
122
+ self._nexteos = None
123
+ self._isdata = None
124
+ self._rstwhen = None
125
+ self._tzdata = None
126
+
127
+ # Start
128
+ def start(self, data):
129
+ """Initialize the timer with the associated data source.
130
+
131
+ Args:
132
+ data: Data source for time reference and session information.
133
+ """
134
+ # write down the 'reset when' value
135
+ # If parameter when is not an integer
136
+ if not isinstance(self.get_param("when"), integer_types): # expect time/datetime
137
+ # Reset when and set timezone data
138
+ self._rstwhen = self.get_param("when")
139
+ self._tzdata = self.get_param("tzdata")
140
+ # If parameter when is an integer
141
+ else:
142
+ # If timezone data is None, timezone data equals data, otherwise timezone data is tzdata
143
+ self._tzdata = data if self.get_param("tzdata") is None else self.get_param("tzdata")
144
+ # If when equals session start time, reset time to session start time
145
+ if self.get_param("when") == SESSION_START:
146
+ self._rstwhen = self._tzdata.p.sessionstart
147
+ # If when equals session end time, reset time to session end time
148
+ elif self.get_param("when") == SESSION_END:
149
+ self._rstwhen = self._tzdata.p.sessionend
150
+ # Check if timezone data is data
151
+ self._isdata = isinstance(self._tzdata, AbstractDataBase)
152
+ # Reset when
153
+ self._reset_when()
154
+ # End time of this trading session
155
+ self._nexteos = datetime.min
156
+ # Current time
157
+ self._curdate = date.min
158
+ # Current month
159
+ self._curmonth = -1 # non-existent month
160
+ # Month mask
161
+ self._monthmask = collections.deque()
162
+ # Current week
163
+ self._curweek = -1 # non-existent week
164
+ # Week mask
165
+ self._weekmask = collections.deque()
166
+
167
+ # Reset when, set _when, _dtwhen, _dwhen, _lastcall
168
+ def _reset_when(self, ddate=datetime.min):
169
+ self._when = self._rstwhen
170
+ self._dtwhen = self._dwhen = None
171
+ self._lastcall = ddate
172
+
173
+ # Check month
174
+ def _check_month(self, ddate):
175
+ # If no activation on specific day of month, return True
176
+ if not self.get_param("monthdays"):
177
+ return True
178
+ # Month mask
179
+ mask = self._monthmask
180
+ # If it's a holiday, whether to carry over to next trading day
181
+ daycarry = False
182
+ # Month of date
183
+ dmonth = ddate.month
184
+ # If date's month is not equal to current month
185
+ if dmonth != self._curmonth:
186
+ # Current month equals passed date's month
187
+ self._curmonth = dmonth # write down new month
188
+ # When parameter monthcarry is True and mask is True, carry over to next trading day. Otherwise, don't carry over
189
+ daycarry = self.get_param("monthcarry") and bool(mask)
190
+ # Month mask equals days activated each month
191
+ self._monthmask = mask = collections.deque(self.get_param("monthdays") or [])
192
+ # Day of month for date
193
+ dday = ddate.day
194
+ # Insert index in activation dates, elements left of index are less than dday, elements right of index are greater than or equal to dday
195
+ dc = bisect.bisect_left(mask, dday) # "left" for days before dday
196
+ # Whether daycarry is True, if originally daycarry is True, or month date carry over and dc > 0, daycarry value is True, otherwise False
197
+ daycarry = daycarry or (self.get_param("monthcarry") and dc > 0)
198
+ # If dc is less than length of activation date list
199
+ if dc < len(mask):
200
+ # If new index is still greater than 0, increment dc by 1, otherwise curday is False
201
+ curday = bisect.bisect_right(mask, dday, lo=dc) > 0 # check dday
202
+ dc += curday
203
+ else:
204
+ curday = False
205
+ # When dc > 0, delete one data from leftmost each time, dc decrements by 1
206
+ while dc:
207
+ mask.popleft()
208
+ dc -= 1
209
+ # Return specific daycarry value or curday value
210
+ return daycarry or curday
211
+
212
+ # Check week
213
+ def _check_week(self, ddate=date.min):
214
+ # If timer not activated on specific weekday, return True
215
+ if not self.get_param("weekdays"):
216
+ return True
217
+ # Calculate current time's year, week number, weekday
218
+ _, dweek, dwkday = ddate.isocalendar()
219
+ # Week mask
220
+ mask = self._weekmask
221
+ # Don't carry over to next trading day
222
+ daycarry = False
223
+ # If time's week number is not equal to current week number
224
+ if dweek != self._curweek:
225
+ # Current week number equals passed time's week number
226
+ self._curweek = dweek # write down new month
227
+ # When parameter weekcarry is True and mask is True, carry over to next trading day. Otherwise, don't carry over
228
+ daycarry = self.get_param("weekcarry") and bool(mask)
229
+ # Set _weekmask to weekly timer activation time
230
+ self._weekmask = mask = collections.deque(self.get_param("weekdays") or [])
231
+ # Get index of current weekday in activation date list, making numbers left of list less than current number, numbers right of list greater than or equal to current number
232
+ dc = bisect.bisect_left(mask, dwkday) # "left" for days before dday
233
+ # Condition for daycarry to be True: daycarry is True, or both holiday carry over is True and dc > 0
234
+ daycarry = daycarry or (self.get_param("weekcarry") and dc > 0)
235
+ # If dc value is less than length of activation date sequence
236
+ if dc < len(mask):
237
+ # Get specific index, if index > 0, curday equals True
238
+ curday = bisect.bisect_right(mask, dwkday, lo=dc) > 0 # check dday
239
+ # Increment dc
240
+ dc += curday
241
+ else:
242
+ curday = False
243
+ # When dc > 0, delete one data from leftmost each time, dc decrements by 1
244
+ while dc:
245
+ mask.popleft()
246
+ dc -= 1
247
+ # Return specific daycarry value or curday value, return True if one is True, return False if both are False
248
+ return daycarry or curday
249
+
250
+ # Check time
251
+ def check(self, dt):
252
+ """Check if the timer should trigger at the given time.
253
+
254
+ Args:
255
+ dt: Numeric datetime to check.
256
+
257
+ Returns:
258
+ bool: True if timer should trigger, False otherwise.
259
+ """
260
+ # Current date and time
261
+ d = num2date(dt)
262
+ # Current date
263
+ ddate = d.date()
264
+ # If last timer call equals current date, return False
265
+ if self._lastcall == ddate: # not repeating, awaiting date change
266
+ return False
267
+ # If current time is greater than this trading session's end time
268
+ if d > self._nexteos:
269
+ # If _tzdata is timezone data, call _getnexteos() to return specific time, otherwise use latest time of this trading session as end time
270
+ if self._isdata: # eos provided by data
271
+ nexteos, _ = self._tzdata._getnexteos()
272
+ # If _tzdata is timezone, compose current trading session's maximum time
273
+ else: # generic eos
274
+ nexteos = datetime.combine(ddate, TIME_MAX)
275
+ # End time of current day
276
+ self._nexteos = nexteos
277
+ # Reset timer
278
+ self._reset_when()
279
+ # If date's passed time is greater than current time, set current time to date's passed time
280
+ if ddate > self._curdate: # day change
281
+ self._curdate = ddate
282
+ # Check month date, if month date check returns True, check week date; if month date check is True,
283
+ # and allow is not None, call allow(ddate) to calculate ret
284
+ ret = self._check_month(ddate)
285
+ if ret:
286
+ ret = self._check_week(ddate)
287
+ if ret and self.get_param("allow") is not None:
288
+ ret = self.get_param("allow")(ddate)
289
+ # If ret is False, need to reset when, return False
290
+ if not ret:
291
+ self._reset_when(ddate) # this day won't make it
292
+ return False # timer target isn't met
293
+
294
+ # no day change or passed month, week and allow filters on date change
295
+ dwhen = self._dwhen
296
+ dtwhen = self._dtwhen
297
+ # If dtwhen is None
298
+ if dtwhen is None:
299
+ # dwhen represents minimum time of current day
300
+ # _when is the timer's time-of-day (a datetime.time from params).
301
+ dwhen = datetime.combine(ddate, self._when)
302
+ # If there is time offset, dwhen is minimum time of current day plus time offset
303
+ if self.get_param("offset"):
304
+ dwhen += self.get_param("offset")
305
+ # Set _dwhen
306
+ self._dwhen = dwhen
307
+ # If _tzdata is data, set dwhen to dtwhen
308
+ if self._isdata:
309
+ self._dtwhen = dtwhen = self._tzdata.date2num(dwhen)
310
+ # Otherwise, need to use timezone when converting to time
311
+ else:
312
+ self._dtwhen = dtwhen = date2num(dwhen, tz=self._tzdata)
313
+ # If time is less than dtwhen, return False, timer target not met
314
+ if dt < dtwhen:
315
+ return False # timer target isn't met
316
+ # Record last time when occurred
317
+ self.lastwhen = dwhen
318
+
319
+ # If not repeating, reset when
320
+ if not self.get_param("repeat"): # cannot repeat
321
+ self._reset_when(ddate) # reset and mark as called on ddate
322
+ # If need to repeat
323
+ else:
324
+ # If date's time is greater than current trading session's last time
325
+ if d > self._nexteos:
326
+ # If tzdata is data, get current trading session's last time
327
+ if self._isdata: # eos provided by data
328
+ nexteos, _ = self._tzdata._getnexteos()
329
+ # If _tzdata is timezone, compose current trading session's maximum time
330
+ else: # generic eos
331
+ nexteos = datetime.combine(ddate, TIME_MAX)
332
+ # Current trading session's last time
333
+ self._nexteos = nexteos
334
+ # If date time hasn't exceeded current trading day's last time, still within same trading day
335
+ else:
336
+ nexteos = self._nexteos
337
+ # while loop
338
+ while True:
339
+ # Next when start time
340
+ dwhen += self.get_param("repeat")
341
+ # If dwhen exceeds current trading session's last time, reset when, exit while loop
342
+ if dwhen > nexteos: # if new schedule is beyond session
343
+ self._reset_when(ddate) # reset to original point
344
+ break
345
+ # If dwhen is greater than current time
346
+ if dwhen > d: # gone over current datetime
347
+ # Convert next timer's time to timestamp
348
+ self._dtwhen = dtwhen = date2num(dwhen) # float timestamp
349
+ # Get the localized expected next time
350
+ # If _tzdata is data, calculate next timer arrival time; if _tzdata is timezone, calculate next timer arrival time considering timezone
351
+ if self._isdata:
352
+ self._dwhen = self._tzdata.num2date(dtwhen)
353
+ else: # assume pytz compatible or None
354
+ self._dwhen = num2date(dtwhen, tz=self._tzdata)
355
+
356
+ break
357
+
358
+ return True # timer target was met