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.
- back_trader_python-1.4.0.dist-info/METADATA +1491 -0
- back_trader_python-1.4.0.dist-info/RECORD +465 -0
- back_trader_python-1.4.0.dist-info/WHEEL +5 -0
- back_trader_python-1.4.0.dist-info/licenses/LICENSE +674 -0
- back_trader_python-1.4.0.dist-info/top_level.txt +1 -0
- backtrader/__init__.py +148 -0
- backtrader/_cerebro/__init__.py +5 -0
- backtrader/_cerebro/channel.py +382 -0
- backtrader/_cerebro/execution.py +377 -0
- backtrader/_cerebro/lifecycle.py +143 -0
- backtrader/_cerebro/notifications.py +150 -0
- backtrader/_cerebro/presentation.py +230 -0
- backtrader/_cerebro/registry.py +593 -0
- backtrader/_cerebro/runnext.py +551 -0
- backtrader/_cerebro/runonce.py +142 -0
- backtrader/analyzer.py +594 -0
- backtrader/analyzers/__init__.py +50 -0
- backtrader/analyzers/annualreturn.py +226 -0
- backtrader/analyzers/calmar.py +165 -0
- backtrader/analyzers/drawdown.py +287 -0
- backtrader/analyzers/leverage.py +112 -0
- backtrader/analyzers/logreturnsrolling.py +190 -0
- backtrader/analyzers/periodstats.py +153 -0
- backtrader/analyzers/positions.py +119 -0
- backtrader/analyzers/pyfolio.py +470 -0
- backtrader/analyzers/returns.py +192 -0
- backtrader/analyzers/sharpe.py +307 -0
- backtrader/analyzers/sharpe_ratio_stats.py +534 -0
- backtrader/analyzers/sqn.py +112 -0
- backtrader/analyzers/timereturn.py +192 -0
- backtrader/analyzers/total_value.py +75 -0
- backtrader/analyzers/tradeanalyzer.py +278 -0
- backtrader/analyzers/transactions.py +141 -0
- backtrader/analyzers/vwr.py +245 -0
- backtrader/bokeh/__init__.py +155 -0
- backtrader/bokeh/analyzers/__init__.py +13 -0
- backtrader/bokeh/analyzers/plot.py +192 -0
- backtrader/bokeh/analyzers/recorder.py +181 -0
- backtrader/bokeh/app.py +1094 -0
- backtrader/bokeh/live/__init__.py +11 -0
- backtrader/bokeh/live/client.py +352 -0
- backtrader/bokeh/live/datahandler.py +346 -0
- backtrader/bokeh/plot_adapter.py +200 -0
- backtrader/bokeh/schemes/__init__.py +14 -0
- backtrader/bokeh/schemes/blackly.py +76 -0
- backtrader/bokeh/schemes/scheme.py +150 -0
- backtrader/bokeh/schemes/tradimo.py +82 -0
- backtrader/bokeh/tab.py +125 -0
- backtrader/bokeh/tabs/__init__.py +30 -0
- backtrader/bokeh/tabs/analyzer.py +120 -0
- backtrader/bokeh/tabs/config.py +154 -0
- backtrader/bokeh/tabs/live.py +109 -0
- backtrader/bokeh/tabs/log.py +185 -0
- backtrader/bokeh/tabs/metadata.py +182 -0
- backtrader/bokeh/tabs/performance.py +359 -0
- backtrader/bokeh/tabs/source.py +70 -0
- backtrader/bokeh/utils/__init__.py +8 -0
- backtrader/bokeh/utils/helpers.py +167 -0
- backtrader/bokeh/webapp.py +164 -0
- backtrader/broker.py +478 -0
- backtrader/brokers/__init__.py +36 -0
- backtrader/brokers/bbroker.py +2576 -0
- backtrader/brokers/btapibroker.py +8227 -0
- backtrader/brokers/hft/__init__.py +89 -0
- backtrader/brokers/hft/binance_bbo.py +625 -0
- backtrader/brokers/hft/binance_bbo_compare.py +1398 -0
- backtrader/brokers/hft/examples.py +1228 -0
- backtrader/brokers/hft/exchange.py +380 -0
- backtrader/brokers/hft/latency.py +309 -0
- backtrader/brokers/hft/matching_core.py +572 -0
- backtrader/brokers/hft/queue.py +238 -0
- backtrader/brokers/hft/recorder.py +88 -0
- backtrader/brokers/hft/state.py +138 -0
- backtrader/brokers/impact_models.py +118 -0
- backtrader/brokers/mixbroker.py +895 -0
- backtrader/brokers/tickbroker.py +1991 -0
- backtrader/btrun/__init__.py +12 -0
- backtrader/btrun/btrun.py +1218 -0
- backtrader/cerebro.py +828 -0
- backtrader/channel.py +682 -0
- backtrader/channels/__init__.py +23 -0
- backtrader/channels/bridge.py +186 -0
- backtrader/channels/funding.py +248 -0
- backtrader/channels/live_queue.py +216 -0
- backtrader/channels/live_validator.py +294 -0
- backtrader/channels/orderbook.py +257 -0
- backtrader/channels/tick.py +202 -0
- backtrader/comminfo.py +665 -0
- backtrader/commissions/__init__.py +106 -0
- backtrader/commissions/ctpoption.py +993 -0
- backtrader/configs/account_config_example.yaml +8 -0
- backtrader/dataseries.py +379 -0
- backtrader/errors.py +106 -0
- backtrader/events.py +980 -0
- backtrader/feed.py +1523 -0
- backtrader/feeds/__init__.py +75 -0
- backtrader/feeds/barrier.py +2006 -0
- backtrader/feeds/blaze.py +118 -0
- backtrader/feeds/btapifeed.py +1538 -0
- backtrader/feeds/btcsv.py +203 -0
- backtrader/feeds/chainer.py +114 -0
- backtrader/feeds/cryptohftdata.py +164 -0
- backtrader/feeds/csvgeneric.py +1205 -0
- backtrader/feeds/ctpcohort.py +1051 -0
- backtrader/feeds/influxfeed.py +158 -0
- backtrader/feeds/livefeed.py +71 -0
- backtrader/feeds/mixed_channel.py +108 -0
- backtrader/feeds/mt4csv.py +42 -0
- backtrader/feeds/pandafeed.py +381 -0
- backtrader/feeds/quandl.py +256 -0
- backtrader/feeds/rollover.py +229 -0
- backtrader/feeds/sierrachart.py +30 -0
- backtrader/feeds/vchart.py +162 -0
- backtrader/feeds/vchartcsv.py +84 -0
- backtrader/feeds/vchartfile.py +153 -0
- backtrader/feeds/yahoo.py +399 -0
- backtrader/fillers.py +148 -0
- backtrader/filters/__init__.py +34 -0
- backtrader/filters/bsplitter.py +127 -0
- backtrader/filters/calendardays.py +121 -0
- backtrader/filters/datafiller.py +192 -0
- backtrader/filters/datafilter.py +74 -0
- backtrader/filters/daysteps.py +96 -0
- backtrader/filters/heikinashi.py +63 -0
- backtrader/filters/renko.py +164 -0
- backtrader/filters/session.py +289 -0
- backtrader/flt.py +80 -0
- backtrader/functions.py +960 -0
- backtrader/indicator.py +449 -0
- backtrader/indicators/__init__.py +148 -0
- backtrader/indicators/accdecoscillator.py +110 -0
- backtrader/indicators/aroon.py +300 -0
- backtrader/indicators/atr.py +315 -0
- backtrader/indicators/awesomeoscillator.py +122 -0
- backtrader/indicators/basicops.py +834 -0
- backtrader/indicators/bollinger.py +223 -0
- backtrader/indicators/cci.py +89 -0
- backtrader/indicators/channels_ext.py +83 -0
- backtrader/indicators/contrib/__init__.py +228 -0
- backtrader/indicators/contrib/absolutely_no_lag_lwma.py +28 -0
- backtrader/indicators/contrib/absolutely_no_lag_lwma_color.py +44 -0
- backtrader/indicators/contrib/accumulation_distribution_line.py +92 -0
- backtrader/indicators/contrib/adx_cross_hull_style_indicator.py +249 -0
- backtrader/indicators/contrib/adxdmi.py +34 -0
- backtrader/indicators/contrib/ai_acceleration_deceleration_oscillator.py +34 -0
- backtrader/indicators/contrib/altr_trend_signal_v22.py +85 -0
- backtrader/indicators/contrib/anchored_momentum_line.py +115 -0
- backtrader/indicators/contrib/any_range_cld_tail_indicator.py +82 -0
- backtrader/indicators/contrib/aroon_horn_sign_indicator.py +96 -0
- backtrader/indicators/contrib/aroon_oscillator_sign_alert.py +50 -0
- backtrader/indicators/contrib/arrows_curves_indicator.py +112 -0
- backtrader/indicators/contrib/as_ctrend_indicator.py +143 -0
- backtrader/indicators/contrib/asimmetric_stoch_nr_indicator.py +187 -0
- backtrader/indicators/contrib/atr_normalize_histogram.py +118 -0
- backtrader/indicators/contrib/average_change_candle.py +165 -0
- backtrader/indicators/contrib/bb_squeeze_indicator.py +60 -0
- backtrader/indicators/contrib/bezier_st_dev_indicator.py +135 -0
- backtrader/indicators/contrib/binary_wave_indicator.py +233 -0
- backtrader/indicators/contrib/blau_c_momentum_indicator.py +123 -0
- backtrader/indicators/contrib/blau_cmi_indicator.py +141 -0
- backtrader/indicators/contrib/blau_csi.py +76 -0
- backtrader/indicators/contrib/blau_ergodic.py +53 -0
- backtrader/indicators/contrib/blau_t_stoch_i.py +72 -0
- backtrader/indicators/contrib/blau_ts_stochastic.py +85 -0
- backtrader/indicators/contrib/blau_tvi.py +55 -0
- backtrader/indicators/contrib/brain_trend2_indicator.py +128 -0
- backtrader/indicators/contrib/brain_trend_signal_proxy.py +47 -0
- backtrader/indicators/contrib/brake_parb_indicator.py +85 -0
- backtrader/indicators/contrib/breakout_bars_trend_v2.py +121 -0
- backtrader/indicators/contrib/bsi_indicator.py +87 -0
- backtrader/indicators/contrib/bulls_bears_eyes.py +67 -0
- backtrader/indicators/contrib/bulls_power.py +56 -0
- backtrader/indicators/contrib/bw_wise_man1_signal.py +102 -0
- backtrader/indicators/contrib/bykov_trend_indicator.py +85 -0
- backtrader/indicators/contrib/candle_stop_color.py +46 -0
- backtrader/indicators/contrib/candles_x_smoothed_indicator.py +69 -0
- backtrader/indicators/contrib/candlesticks_bw.py +45 -0
- backtrader/indicators/contrib/caudate_x_period_candle_color.py +56 -0
- backtrader/indicators/contrib/cci_histogram_indicator.py +53 -0
- backtrader/indicators/contrib/cci_woodies_indicator.py +80 -0
- backtrader/indicators/contrib/center_of_gravity_candle_indicator.py +83 -0
- backtrader/indicators/contrib/center_of_gravity_indicator.py +70 -0
- backtrader/indicators/contrib/cg_oscillator.py +40 -0
- backtrader/indicators/contrib/close_line_cci.py +38 -0
- backtrader/indicators/contrib/close_price_fractals.py +47 -0
- backtrader/indicators/contrib/color3rd_gen_xma_indicator.py +122 -0
- backtrader/indicators/contrib/color_bb_candles_indicator.py +108 -0
- backtrader/indicators/contrib/color_coppock_indicator.py +157 -0
- backtrader/indicators/contrib/color_hma.py +71 -0
- backtrader/indicators/contrib/color_j_variation_indicator.py +53 -0
- backtrader/indicators/contrib/color_metro_de_marker_indicator.py +78 -0
- backtrader/indicators/contrib/color_metro_stochastic_indicator.py +93 -0
- backtrader/indicators/contrib/color_metro_wpr_indicator.py +85 -0
- backtrader/indicators/contrib/color_schaff_de_marker_trend_cycle.py +92 -0
- backtrader/indicators/contrib/color_schaff_trend_cycle_indicator.py +203 -0
- backtrader/indicators/contrib/color_step_xccx_indicator.py +193 -0
- backtrader/indicators/contrib/color_x2_ma.py +49 -0
- backtrader/indicators/contrib/color_x_derivative.py +63 -0
- backtrader/indicators/contrib/color_zerolag_de_marker.py +84 -0
- backtrader/indicators/contrib/corrected_average_indicator.py +127 -0
- backtrader/indicators/contrib/darvas_boxes_system.py +73 -0
- backtrader/indicators/contrib/dema_range_channel_color.py +42 -0
- backtrader/indicators/contrib/derivative_indicator.py +95 -0
- backtrader/indicators/contrib/digital_ft01_indicator.py +112 -0
- backtrader/indicators/contrib/digital_macd.py +200 -0
- backtrader/indicators/contrib/donchian_channels_system.py +45 -0
- backtrader/indicators/contrib/dots_indicator.py +93 -0
- backtrader/indicators/contrib/ef_distance_indicator.py +82 -0
- backtrader/indicators/contrib/ema_rsi_va.py +80 -0
- backtrader/indicators/contrib/envelopes_jp_alonso.py +32 -0
- backtrader/indicators/contrib/f2a_ao_indicator.py +120 -0
- backtrader/indicators/contrib/fatl_filter.py +179 -0
- backtrader/indicators/contrib/fibo_candles_indicator.py +78 -0
- backtrader/indicators/contrib/fine_tuning_ma.py +100 -0
- backtrader/indicators/contrib/fisher_org_v1.py +102 -0
- backtrader/indicators/contrib/fisher_org_v1_sign.py +118 -0
- backtrader/indicators/contrib/force_index_ema.py +96 -0
- backtrader/indicators/contrib/force_index_ema_2.py +27 -0
- backtrader/indicators/contrib/forecast_oscilator.py +145 -0
- backtrader/indicators/contrib/fractal_amambk.py +81 -0
- backtrader/indicators/contrib/frama_series.py +84 -0
- backtrader/indicators/contrib/frasm_av2_indicator.py +104 -0
- backtrader/indicators/contrib/go_indicator.py +93 -0
- backtrader/indicators/contrib/hlr_indicator.py +95 -0
- backtrader/indicators/contrib/hma.py +50 -0
- backtrader/indicators/contrib/i4_drfv2.py +34 -0
- backtrader/indicators/contrib/i4_drfv3.py +38 -0
- backtrader/indicators/contrib/i_anch_mom_indicator.py +72 -0
- backtrader/indicators/contrib/i_de_marker_sign_indicator.py +64 -0
- backtrader/indicators/contrib/i_gap_indicator.py +45 -0
- backtrader/indicators/contrib/i_stoch_komposter_indicator.py +77 -0
- backtrader/indicators/contrib/i_trend_indicator.py +125 -0
- backtrader/indicators/contrib/iamma_indicator.py +39 -0
- backtrader/indicators/contrib/indexed_moving_average.py +33 -0
- backtrader/indicators/contrib/instantaneous_trend_filter_indicator.py +51 -0
- backtrader/indicators/contrib/inverse_reaction_indicator.py +41 -0
- backtrader/indicators/contrib/irsi_sign_indicator.py +95 -0
- backtrader/indicators/contrib/iwpr_sign_indicator.py +59 -0
- backtrader/indicators/contrib/j_brain_trend1_sig_indicator.py +233 -0
- backtrader/indicators/contrib/j_tpo_proxy.py +32 -0
- backtrader/indicators/contrib/jma_slope_indicator.py +73 -0
- backtrader/indicators/contrib/kalman_filter_indicator.py +119 -0
- backtrader/indicators/contrib/kalman_filter_line.py +127 -0
- backtrader/indicators/contrib/kama_indicator.py +150 -0
- backtrader/indicators/contrib/karacatica_indicator.py +99 -0
- backtrader/indicators/contrib/kdj_indicator.py +59 -0
- backtrader/indicators/contrib/kwan_ccc_indicator.py +195 -0
- backtrader/indicators/contrib/kwan_nrp_indicator.py +113 -0
- backtrader/indicators/contrib/kwan_rdp_indicator.py +192 -0
- backtrader/indicators/contrib/laguerre_adx_indicator.py +85 -0
- backtrader/indicators/contrib/laguerre_filter_indicator.py +66 -0
- backtrader/indicators/contrib/laguerre_plus_di_proxy.py +57 -0
- backtrader/indicators/contrib/laguerre_roc_indicator.py +81 -0
- backtrader/indicators/contrib/le_man_signal_indicator.py +63 -0
- backtrader/indicators/contrib/linear_reg_slope_v2_indicator.py +136 -0
- backtrader/indicators/contrib/loco_indicator.py +88 -0
- backtrader/indicators/contrib/lrma_indicator.py +185 -0
- backtrader/indicators/contrib/lsma_angle_indicator.py +106 -0
- backtrader/indicators/contrib/ma_rounding_channel_indicator.py +149 -0
- backtrader/indicators/contrib/macd2_indicator.py +61 -0
- backtrader/indicators/contrib/macd_candle_indicator.py +80 -0
- backtrader/indicators/contrib/malr_indicator.py +77 -0
- backtrader/indicators/contrib/momentum_candle_sign_indicator.py +51 -0
- backtrader/indicators/contrib/moving_average_fn_indicator.py +139 -0
- backtrader/indicators/contrib/mt5_stochastic_close_close.py +57 -0
- backtrader/indicators/contrib/muv_nor_diff_cloud_indicator.py +107 -0
- backtrader/indicators/contrib/non_lag_dot_indicator.py +124 -0
- backtrader/indicators/contrib/nrtr_extr_indicator.py +95 -0
- backtrader/indicators/contrib/nrtr_indicator.py +95 -0
- backtrader/indicators/contrib/p_channel_system.py +40 -0
- backtrader/indicators/contrib/percent_envelope.py +37 -0
- backtrader/indicators/contrib/percentage_crossover_channel.py +47 -0
- backtrader/indicators/contrib/pivot_zig_zag_proxy.py +47 -0
- backtrader/indicators/contrib/price_channel_stop_indicator.py +104 -0
- backtrader/indicators/contrib/price_extreme_channel.py +35 -0
- backtrader/indicators/contrib/qqe_cloud_indicator.py +129 -0
- backtrader/indicators/contrib/ravi_indicator.py +40 -0
- backtrader/indicators/contrib/raw_close_close_stochastic.py +74 -0
- backtrader/indicators/contrib/rd_trend_trigger_indicator.py +51 -0
- backtrader/indicators/contrib/renko_level.py +85 -0
- backtrader/indicators/contrib/renko_line_break.py +91 -0
- backtrader/indicators/contrib/rftl_indicator.py +41 -0
- backtrader/indicators/contrib/rkd_indicator.py +53 -0
- backtrader/indicators/contrib/roc2_vg_indicator.py +68 -0
- backtrader/indicators/contrib/rsi_histogram_indicator.py +43 -0
- backtrader/indicators/contrib/rsi_slowdown.py +57 -0
- backtrader/indicators/contrib/rsioma_v2.py +41 -0
- backtrader/indicators/contrib/rvi_histogram_indicator.py +107 -0
- backtrader/indicators/contrib/safe_adx.py +89 -0
- backtrader/indicators/contrib/shared_strategy_indicators.py +1651 -0
- backtrader/indicators/contrib/sidus_indicator.py +105 -0
- backtrader/indicators/contrib/silver_trend_indicator.py +79 -0
- backtrader/indicators/contrib/sliding_range_color.py +56 -0
- backtrader/indicators/contrib/slow_stoch.py +42 -0
- backtrader/indicators/contrib/smoothed_adx_indicator.py +86 -0
- backtrader/indicators/contrib/smoothed_rsi.py +31 -0
- backtrader/indicators/contrib/spearman_rank_correlation_histogram.py +60 -0
- backtrader/indicators/contrib/stalin_indicator.py +152 -0
- backtrader/indicators/contrib/starter_laguerre_filter.py +62 -0
- backtrader/indicators/contrib/step_manrtr_indicator.py +137 -0
- backtrader/indicators/contrib/stochastic_histogram_indicator.py +143 -0
- backtrader/indicators/contrib/t3_alarm_indicator.py +125 -0
- backtrader/indicators/contrib/t3_average.py +76 -0
- backtrader/indicators/contrib/t3_indicator.py +40 -0
- backtrader/indicators/contrib/the20s_v020_signal.py +93 -0
- backtrader/indicators/contrib/three_candles_indicator.py +70 -0
- backtrader/indicators/contrib/three_line_break_indicator.py +64 -0
- backtrader/indicators/contrib/time_line.py +57 -0
- backtrader/indicators/contrib/trading_channel_index_proxy.py +48 -0
- backtrader/indicators/contrib/trend_arrows_indicator.py +109 -0
- backtrader/indicators/contrib/trend_continuation_indicator.py +127 -0
- backtrader/indicators/contrib/trend_intensity_index_proxy.py +51 -0
- backtrader/indicators/contrib/trend_manager_indicator.py +39 -0
- backtrader/indicators/contrib/tri_x_candle_indicator.py +51 -0
- backtrader/indicators/contrib/trigger_line.py +66 -0
- backtrader/indicators/contrib/triple_ema_rate.py +34 -0
- backtrader/indicators/contrib/trvi_indicator.py +194 -0
- backtrader/indicators/contrib/two_pb_ideal_xosma_indicator.py +127 -0
- backtrader/indicators/contrib/ultra_absolutely_no_lag_lwma_color.py +92 -0
- backtrader/indicators/contrib/ultra_wpr_indicator.py +173 -0
- backtrader/indicators/contrib/up_down_candle_strength.py +68 -0
- backtrader/indicators/contrib/vinin_i_trend_indicator.py +139 -0
- backtrader/indicators/contrib/volume_weighted_ma_indicator.py +78 -0
- backtrader/indicators/contrib/volume_weighted_ma_st_dev_indicator.py +111 -0
- backtrader/indicators/contrib/vwap_close_indicator.py +65 -0
- backtrader/indicators/contrib/vwma_candle.py +57 -0
- backtrader/indicators/contrib/vwma_digit_system.py +70 -0
- backtrader/indicators/contrib/wami.py +43 -0
- backtrader/indicators/contrib/wprsi_signal_indicator.py +105 -0
- backtrader/indicators/contrib/x_de_marker_histogram_vol_direct_indicator.py +145 -0
- backtrader/indicators/contrib/x_fisher_indicator.py +64 -0
- backtrader/indicators/contrib/xcci_histogram_vol_direct_indicator.py +56 -0
- backtrader/indicators/contrib/xcci_histogram_vol_indicator.py +85 -0
- backtrader/indicators/contrib/xma_ichimoku.py +163 -0
- backtrader/indicators/contrib/xma_ishimoku_channel_indicator.py +65 -0
- backtrader/indicators/contrib/xma_ishimoku_line.py +68 -0
- backtrader/indicators/contrib/xma_range_bands_indicator.py +107 -0
- backtrader/indicators/contrib/xmacd_indicator.py +70 -0
- backtrader/indicators/contrib/xrsi_de_marker_histogram.py +67 -0
- backtrader/indicators/contrib/xrsi_histogram_vol_direct_indicator.py +52 -0
- backtrader/indicators/contrib/xrsi_histogram_vol_indicator.py +81 -0
- backtrader/indicators/contrib/xrvi_indicator.py +130 -0
- backtrader/indicators/contrib/zero_lag_macd.py +36 -0
- backtrader/indicators/contrib/zig_zag_recent_pivot_signal.py +90 -0
- backtrader/indicators/contrib/zpf_indicator.py +115 -0
- backtrader/indicators/crossover.py +337 -0
- backtrader/indicators/dema.py +175 -0
- backtrader/indicators/demarker.py +270 -0
- backtrader/indicators/deviation.py +284 -0
- backtrader/indicators/directionalmove.py +1071 -0
- backtrader/indicators/dma.py +112 -0
- backtrader/indicators/dpo.py +96 -0
- backtrader/indicators/dv2.py +56 -0
- backtrader/indicators/ema.py +145 -0
- backtrader/indicators/envelope.py +475 -0
- backtrader/indicators/hadelta.py +198 -0
- backtrader/indicators/heikinashi.py +153 -0
- backtrader/indicators/hma.py +153 -0
- backtrader/indicators/hurst.py +151 -0
- backtrader/indicators/ichimoku.py +267 -0
- backtrader/indicators/kama.py +181 -0
- backtrader/indicators/kst.py +159 -0
- backtrader/indicators/lrsi.py +125 -0
- backtrader/indicators/mabase.py +147 -0
- backtrader/indicators/macd.py +322 -0
- backtrader/indicators/momentum.py +267 -0
- backtrader/indicators/moneyflow.py +237 -0
- backtrader/indicators/mt5atr.py +124 -0
- backtrader/indicators/myind.py +179 -0
- backtrader/indicators/obv.py +94 -0
- backtrader/indicators/ols.py +265 -0
- backtrader/indicators/oscillator.py +161 -0
- backtrader/indicators/percentchange.py +83 -0
- backtrader/indicators/percentrank.py +46 -0
- backtrader/indicators/pivotpoint.py +469 -0
- backtrader/indicators/prettygoodoscillator.py +113 -0
- backtrader/indicators/priceops_ext.py +123 -0
- backtrader/indicators/priceoscillator.py +262 -0
- backtrader/indicators/psar.py +212 -0
- backtrader/indicators/rmi.py +69 -0
- backtrader/indicators/rsi.py +440 -0
- backtrader/indicators/sma.py +141 -0
- backtrader/indicators/smma.py +116 -0
- backtrader/indicators/spread.py +54 -0
- backtrader/indicators/stochastic.py +263 -0
- backtrader/indicators/supertrend.py +436 -0
- backtrader/indicators/trend_ext.py +105 -0
- backtrader/indicators/trix.py +202 -0
- backtrader/indicators/tsi.py +155 -0
- backtrader/indicators/ultimateoscillator.py +158 -0
- backtrader/indicators/vortex.py +62 -0
- backtrader/indicators/williams.py +194 -0
- backtrader/indicators/wma.py +103 -0
- backtrader/indicators/zlema.py +135 -0
- backtrader/indicators/zlind.py +104 -0
- backtrader/linebuffer.py +3155 -0
- backtrader/lineiterator.py +2911 -0
- backtrader/lineroot.py +1106 -0
- backtrader/lineseries.py +2559 -0
- backtrader/live_trading/__init__.py +31 -0
- backtrader/live_trading/interface.py +404 -0
- backtrader/mathsupport.py +94 -0
- backtrader/metabase.py +1804 -0
- backtrader/mixins/__init__.py +21 -0
- backtrader/mixins/singleton.py +118 -0
- backtrader/observer.py +106 -0
- backtrader/observers/__init__.py +45 -0
- backtrader/observers/benchmark.py +126 -0
- backtrader/observers/broker.py +184 -0
- backtrader/observers/buysell.py +144 -0
- backtrader/observers/drawdown.py +161 -0
- backtrader/observers/logreturns.py +113 -0
- backtrader/observers/timereturn.py +86 -0
- backtrader/observers/trade_logger.py +2972 -0
- backtrader/observers/tradelogger.py +6 -0
- backtrader/observers/trades.py +258 -0
- backtrader/order.py +1114 -0
- backtrader/parameters.py +2345 -0
- backtrader/plot/__init__.py +54 -0
- backtrader/plot/finance.py +1022 -0
- backtrader/plot/formatters.py +200 -0
- backtrader/plot/locator.py +353 -0
- backtrader/plot/multicursor.py +495 -0
- backtrader/plot/plot.py +2500 -0
- backtrader/plot/plot_plotly.py +1351 -0
- backtrader/plot/scheme.py +253 -0
- backtrader/plot/utils.py +104 -0
- backtrader/position.py +290 -0
- backtrader/position_modes.py +132 -0
- backtrader/profiles.py +254 -0
- backtrader/reports/__init__.py +39 -0
- backtrader/reports/charts.py +371 -0
- backtrader/reports/performance.py +620 -0
- backtrader/reports/reporter.py +660 -0
- backtrader/resamplerfilter.py +1001 -0
- backtrader/signal.py +118 -0
- backtrader/signals/__init__.py +17 -0
- backtrader/sizer.py +114 -0
- backtrader/sizers/__init__.py +26 -0
- backtrader/sizers/fixedsize.py +161 -0
- backtrader/sizers/percents_sizer.py +119 -0
- backtrader/store.py +221 -0
- backtrader/stores/__init__.py +33 -0
- backtrader/stores/btapistore.py +15506 -0
- backtrader/stores/livestore.py +137 -0
- backtrader/stores/vchartfile.py +96 -0
- backtrader/strategy.py +3655 -0
- backtrader/talib.py +280 -0
- backtrader/test_helpers.py +96 -0
- backtrader/timer.py +358 -0
- backtrader/trade.py +442 -0
- backtrader/tradingcal.py +361 -0
- backtrader/utils/__init__.py +68 -0
- backtrader/utils/autodict.py +251 -0
- backtrader/utils/date.py +71 -0
- backtrader/utils/dateintern.py +509 -0
- backtrader/utils/flushfile.py +94 -0
- backtrader/utils/fractal.py +101 -0
- backtrader/utils/get_metrics.py +101 -0
- backtrader/utils/load_data.py +209 -0
- backtrader/utils/log_message.py +998 -0
- backtrader/utils/ordereddefaultdict.py +75 -0
- backtrader/utils/py3.py +296 -0
- backtrader/version.py +21 -0
- 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()
|