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
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env python
2
+ """Renko Filter Module - Renko chart bars.
3
+
4
+ This module provides the Renko filter for converting price data
5
+ into Renko bricks for charting.
6
+
7
+ Classes:
8
+ Renko: Creates Renko bars from price data.
9
+
10
+ Example:
11
+ >>> data = bt.feeds.GenericCSVData(dataname='data.csv')
12
+ >>> data.addfilter(bt.filters.Renko(size=10))
13
+ >>> cerebro.adddata(data)
14
+ """
15
+
16
+ from . import Filter
17
+
18
+ __all__ = ["Renko"]
19
+
20
+
21
+ class Renko(Filter):
22
+ """Modify the data stream to draw Renko bars (or bricks)
23
+
24
+ Params:
25
+
26
+ - ``hilo`` (default: *False*) Use high and low instead of close to decide
27
+ if a new brick is needed
28
+
29
+ - ``size`` (default: *None*) The size to consider for each brick
30
+
31
+ - ``autosize`` (default: *20.0*) If *size* is *None*, this will be used
32
+ to autocalculate the size of the bricks (simply dividing the current
33
+ price by the given value)
34
+
35
+ - ``dynamic`` (default: *False*) If *True* and using *autosize*, the size
36
+ of the bricks will be recalculated when moving to a new brick. This
37
+ will, of course, eliminate the perfect alignment of Renko bricks.
38
+
39
+ - ``align`` (default: *1.0*) Factor used to align the price boundaries of
40
+ the bricks. If the price is for example *3563.25* and *align* is
41
+ *10.0*, the resulting aligned price will be *3560*. The calculation:
42
+
43
+ - 3563.25 / 10.0 = 356.325
44
+ - round it and remove the decimals -> 356
45
+ - 356 * 10.0 -> 3560
46
+
47
+ - ``roundstart`` (default: *True*) If *True*, round the initial start
48
+ value to int. Else keep the original value, which should aid when
49
+ backtesting penny stocks
50
+
51
+ See:
52
+ - http://stockcharts.com/school/doku.php?id=chart_school:chart_analysis:renko
53
+
54
+ """
55
+
56
+ params = (
57
+ ("hilo", False),
58
+ ("size", None),
59
+ ("autosize", 20.0),
60
+ ("dynamic", False),
61
+ ("align", 1.0),
62
+ ("roundstart", True),
63
+ )
64
+
65
+ def __init__(self, data, *args, **kwargs):
66
+ """Initialize the Renko filter.
67
+
68
+ Args:
69
+ data: The data feed to apply the filter to.
70
+ *args: Variable length argument list.
71
+ **kwargs: Additional keyword arguments passed to parent class.
72
+ """
73
+ super().__init__(data, *args, **kwargs)
74
+ self._bot = None
75
+ self._top = None
76
+ self._size = None
77
+
78
+ def nextstart(self, data):
79
+ """Initialize Renko brick boundaries on the first data point.
80
+
81
+ This method sets up the initial brick size and top/bottom boundaries
82
+ based on the opening price and configured parameters.
83
+
84
+ Args:
85
+ data: The data feed containing the first bar.
86
+ """
87
+ o = data.open[0]
88
+ o = round(o / self.p.align, 0) * self.p.align # aligned
89
+ self._size = self.p.size or (float(o // self.p.autosize) if self.p.autosize else 1.0)
90
+ if self.p.roundstart:
91
+ o = int(o)
92
+
93
+ self._top = o + self._size
94
+ self._bot = o - self._size
95
+
96
+ def next(self, data):
97
+ """Process each bar to create Renko bricks.
98
+
99
+ This method analyzes the current price data and creates Renko bricks
100
+ when price moves beyond the current brick boundaries. Each brick has
101
+ a fixed size, and new bricks are created when price breaks through
102
+ the current brick's top or bottom boundary.
103
+
104
+ Args:
105
+ data: The data feed containing current bar data.
106
+
107
+ Returns:
108
+ bool: True if the stream length changed (bar removed),
109
+ False if unchanged (Renko brick created).
110
+ """
111
+ c = data.close[0]
112
+ h = data.high[0]
113
+ low = data.low[0]
114
+
115
+ if self.p.hilo:
116
+ hiprice = h
117
+ loprice = low
118
+ else:
119
+ hiprice = loprice = c
120
+
121
+ if hiprice >= self._top:
122
+ # deliver a renko brick from top -> top + size
123
+ self._bot = bot = self._top
124
+
125
+ if self.p.size is None and self.p.dynamic:
126
+ self._size = float(c // self.p.autosize) if self.p.autosize else 1.0
127
+ top = bot + self._size
128
+ top = round(top / self.p.align, 0) * self.p.align # aligned
129
+ else:
130
+ top = bot + self._size
131
+
132
+ self._top = top
133
+
134
+ data.open[0] = bot
135
+ data.low[0] = bot
136
+ data.high[0] = top
137
+ data.close[0] = top
138
+ data.volume[0] = 0.0
139
+ data.openinterest[0] = 0.0
140
+ return False # length of data stream is unaltered
141
+
142
+ if loprice <= self._bot:
143
+ # deliver a renko brick from bot -> bot - size
144
+ self._top = top = self._bot
145
+
146
+ if self.p.size is None and self.p.dynamic:
147
+ self._size = float(c // self.p.autosize) if self.p.autosize else 1.0
148
+ bot = top - self._size
149
+ bot = round(bot / self.p.align, 0) * self.p.align # aligned
150
+ else:
151
+ bot = top - self._size
152
+
153
+ self._bot = bot
154
+
155
+ data.open[0] = top
156
+ data.low[0] = top
157
+ data.high[0] = bot
158
+ data.close[0] = bot
159
+ data.volume[0] = 0.0
160
+ data.openinterest[0] = 0.0
161
+ return False # length of data stream is unaltered
162
+
163
+ data.backwards()
164
+ return True # length of stream was changed, get new bar
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/env python
2
+ """Session Filter Module - Session bar filling.
3
+
4
+ This module provides the SessionFiller filter for adding missing
5
+ bars over gaps within a trading session.
6
+
7
+ Classes:
8
+ SessionFiller: Fills missing bars within a session.
9
+
10
+ Example:
11
+ >>> data = bt.feeds.GenericCSVData(dataname='data.csv')
12
+ >>> data.addfilter(bt.filters.SessionFiller())
13
+ >>> cerebro.adddata(data)
14
+ """
15
+
16
+ from datetime import datetime, timedelta
17
+
18
+ from ..dataseries import TimeFrame
19
+ from ..parameters import ParameterDescriptor, ParameterizedBase
20
+
21
+
22
+ class SessionFiller(ParameterizedBase):
23
+ """
24
+ Bar Filler to add missing bars over gaps in a session.
25
+
26
+ This class has been refactored from MetaParams to the new ParameterizedBase
27
+ system for Day 36-38 of the metaprogramming removal project.
28
+
29
+ How to use it:
30
+
31
+ - Instantiate the class (1 instance per filter needed)
32
+
33
+ - ``addfilter`` it to the data with ``data.addfilter(filter_instance)``
34
+
35
+ Bar ``fill`` logic:
36
+
37
+ - The ``fill_price`` will be used to fill ``open``, ``high``, ``low`` and
38
+ ``close``
39
+
40
+ If ``None`` then the ``close`` price of the last (previous) bar will be
41
+ used.
42
+
43
+ - Volume will be set to ``fill_vol``
44
+
45
+ - ``openinterest`` will be set to ``fill_oi``
46
+
47
+ Parameters:
48
+
49
+ - fill_price (def: None):
50
+
51
+ Price to be used to fill missing bars. If None will be used the closing
52
+ price of the previous bar
53
+
54
+ - fill_vol (def: float('NaN')):
55
+
56
+ Value to use to fill the missing volume
57
+
58
+ - Fill_oi (def: float('NaN')):
59
+
60
+ Value to use to fill the missing Open Interest
61
+
62
+ - Skip_first_fill (def: True):
63
+
64
+ Upon seeing the 1st valid bar do not fill from the sessionstart up to
65
+ that bar
66
+ """
67
+
68
+ # Use new parameter descriptor system to define parameters
69
+ fill_price = ParameterDescriptor(
70
+ default=None,
71
+ doc="Price to be used to fill missing bars. If None will be used the closing price of the previous bar",
72
+ )
73
+ fill_vol = ParameterDescriptor(
74
+ default=float("NaN"), type_=float, doc="Value to use to fill the missing volume"
75
+ )
76
+ fill_oi = ParameterDescriptor(
77
+ default=float("NaN"), type_=float, doc="Value to use to fill the missing Open Interest"
78
+ )
79
+ skip_first_fill = ParameterDescriptor(
80
+ default=True,
81
+ type_=bool,
82
+ doc="Upon seeing the 1st valid bar do not fill from the sessionstart up to that bar",
83
+ )
84
+
85
+ MAXDATE = datetime.max
86
+
87
+ # Minimum delta unit in between bars
88
+ _tdeltas = {
89
+ TimeFrame.Minutes: timedelta(seconds=60),
90
+ TimeFrame.Seconds: timedelta(seconds=1),
91
+ TimeFrame.MicroSeconds: timedelta(microseconds=1),
92
+ }
93
+
94
+ def __init__(self, data, **kwargs):
95
+ """Initialize the SessionFiller.
96
+
97
+ Args:
98
+ data: The data feed to apply the filter to.
99
+ **kwargs: Additional keyword arguments passed to parent class.
100
+ """
101
+ super().__init__(**kwargs)
102
+ # Calculate and save timedelta for timeframe
103
+ self._tdframe = self._tdeltas[data._timeframe]
104
+ self._tdunit = self._tdeltas[data._timeframe] * data._compression
105
+
106
+ self.seenbar = False # control if at least one bar has been seen
107
+ self.sessend = self.MAXDATE # maxdate is the control for session bar
108
+
109
+ def __call__(self, data):
110
+ """
111
+ Params:
112
+ - data: the data source to filter/process
113
+
114
+ Returns:
115
+ - False (always) because this filter does not remove bars from the
116
+ stream
117
+
118
+ The logic (starting with a session end control flag of MAXDATE)
119
+
120
+ - If new bar is over session end (never true for 1st bar)
121
+
122
+ Fill up to the session end.
123
+ Reset sessionend to MAXDATE & fall through
124
+
125
+ - If the session end is flagged as MAXDATE
126
+
127
+ Recalculate session limits and check whether the bar is within them
128
+
129
+ If so, fill up and record the last seen tim
130
+
131
+ - Else ... the incoming bar is in the session, fill up to it
132
+ """
133
+ # Get time of current (from a data source) bar
134
+ ret = False
135
+
136
+ dtime_cur = data.datetime.datetime()
137
+
138
+ if dtime_cur > self.sessend:
139
+ # bar over session end - fill up and invalidate
140
+ # Do not put current bar in stack to let it be evaluated below
141
+ # Fill up to endsession + the smallest unit of timeframe
142
+ ret = self._fillbars(data, self.dtime_prev, self.sessend + self._tdframe, tostack=False)
143
+ self.sessend = self.MAXDATE
144
+
145
+ # Fall through from previous check ... the bar which is over the
146
+ # session could already be in a new session and within the limits
147
+ if self.sessend == self.MAXDATE:
148
+ # No bar seen yet or one went over the previous session limit
149
+ ddate = dtime_cur.date()
150
+ sessstart = datetime.combine(ddate, data.p.sessionstart)
151
+ self.sessend = sessend = datetime.combine(ddate, data.p.sessionend)
152
+
153
+ if sessstart <= dtime_cur <= sessend:
154
+ # 1st bar from session in the session - fill from session start
155
+ if self.seenbar or not self.get_param("skip_first_fill"):
156
+ ret = self._fillbars(data, sessstart - self._tdunit, dtime_cur)
157
+
158
+ self.seenbar = True
159
+ self.dtime_prev = dtime_cur
160
+
161
+ else:
162
+ # Seen a previous bar, and this is in the session - fill up to it
163
+ ret = self._fillbars(data, self.dtime_prev, dtime_cur)
164
+ self.dtime_prev = dtime_cur
165
+
166
+ return ret
167
+
168
+ def _fillbars(self, data, time_start, time_end, tostack=True):
169
+ """
170
+ Fills one by one bars as needed from time_start to time_end
171
+
172
+ Invalidates the control dtime_prev if requested
173
+ """
174
+ # Control flag - bars added to the stack
175
+ dirty = 0
176
+
177
+ time_start += self._tdunit
178
+ while time_start < time_end:
179
+ dirty += self._fillbar(data, time_start)
180
+ time_start += self._tdunit
181
+
182
+ if dirty and tostack:
183
+ data._save2stack(erase=True)
184
+
185
+ return bool(dirty) or not tostack
186
+
187
+ def _fillbar(self, data, dtime):
188
+ # Prepare an array of the necessary size
189
+ bar = [float("Nan")] * data.size()
190
+
191
+ # Fill datetime
192
+ bar[data.DateTime] = data.date2num(dtime)
193
+
194
+ # Fill the prices
195
+ price = self.get_param("fill_price") or data.close[-1]
196
+ for pricetype in [data.Open, data.High, data.Low, data.Close]:
197
+ bar[pricetype] = price
198
+
199
+ # Fill volume and open interest
200
+ bar[data.Volume] = self.get_param("fill_vol")
201
+ bar[data.OpenInterest] = self.get_param("fill_oi")
202
+
203
+ # Fill extra lines the data feed may have defined beyond DateTime
204
+ for i in range(data.DateTime + 1, data.size()):
205
+ bar[i] = data.lines[i][0]
206
+
207
+ # Add to the stack of bars to save
208
+ data._add2stack(bar)
209
+
210
+ return True
211
+
212
+
213
+ class SessionFilterSimple(ParameterizedBase):
214
+ """
215
+ This class can be applied to a data source as a filter and will filter out
216
+ intraday bars which fall outside the regular session times (ie: pre/post
217
+ market data)
218
+
219
+ This class has been refactored from MetaParams to the new ParameterizedBase
220
+ system for Day 36-38 of the metaprogramming removal project.
221
+
222
+ This is a "simple" filter and must NOT manage the stack of the data (passed
223
+ during init and __call__)
224
+
225
+ It needs no "last" method because it has nothing to deliver
226
+
227
+ Bar Management will be done by the SimpleFilterWrapper class made which is
228
+ added durint the DataBase.addfilter_simple call
229
+ """
230
+
231
+ def __init__(self, data, **kwargs):
232
+ """Initialize the SessionFilterSimple.
233
+
234
+ Args:
235
+ data: The data feed to apply the filter to.
236
+ **kwargs: Additional keyword arguments passed to parent class.
237
+ """
238
+ super().__init__(**kwargs)
239
+
240
+ def __call__(self, data):
241
+ """
242
+ Return Values:
243
+
244
+ - False: nothing to filter
245
+ - True: filter current bar (because it's not in the session times)
246
+ """
247
+ # Both ends of the comparison are in the session
248
+ return not (data.p.sessionstart <= data.datetime.time(0) <= data.p.sessionend)
249
+
250
+
251
+ class SessionFilter(ParameterizedBase):
252
+ """
253
+ This class can be applied to a data source as a filter and will filter out
254
+ intraday bars which fall outside the regular session times (ie: pre/post
255
+ market data)
256
+
257
+ This class has been refactored from MetaParams to the new ParameterizedBase
258
+ system for Day 36-38 of the metaprogramming removal project.
259
+
260
+ This is a "non-simple" filter and must manage the stack of the data (passed
261
+ during init and __call__)
262
+
263
+ It needs no "last" method because it has nothing to deliver
264
+ """
265
+
266
+ def __init__(self, data, **kwargs):
267
+ """Initialize the SessionFilter.
268
+
269
+ Args:
270
+ data: The data feed to apply the filter to.
271
+ **kwargs: Additional keyword arguments passed to parent class.
272
+ """
273
+ super().__init__(**kwargs)
274
+
275
+ def __call__(self, data):
276
+ """
277
+ Return Values:
278
+
279
+ - False: data stream was not touched
280
+ - True: data stream was manipulated (bar outside session times and
281
+ - removed)
282
+ """
283
+ if data.p.sessionstart <= data.datetime.time(0) <= data.p.sessionend:
284
+ # Both ends of the comparison are in the session
285
+ return False # say the stream is untouched
286
+
287
+ # bar outside the regular session times
288
+ data.backwards() # remove bar from data stack
289
+ return True # the signal the data was manipulated
backtrader/flt.py ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env python
2
+ """Filter Module - Data filtering for backtrader.
3
+
4
+ This module provides the base Filter class for data filtering operations.
5
+ Filters can be applied to data feeds to modify or filter bars during
6
+ backtesting.
7
+
8
+ Classes:
9
+ Filter: Base class for data filters.
10
+
11
+ Example:
12
+ >>> class MyFilter(bt.Filter):
13
+ ... def next(self, data):
14
+ ... # Modify data bar
15
+ ... pass
16
+ """
17
+
18
+ from .parameters import ParameterizedBase
19
+
20
+ __all__ = ["Filter"]
21
+
22
+
23
+ # Filter class - refactored to use new parameter system
24
+ class Filter(ParameterizedBase):
25
+ """Base class for data filters in backtrader.
26
+
27
+ Filters process data bars and can modify or reject them. Subclasses
28
+ should override the next() method to implement custom filtering logic.
29
+
30
+ Attributes:
31
+ _firsttime: Tracks if this is the first call.
32
+
33
+ This class has been refactored from MetaParams to the new ParameterizedBase
34
+ system for Day 36-38 of the metaprogramming removal project.
35
+ """
36
+
37
+ _firsttime = True
38
+
39
+ def __init__(self, data_, **kwargs):
40
+ """Initialize the Filter.
41
+
42
+ Args:
43
+ data_: The data feed to filter.
44
+ **kwargs: Additional keyword arguments for parameters.
45
+ """
46
+ # Call parent class initialization
47
+ super().__init__(**kwargs)
48
+
49
+ def __call__(self, data):
50
+ """Process a data bar through the filter.
51
+
52
+ Args:
53
+ data: The data feed being filtered.
54
+ """
55
+ # If first time, call nextstart, then set _firsttime to False
56
+ if self._firsttime:
57
+ self.nextstart(data)
58
+ self._firsttime = False
59
+ # Call next
60
+ self.next(data)
61
+
62
+ def nextstart(self, data):
63
+ """Called on the first bar before filtering starts.
64
+
65
+ Args:
66
+ data: The data feed being filtered.
67
+
68
+ Note:
69
+ Override this method to perform one-time initialization.
70
+ """
71
+
72
+ def next(self, data):
73
+ """Process each data bar.
74
+
75
+ Args:
76
+ data: The data feed being filtered.
77
+
78
+ Note:
79
+ Subclasses must override this method to implement filtering logic.
80
+ """