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,449 @@
1
+ #!/usr/bin/env python
2
+ """Backtrader Indicator Module.
3
+
4
+ This module provides the base Indicator class and related infrastructure
5
+ for creating and managing technical analysis indicators. It replaces the
6
+ metaclass-based approach with explicit inheritance and registration.
7
+
8
+ The Indicator class serves as the foundation for all technical indicators
9
+ in backtrader, managing line data, minimum periods, and calculation logic.
10
+ """
11
+
12
+ from .lineiterator import IndicatorBase, LineIterator
13
+ from .lineseries import Lines
14
+ from .metabase import AutoInfoClass, OwnerContext
15
+ from .utils.log_message import get_logger
16
+ from .utils.py3 import range
17
+
18
+ logger = get_logger(__name__)
19
+
20
+
21
+ class IndicatorRegistry:
22
+ """Registry to manage indicator classes and provide caching functionality.
23
+
24
+ This class replaces the metaclass-based indicator registration and
25
+ caching mechanism from the original backtrader implementation.
26
+ """
27
+
28
+ _indcol: dict = {}
29
+ _icache: dict = {}
30
+ _icacheuse = False
31
+
32
+ @classmethod
33
+ def register(cls, name, indicator_cls):
34
+ """Register an indicator class in the registry.
35
+
36
+ Args:
37
+ name: Name of the indicator class
38
+ indicator_cls: The indicator class to register
39
+ """
40
+ if not name.startswith("_") and name != "Indicator":
41
+ cls._indcol[name] = indicator_cls
42
+
43
+ @classmethod
44
+ def cleancache(cls):
45
+ """Clear the indicator cache."""
46
+ cls._icache = {}
47
+
48
+ @classmethod
49
+ def usecache(cls, onoff):
50
+ """Enable or disable indicator caching.
51
+
52
+ Args:
53
+ onoff: If True, enable caching; if False, disable it
54
+ """
55
+ cls._icacheuse = onoff
56
+
57
+ @classmethod
58
+ def get_cached_or_create(cls, indicator_cls, *args, **kwargs):
59
+ """Get cached indicator instance or create new one.
60
+
61
+ Args:
62
+ indicator_cls: The indicator class to instantiate
63
+ *args: Positional arguments for the indicator
64
+ **kwargs: Keyword arguments for the indicator
65
+
66
+ Returns:
67
+ Cached indicator instance if available and caching enabled,
68
+ otherwise a new indicator instance
69
+ """
70
+ if not cls._icacheuse:
71
+ return indicator_cls(*args, **kwargs)
72
+
73
+ # Implement a cache to avoid duplicating lines actions
74
+ ckey = (indicator_cls, tuple(args), tuple(kwargs.items())) # tuples hashable
75
+ try:
76
+ return cls._icache[ckey]
77
+ except TypeError: # something is not hashable
78
+ return indicator_cls(*args, **kwargs)
79
+ except KeyError:
80
+ logger.debug("indicator:79 ignored KeyError")
81
+ # hashable but not in the cache
82
+
83
+ _obj = indicator_cls(*args, **kwargs)
84
+ return cls._icache.setdefault(ckey, _obj)
85
+
86
+
87
+ class Indicator(IndicatorBase):
88
+ """Base class for all technical indicators in Backtrader.
89
+
90
+ This class provides the foundation for creating custom indicators.
91
+ It manages line data, minimum periods, and calculation logic.
92
+ Indicators inherit from IndicatorBase and integrate with the
93
+ LineIterator system for data flow.
94
+
95
+ Attributes:
96
+ _ltype: Line type set to IndType (0) for indicators
97
+ csv: Whether to output this indicator to CSV (default: False)
98
+ aliased: Whether this indicator has an alias name
99
+ """
100
+
101
+ _ltype = LineIterator.IndType
102
+ csv = False
103
+
104
+ def __getitem__(self, ago):
105
+ """CRITICAL FIX: Forward item access to the first line (e.g., sma line)
106
+
107
+ For indicators with named lines like SMA (which has lines.sma), accessing
108
+ indicator[0] should return the value from the first line, not the indicator's
109
+ own array.
110
+ """
111
+ # Use the first line if available
112
+ if hasattr(self, "lines") and hasattr(self.lines, "lines") and len(self.lines.lines) > 0:
113
+ return self.lines.lines[0][ago]
114
+ # Fallback to parent class behavior
115
+ return super().__getitem__(ago)
116
+
117
+ # Track if this is an aliased indicator
118
+ aliased = False
119
+
120
+ def __init_subclass__(cls, **kwargs):
121
+ """Handle subclass registration and initialization.
122
+
123
+ This method is called when a subclass of Indicator is created.
124
+ It performs:
125
+ 1. Lines creation using Lines infrastructure
126
+ 2. Automatic registration in IndicatorRegistry
127
+ 3. Alias handling for module-level access
128
+ 4. next/once method setup for calculation modes
129
+
130
+ Args:
131
+ **kwargs: Additional keyword arguments
132
+ """
133
+ super().__init_subclass__(**kwargs)
134
+
135
+ init = cls.__dict__.get("__init__")
136
+ if init is not None and not getattr(init, "_bt_owner_context_wrapped", False):
137
+
138
+ def owner_context_init(self, *args, **kwargs):
139
+ parent_owner = OwnerContext.get_current_owner(LineIterator)
140
+ with OwnerContext.set_owner(self):
141
+ result = init(self, *args, **kwargs)
142
+
143
+ if (
144
+ parent_owner is not None
145
+ and parent_owner is not self
146
+ and hasattr(parent_owner, "addindicator")
147
+ ):
148
+ old_owner = getattr(self, "_owner", None)
149
+ if old_owner is not parent_owner:
150
+ try:
151
+ old_lists = getattr(old_owner, "_lineiterators", {})
152
+ for indicators in old_lists.values():
153
+ while self in indicators:
154
+ indicators.remove(self)
155
+ except Exception: # nosec B110
156
+ # Best-effort detach from a previous owner; ignore failures.
157
+ logger.warning("indicator:155 suppressed Exception")
158
+ self._owner = parent_owner
159
+ parent_owner.addindicator(self)
160
+
161
+ return result
162
+
163
+ owner_context_init.__name__ = getattr(init, "__name__", "__init__")
164
+ owner_context_init.__doc__ = getattr(init, "__doc__", None)
165
+ owner_context_init._bt_owner_context_wrapped = True
166
+ cls.__init__ = owner_context_init
167
+
168
+ # CRITICAL FIX: Handle lines creation for indicators like LineSeries does
169
+ # This ensures that lines tuples are converted to Lines instances
170
+ lines = cls.__dict__.get("lines", ())
171
+ extralines = cls.__dict__.get("extralines", 0)
172
+
173
+ # Ensure lines is a tuple (it might be a class type)
174
+ if not isinstance(lines, (tuple, list)):
175
+ if hasattr(lines, "_getlines"):
176
+ lines = lines._getlines() or ()
177
+ else:
178
+ lines = ()
179
+ else:
180
+ lines = tuple(lines) # Ensure it's a tuple
181
+
182
+ # Create lines class using the proper Lines infrastructure
183
+ if lines or extralines:
184
+ # Use the LineSeries mechanism to create the lines class
185
+ from .lineseries import Lines
186
+
187
+ cls.lines = Lines._derive("lines", lines, extralines, ())
188
+
189
+ # NOTE: __init__ patching for _finalize_minperiod disabled as it's handled elsewhere
190
+ # The minperiod calculation is now done explicitly in indicators that need it (like MACD)
191
+
192
+ # Register subclasses automatically
193
+ if not cls.aliased and cls.__name__ != "Indicator" and not cls.__name__.startswith("_"):
194
+ IndicatorRegistry.register(cls.__name__, cls)
195
+
196
+ # Handle aliases - register them to the indicators module
197
+ if hasattr(cls, "alias") and cls.alias:
198
+ import sys
199
+
200
+ indicators_module = sys.modules.get("backtrader.indicators")
201
+ if indicators_module:
202
+ # Set the main class name
203
+ setattr(indicators_module, cls.__name__, cls)
204
+ # Set all aliases - handle both tuple and list formats
205
+ aliases = cls.alias
206
+ if isinstance(aliases, (list, tuple)):
207
+ for alias in aliases:
208
+ if isinstance(alias, str):
209
+ setattr(indicators_module, alias, cls)
210
+
211
+ # Check if next and once have both been overridden
212
+ # Define default methods if they don't exist
213
+ if not hasattr(cls, "next"):
214
+ cls.next = lambda self: None
215
+ if not hasattr(cls, "once"):
216
+ cls.once = lambda self, start, end: None
217
+
218
+ next_over = getattr(cls, "next", None) != getattr(Indicator, "next", None)
219
+ once_over = getattr(cls, "once", None) != getattr(Indicator, "once", None)
220
+
221
+ # CRITICAL FIX: Also check if once() is the no-op from LineRoot
222
+ # If once is inherited from LineRoot (which is just 'pass'), treat it as not overridden
223
+ # This handles indicators that only set up line bindings without defining next/once
224
+ from .lineroot import LineRoot
225
+
226
+ if hasattr(LineRoot, "once") and getattr(cls, "once", None) == getattr(
227
+ LineRoot, "once", None
228
+ ):
229
+ # LineRoot.once is a no-op, so always use once_via_next
230
+ cls.once = cls.once_via_next
231
+ cls.preonce = cls.preonce_via_prenext
232
+ cls.oncestart = cls.oncestart_via_nextstart
233
+ elif next_over and not once_over:
234
+ # No -> need pointer movement to once simulation via next
235
+ cls.once = cls.once_via_next
236
+ cls.preonce = cls.preonce_via_prenext
237
+ cls.oncestart = cls.oncestart_via_nextstart
238
+
239
+ # Cache related methods - moved from metaclass
240
+ @classmethod
241
+ def cleancache(cls):
242
+ """Clear the indicator cache"""
243
+ IndicatorRegistry.cleancache()
244
+
245
+ @classmethod
246
+ def usecache(cls, onoff):
247
+ """Enable or disable caching"""
248
+ IndicatorRegistry.usecache(onoff)
249
+
250
+ def _finalize_minperiod(self):
251
+ """CRITICAL FIX: Finalize minimum period calculation after indicator __init__ completes.
252
+
253
+ This method is called after the subclass's __init__ has finished creating
254
+ sub-indicators and line bindings. It ensures that the minimum periods from
255
+ all data sources, lines and sub-indicators are properly propagated to this
256
+ indicator's _minperiod.
257
+ """
258
+ # Step 0: Calculate minperiod from data sources first
259
+ # This is critical for indicators applied to other indicators/lines
260
+ try:
261
+ if hasattr(self, "datas") and self.datas:
262
+ data_minperiods = [getattr(d, "_minperiod", 1) for d in self.datas if d is not None]
263
+ if data_minperiods:
264
+ data_max = max(data_minperiods)
265
+ if data_max > self._minperiod:
266
+ self._minperiod = data_max
267
+ except (AttributeError, TypeError):
268
+ # No usable datas to derive a minperiod from; keep current value.
269
+ logger.debug("indicator:267 ignored AttributeError,TypeError")
270
+
271
+ # Step 1: Calculate minperiod from lines
272
+ try:
273
+ if hasattr(self, "lines") and self.lines is not None:
274
+ line_minperiods = []
275
+ for line in self.lines:
276
+ mp = getattr(line, "_minperiod", 1)
277
+ line_minperiods.append(mp)
278
+ if line_minperiods:
279
+ lines_max = max(line_minperiods)
280
+ if lines_max > self._minperiod:
281
+ self._minperiod = lines_max
282
+ except (AttributeError, TypeError):
283
+ # Lines not iterable yet; keep current minperiod.
284
+ logger.debug("indicator:282 ignored AttributeError,TypeError")
285
+
286
+ # Step 2: Calculate minperiod from sub-indicators
287
+ try:
288
+ if hasattr(self, "_lineiterators"):
289
+ indicators = self._lineiterators.get(LineIterator.IndType, [])
290
+ if indicators:
291
+ ind_minperiods = [getattr(ind, "_minperiod", 1) for ind in indicators]
292
+ if ind_minperiods:
293
+ ind_max = max(ind_minperiods)
294
+ if ind_max > self._minperiod:
295
+ self._minperiod = ind_max
296
+ except (AttributeError, TypeError):
297
+ # No sub-indicator registry available; keep current minperiod.
298
+ logger.debug("indicator:296 ignored AttributeError,TypeError")
299
+
300
+ # Step 3: Update minperiod on all lines
301
+ try:
302
+ if hasattr(self, "lines") and self.lines is not None:
303
+ for line in self.lines:
304
+ if hasattr(line, "updateminperiod"):
305
+ line.updateminperiod(self._minperiod)
306
+ except (AttributeError, TypeError):
307
+ # Lines not iterable; minperiod propagation is best-effort.
308
+ logger.debug("indicator:306 ignored AttributeError,TypeError")
309
+
310
+ def advance(self, size=1):
311
+ """Advance indicator lines when data length is less than clock length.
312
+
313
+ Also advances sub-indicators so that during _oncepost() replay every
314
+ level of the indicator tree stays in sync (fixes runonce ATR/SMMA
315
+ index mismatch when an indicator uses sub_ind[0] in next()).
316
+
317
+ Args:
318
+ size: Number of steps to advance (default: 1)
319
+ """
320
+ # Prefer the concrete secondary-feed clock resolved in
321
+ # Strategy._periodset() for indicators that follow a non-primary feed
322
+ # (e.g. SMA over an H1 LinesOperation inside an M15 strategy). Their
323
+ # _clock may point at a feed whose len() is correct, but when an
324
+ # explicit secondary clock was pinned we use it so the indicator
325
+ # advances in lockstep with that feed. See
326
+ # docs/DEV_REGRESSION_FAILURES.md.
327
+ adv_clock = getattr(self, "_resolved_secondary_clock", None) or self._clock
328
+ if len(self) < len(adv_clock):
329
+ self.lines.advance(size=size)
330
+ for ind in self._lineiterators.get(LineIterator.IndType, []):
331
+ ind.advance(size)
332
+
333
+ def preonce_via_prenext(self, start, end):
334
+ """Implement preonce using prenext for batch calculation.
335
+
336
+ This is a generic implementation if prenext is overridden but preonce is not.
337
+ It loops through the range and calls prenext for each step.
338
+
339
+ Args:
340
+ start: Starting index
341
+ end: Ending index
342
+ """
343
+ # Generic implementation if prenext is overridden but preonce is not
344
+ for i in range(start, end):
345
+ # Advance all data feeds
346
+ for data in self.datas:
347
+ data.advance()
348
+ # Advance all sub-indicators
349
+ for indicator in self._lineiterators[LineIterator.IndType]:
350
+ indicator.advance()
351
+ # CRITICAL FIX: Directly advance lines instead of using self.advance()
352
+ self.lines.advance()
353
+ # Call prenext
354
+ self.prenext()
355
+
356
+ def oncestart_via_nextstart(self, start, end):
357
+ """Implement oncestart using nextstart for batch calculation.
358
+
359
+ This is used when nextstart is overridden but oncestart is not.
360
+
361
+ Args:
362
+ start: Starting index
363
+ end: Ending index
364
+ """
365
+ # nextstart has been overridden, but oncestart has not - call the overridden nextstart
366
+ for i in range(start, end):
367
+ for data in self.datas:
368
+ data.advance()
369
+
370
+ for indicator in self._lineiterators[LineIterator.IndType]:
371
+ indicator.advance()
372
+
373
+ # CRITICAL FIX: Directly advance lines instead of using self.advance()
374
+ self.lines.advance()
375
+ self.nextstart()
376
+
377
+ def once_via_next(self, start, end):
378
+ """Implement once using next for batch calculation.
379
+
380
+ This is used when next is overridden but once is not.
381
+ It loops through the range and calls next for each step.
382
+
383
+ Args:
384
+ start: Starting index
385
+ end: Ending index
386
+ """
387
+ # Not overridden, next must be there ...
388
+ # Simple implementation matching master branch - just advance and call next
389
+ for i in range(start, end):
390
+ for data in self.datas:
391
+ data.advance()
392
+
393
+ for indicator in self._lineiterators[LineIterator.IndType]:
394
+ indicator.advance()
395
+
396
+ # CRITICAL FIX: Directly advance lines instead of using self.advance()
397
+ # self.advance() checks len(self) < len(self._clock) which fails when
398
+ # _clock is MinimalClock (always returns 0) or when _clock is not properly
399
+ # synchronized. In once_via_next, we always need to advance.
400
+ self.lines.advance()
401
+ self.next()
402
+
403
+
404
+ class LinePlotterIndicatorBase(Indicator.__class__):
405
+ """Base class for indicators that plot multiple lines.
406
+
407
+ Note: These classes are not currently used in the project.
408
+ They are kept for compatibility with the original backtrader.
409
+ """
410
+
411
+ def donew(cls, *args, **kwargs):
412
+ """Create a new LinePlotterIndicator instance.
413
+
414
+ Args:
415
+ *args: Positional arguments
416
+ **kwargs: Keyword arguments, must include 'name'
417
+
418
+ Returns:
419
+ tuple: (created_object, args, kwargs)
420
+ """
421
+ # Get line name
422
+ lname = kwargs.pop("name")
423
+ # Get class name
424
+ name = cls.__name__
425
+ # Get cls lines, or return Lines if not present
426
+ lines = getattr(cls, "lines", Lines)
427
+ # Derive lines with the new line
428
+ cls.lines = lines._derive(name, (lname,), 0, [])
429
+ # Derive plotlines
430
+ plotlines = AutoInfoClass
431
+ newplotlines: dict = {}
432
+ newplotlines.setdefault(lname, {})
433
+ cls.plotlines = plotlines._derive(name, newplotlines, [], recurse=True)
434
+
435
+ # Create the object and set the params in place
436
+ _obj, args, kwargs = super().donew(*args, **kwargs)
437
+ # Set _obj owner attribute
438
+ _obj.owner = _obj.data.owner._clock
439
+ # Add another linebuffer
440
+ _obj.data.lines[0].addbinding(_obj.lines[0])
441
+ # Return the object and arguments to the chain
442
+ return _obj, args, kwargs
443
+
444
+
445
+ class LinePlotterIndicator(Indicator, LinePlotterIndicatorBase):
446
+ """Indicator that plots multiple lines.
447
+
448
+ Note: This class is not currently used in the project.
449
+ """
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env python
2
+ """Technical Analysis Indicators Module.
3
+
4
+ This module provides a comprehensive collection of technical analysis
5
+ indicators for trading strategies. It includes moving averages,
6
+ oscillators, momentum indicators, volatility indicators, and more.
7
+
8
+ Indicator Categories:
9
+ - Moving Averages: SMA, EMA, SMMA, WMA, DEMA, KAMA, HMA, etc.
10
+ - Oscillators: RSI, Stochastic, MACD, CCI, etc.
11
+ - Volatility: ATR, Bollinger Bands, Standard Deviation
12
+ - Momentum: ROC, Momentum, Ultimate Oscillator
13
+ - Trend: ADX, Aroon, Parabolic SAR, Ichimoku
14
+ - Volume: OBV, Money Flow Index
15
+ - Custom: Additional custom indicators
16
+
17
+ Example:
18
+ Using indicators in a strategy:
19
+ >>> class MyStrategy(bt.Strategy):
20
+ ... def __init__(self):
21
+ ... self.sma = bt.indicators.SMA(self.data.close, period=20)
22
+ ... self.rsi = bt.indicators.RSI(self.data.close, period=14)
23
+ """
24
+
25
+ import os as _os
26
+
27
+ from ..indicator import Indicator as Indicator
28
+ from ..functions import *
29
+
30
+ if _os.environ.get("BACKTRADER_LIGHT_IMPORT", "").strip().lower() in {
31
+ "1",
32
+ "true",
33
+ "yes",
34
+ "on",
35
+ }:
36
+ from .mabase import MovAv as MovAv
37
+ from .mabase import MovingAverage as MovingAverage
38
+ from .mabase import MovingAverageBase as MovingAverageBase
39
+ from .basicops import Highest as Highest
40
+ from .basicops import Lowest as Lowest
41
+ from .sma import SMA as SMA
42
+ from .sma import MovingAverageSimple as MovingAverageSimple
43
+ from .smma import SmoothedMovingAverage as SmoothedMovingAverage
44
+ from .ema import EMA as EMA
45
+ from .ema import ExponentialMovingAverage as ExponentialMovingAverage
46
+ from .deviation import StandardDeviation as StandardDeviation
47
+ from .deviation import StdDev as StdDev
48
+ from .atr import ATR as ATR
49
+ from .atr import AverageTrueRange as AverageTrueRange
50
+ from .bollinger import BollingerBands as BollingerBands
51
+ from .crossover import CrossOver as CrossOver
52
+ from .directionalmove import AverageDirectionalMovementIndex as AverageDirectionalMovementIndex
53
+ from .directionalmove import MinusDirectionalIndicator as MinusDirectionalIndicator
54
+ from .directionalmove import PlusDirectionalIndicator as PlusDirectionalIndicator
55
+ from .rsi import RSI as RSI
56
+ from .rsi import RelativeStrengthIndex as RelativeStrengthIndex
57
+ from .obv import OnBalanceVolume as OnBalanceVolume
58
+
59
+ OBV = OnBalanceVolume
60
+
61
+ SimpleMovingAverage = MovingAverageSimple
62
+ SMMA = SmoothedMovingAverage
63
+ ADX = AverageDirectionalMovementIndex
64
+ MinusDI = MinusDirectionalIndicator
65
+ PlusDI = PlusDirectionalIndicator
66
+ else:
67
+ # The modules below should/must define __all__ with the Indicator objects
68
+ # of prepend an "_" (underscore) to private classes/variables
69
+ from .basicops import *
70
+
71
+ # base for moving averages
72
+ from .mabase import *
73
+
74
+ # moving averages (so envelope and oscillators can be auto-generated)
75
+ from .sma import *
76
+ from .ema import *
77
+ from .smma import *
78
+ from .wma import *
79
+ from .dema import *
80
+ from .kama import *
81
+ from .zlema import *
82
+ from .hma import *
83
+ from .zlind import *
84
+ from .dma import *
85
+
86
+ # depends on moving averages
87
+ from .deviation import *
88
+
89
+ # depend on basicops, moving averages and deviations
90
+ from .atr import *
91
+ from .mt5atr import *
92
+ from .aroon import *
93
+ from .bollinger import *
94
+ from .cci import *
95
+ from .crossover import *
96
+ from .dpo import *
97
+ from .directionalmove import *
98
+ from .envelope import *
99
+ from .heikinashi import *
100
+ from .lrsi import *
101
+ from .spread import *
102
+ from .macd import *
103
+ from .momentum import *
104
+ from .oscillator import *
105
+ from .percentchange import *
106
+ from .percentrank import *
107
+ from .pivotpoint import *
108
+ from .prettygoodoscillator import *
109
+ from .priceoscillator import *
110
+ from .psar import *
111
+ from .rsi import *
112
+ from .stochastic import *
113
+ from .trix import *
114
+ from .tsi import *
115
+ from .ultimateoscillator import *
116
+ from .williams import *
117
+ from .rmi import *
118
+ from .awesomeoscillator import *
119
+ from .accdecoscillator import *
120
+ from .priceops_ext import *
121
+ from .moneyflow import *
122
+ from .obv import *
123
+ from .demarker import *
124
+ from .channels_ext import *
125
+ from .trend_ext import *
126
+ from .supertrend import *
127
+
128
+ from .dv2 import * # depends on percentrank
129
+
130
+ # Depends on Momentum
131
+ from .kst import *
132
+
133
+ from .ichimoku import *
134
+
135
+ from .hurst import *
136
+ from .ols import *
137
+ from .hadelta import *
138
+ from .vortex import *
139
+
140
+ # Add some custom indicators
141
+ from .myind import *
142
+ from .contrib import *
143
+
144
+ # # At the end of the file, after all imports
145
+ # from .mabase import _register_common_moving_averages
146
+ #
147
+ # # Register moving averages after all modules are loaded to avoid circular imports
148
+ # _register_common_moving_averages()