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,200 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Bokeh plotter adapter for Cerebro plotter contract."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import bisect
|
|
7
|
+
import datetime
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
from .. import date2num
|
|
11
|
+
from ..utils.log_message import get_logger
|
|
12
|
+
from .app import BOKEH_AVAILABLE, PANDAS_AVAILABLE, BacktraderBokeh
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from bokeh.io import output_file, output_notebook, save
|
|
16
|
+
from bokeh.io import show as bokeh_show
|
|
17
|
+
except ImportError: # pragma: no cover - covered by feature flag above
|
|
18
|
+
output_notebook = None
|
|
19
|
+
output_file = None
|
|
20
|
+
save = None
|
|
21
|
+
bokeh_show = None
|
|
22
|
+
|
|
23
|
+
logger = get_logger(__name__)
|
|
24
|
+
|
|
25
|
+
_KNOWN_PLOTTER_KWARGS = {"style", "scheme", "use_default_tabs", "filter", "filename"}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class BokehPlot:
|
|
29
|
+
"""Adapter class exposing cerebro-compatible plotter contract.
|
|
30
|
+
|
|
31
|
+
It keeps `BacktraderBokeh` API unchanged and maps the existing `cerebro.plot()`
|
|
32
|
+
contract to a Plot/Plotly-compatible adapter interface:
|
|
33
|
+
``plot -> show -> savefig``.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, **kwargs):
|
|
37
|
+
if not BOKEH_AVAILABLE:
|
|
38
|
+
raise ImportError("bokeh is required for backend='bokeh'; pip install bokeh")
|
|
39
|
+
if not PANDAS_AVAILABLE:
|
|
40
|
+
raise ImportError("pandas is required for backend='bokeh'; pip install pandas")
|
|
41
|
+
|
|
42
|
+
self._notebook_notified = False
|
|
43
|
+
self._iplot = True
|
|
44
|
+
self._filename = None
|
|
45
|
+
self._models = []
|
|
46
|
+
self._app_kwargs = {}
|
|
47
|
+
|
|
48
|
+
unknown_kwargs = [k for k in kwargs if k not in _KNOWN_PLOTTER_KWARGS]
|
|
49
|
+
if unknown_kwargs:
|
|
50
|
+
logger.warning(
|
|
51
|
+
"Ignoring unsupported BacktraderBokeh kwargs for adapter: %s",
|
|
52
|
+
", ".join(sorted(unknown_kwargs)),
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
for key, value in kwargs.items():
|
|
56
|
+
if key == "filename":
|
|
57
|
+
self._filename = value
|
|
58
|
+
elif key in _KNOWN_PLOTTER_KWARGS:
|
|
59
|
+
self._app_kwargs[key] = value
|
|
60
|
+
|
|
61
|
+
self._app = BacktraderBokeh(**self._app_kwargs)
|
|
62
|
+
|
|
63
|
+
def plot(
|
|
64
|
+
self,
|
|
65
|
+
strategy,
|
|
66
|
+
figid=0,
|
|
67
|
+
numfigs=1,
|
|
68
|
+
iplot=True,
|
|
69
|
+
start=None,
|
|
70
|
+
end=None,
|
|
71
|
+
use=None,
|
|
72
|
+
**kwargs,
|
|
73
|
+
):
|
|
74
|
+
"""Collect a strategy figure for deferred rendering.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
strategy: Strategy instance
|
|
78
|
+
figid: Unused in adapter, kept for compatibility.
|
|
79
|
+
numfigs: Reserved for compatibility.
|
|
80
|
+
iplot: Notebook display preference.
|
|
81
|
+
start: Start index or datetime for slicing.
|
|
82
|
+
end: End index or datetime for slicing.
|
|
83
|
+
use: Unused, matplotlib-only option kept for compatibility.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Empty list, reserved for plotter contract consistency.
|
|
87
|
+
"""
|
|
88
|
+
self._iplot = iplot
|
|
89
|
+
|
|
90
|
+
if use is not None:
|
|
91
|
+
logger.warning("bokeh backend ignores use parameter from cerebro.plot()")
|
|
92
|
+
if numfigs is not None and numfigs != 1:
|
|
93
|
+
logger.warning(
|
|
94
|
+
"bokeh backend uses one tab chart stack; numfigs=%s will be ignored",
|
|
95
|
+
numfigs,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
if kwargs:
|
|
99
|
+
logger.warning("Unsupported plot() kwargs ignored: %s", ", ".join(sorted(kwargs)))
|
|
100
|
+
|
|
101
|
+
_ = iplot # keep signature compatibility; actual display is deferred to show()
|
|
102
|
+
|
|
103
|
+
if strategy is None:
|
|
104
|
+
return []
|
|
105
|
+
|
|
106
|
+
start_i, end_i = self._resolve_range(strategy, start, end)
|
|
107
|
+
self._app.create_figurepage(strategy, filldata=True, start=start_i, end=end_i)
|
|
108
|
+
return []
|
|
109
|
+
|
|
110
|
+
def show(self):
|
|
111
|
+
"""Build deferred models and render them.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
List of bokeh models.
|
|
115
|
+
"""
|
|
116
|
+
# build_full_model (not build_model) so the extra tabs
|
|
117
|
+
# (Performance/Analyzer/Metadata/Config/Log/Source) are included,
|
|
118
|
+
# matching BacktraderBokeh.plot() - this is bokeh's value-add over a
|
|
119
|
+
# bare charts panel.
|
|
120
|
+
model = self._app.build_full_model()
|
|
121
|
+
if model is None:
|
|
122
|
+
return []
|
|
123
|
+
|
|
124
|
+
if self._iplot and self._should_use_notebook_output():
|
|
125
|
+
output_notebook()
|
|
126
|
+
|
|
127
|
+
if bokeh_show is not None and self._iplot:
|
|
128
|
+
bokeh_show(model)
|
|
129
|
+
|
|
130
|
+
if self._filename is not None:
|
|
131
|
+
self.savefig(model, self._filename)
|
|
132
|
+
|
|
133
|
+
self._models.append(model)
|
|
134
|
+
return [model]
|
|
135
|
+
|
|
136
|
+
def savefig(self, fig, filename, **kwargs):
|
|
137
|
+
"""Save a bokeh model to disk.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
fig: Bokeh model
|
|
141
|
+
filename: HTML file path
|
|
142
|
+
**kwargs: Unused compatibility args
|
|
143
|
+
"""
|
|
144
|
+
if output_file is None or save is None:
|
|
145
|
+
raise ImportError("bokeh is required for backend='bokeh'; pip install bokeh")
|
|
146
|
+
|
|
147
|
+
output_file(filename)
|
|
148
|
+
save(fig)
|
|
149
|
+
|
|
150
|
+
def _should_use_notebook_output(self):
|
|
151
|
+
if self._notebook_notified:
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
if "ipykernel" not in sys.modules:
|
|
155
|
+
return False
|
|
156
|
+
|
|
157
|
+
self._notebook_notified = True
|
|
158
|
+
return output_notebook is not None
|
|
159
|
+
|
|
160
|
+
def _resolve_range(self, strategy, start, end):
|
|
161
|
+
if strategy is None:
|
|
162
|
+
return 0, None
|
|
163
|
+
|
|
164
|
+
dtime = strategy.lines.datetime.plot()
|
|
165
|
+
total = len(dtime)
|
|
166
|
+
if total == 0:
|
|
167
|
+
return 0, 0
|
|
168
|
+
|
|
169
|
+
start_i = self._resolve_index(dtime, start, 0)
|
|
170
|
+
end_i = self._resolve_index(dtime, end, total, is_end=True)
|
|
171
|
+
return start_i, end_i
|
|
172
|
+
|
|
173
|
+
def _resolve_index(self, dtline, value, default, is_end=False):
|
|
174
|
+
if value is None:
|
|
175
|
+
return default
|
|
176
|
+
|
|
177
|
+
if isinstance(value, (datetime.date, datetime.datetime)):
|
|
178
|
+
return (
|
|
179
|
+
bisect.bisect_right(dtline, date2num(value))
|
|
180
|
+
if is_end
|
|
181
|
+
else bisect.bisect_left(dtline, date2num(value))
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
if isinstance(value, (int, float)):
|
|
185
|
+
value = int(value)
|
|
186
|
+
if value < 0:
|
|
187
|
+
value = len(dtline) + value
|
|
188
|
+
if is_end and value < 0:
|
|
189
|
+
value = len(dtline) + 1 + value
|
|
190
|
+
return max(0, value)
|
|
191
|
+
|
|
192
|
+
try:
|
|
193
|
+
return bisect.bisect_left(dtline, value)
|
|
194
|
+
except TypeError:
|
|
195
|
+
if is_end:
|
|
196
|
+
try:
|
|
197
|
+
return bisect.bisect_right(dtline, value)
|
|
198
|
+
except TypeError:
|
|
199
|
+
return default
|
|
200
|
+
return bisect.bisect_left(dtline, value)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
Bokeh theme system.
|
|
4
|
+
|
|
5
|
+
Provides multiple theme configurations:
|
|
6
|
+
- Blackly: Dark theme
|
|
7
|
+
- Tradimo: Light theme
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from .blackly import Blackly
|
|
11
|
+
from .scheme import Scheme
|
|
12
|
+
from .tradimo import Tradimo
|
|
13
|
+
|
|
14
|
+
__all__ = ["Scheme", "Blackly", "Tradimo"]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
Blackly dark theme.
|
|
4
|
+
|
|
5
|
+
Plotting theme suitable for dark backgrounds.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .scheme import Scheme
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Blackly(Scheme):
|
|
12
|
+
"""Dark theme.
|
|
13
|
+
|
|
14
|
+
Dark background with light text, suitable for night use or dark interfaces.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def _set_params(self):
|
|
18
|
+
super()._set_params()
|
|
19
|
+
|
|
20
|
+
# ========== Candlestick color configuration ==========
|
|
21
|
+
self.barup = "#ff9896" # Up candle color (light red)
|
|
22
|
+
self.bardown = "#98df8a" # Down candle color (light green)
|
|
23
|
+
self.barup_wick = self.barup
|
|
24
|
+
self.bardown_wick = self.bardown
|
|
25
|
+
self.barup_outline = self.barup
|
|
26
|
+
self.bardown_outline = self.bardown
|
|
27
|
+
|
|
28
|
+
# ========== Volume color configuration ==========
|
|
29
|
+
self.volup = "#ff9896"
|
|
30
|
+
self.voldown = "#98df8a"
|
|
31
|
+
|
|
32
|
+
# ========== Background configuration ==========
|
|
33
|
+
self.background_fill = "#222222" # Dark chart background
|
|
34
|
+
self.body_background_color = "#2B2B2B" # Dark page background
|
|
35
|
+
self.border_fill = "#3C3F41" # Dark border
|
|
36
|
+
|
|
37
|
+
# ========== Grid configuration ==========
|
|
38
|
+
self.grid_line_color = "#444444"
|
|
39
|
+
|
|
40
|
+
# ========== Axis configuration ==========
|
|
41
|
+
self.axis_line_color = "darkgrey"
|
|
42
|
+
self.tick_line_color = "darkgrey"
|
|
43
|
+
self.axis_text_color = "lightgrey"
|
|
44
|
+
self.axis_label_text_color = "darkgrey"
|
|
45
|
+
|
|
46
|
+
# ========== Title configuration ==========
|
|
47
|
+
self.plot_title_text_color = "darkgrey"
|
|
48
|
+
|
|
49
|
+
# ========== Legend configuration ==========
|
|
50
|
+
self.legend_background_color = "#3C3F41"
|
|
51
|
+
self.legend_text_color = "lightgrey"
|
|
52
|
+
self.legend_click = "hide"
|
|
53
|
+
|
|
54
|
+
# ========== Crosshair configuration ==========
|
|
55
|
+
self.crosshair_line_color = "#999999"
|
|
56
|
+
|
|
57
|
+
# ========== Tab configuration ==========
|
|
58
|
+
self.tab_active_background_color = "#666666"
|
|
59
|
+
self.tab_active_color = "#bbbbbb"
|
|
60
|
+
|
|
61
|
+
# ========== Table configuration ==========
|
|
62
|
+
self.table_color_even = "#404040"
|
|
63
|
+
self.table_color_odd = "#333333"
|
|
64
|
+
self.table_header_color = "#707070"
|
|
65
|
+
|
|
66
|
+
# ========== Tooltip configuration ==========
|
|
67
|
+
self.tooltip_background_color = "#4C4F51"
|
|
68
|
+
self.tooltip_text_label_color = "#848EFF"
|
|
69
|
+
self.tooltip_text_value_color = "#aaaaaa"
|
|
70
|
+
|
|
71
|
+
# ========== Code highlighting configuration ==========
|
|
72
|
+
self.tag_pre_background_color = "#222222"
|
|
73
|
+
self.tag_pre_text_color = "lightgrey"
|
|
74
|
+
|
|
75
|
+
# ========== Text configuration ==========
|
|
76
|
+
self.text_color = "lightgrey"
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Bokeh theme base class.
|
|
3
|
+
|
|
4
|
+
Defines all plotting-related style parameters.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Scheme:
|
|
9
|
+
"""Bokeh plotting theme base class.
|
|
10
|
+
|
|
11
|
+
Defines all plotting-related style parameters. Subclasses can customize
|
|
12
|
+
styles by overriding the _set_params method.
|
|
13
|
+
|
|
14
|
+
Attribute categories:
|
|
15
|
+
- Color configuration: barup, bardown, volup, voldown, etc.
|
|
16
|
+
- Background configuration: background_fill, body_background_color, etc.
|
|
17
|
+
- Grid configuration: grid_line_color, etc.
|
|
18
|
+
- Text configuration: axis_text_color, etc.
|
|
19
|
+
- Crosshair: crosshair_line_color, etc.
|
|
20
|
+
- Chart configuration: plot_sizing_mode, plot_height, etc.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self):
|
|
24
|
+
"""Initialize the scheme with default parameters."""
|
|
25
|
+
self._set_params()
|
|
26
|
+
|
|
27
|
+
def _set_params(self):
|
|
28
|
+
"""Set default parameters.
|
|
29
|
+
|
|
30
|
+
Subclasses should call super()._set_params() first, then override specific parameters.
|
|
31
|
+
"""
|
|
32
|
+
# ========== Candlestick color configuration ==========
|
|
33
|
+
self.barup = "#26a69a" # Up candle color
|
|
34
|
+
self.bardown = "#ef5350" # Down candle color
|
|
35
|
+
self.barup_wick = "#26a69a" # Up candle wick color
|
|
36
|
+
self.bardown_wick = "#ef5350" # Down candle wick color
|
|
37
|
+
self.barup_outline = "#26a69a" # Up candle outline color
|
|
38
|
+
self.bardown_outline = "#ef5350" # Down candle outline color
|
|
39
|
+
|
|
40
|
+
# ========== Volume color configuration ==========
|
|
41
|
+
self.volup = "#26a69a" # Up volume color
|
|
42
|
+
self.voldown = "#ef5350" # Down volume color
|
|
43
|
+
|
|
44
|
+
# ========== Background configuration ==========
|
|
45
|
+
self.background_fill = "#fafafa" # Chart background color
|
|
46
|
+
self.body_background_color = "#ffffff" # Page background color
|
|
47
|
+
self.border_fill = "#ffffff" # Border fill color
|
|
48
|
+
|
|
49
|
+
# ========== Grid configuration ==========
|
|
50
|
+
self.grid_line_color = "#e0e0e0" # Grid line color
|
|
51
|
+
|
|
52
|
+
# ========== Axis configuration ==========
|
|
53
|
+
self.axis_line_color = "#666666" # Axis line color
|
|
54
|
+
self.tick_line_color = "#666666" # Tick line color
|
|
55
|
+
self.axis_text_color = "#666666" # Axis text color
|
|
56
|
+
self.axis_label_text_color = "#666666" # Axis label color
|
|
57
|
+
|
|
58
|
+
# ========== Title configuration ==========
|
|
59
|
+
self.plot_title_text_color = "#333333" # Chart title color
|
|
60
|
+
|
|
61
|
+
# ========== Legend configuration ==========
|
|
62
|
+
self.legend_background_color = "#ffffff" # Legend background color
|
|
63
|
+
self.legend_text_color = "#333333" # Legend text color
|
|
64
|
+
self.legend_click = "hide" # Legend click behavior: 'hide' or 'mute'
|
|
65
|
+
|
|
66
|
+
# ========== Crosshair configuration ==========
|
|
67
|
+
self.crosshair_line_color = "#999999" # Crosshair line color
|
|
68
|
+
|
|
69
|
+
# ========== Tab configuration ==========
|
|
70
|
+
self.tab_active_background_color = "#e0e0e0" # Active tab background color
|
|
71
|
+
self.tab_active_color = "#333333" # Active tab text color
|
|
72
|
+
|
|
73
|
+
# ========== Table configuration ==========
|
|
74
|
+
self.table_color_even = "#ffffff" # Table even row color
|
|
75
|
+
self.table_color_odd = "#f5f5f5" # Table odd row color
|
|
76
|
+
self.table_header_color = "#e0e0e0" # Table header color
|
|
77
|
+
|
|
78
|
+
# ========== Tooltip configuration ==========
|
|
79
|
+
self.tooltip_background_color = "#ffffff" # Tooltip background color
|
|
80
|
+
self.tooltip_text_label_color = "#666666" # Tooltip label color
|
|
81
|
+
self.tooltip_text_value_color = "#333333" # Tooltip value color
|
|
82
|
+
|
|
83
|
+
# ========== Code highlight configuration ==========
|
|
84
|
+
self.tag_pre_background_color = "#f5f5f5" # Code block background color
|
|
85
|
+
self.tag_pre_text_color = "#333333" # Code block text color
|
|
86
|
+
|
|
87
|
+
# ========== Text configuration ==========
|
|
88
|
+
self.text_color = "#333333" # General text color
|
|
89
|
+
|
|
90
|
+
# ========== Chart layout configuration ==========
|
|
91
|
+
self.plot_sizing_mode = "stretch_width" # Chart sizing mode
|
|
92
|
+
self.plot_height = 400 # Default chart height
|
|
93
|
+
self.plot_height_volume = 150 # Volume chart height
|
|
94
|
+
self.plot_height_indicator = 200 # Indicator chart height
|
|
95
|
+
|
|
96
|
+
# ========== Toolbar configuration ==========
|
|
97
|
+
self.toolbar_location = "right" # Toolbar location
|
|
98
|
+
|
|
99
|
+
# ========== Line style configuration ==========
|
|
100
|
+
self.line_width = 1.5 # Default line width
|
|
101
|
+
self.line_alpha = 1.0 # Default line alpha
|
|
102
|
+
|
|
103
|
+
# ========== Marker configuration ==========
|
|
104
|
+
self.marker_size = 8 # Marker size
|
|
105
|
+
self.marker_buy_color = "#26a69a" # Buy marker color
|
|
106
|
+
self.marker_sell_color = "#ef5350" # Sell marker color
|
|
107
|
+
|
|
108
|
+
# ========== Data label configuration ==========
|
|
109
|
+
self.data_label_font_size = "10pt" # Data label font size
|
|
110
|
+
|
|
111
|
+
# ========== Date format configuration ==========
|
|
112
|
+
self.date_format = "%Y-%m-%d" # Date format
|
|
113
|
+
self.datetime_format = "%Y-%m-%d %H:%M" # Datetime format
|
|
114
|
+
|
|
115
|
+
# ========== Axis format configuration ==========
|
|
116
|
+
self.xaxis_formatter = None # X-axis formatter
|
|
117
|
+
self.yaxis_formatter = None # Y-axis formatter
|
|
118
|
+
|
|
119
|
+
def get_color(self, name, default=None):
|
|
120
|
+
"""Get color configuration.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
name: Color name
|
|
124
|
+
default: Default value
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Color value
|
|
128
|
+
"""
|
|
129
|
+
return getattr(self, name, default)
|
|
130
|
+
|
|
131
|
+
def set_color(self, name, value):
|
|
132
|
+
"""Set color configuration.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
name: Color name
|
|
136
|
+
value: Color value
|
|
137
|
+
"""
|
|
138
|
+
setattr(self, name, value)
|
|
139
|
+
|
|
140
|
+
def copy(self):
|
|
141
|
+
"""Create a copy of the theme.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
New theme instance
|
|
145
|
+
"""
|
|
146
|
+
new_scheme = self.__class__()
|
|
147
|
+
for attr in dir(self):
|
|
148
|
+
if not attr.startswith("_") and not callable(getattr(self, attr)):
|
|
149
|
+
setattr(new_scheme, attr, getattr(self, attr))
|
|
150
|
+
return new_scheme
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
Tradimo light theme.
|
|
4
|
+
|
|
5
|
+
Plotting theme suitable for light backgrounds.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .blackly import Blackly
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Tradimo(Blackly):
|
|
12
|
+
"""Light theme.
|
|
13
|
+
|
|
14
|
+
Light background with dark text, suitable for daytime use or light interfaces.
|
|
15
|
+
Inherits from Blackly to maintain consistent parameter structure.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def _set_params(self):
|
|
19
|
+
super()._set_params()
|
|
20
|
+
|
|
21
|
+
dark_text = "#333333"
|
|
22
|
+
|
|
23
|
+
# ========== Candlestick color configuration ==========
|
|
24
|
+
self.barup = "#e6550d" # Up candle color (orange)
|
|
25
|
+
self.bardown = "#31a354" # Down candle color (green)
|
|
26
|
+
self.barup_wick = self.barup
|
|
27
|
+
self.bardown_wick = self.bardown
|
|
28
|
+
self.barup_outline = self.barup
|
|
29
|
+
self.bardown_outline = self.bardown
|
|
30
|
+
|
|
31
|
+
# ========== Volume color configuration ==========
|
|
32
|
+
self.volup = "#ff9896"
|
|
33
|
+
self.voldown = "#98df8a"
|
|
34
|
+
|
|
35
|
+
# ========== Background configuration ==========
|
|
36
|
+
self.background_fill = "white"
|
|
37
|
+
self.body_background_color = "white"
|
|
38
|
+
self.border_fill = "white"
|
|
39
|
+
|
|
40
|
+
# ========== Grid configuration ==========
|
|
41
|
+
self.grid_line_color = "#eeeeee"
|
|
42
|
+
|
|
43
|
+
# ========== Axis configuration ==========
|
|
44
|
+
self.axis_line_color = "#222222"
|
|
45
|
+
self.tick_line_color = "#222222"
|
|
46
|
+
self.axis_text_color = dark_text
|
|
47
|
+
self.axis_label_text_color = dark_text
|
|
48
|
+
|
|
49
|
+
# ========== Title configuration ==========
|
|
50
|
+
self.plot_title_text_color = dark_text
|
|
51
|
+
|
|
52
|
+
# ========== Legend configuration ==========
|
|
53
|
+
self.legend_background_color = "#f5f5f5"
|
|
54
|
+
self.legend_text_color = dark_text
|
|
55
|
+
self.legend_click = "hide"
|
|
56
|
+
|
|
57
|
+
# ========== Crosshair configuration ==========
|
|
58
|
+
self.crosshair_line_color = "#000000"
|
|
59
|
+
|
|
60
|
+
# ========== Tab configuration ==========
|
|
61
|
+
self.tab_active_background_color = "#dddddd"
|
|
62
|
+
self.tab_active_color = "#111111"
|
|
63
|
+
|
|
64
|
+
# ========== Table configuration ==========
|
|
65
|
+
self.table_color_even = "#fefefe"
|
|
66
|
+
self.table_color_odd = "#eeeeee"
|
|
67
|
+
self.table_header_color = "#cccccc"
|
|
68
|
+
|
|
69
|
+
# ========== Tooltip configuration ==========
|
|
70
|
+
self.tooltip_background_color = "#f5f5f5"
|
|
71
|
+
self.tooltip_text_label_color = "#848EFF"
|
|
72
|
+
self.tooltip_text_value_color = "#5c5c5c"
|
|
73
|
+
|
|
74
|
+
# ========== Code highlighting configuration ==========
|
|
75
|
+
self.tag_pre_background_color = "#f5f5f5"
|
|
76
|
+
self.tag_pre_text_color = dark_text
|
|
77
|
+
|
|
78
|
+
# ========== Text configuration ==========
|
|
79
|
+
self.text_color = "#222222"
|
|
80
|
+
|
|
81
|
+
# ========== Special configuration ==========
|
|
82
|
+
self.loc = "#265371" # Location line color
|
backtrader/bokeh/tab.py
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
Tab base class.
|
|
4
|
+
|
|
5
|
+
Provides extensible tab architecture for creating custom tabs.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
Panel: Any = None
|
|
11
|
+
BOKEH_AVAILABLE = False
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
# Bokeh 3.x
|
|
15
|
+
from bokeh.models import TabPanel as _Panel
|
|
16
|
+
|
|
17
|
+
Panel = _Panel
|
|
18
|
+
BOKEH_AVAILABLE = True
|
|
19
|
+
except ImportError:
|
|
20
|
+
try:
|
|
21
|
+
# Bokeh 2.x
|
|
22
|
+
from bokeh.models.widgets import Panel as _Panel
|
|
23
|
+
|
|
24
|
+
Panel = _Panel
|
|
25
|
+
BOKEH_AVAILABLE = True
|
|
26
|
+
except ImportError:
|
|
27
|
+
try:
|
|
28
|
+
from bokeh.models import Panel as _Panel
|
|
29
|
+
|
|
30
|
+
Panel = _Panel
|
|
31
|
+
BOKEH_AVAILABLE = True
|
|
32
|
+
except ImportError:
|
|
33
|
+
# Bokeh not installed (optional dependency); BOKEH_AVAILABLE stays False.
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class BokehTab:
|
|
38
|
+
"""Tab base class.
|
|
39
|
+
|
|
40
|
+
Abstract base class for creating custom tabs.
|
|
41
|
+
Subclasses must implement _is_useable and _get_panel methods.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
_app: BacktraderBokeh application instance
|
|
45
|
+
_figurepage: Figure page instance
|
|
46
|
+
_client: Client instance (optional, for live mode)
|
|
47
|
+
_panel: Bokeh Panel instance
|
|
48
|
+
|
|
49
|
+
Example:
|
|
50
|
+
class MyCustomTab(BokehTab):
|
|
51
|
+
def _is_useable(self):
|
|
52
|
+
return True
|
|
53
|
+
|
|
54
|
+
def _get_panel(self):
|
|
55
|
+
from bokeh.models import Div
|
|
56
|
+
div = Div(text='<h1>My Content</h1>')
|
|
57
|
+
return div, 'My Tab'
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
def __init__(self, app, figurepage, client=None):
|
|
61
|
+
"""Initialize tab.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
app: BacktraderBokeh application instance
|
|
65
|
+
figurepage: Figure page instance
|
|
66
|
+
client: Client instance (optional)
|
|
67
|
+
"""
|
|
68
|
+
self._app = app
|
|
69
|
+
self._figurepage = figurepage
|
|
70
|
+
self._client = client
|
|
71
|
+
self._panel = None
|
|
72
|
+
|
|
73
|
+
def _is_useable(self):
|
|
74
|
+
"""Check if tab is useable.
|
|
75
|
+
|
|
76
|
+
Subclasses must implement this method.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
bool: Whether tab is useable
|
|
80
|
+
"""
|
|
81
|
+
raise NotImplementedError("_is_useable needs to be implemented.")
|
|
82
|
+
|
|
83
|
+
def _get_panel(self):
|
|
84
|
+
"""Get tab content.
|
|
85
|
+
|
|
86
|
+
Subclasses must implement this method.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
tuple: (child_widget, title) - Child widget and title
|
|
90
|
+
"""
|
|
91
|
+
raise NotImplementedError("_get_panel needs to be implemented.")
|
|
92
|
+
|
|
93
|
+
def is_useable(self):
|
|
94
|
+
"""Public interface: Check if tab is useable.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
bool: Whether tab is useable
|
|
98
|
+
"""
|
|
99
|
+
return self._is_useable()
|
|
100
|
+
|
|
101
|
+
def get_panel(self):
|
|
102
|
+
"""Public interface: Get Bokeh Panel.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Panel: Bokeh Panel instance
|
|
106
|
+
"""
|
|
107
|
+
if not BOKEH_AVAILABLE or Panel is None:
|
|
108
|
+
return None
|
|
109
|
+
child, title = self._get_panel()
|
|
110
|
+
self._panel = Panel(child=child, title=title)
|
|
111
|
+
return self._panel
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def strategy(self):
|
|
115
|
+
"""Get strategy instance."""
|
|
116
|
+
if self._figurepage is not None:
|
|
117
|
+
return getattr(self._figurepage, "strategy", None)
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def scheme(self):
|
|
122
|
+
"""Get theme instance."""
|
|
123
|
+
if self._app is not None:
|
|
124
|
+
return getattr(self._app, "scheme", None)
|
|
125
|
+
return None
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
Built-in tabs module.
|
|
4
|
+
|
|
5
|
+
Provides the following built-in tabs:
|
|
6
|
+
- AnalyzerTab: Analyzer results display
|
|
7
|
+
- ConfigTab: Configuration info display
|
|
8
|
+
- LogTab: Log display
|
|
9
|
+
- MetadataTab: Metadata display
|
|
10
|
+
- SourceTab: Source code display
|
|
11
|
+
- LiveTab: Live configuration tab
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from .analyzer import AnalyzerTab
|
|
15
|
+
from .config import ConfigTab
|
|
16
|
+
from .live import LiveTab
|
|
17
|
+
from .log import LogTab
|
|
18
|
+
from .metadata import MetadataTab
|
|
19
|
+
from .performance import PerformanceTab
|
|
20
|
+
from .source import SourceTab
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"AnalyzerTab",
|
|
24
|
+
"ConfigTab",
|
|
25
|
+
"LogTab",
|
|
26
|
+
"MetadataTab",
|
|
27
|
+
"SourceTab",
|
|
28
|
+
"LiveTab",
|
|
29
|
+
"PerformanceTab",
|
|
30
|
+
]
|