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
backtrader/dataseries.py
ADDED
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""DataSeries Module - Time-series data structures for financial data.
|
|
3
|
+
|
|
4
|
+
This module provides the DataSeries class and related utilities for
|
|
5
|
+
handling time-series financial data. It defines common data line types
|
|
6
|
+
(OHLCV) and timeframe specifications.
|
|
7
|
+
|
|
8
|
+
Key Classes:
|
|
9
|
+
TimeFrame: Enumeration of time periods (Minutes, Days, Weeks, etc.).
|
|
10
|
+
DataSeries: Base class for financial data feeds with OHLCV lines.
|
|
11
|
+
OHLC: DataSeries with Open, High, Low, Close lines.
|
|
12
|
+
OHLCDateTime: OHLC with datetime line.
|
|
13
|
+
|
|
14
|
+
Example:
|
|
15
|
+
Getting timeframe name:
|
|
16
|
+
>>> TimeFrame.getname(TimeFrame.Days) # Returns 'Day'
|
|
17
|
+
>>> TimeFrame.getname(TimeFrame.Days, 5) # Returns 'Days'
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import datetime as _datetime
|
|
21
|
+
import inspect
|
|
22
|
+
|
|
23
|
+
from .lineseries import LineSeries
|
|
24
|
+
from .utils import AutoOrderedDict, OrderedDict, date2num
|
|
25
|
+
from .utils.py3 import range
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TimeFrame:
|
|
29
|
+
"""Enumeration of time periods for financial data.
|
|
30
|
+
|
|
31
|
+
Defines constants for different time periods used in financial
|
|
32
|
+
data: Ticks, MicroSeconds, Seconds, Minutes, Days, Weeks, Months,
|
|
33
|
+
Years, and NoTimeFrame.
|
|
34
|
+
|
|
35
|
+
Class Methods:
|
|
36
|
+
getname(tframe, compression): Get name for timeframe.
|
|
37
|
+
TFrame(name): Get timeframe constant from name.
|
|
38
|
+
TName(tframe): Get name string from timeframe constant.
|
|
39
|
+
|
|
40
|
+
Attributes:
|
|
41
|
+
Ticks, MicroSeconds, Seconds, Minutes, Days, Weeks, Months, Years, NoTimeFrame: Timeframe constants.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
# Add 9 attributes to TimeFrame class for distinguishing trading periods
|
|
45
|
+
Ticks, MicroSeconds, Seconds, Minutes, Days, Weeks, Months, Years, NoTimeFrame = range(1, 10)
|
|
46
|
+
# Add a names attribute
|
|
47
|
+
Names = [
|
|
48
|
+
"",
|
|
49
|
+
"Ticks",
|
|
50
|
+
"MicroSeconds",
|
|
51
|
+
"Seconds",
|
|
52
|
+
"Minutes",
|
|
53
|
+
"Days",
|
|
54
|
+
"Weeks",
|
|
55
|
+
"Months",
|
|
56
|
+
"Years",
|
|
57
|
+
"NoTimeFrame",
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
names = Names # support old naming convention
|
|
61
|
+
|
|
62
|
+
# Class method to get Timeframe period type
|
|
63
|
+
@classmethod
|
|
64
|
+
def getname(cls, tframe, compression=None): # backtrader built-in
|
|
65
|
+
"""Get the name for a timeframe.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
tframe: TimeFrame constant (e.g., TimeFrame.Days).
|
|
69
|
+
compression: Compression factor. If None, uses 1.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
str: Name of the timeframe (singular or plural).
|
|
73
|
+
"""
|
|
74
|
+
# The default parameter setting for compression is not actually reasonable here,
|
|
75
|
+
# if the default parameter is passed directly, an error will occur in the comparison below
|
|
76
|
+
# Modify the default parameter to 1 or add judgment for compression,
|
|
77
|
+
# I feel changing it to 1 might be more appropriate
|
|
78
|
+
# @classmethod
|
|
79
|
+
# def getname(cls, tframe, compression=1):
|
|
80
|
+
tname = cls.Names[tframe]
|
|
81
|
+
if compression > 1 or tname == cls.Names[-1]:
|
|
82
|
+
return tname # for plural or 'NoTimeFrame' return plain entry
|
|
83
|
+
|
|
84
|
+
# return singular if compression is 1
|
|
85
|
+
# If compression is 1, return a singular trading period
|
|
86
|
+
return cls.Names[tframe][:-1]
|
|
87
|
+
|
|
88
|
+
# Class method to get trading period name value
|
|
89
|
+
@classmethod
|
|
90
|
+
def TFrame(cls, name):
|
|
91
|
+
"""Get TimeFrame constant from name.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
name: String name like 'Days', 'Minutes'.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
TimeFrame constant.
|
|
98
|
+
"""
|
|
99
|
+
return getattr(cls, name)
|
|
100
|
+
|
|
101
|
+
# Class method to return trading period name based on trading period value
|
|
102
|
+
@classmethod
|
|
103
|
+
def TName(cls, tframe):
|
|
104
|
+
"""Get name string from timeframe constant.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
tframe: TimeFrame constant.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
str: Name of the timeframe.
|
|
111
|
+
"""
|
|
112
|
+
return cls.Names[tframe]
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class DataSeries(LineSeries):
|
|
116
|
+
"""Base class for financial time-series data feeds.
|
|
117
|
+
|
|
118
|
+
DataSeries extends LineSeries to provide the standard OHLCV (Open,
|
|
119
|
+
High, Low, Close, Volume, OpenInterest) data lines plus DateTime.
|
|
120
|
+
|
|
121
|
+
Attributes:
|
|
122
|
+
_name: Name identifier for the data series.
|
|
123
|
+
_compression: Compression factor for the timeframe.
|
|
124
|
+
_timeframe: TimeFrame period (Days, Minutes, etc.).
|
|
125
|
+
|
|
126
|
+
Lines:
|
|
127
|
+
DateTime: Timestamp of the bar.
|
|
128
|
+
Open: Opening price.
|
|
129
|
+
High: Highest price.
|
|
130
|
+
Low: Lowest price.
|
|
131
|
+
Close: Closing price.
|
|
132
|
+
Volume: Trading volume.
|
|
133
|
+
OpenInterest: Open interest (for derivatives).
|
|
134
|
+
|
|
135
|
+
Example:
|
|
136
|
+
>>> data = DataSeries()
|
|
137
|
+
>>> print(data.close[0]) # Current close price
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
# Set plotinfo related values
|
|
141
|
+
plotinfo = {"plot": True, "plotind": True, "plotylimited": True}
|
|
142
|
+
|
|
143
|
+
# Set dataseries _name attribute, usually can use data._name directly in strategy to get specific data value
|
|
144
|
+
_name = ""
|
|
145
|
+
name = _name
|
|
146
|
+
# Set _compression attribute, default is 1, meaning trading period is singular, such as 1 second, 1 minute, 1 day, 1 week, etc.
|
|
147
|
+
_compression = 1
|
|
148
|
+
# Set _timeframe attribute, default is Days
|
|
149
|
+
_timeframe = TimeFrame.Days
|
|
150
|
+
|
|
151
|
+
# Set 7 common attributes for dataseries and their values
|
|
152
|
+
Close, Low, High, Open, Volume, OpenInterest, DateTime = range(7)
|
|
153
|
+
# Line order in dataseries
|
|
154
|
+
LineOrder = [DateTime, Open, High, Low, Close, Volume, OpenInterest]
|
|
155
|
+
|
|
156
|
+
# Get header variable names of dataseries
|
|
157
|
+
def getwriterheaders(self):
|
|
158
|
+
"""Get header names for writing data.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
list: List of header names including data name and line names.
|
|
162
|
+
"""
|
|
163
|
+
headers = [self._name, "len"]
|
|
164
|
+
|
|
165
|
+
for lo in self.LineOrder:
|
|
166
|
+
headers.append(self._getlinealias(lo))
|
|
167
|
+
|
|
168
|
+
morelines = self.getlinealiases()[len(self.LineOrder) :]
|
|
169
|
+
headers.extend(morelines)
|
|
170
|
+
|
|
171
|
+
return headers
|
|
172
|
+
|
|
173
|
+
# Get values
|
|
174
|
+
def getwritervalues(self):
|
|
175
|
+
"""Get current values for writing.
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
list: List of current values including data name, length, and line values.
|
|
179
|
+
"""
|
|
180
|
+
length = len(self)
|
|
181
|
+
values = [self._name, length]
|
|
182
|
+
|
|
183
|
+
if length:
|
|
184
|
+
values.append(self.datetime.datetime(0))
|
|
185
|
+
for line in self.LineOrder[1:]:
|
|
186
|
+
values.append(self.lines[line][0])
|
|
187
|
+
for i in range(len(self.LineOrder), self.lines.size()):
|
|
188
|
+
values.append(self.lines[i][0])
|
|
189
|
+
else:
|
|
190
|
+
values.extend([""] * self.lines.size()) # no values yet
|
|
191
|
+
|
|
192
|
+
return values
|
|
193
|
+
|
|
194
|
+
# Get written information
|
|
195
|
+
def getwriterinfo(self):
|
|
196
|
+
"""Get information about the data series.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
OrderedDict: Dictionary with name, timeframe, and compression info.
|
|
200
|
+
"""
|
|
201
|
+
# returns dictionary with information
|
|
202
|
+
info = OrderedDict()
|
|
203
|
+
info["Name"] = self._name
|
|
204
|
+
info["Timeframe"] = TimeFrame.TName(self._timeframe)
|
|
205
|
+
info["Compression"] = self._compression
|
|
206
|
+
|
|
207
|
+
return info
|
|
208
|
+
|
|
209
|
+
def get_name(self):
|
|
210
|
+
"""Get the name of this data series.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
str: Data series name.
|
|
214
|
+
"""
|
|
215
|
+
return self._name
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class OHLC(DataSeries):
|
|
219
|
+
"""DataSeries with OHLCV lines but no datetime line.
|
|
220
|
+
|
|
221
|
+
Lines:
|
|
222
|
+
close, low, high, open, volume, openinterest
|
|
223
|
+
"""
|
|
224
|
+
|
|
225
|
+
# Inherit from DataSeries, lines exclude datetime leaving only 6
|
|
226
|
+
lines = (
|
|
227
|
+
"close",
|
|
228
|
+
"low",
|
|
229
|
+
"high",
|
|
230
|
+
"open",
|
|
231
|
+
"volume",
|
|
232
|
+
"openinterest",
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
class OHLCDateTime(OHLC):
|
|
237
|
+
"""DataSeries with datetime line plus OHLCV lines.
|
|
238
|
+
|
|
239
|
+
This is the full-featured data series for financial data.
|
|
240
|
+
"""
|
|
241
|
+
|
|
242
|
+
# Inherit from DataSeries, lines only keep datetime
|
|
243
|
+
lines = (("datetime"),)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
class SimpleFilterWrapper:
|
|
247
|
+
"""Wrapper for filters added via .addfilter to turn them
|
|
248
|
+
into processors.
|
|
249
|
+
|
|
250
|
+
Filters are callables which
|
|
251
|
+
|
|
252
|
+
- Take `data` as an argument
|
|
253
|
+
- Return False if the current bar has not triggered the filter
|
|
254
|
+
- Return True if the current bar must be filtered
|
|
255
|
+
|
|
256
|
+
The wrapper takes the return value and executes the bar removal
|
|
257
|
+
if needed to be
|
|
258
|
+
"""
|
|
259
|
+
|
|
260
|
+
# This is a class for adding filters, which can perform certain operations on data according to filter needs, such as removal
|
|
261
|
+
# This filter is usually a class or a function
|
|
262
|
+
def __init__(self, data, ffilter, *args, **kwargs):
|
|
263
|
+
"""Initialize the filter wrapper.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
data: Data source to filter.
|
|
267
|
+
ffilter: Filter class or callable.
|
|
268
|
+
*args: Positional arguments for the filter.
|
|
269
|
+
**kwargs: Keyword arguments for the filter.
|
|
270
|
+
"""
|
|
271
|
+
if inspect.isclass(ffilter):
|
|
272
|
+
ffilter = ffilter(data, *args, **kwargs)
|
|
273
|
+
args = []
|
|
274
|
+
kwargs = {}
|
|
275
|
+
|
|
276
|
+
self.ffilter = ffilter
|
|
277
|
+
self.args = args
|
|
278
|
+
self.kwargs = kwargs
|
|
279
|
+
|
|
280
|
+
def __call__(self, data):
|
|
281
|
+
"""Apply the filter to the data.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
data: Data source to filter.
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
bool: True if bar was filtered (removed), False otherwise.
|
|
288
|
+
"""
|
|
289
|
+
if self.ffilter(data, *self.args, **self.kwargs):
|
|
290
|
+
data.backwards()
|
|
291
|
+
return True
|
|
292
|
+
|
|
293
|
+
return False
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class _Bar(AutoOrderedDict):
|
|
297
|
+
"""
|
|
298
|
+
This class is a placeholder for the values of the standard lines in a
|
|
299
|
+
DataBase class (from OHLCDateTime)
|
|
300
|
+
|
|
301
|
+
It inherits from AutoOrderedDict to be able to easily return the values as
|
|
302
|
+
an iterable and address the keys as attributes
|
|
303
|
+
|
|
304
|
+
Order of definition is important and must match that of the lines
|
|
305
|
+
definition in DataBase (which directly inherits from OHLCDateTime)
|
|
306
|
+
"""
|
|
307
|
+
|
|
308
|
+
# This bar is a placeholder for DataBase with standard lines, commonly used to combine small period candlesticks into large period candlesticks
|
|
309
|
+
replaying = False
|
|
310
|
+
|
|
311
|
+
# Without - 1 ... converting back to time will not work
|
|
312
|
+
# Need another -1 to support timezones which may move the time forward
|
|
313
|
+
MAXDATE = date2num(_datetime.datetime.max) - 2
|
|
314
|
+
|
|
315
|
+
def __init__(self, maxdate=False):
|
|
316
|
+
"""Initialize a bar container.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
maxdate: If True, set datetime to maximum date.
|
|
320
|
+
"""
|
|
321
|
+
super().__init__()
|
|
322
|
+
# Note: These cannot be set here as they conflict with line definitions
|
|
323
|
+
# self.datetime = None
|
|
324
|
+
# self.openinterest = None
|
|
325
|
+
# self.volume = None
|
|
326
|
+
# self.open = None
|
|
327
|
+
# self.high = None
|
|
328
|
+
# self.low = None
|
|
329
|
+
# self.close = None
|
|
330
|
+
self.bstart(maxdate=maxdate)
|
|
331
|
+
|
|
332
|
+
def bstart(self, maxdate=False):
|
|
333
|
+
"""Initializes a bar to the default not-updated vaues"""
|
|
334
|
+
# Initialize before starting
|
|
335
|
+
# Order is important: defined in DataSeries/OHLC/OHLCDateTime
|
|
336
|
+
self.close = float("NaN")
|
|
337
|
+
self.low = float("inf")
|
|
338
|
+
self.high = float("-inf")
|
|
339
|
+
self.open = float("NaN")
|
|
340
|
+
self.volume = 0.0
|
|
341
|
+
self.openinterest = 0.0
|
|
342
|
+
self.datetime = self.MAXDATE if maxdate else None
|
|
343
|
+
|
|
344
|
+
def isopen(self):
|
|
345
|
+
# Check if already updated
|
|
346
|
+
"""Returns if a bar has already been updated
|
|
347
|
+
|
|
348
|
+
Uses the fact that NaN is the value which is not equal to itself
|
|
349
|
+
and ``open`` is initialized to NaN
|
|
350
|
+
"""
|
|
351
|
+
o = self.open
|
|
352
|
+
return o == o # False if NaN, True in other cases
|
|
353
|
+
|
|
354
|
+
def bupdate(self, data, reopen=False):
|
|
355
|
+
# Update specific bar
|
|
356
|
+
"""Updates a bar with the values from data
|
|
357
|
+
|
|
358
|
+
Returns True if the update was the 1st on a bar (just opened)
|
|
359
|
+
|
|
360
|
+
Returns False otherwise
|
|
361
|
+
"""
|
|
362
|
+
if reopen:
|
|
363
|
+
self.bstart()
|
|
364
|
+
|
|
365
|
+
self.datetime = data.datetime[0]
|
|
366
|
+
|
|
367
|
+
self.high = max(self.high, data.high[0])
|
|
368
|
+
self.low = min(self.low, data.low[0])
|
|
369
|
+
self.close = data.close[0]
|
|
370
|
+
|
|
371
|
+
self.volume += data.volume[0]
|
|
372
|
+
self.openinterest = data.openinterest[0]
|
|
373
|
+
|
|
374
|
+
o = self.open
|
|
375
|
+
if reopen or o != o: # noqa: PLR0124 # o != o is a NaN check (NaN != NaN)
|
|
376
|
+
self.open = data.open[0]
|
|
377
|
+
return True # just opened the bar
|
|
378
|
+
|
|
379
|
+
return False
|
backtrader/errors.py
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Exception Classes Module - Custom exceptions for backtrader.
|
|
3
|
+
|
|
4
|
+
This module defines the exception hierarchy used throughout the
|
|
5
|
+
backtrader framework.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
BacktraderError: Base exception for all backtrader exceptions.
|
|
9
|
+
StrategySkipError: Raised to skip a strategy during optimization.
|
|
10
|
+
ModuleImportError: Raised when a required module cannot be imported.
|
|
11
|
+
FromModuleImportError: Raised when a from-style import fails.
|
|
12
|
+
DataError: Raised for data-feed/parsing problems.
|
|
13
|
+
BrokerError: Raised for broker/execution problems.
|
|
14
|
+
OrderError: Raised for order-related problems (subclass of BrokerError).
|
|
15
|
+
ConfigError: Raised for invalid configuration/parameters.
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
Raising StrategySkipError during optimization:
|
|
19
|
+
>>> class MyStrategy(bt.Strategy):
|
|
20
|
+
... params = (('period', 20),)
|
|
21
|
+
...
|
|
22
|
+
... def __init__(self):
|
|
23
|
+
... if self.p.period < 5:
|
|
24
|
+
... raise bt.errors.StrategySkipError()
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
# 'from errors import *' exports the base and the most commonly raised classes.
|
|
28
|
+
# The category classes are additive (new parents only); existing classes and
|
|
29
|
+
# their inheritance are unchanged so isinstance() checks stay compatible.
|
|
30
|
+
__all__ = [
|
|
31
|
+
"BacktraderError",
|
|
32
|
+
"StrategySkipError",
|
|
33
|
+
"DataError",
|
|
34
|
+
"BrokerError",
|
|
35
|
+
"OrderError",
|
|
36
|
+
"ConfigError",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# BacktraderError class
|
|
41
|
+
class BacktraderError(Exception):
|
|
42
|
+
"""Base exception for all backtrader exceptions."""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# StrategySkipError, only this class is used in cerebro
|
|
46
|
+
class StrategySkipError(BacktraderError):
|
|
47
|
+
"""Requests the platform to skip this strategy for backtesting. To be
|
|
48
|
+
raised during the initialization (``__init__``) phase of the instance"""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# ModuleImportError class
|
|
52
|
+
class ModuleImportError(BacktraderError):
|
|
53
|
+
"""Raised if a class requests a module to be present to work and it cannot
|
|
54
|
+
be imported"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, message, *args):
|
|
57
|
+
"""Initialize the ModuleImportError.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
message: Error message.
|
|
61
|
+
*args: Additional arguments.
|
|
62
|
+
"""
|
|
63
|
+
super().__init__(message, *args)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# FromModuleImportError class
|
|
67
|
+
class FromModuleImportError(ModuleImportError):
|
|
68
|
+
"""Raised if a class requests a module to be present to work and it cannot
|
|
69
|
+
be imported"""
|
|
70
|
+
|
|
71
|
+
def __init__(self, message, *args):
|
|
72
|
+
"""Initialize the FromModuleImportError.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
message: Error message.
|
|
76
|
+
*args: Additional arguments.
|
|
77
|
+
"""
|
|
78
|
+
super().__init__(message, *args)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# ---------------------------------------------------------------------------
|
|
82
|
+
# Business exception categories (additive, Sprint 3).
|
|
83
|
+
#
|
|
84
|
+
# These give callers a meaningful hierarchy to catch
|
|
85
|
+
# (e.g. ``except bt.errors.DataError``) without having to enumerate stdlib
|
|
86
|
+
# exceptions. They all derive from BacktraderError, so existing
|
|
87
|
+
# ``except BacktraderError`` handlers keep working. Nothing here changes the
|
|
88
|
+
# parent of a previously existing class, so isinstance() behavior is
|
|
89
|
+
# backward compatible.
|
|
90
|
+
# ---------------------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class DataError(BacktraderError):
|
|
94
|
+
"""Raised for data-feed problems: loading, parsing, or alignment failures."""
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class BrokerError(BacktraderError):
|
|
98
|
+
"""Raised for broker/execution problems: cash, margin, or matching failures."""
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class OrderError(BrokerError):
|
|
102
|
+
"""Raised for order-related problems: invalid size/price or rejected orders."""
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class ConfigError(BacktraderError):
|
|
106
|
+
"""Raised for invalid configuration or parameter values."""
|