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,495 @@
1
+ #!/usr/bin/env python
2
+ """MultiCursor Widget Module for Matplotlib.
3
+
4
+ This module provides MultiCursor widgets for matplotlib that display vertical
5
+ and/or horizontal cursor lines across multiple axes simultaneously. It includes
6
+ two implementations:
7
+
8
+ * MultiCursor: Enhanced version with support for independent/shared
9
+ cursor behavior across axes
10
+
11
+ * MultiCursor2: Simplified version with basic shared cursor functionality
12
+
13
+ These widgets are useful for interactive plots where you need to compare data
14
+ across multiple subplots at the same cursor position.
15
+
16
+ The module is based on matplotlib's MultiCursor widget with enhancements
17
+ to better handle axes with different y-dimensions and more flexible cursor
18
+ visibility controls.
19
+
20
+ Example:
21
+ >>> from matplotlib import pyplot as plt
22
+ >>> import numpy as np
23
+ >>> from backtrader.plot.multicursor import MultiCursor
24
+ >>> t = np.arange(0.0, 2.0, 0.01)
25
+ >>> s1 = np.sin(2*np.pi*t)
26
+ >>> s2 = np.sin(4*np.pi*t)
27
+ >>> fig = plt.figure()
28
+ >>> ax1 = fig.add_subplot(211)
29
+ >>> ax1.plot(t, s1)
30
+ >>> ax2 = fig.add_subplot(212, sharex=ax1)
31
+ >>> ax2.plot(t, s2)
32
+ >>> multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1,
33
+ ... horizOn=False, vertOn=True)
34
+ >>> plt.show()
35
+ """
36
+
37
+ # LICENSE AGREEMENT FOR MATPLOTLIB 1.2.0
38
+ # --------------------------------------
39
+ #
40
+ # 1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the
41
+ # Individual or Organization ("Licensee") accessing and otherwise using
42
+ # matplotlib software in source or binary form and its associated
43
+ # documentation.
44
+ #
45
+ # 2. Subject to the terms and conditions of this License Agreement, JDH
46
+ # hereby grants Licensee a nonexclusive, royalty-free, world-wide license
47
+ # to reproduce, analyze, test, perform and/or display publicly, prepare
48
+ # derivative works, distribute, and otherwise use matplotlib 1.2.0
49
+ # alone or in any derivative version, provided, however, that JDH's
50
+ # License Agreement and JDH's notice of copyright, i.e., "Copyright (c)
51
+ # 2002-2011 John D. Hunter; All Rights Reserved" are retained in
52
+ # matplotlib 1.2.0 alone or in any derivative version prepared by
53
+ # Licensee.
54
+ #
55
+ # 3. In the event Licensee prepares a derivative work that is based on or
56
+ # incorporates matplotlib 1.2.0 or any part thereof, and wants to
57
+ # make the derivative work available to others as provided herein, then
58
+ # Licensee hereby agrees to include in any such work a brief summary of
59
+ # the changes made to matplotlib 1.2.0.
60
+ #
61
+ # 4. JDH is making matplotlib 1.2.0 available to Licensee on an "AS
62
+ # IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
63
+ # IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND
64
+ # DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
65
+ # FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB 1.2.0
66
+ # WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
67
+ #
68
+ # 5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
69
+ # 1.2.0 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
70
+ # LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
71
+ # MATPLOTLIB 1.2.0, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
72
+ # THE POSSIBILITY THEREOF.
73
+
74
+ # 6. This License Agreement will automatically terminate upon a material
75
+ # breach of its terms and conditions.
76
+ #
77
+ # 7. Nothing in this License Agreement shall be deemed to create any
78
+ # relationship of agency, partnership, or joint venture between JDH and
79
+ # Licensee. This License Agreement does not grant permission to use JDH
80
+ # trademarks or trade name in a trademark sense to endorse or promote
81
+ # products or services of Licensee, or any third party.
82
+ #
83
+ # 8. By copying, installing or otherwise using matplotlib 1.2.0,
84
+ # Licensee agrees to be bound by the terms and conditions of this License
85
+ # Agreement.
86
+
87
+ # CHANGES
88
+ # The original MultiCursor plots all horizontal lines at the same time
89
+ # The modified version plots only the horizontal line in the axis in which the
90
+ # motion event takes place
91
+ #
92
+ # The original MultiCursos uses the ylimit of the las passed axis, to calculate
93
+ # the mid-point of the axis.
94
+ # which creates a huge distorsion if all axises don't
95
+ # have the same y dimensions
96
+ #
97
+ # The modified version uses the y limits of each axis to calculate the initial
98
+ # position of each line avoiding the distorsion
99
+
100
+ from ..utils.py3 import zip
101
+
102
+
103
+ class Widget:
104
+ """
105
+ Abstract base class for GUI neutral widgets
106
+ """
107
+
108
+ drawon = True
109
+ eventson = True
110
+ _active = True
111
+
112
+ def set_active(self, active):
113
+ """Set whether the widget is active."""
114
+ self._active = active
115
+
116
+ def get_active(self):
117
+ """Get whether the widget is active."""
118
+ return self._active
119
+
120
+ # set_active is overriden by SelectorWidgets.
121
+ active = property(
122
+ get_active, lambda self, active: self.set_active(active), doc="Is the widget active?"
123
+ )
124
+
125
+ def ignore(self, event):
126
+ """Return True if event should be ignored.
127
+ This method (or a version of it) should be called at the beginning
128
+ of any event callback.
129
+ """
130
+ return not self.active
131
+
132
+
133
+ class MultiCursor(Widget):
134
+ """
135
+ Provide a vertical (default) and/or horizontal line cursor shared between
136
+ multiple axes.
137
+
138
+ For the cursor to remain responsive, you much keep a reference to
139
+ it.
140
+
141
+ Example usage::
142
+
143
+ from matplotlib.widgets import MultiCursor
144
+ from pylab import figure, show, np
145
+
146
+ T = np.arange(0.0, 2.0, 0.01)
147
+ s1 = np.sin(2*np.pi*t)
148
+ s2 = np.sin(4*np.pi*t)
149
+ fig = figure()
150
+ ax1 = fig.add_subplot(211)
151
+ ax1.plot(t, s1)
152
+
153
+
154
+ Ax2 = fig.add_subplot(212, sharex=ax1)
155
+ ax2.plot(t, s2)
156
+
157
+ Multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1,
158
+ horizOn=False, vertOn=True)
159
+ show()
160
+
161
+ """
162
+
163
+ def __init__(
164
+ self,
165
+ canvas,
166
+ axes,
167
+ useblit=True,
168
+ horizOn=False,
169
+ vertOn=True,
170
+ horizMulti=False,
171
+ vertMulti=True,
172
+ horizShared=True,
173
+ vertShared=False,
174
+ **lineprops,
175
+ ):
176
+ """Initialize the MultiCursor widget.
177
+
178
+ Creates vertical and/or horizontal cursor lines that are synchronized
179
+ across multiple axes. The enhanced version supports independent cursor
180
+ behavior per axis and handles axes with different dimensions correctly.
181
+
182
+ Args:
183
+ canvas: The matplotlib canvas to attach the cursor to.
184
+ axes: Sequence of Axes objects to share the cursor across.
185
+ useblit: If True, use blitting for faster rendering (default: True).
186
+ horizOn: If True, display horizontal cursor lines (default: False).
187
+ vertOn: If True, display vertical cursor lines (default: True).
188
+ horizMulti: If True, show horizontal cursor on all axes
189
+ simultaneously; if False, only show on axis under cursor
190
+ (default: False).
191
+ vertMulti: If True, show vertical cursor on all axes simultaneously;
192
+ if False, only show on axis under cursor (default: True).
193
+ horizShared: If True, use shared y-position for horizontal cursors
194
+ from the last axis; if False, calculate independently per axis
195
+ (default: True).
196
+ vertShared: If True, use shared x-position for vertical cursors
197
+ from the last axis; if False, calculate independently per axis
198
+ (default: False).
199
+ **lineprops: Additional keyword arguments passed to the cursor lines
200
+ (e.g., color, linewidth, linestyle).
201
+
202
+ Attributes:
203
+ visible: Boolean indicating if the cursor is currently visible.
204
+ vlines: List of vertical cursor line objects.
205
+ hlines: List of horizontal cursor line objects.
206
+ useblit: Boolean indicating if blitting is enabled.
207
+ background: Background canvas for blitting.
208
+ """
209
+ self._ciddraw = None
210
+ self._cidmotion = None
211
+ self.canvas = canvas
212
+ self.axes = axes
213
+ self.horizOn = horizOn
214
+ self.vertOn = vertOn
215
+ self.horizMulti = horizMulti
216
+ self.vertMulti = vertMulti
217
+
218
+ self.visible = True
219
+ self.useblit = useblit and self.canvas.supports_blit
220
+ self.background = None
221
+ self.needclear = False
222
+
223
+ if self.useblit:
224
+ lineprops["animated"] = True
225
+
226
+ self.vlines = []
227
+ if vertOn:
228
+ xmin, xmax = axes[-1].get_xlim()
229
+ xmid = 0.5 * (xmin + xmax)
230
+
231
+ for ax in axes:
232
+ if not horizShared:
233
+ xmin, xmax = ax.get_xlim()
234
+ xmid = 0.5 * (xmin + xmax)
235
+
236
+ vline = ax.axvline(xmid, visible=False, **lineprops)
237
+ self.vlines.append(vline)
238
+
239
+ self.hlines = []
240
+ if horizOn:
241
+ ymin, ymax = axes[-1].get_ylim()
242
+ ymid = 0.5 * (ymin + ymax)
243
+
244
+ for ax in axes:
245
+ if not vertShared:
246
+ ymin, ymax = ax.get_ylim()
247
+ ymid = 0.5 * (ymin + ymax)
248
+
249
+ hline = ax.axhline(ymid, visible=False, **lineprops)
250
+ self.hlines.append(hline)
251
+
252
+ self.connect()
253
+
254
+ def connect(self):
255
+ """connect events"""
256
+ self._cidmotion = self.canvas.mpl_connect("motion_notify_event", self.onmove)
257
+ self._ciddraw = self.canvas.mpl_connect("draw_event", self.clear)
258
+
259
+ def disconnect(self):
260
+ """disconnect events"""
261
+ self.canvas.mpl_disconnect(self._cidmotion)
262
+ self.canvas.mpl_disconnect(self._ciddraw)
263
+
264
+ def clear(self, event):
265
+ """clear the cursor"""
266
+ if self.ignore(event):
267
+ return
268
+ if self.useblit:
269
+ self.background = self.canvas.copy_from_bbox(self.canvas.figure.bbox)
270
+ for line in self.vlines + self.hlines:
271
+ line.set_visible(False)
272
+
273
+ def onmove(self, event):
274
+ """Handle mouse motion events to update cursor position.
275
+
276
+ Updates the vertical and/or horizontal cursor lines based on the mouse
277
+ position in the axes. Respects the horizMulti, vertMulti, horizShared,
278
+ and vertShared settings to control cursor visibility and positioning.
279
+
280
+ Args:
281
+ event: Matplotlib motion event containing xdata, ydata, and inaxes
282
+ information.
283
+
284
+ The method will:
285
+ * Ignore the event if the widget is inactive
286
+ * Ignore the event if the mouse is outside all axes
287
+ * Update cursor line positions based on mouse coordinates
288
+ * Show/hide cursors based on multi-axis settings
289
+ * Trigger a canvas update via blitting or draw_idle
290
+ """
291
+ if self.ignore(event):
292
+ return
293
+ if event.inaxes is None:
294
+ return
295
+ if not self.canvas.widgetlock.available(self):
296
+ return
297
+ self.needclear = True
298
+ if not self.visible:
299
+ return
300
+ if self.vertOn:
301
+ for line in self.vlines:
302
+ visible = self.visible
303
+ if not self.vertMulti:
304
+ visible = visible and line.axes == event.inaxes
305
+
306
+ if visible:
307
+ line.set_xdata((event.xdata, event.xdata))
308
+ line.set_visible(visible)
309
+ if self.horizOn:
310
+ for line in self.hlines:
311
+ visible = self.visible
312
+ if not self.horizMulti:
313
+ visible = visible and line.axes == event.inaxes
314
+ if visible:
315
+ line.set_ydata((event.ydata, event.ydata))
316
+ line.set_visible(self.visible)
317
+ self._update(event)
318
+
319
+ def _update(self, event):
320
+ if self.useblit:
321
+ if self.background is not None:
322
+ self.canvas.restore_region(self.background)
323
+ if self.vertOn:
324
+ for ax, line in zip(self.axes, self.vlines):
325
+ if self.vertMulti or event.inaxes == line.axes:
326
+ ax.draw_artist(line)
327
+
328
+ if self.horizOn:
329
+ for ax, line in zip(self.axes, self.hlines):
330
+ if self.horizMulti or event.inaxes == line.axes:
331
+ ax.draw_artist(line)
332
+ self.canvas.blit(self.canvas.figure.bbox)
333
+ else:
334
+ self.canvas.draw_idle()
335
+
336
+
337
+ class MultiCursor2(Widget):
338
+ """
339
+ Provide a vertical (default) and/or horizontal line cursor shared between
340
+ multiple axes.
341
+ For the cursor to remain responsive you much keep a reference to
342
+ it.
343
+ Example usage::
344
+ from matplotlib.widgets import MultiCursor
345
+ from pylab import figure, show, np
346
+ t = np.arange(0.0, 2.0, 0.01)
347
+ s1 = np.sin(2*np.pi*t)
348
+ s2 = np.sin(4*np.pi*t)
349
+ fig = figure()
350
+ ax1 = fig.add_subplot(211)
351
+ ax1.plot(t, s1)
352
+ ax2 = fig.add_subplot(212, sharex=ax1)
353
+ ax2.plot(t, s2)
354
+ multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1,
355
+ horizOn=False, vertOn=True)
356
+ show()
357
+ """
358
+
359
+ def __init__(self, canvas, axes, useblit=True, horizOn=False, vertOn=True, **lineprops):
360
+ """Initialize the MultiCursor2 widget.
361
+
362
+ Creates vertical and/or horizontal cursor lines that are synchronized
363
+ across multiple axes. This is a simplified version that shows horizontal
364
+ cursors only on the axis where the mouse is located.
365
+
366
+ Args:
367
+ canvas: The matplotlib canvas to attach the cursor to.
368
+ axes: Sequence of Axes objects to share the cursor across.
369
+ useblit: If True, use blitting for faster rendering (default: True).
370
+ horizOn: If True, display horizontal cursor lines (default: False).
371
+ vertOn: If True, display vertical cursor lines (default: True).
372
+ **lineprops: Additional keyword arguments passed to the cursor lines
373
+ (e.g., color, linewidth, linestyle).
374
+
375
+ Attributes:
376
+ visible: Boolean indicating if the cursor is currently visible.
377
+ vlines: List of vertical cursor line objects.
378
+ hlines: List of horizontal cursor line objects.
379
+ useblit: Boolean indicating if blitting is enabled.
380
+ background: Background canvas for blitting.
381
+
382
+ Note:
383
+ Unlike MultiCursor, this version always shows vertical cursors on
384
+ all axes and shows horizontal cursors only on the axis where the
385
+ mouse event occurs. This avoids distortion when axes have different
386
+ y-dimensions.
387
+ """
388
+ self._ciddraw = None
389
+ self._cidmotion = None
390
+ self.canvas = canvas
391
+ self.axes = axes
392
+ self.horizOn = horizOn
393
+ self.vertOn = vertOn
394
+
395
+ xmin, xmax = axes[-1].get_xlim()
396
+ xmid = 0.5 * (xmin + xmax)
397
+
398
+ self.visible = True
399
+ self.useblit = useblit and self.canvas.supports_blit
400
+ self.background = None
401
+ self.needclear = False
402
+
403
+ if self.useblit:
404
+ lineprops["animated"] = True
405
+
406
+ if vertOn:
407
+ self.vlines = [ax.axvline(xmid, visible=False, **lineprops) for ax in axes]
408
+ else:
409
+ self.vlines = []
410
+
411
+ if horizOn:
412
+ self.hlines = []
413
+ for ax in axes:
414
+ ymin, ymax = ax.get_ylim()
415
+ ymid = 0.5 * (ymin + ymax)
416
+ hline = ax.axhline(ymid, visible=False, **lineprops)
417
+ self.hlines.append(hline)
418
+ else:
419
+ self.hlines = []
420
+
421
+ self.connect()
422
+
423
+ def connect(self):
424
+ """connect events"""
425
+ self._cidmotion = self.canvas.mpl_connect("motion_notify_event", self.onmove)
426
+ self._ciddraw = self.canvas.mpl_connect("draw_event", self.clear)
427
+
428
+ def disconnect(self):
429
+ """disconnect events"""
430
+ self.canvas.mpl_disconnect(self._cidmotion)
431
+ self.canvas.mpl_disconnect(self._ciddraw)
432
+
433
+ def clear(self, event):
434
+ """clear the cursor"""
435
+ if self.ignore(event):
436
+ return
437
+ if self.useblit:
438
+ self.background = self.canvas.copy_from_bbox(self.canvas.figure.bbox)
439
+ for line in self.vlines + self.hlines:
440
+ line.set_visible(False)
441
+
442
+ def onmove(self, event):
443
+ """Handle mouse motion events to update cursor position.
444
+
445
+ Updates the vertical and/or horizontal cursor lines based on the mouse
446
+ position in the axes. Vertical cursors are shown on all axes, while
447
+ horizontal cursors are only shown on the axis where the mouse event
448
+ occurred.
449
+
450
+ Args:
451
+ event: Matplotlib motion event containing xdata, ydata, and inaxes
452
+ information.
453
+
454
+ The method will:
455
+ * Ignore the event if the widget is inactive
456
+ * Ignore the event if the mouse is outside all axes
457
+ * Update all vertical cursors to the mouse x-position
458
+ * Update horizontal cursor only on the axis under the mouse
459
+ * Trigger a canvas update via blitting or draw_idle
460
+ """
461
+ if self.ignore(event):
462
+ return
463
+ if event.inaxes is None:
464
+ return
465
+
466
+ if not self.canvas.widgetlock.available(self):
467
+ return
468
+ self.needclear = True
469
+ if not self.visible:
470
+ return
471
+ if self.vertOn:
472
+ for line in self.vlines:
473
+ visible = True or line.axes == event.inaxes # noqa: SIM222 # upstream-disabled
474
+ line.set_xdata((event.xdata, event.xdata))
475
+ line.set_visible(visible)
476
+ if self.horizOn:
477
+ for line in self.hlines:
478
+ visible = line.axes == event.inaxes
479
+ line.set_ydata((event.ydata, event.ydata))
480
+ line.set_visible(visible)
481
+ self._update(event)
482
+
483
+ def _update(self, event):
484
+ if self.useblit:
485
+ if self.background is not None:
486
+ self.canvas.restore_region(self.background)
487
+ if self.vertOn:
488
+ for ax, line in zip(self.axes, self.vlines):
489
+ ax.draw_artist(line)
490
+ if self.horizOn:
491
+ for ax, line in zip(self.axes, self.hlines):
492
+ ax.draw_artist(line)
493
+ self.canvas.blit(self.canvas.figure.bbox)
494
+ else:
495
+ self.canvas.draw_idle()