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,21 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
|
|
3
|
+
"""Backtrader mixins module.
|
|
4
|
+
|
|
5
|
+
This module provides mixin classes that can be used to add functionality
|
|
6
|
+
to other classes without using metaclasses. These mixins are part of the
|
|
7
|
+
effort to remove metaprogramming from backtrader while maintaining
|
|
8
|
+
backward compatibility.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from .singleton import (
|
|
12
|
+
ParameterizedSingletonMixin,
|
|
13
|
+
SingletonMixin,
|
|
14
|
+
StoreBase,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"SingletonMixin",
|
|
19
|
+
"ParameterizedSingletonMixin",
|
|
20
|
+
"StoreBase",
|
|
21
|
+
]
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Singleton Mixin Module - Singleton pattern implementation.
|
|
3
|
+
|
|
4
|
+
This module provides the SingletonMixin class for implementing the
|
|
5
|
+
singleton pattern without using metaclasses. This is part of the
|
|
6
|
+
metaprogramming removal effort in backtrader.
|
|
7
|
+
|
|
8
|
+
Classes:
|
|
9
|
+
SingletonMixin: Mixin class that implements the singleton pattern.
|
|
10
|
+
ParameterizedSingletonMixin: Singleton mixin with parameter support.
|
|
11
|
+
StoreBase: Base class for store singletons.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
Creating a singleton class:
|
|
15
|
+
>>> class MyClass(SingletonMixin):
|
|
16
|
+
... pass
|
|
17
|
+
>>> a = MyClass()
|
|
18
|
+
>>> b = MyClass()
|
|
19
|
+
>>> assert a is b # True - same instance
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import threading
|
|
23
|
+
import weakref
|
|
24
|
+
from typing import Any, Dict, Optional
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SingletonMixin:
|
|
28
|
+
"""Mixin class to implement singleton pattern using __new__ method.
|
|
29
|
+
|
|
30
|
+
This replaces the MetaSingleton metaclass pattern, providing the same
|
|
31
|
+
functionality without using metaclasses. Each class that inherits from
|
|
32
|
+
this mixin will maintain exactly one instance per class.
|
|
33
|
+
|
|
34
|
+
Thread-safe implementation using threading.Lock.
|
|
35
|
+
|
|
36
|
+
Features:
|
|
37
|
+
- Thread-safe singleton creation
|
|
38
|
+
- Per-class singleton instances (subclasses get their own instances)
|
|
39
|
+
- Automatic cleanup when instances are garbage collected
|
|
40
|
+
- Maintains compatibility with existing parameter systems
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
# Class-level storage for singleton instances
|
|
44
|
+
# Using WeakValueDictionary for automatic cleanup
|
|
45
|
+
_instances: Dict[type, Any] = weakref.WeakValueDictionary()
|
|
46
|
+
_lock = threading.Lock()
|
|
47
|
+
|
|
48
|
+
def __new__(cls, *args, **kwargs):
|
|
49
|
+
"""Create or return existing singleton instance for the class."""
|
|
50
|
+
|
|
51
|
+
# Check if instance already exists (fast path, no lock)
|
|
52
|
+
if cls in cls._instances:
|
|
53
|
+
return cls._instances[cls]
|
|
54
|
+
|
|
55
|
+
# Acquire lock for thread-safe creation
|
|
56
|
+
with cls._lock:
|
|
57
|
+
# Double-check pattern: instance might have been created
|
|
58
|
+
# by another thread while waiting for lock
|
|
59
|
+
if cls in cls._instances:
|
|
60
|
+
return cls._instances[cls]
|
|
61
|
+
|
|
62
|
+
# Create new instance using object.__new__ directly
|
|
63
|
+
# This avoids recursion issues with mixin inheritance
|
|
64
|
+
instance = object.__new__(cls)
|
|
65
|
+
|
|
66
|
+
# Store instance before calling __init__ to handle potential
|
|
67
|
+
# recursive calls during initialization
|
|
68
|
+
cls._instances[cls] = instance
|
|
69
|
+
|
|
70
|
+
return instance
|
|
71
|
+
|
|
72
|
+
@classmethod
|
|
73
|
+
def _reset_instance(cls):
|
|
74
|
+
"""Reset the singleton instance for this class.
|
|
75
|
+
|
|
76
|
+
This is mainly for testing purposes and should be used with caution
|
|
77
|
+
in production code.
|
|
78
|
+
"""
|
|
79
|
+
with cls._lock:
|
|
80
|
+
if cls in cls._instances:
|
|
81
|
+
del cls._instances[cls]
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def _get_instance(cls) -> Optional[Any]:
|
|
85
|
+
"""Get the current singleton instance if it exists.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
The singleton instance if it exists, None otherwise.
|
|
89
|
+
"""
|
|
90
|
+
return cls._instances.get(cls)
|
|
91
|
+
|
|
92
|
+
@classmethod
|
|
93
|
+
def _has_instance(cls) -> bool:
|
|
94
|
+
"""Check if a singleton instance exists for this class.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
True if instance exists, False otherwise.
|
|
98
|
+
"""
|
|
99
|
+
return cls in cls._instances
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class ParameterizedSingletonMixin(SingletonMixin):
|
|
103
|
+
"""Enhanced singleton mixin that integrates with parameter systems.
|
|
104
|
+
|
|
105
|
+
This version is specifically designed to work with backtrader's
|
|
106
|
+
parameter system, maintaining compatibility with MetaParams functionality.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
def __init__(self, *args, **kwargs):
|
|
110
|
+
"""Initialize singleton instance only once."""
|
|
111
|
+
if getattr(self, "_singleton_initialized", False):
|
|
112
|
+
return
|
|
113
|
+
|
|
114
|
+
self._singleton_initialized = True
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# Backward compatibility alias
|
|
118
|
+
StoreBase = ParameterizedSingletonMixin
|
backtrader/observer.py
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Observer Module - Strategy monitoring and data collection.
|
|
3
|
+
|
|
4
|
+
This module provides the Observer base class for monitoring strategy
|
|
5
|
+
execution and collecting data during backtesting. Observers track metrics
|
|
6
|
+
like cash, value, drawdown, and trade statistics.
|
|
7
|
+
|
|
8
|
+
Observers are similar to indicators but are used primarily for monitoring
|
|
9
|
+
and recording strategy state rather than generating trading signals.
|
|
10
|
+
|
|
11
|
+
Key Classes:
|
|
12
|
+
Observer: Base class for all observers.
|
|
13
|
+
|
|
14
|
+
Observers receive the same notifications as strategies:
|
|
15
|
+
- prenext/nextstart/next: Called during each bar
|
|
16
|
+
- start/stop: Called at the beginning and end of backtesting
|
|
17
|
+
|
|
18
|
+
Example:
|
|
19
|
+
Creating a custom observer:
|
|
20
|
+
>>> class MyObserver(Observer):
|
|
21
|
+
... lines = ('custom_metric',)
|
|
22
|
+
...
|
|
23
|
+
... def next(self):
|
|
24
|
+
... self.lines.custom_metric[0] = self.data.close[0] * 2
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from .lineiterator import LineIterator, ObserverBase, StrategyBase
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Observer class - refactored to not use metaclass
|
|
31
|
+
class Observer(ObserverBase):
|
|
32
|
+
"""Base class for monitoring strategy execution.
|
|
33
|
+
|
|
34
|
+
Observers track and record strategy state during backtesting.
|
|
35
|
+
They can track metrics like cash, value, drawdown, positions, etc.
|
|
36
|
+
|
|
37
|
+
Attributes:
|
|
38
|
+
csv: Whether to save observer data to CSV (default: True).
|
|
39
|
+
plotinfo: Plotting configuration dictionary.
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
>>> observer = MyObserver()
|
|
43
|
+
>>> cerebro.addobserver(observer)
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
# Set _stclock to False
|
|
47
|
+
_stclock = False
|
|
48
|
+
# Owned instance
|
|
49
|
+
_OwnerCls = StrategyBase
|
|
50
|
+
# Line type
|
|
51
|
+
_ltype = LineIterator.ObsType
|
|
52
|
+
# Whether to save to csv and other files
|
|
53
|
+
csv = True
|
|
54
|
+
# Plot settings options
|
|
55
|
+
plotinfo = {"plot": False, "subplot": True}
|
|
56
|
+
|
|
57
|
+
def __init__(self, *args, **kwargs):
|
|
58
|
+
"""
|
|
59
|
+
Initialize Observer with functionality previously in MetaObserver.dopreinit.
|
|
60
|
+
|
|
61
|
+
Note: __new__ removed - _analyzers initialization moved here.
|
|
62
|
+
"""
|
|
63
|
+
# Initialize _analyzers list (moved from __new__)
|
|
64
|
+
self._analyzers = [] # keep children analyzers
|
|
65
|
+
|
|
66
|
+
# Initialize parent first
|
|
67
|
+
super().__init__(*args, **kwargs)
|
|
68
|
+
|
|
69
|
+
# Handle _stclock functionality (previously in MetaObserver.dopreinit)
|
|
70
|
+
if self._stclock: # Change the clock if strategy wide observer
|
|
71
|
+
self._clock = self._owner
|
|
72
|
+
|
|
73
|
+
# An Observer is ideally always observing and that' why prenext calls next.
|
|
74
|
+
# The behavior can be overriden by subclasses
|
|
75
|
+
def prenext(self):
|
|
76
|
+
"""Process bars before minimum period is reached.
|
|
77
|
+
|
|
78
|
+
By default, observers always process every bar by calling next()
|
|
79
|
+
even during the prenext phase. Subclasses can override this behavior.
|
|
80
|
+
|
|
81
|
+
Note:
|
|
82
|
+
This default implementation calls next() to ensure observers
|
|
83
|
+
track all bars from the beginning.
|
|
84
|
+
"""
|
|
85
|
+
self.next()
|
|
86
|
+
|
|
87
|
+
# Register analyzer
|
|
88
|
+
def _register_analyzer(self, analyzer):
|
|
89
|
+
self._analyzers.append(analyzer)
|
|
90
|
+
|
|
91
|
+
def _start(self):
|
|
92
|
+
# PERFORMANCE FIX: Ensure _owner is set before calling start()
|
|
93
|
+
# This is a fallback for cases where findowner didn't find the strategy during __init__
|
|
94
|
+
if not hasattr(self, "_owner") or self._owner is None:
|
|
95
|
+
# Try to get owner from _parent (set by strategy when adding observer)
|
|
96
|
+
if hasattr(self, "_parent") and self._parent is not None:
|
|
97
|
+
self._owner = self._parent
|
|
98
|
+
|
|
99
|
+
self.start()
|
|
100
|
+
|
|
101
|
+
def start(self):
|
|
102
|
+
"""Called at the start of the backtesting run.
|
|
103
|
+
|
|
104
|
+
This method can be overridden by subclasses to perform
|
|
105
|
+
initialization at the start of strategy execution.
|
|
106
|
+
"""
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Observers Module - Strategy monitoring observers.
|
|
3
|
+
|
|
4
|
+
This module provides observers for monitoring and recording strategy
|
|
5
|
+
execution. Observers track metrics like cash, value, drawdown, trades,
|
|
6
|
+
and benchmark data during backtesting.
|
|
7
|
+
|
|
8
|
+
Available Observers:
|
|
9
|
+
- Benchmark: Benchmark data (price) for comparison
|
|
10
|
+
- Broker: Cash and value tracking
|
|
11
|
+
- BuySell: Buy/sell signal visualization
|
|
12
|
+
- DrawDown: Drawdown tracking and visualization
|
|
13
|
+
- LogReturns: Log returns tracking
|
|
14
|
+
- TimeReturn: Returns by time period
|
|
15
|
+
- Trades: Trade tracking
|
|
16
|
+
- TradeLogger: Comprehensive logging (orders, trades, positions, indicators, signals)
|
|
17
|
+
|
|
18
|
+
Example:
|
|
19
|
+
Adding observers to a strategy:
|
|
20
|
+
>>> cerebro.addobserver(bt.observers.DrawDown)
|
|
21
|
+
>>> cerebro.addobserver(bt.observers.Trades)
|
|
22
|
+
>>> cerebro.addobserver(bt.observers.TradeLogger, log_dir='./logs')
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import os as _os
|
|
26
|
+
|
|
27
|
+
# The modules below should/must define __all__ with the Indicator objects
|
|
28
|
+
# of prepend an "_" (underscore) to private classes/variables
|
|
29
|
+
|
|
30
|
+
if _os.environ.get("BACKTRADER_LIGHT_IMPORT", "").strip().lower() in {
|
|
31
|
+
"1",
|
|
32
|
+
"true",
|
|
33
|
+
"yes",
|
|
34
|
+
"on",
|
|
35
|
+
}:
|
|
36
|
+
from .trade_logger import TradeLogger as TradeLogger
|
|
37
|
+
else:
|
|
38
|
+
from .benchmark import *
|
|
39
|
+
from .broker import *
|
|
40
|
+
from .buysell import *
|
|
41
|
+
from .drawdown import *
|
|
42
|
+
from .logreturns import *
|
|
43
|
+
from .timereturn import *
|
|
44
|
+
from .trade_logger import TradeLogger as TradeLogger
|
|
45
|
+
from .trades import *
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Benchmark Observer Module - Strategy vs benchmark comparison.
|
|
3
|
+
|
|
4
|
+
This module provides the Benchmark observer for tracking strategy returns
|
|
5
|
+
against a reference asset (benchmark).
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
Benchmark: Observer that compares strategy performance to a benchmark.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> cerebro = bt.Cerebro()
|
|
12
|
+
>>> data = bt.feeds.GenericCSVData(dataname='benchmark.csv')
|
|
13
|
+
>>> cerebro.adddata(data)
|
|
14
|
+
>>> cerebro.addobserver(bt.observers.Benchmark, data=data)
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from ..analyzers.timereturn import TimeReturn as TimeReturnAnalyzer
|
|
18
|
+
from .timereturn import TimeReturn
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Benchmark
|
|
22
|
+
class Benchmark(TimeReturn):
|
|
23
|
+
"""This observer stores the *returns* of the strategy and the *return* of a
|
|
24
|
+
reference asset which is one of the datas passed to the system.
|
|
25
|
+
|
|
26
|
+
Params:
|
|
27
|
+
|
|
28
|
+
- ``timeframe`` (default: ``None``)
|
|
29
|
+
If ``None`` then the complete return over the entire backtested period
|
|
30
|
+
will be reported
|
|
31
|
+
|
|
32
|
+
- ``compression`` (default: ``None``)
|
|
33
|
+
|
|
34
|
+
Only used for sub-day timeframes to, for example, work on an hourly
|
|
35
|
+
timeframe by specifying "TimeFrame.Minutes" and 60 as compression
|
|
36
|
+
|
|
37
|
+
- ``data`` (default: ``None``)
|
|
38
|
+
|
|
39
|
+
Reference asset to track to allow for comparison.
|
|
40
|
+
|
|
41
|
+
:note:: this data must have been added to a ``cerebro`` instance with
|
|
42
|
+
``addata``, ``resampledata`` or ``replaydata``.
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
- ``_doprenext`` (default: ``False``)
|
|
46
|
+
|
|
47
|
+
Benchmarking will take place from the point at which the strategy kicks
|
|
48
|
+
in (i.e.: when the minimum period of the strategy has been met).
|
|
49
|
+
|
|
50
|
+
Setting this to ``True`` will record benchmarking values from the
|
|
51
|
+
starting point of the data feeds
|
|
52
|
+
|
|
53
|
+
- ``firstopen`` (default: ``False``)
|
|
54
|
+
|
|
55
|
+
Keepint it as ``False`` ensures that the 1st comparison point between
|
|
56
|
+
the value and the benchmark starts at 0%, because the benchmark will
|
|
57
|
+
not use its opening price.
|
|
58
|
+
|
|
59
|
+
See the ``TimeReturn`` analyzer reference for a full explanation of the
|
|
60
|
+
meaning of the parameter
|
|
61
|
+
|
|
62
|
+
- ``fund`` (default: ``None``)
|
|
63
|
+
|
|
64
|
+
If `None`, the actual mode of the broker (fundmode - True/False) will
|
|
65
|
+
be autodetected to decide if the returns are based on the total net
|
|
66
|
+
asset value or on the fund value. See ``set_fundmode`` in the broker
|
|
67
|
+
documentation
|
|
68
|
+
|
|
69
|
+
Set it to ``True`` or ``False`` for a specific behavior
|
|
70
|
+
|
|
71
|
+
Remember that at any moment of a `run` the current values can be checked
|
|
72
|
+
by looking at the *lines* by name at index ``0``.
|
|
73
|
+
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
_stclock = True
|
|
77
|
+
|
|
78
|
+
lines = ("benchmark",)
|
|
79
|
+
plotlines = {"benchmark": {"_name": "Benchmark"}}
|
|
80
|
+
|
|
81
|
+
params = (
|
|
82
|
+
("data", None),
|
|
83
|
+
("_doprenext", False),
|
|
84
|
+
# Set to False, to ensure the asset is measured at 0% in the 1st tick
|
|
85
|
+
("firstopen", False),
|
|
86
|
+
("fund", None),
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def _plotlabel(self):
|
|
90
|
+
labels = super()._plotlabel()
|
|
91
|
+
labels.append(self.p.data._name)
|
|
92
|
+
return labels
|
|
93
|
+
|
|
94
|
+
def __init__(self):
|
|
95
|
+
"""Initialize the Benchmark observer.
|
|
96
|
+
|
|
97
|
+
Sets up data reference and benchmark analyzer.
|
|
98
|
+
"""
|
|
99
|
+
if self.p.data is None: # use the 1st data in the system if none given
|
|
100
|
+
self.p.data = self.data0
|
|
101
|
+
|
|
102
|
+
super().__init__() # treturn including data parameter
|
|
103
|
+
# Create a time return object without the data
|
|
104
|
+
kwargs = self.p._getkwargs()
|
|
105
|
+
kwargs.update(data=None) # to create a return for the strategy
|
|
106
|
+
# Get return rate
|
|
107
|
+
t = self._owner._addanalyzer_slave(TimeReturnAnalyzer, **kwargs)
|
|
108
|
+
|
|
109
|
+
# swap for consistency
|
|
110
|
+
self.treturn, self.tbench = t, self.treturn
|
|
111
|
+
|
|
112
|
+
def next(self):
|
|
113
|
+
"""Update benchmark value for the current period.
|
|
114
|
+
|
|
115
|
+
Gets the benchmark return from the analyzer.
|
|
116
|
+
"""
|
|
117
|
+
super().next()
|
|
118
|
+
self.lines.benchmark[0] = self.tbench.rets.get(self.tbench.dtkey, float("NaN"))
|
|
119
|
+
|
|
120
|
+
def prenext(self):
|
|
121
|
+
"""Process bars before minimum period is reached.
|
|
122
|
+
|
|
123
|
+
Handles prenext phase for time tracking.
|
|
124
|
+
"""
|
|
125
|
+
if self.p._doprenext:
|
|
126
|
+
super(TimeReturn, self).prenext()
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Broker Observer Module - Cash and value tracking.
|
|
3
|
+
|
|
4
|
+
This module provides observers for tracking broker cash and portfolio value.
|
|
5
|
+
|
|
6
|
+
Classes:
|
|
7
|
+
Cash: Observer that tracks current cash level.
|
|
8
|
+
Value: Observer that tracks portfolio value.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> cerebro = bt.Cerebro()
|
|
12
|
+
>>> cerebro.addobserver(bt.observers.Broker)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from ..observer import Observer
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# Get cash
|
|
19
|
+
class Cash(Observer):
|
|
20
|
+
"""This observer keeps track the current amount of cash in the broker
|
|
21
|
+
|
|
22
|
+
Params: None
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
_stclock = True
|
|
26
|
+
|
|
27
|
+
lines = ("cash",)
|
|
28
|
+
|
|
29
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
30
|
+
|
|
31
|
+
def next(self):
|
|
32
|
+
"""Update the cash value for the current period.
|
|
33
|
+
|
|
34
|
+
Gets current cash amount from the broker.
|
|
35
|
+
"""
|
|
36
|
+
self.lines[0][0] = self._owner.broker.getcash()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# Get value
|
|
40
|
+
class Value(Observer):
|
|
41
|
+
"""This observer keeps track of the current portfolio value in the broker
|
|
42
|
+
including the cash
|
|
43
|
+
|
|
44
|
+
Params:
|
|
45
|
+
|
|
46
|
+
- ``fund`` (default: ``None``)
|
|
47
|
+
|
|
48
|
+
If `None`, the actual mode of the broker (fundmode - True/False) will
|
|
49
|
+
be autodetected to decide if the returns are based on the total net
|
|
50
|
+
asset value or on the fund value. See ``set_fundmode`` in the broker
|
|
51
|
+
documentation
|
|
52
|
+
|
|
53
|
+
Set it to ``True`` or ``False`` for a specific behavior
|
|
54
|
+
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
_stclock = True
|
|
58
|
+
|
|
59
|
+
params = (("fund", None),)
|
|
60
|
+
|
|
61
|
+
lines = ("value",)
|
|
62
|
+
|
|
63
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
64
|
+
|
|
65
|
+
def __init__(self):
|
|
66
|
+
"""Initialize the Value observer.
|
|
67
|
+
|
|
68
|
+
Sets up fund mode tracking variable.
|
|
69
|
+
"""
|
|
70
|
+
self._fundmode = None
|
|
71
|
+
|
|
72
|
+
def start(self):
|
|
73
|
+
"""Start the Value observer and determine fund mode.
|
|
74
|
+
|
|
75
|
+
Detects or sets fund mode for value calculation.
|
|
76
|
+
"""
|
|
77
|
+
if self.p.fund is None:
|
|
78
|
+
self._fundmode = self._owner.broker.fundmode
|
|
79
|
+
else:
|
|
80
|
+
self._fundmode = self.p.fund
|
|
81
|
+
|
|
82
|
+
def next(self):
|
|
83
|
+
"""Update the portfolio value for the current period.
|
|
84
|
+
|
|
85
|
+
Gets value from broker based on fund mode setting.
|
|
86
|
+
"""
|
|
87
|
+
if not self._fundmode:
|
|
88
|
+
self.lines[0][0] = self._owner.broker.getvalue()
|
|
89
|
+
else:
|
|
90
|
+
self.lines[0][0] = self._owner.broker.fundvalue
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# Get both cash and value
|
|
94
|
+
class Broker(Observer):
|
|
95
|
+
"""This observer keeps track of the current cash amount and portfolio value in
|
|
96
|
+
the broker (including the cash)
|
|
97
|
+
|
|
98
|
+
Params: None
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
_stclock = True
|
|
102
|
+
|
|
103
|
+
params = (("fund", None),)
|
|
104
|
+
|
|
105
|
+
alias = ("CashValue",)
|
|
106
|
+
lines = ("cash", "value")
|
|
107
|
+
|
|
108
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
109
|
+
|
|
110
|
+
def __init__(self):
|
|
111
|
+
"""Initialize the Broker observer.
|
|
112
|
+
|
|
113
|
+
Sets up fund mode tracking variable.
|
|
114
|
+
"""
|
|
115
|
+
self._fundmode = None
|
|
116
|
+
|
|
117
|
+
def start(self):
|
|
118
|
+
"""Start the Broker observer and configure plotting.
|
|
119
|
+
|
|
120
|
+
Determines fund mode and configures plot settings.
|
|
121
|
+
"""
|
|
122
|
+
if self.p.fund is None:
|
|
123
|
+
self._fundmode = self._owner.broker.fundmode
|
|
124
|
+
else:
|
|
125
|
+
self._fundmode = self.p.fund
|
|
126
|
+
|
|
127
|
+
if self._fundmode:
|
|
128
|
+
self.plotlines.cash._plotskip = True
|
|
129
|
+
self.plotlines.value._name = "FundValue"
|
|
130
|
+
|
|
131
|
+
def next(self):
|
|
132
|
+
"""Update cash and value for the current period.
|
|
133
|
+
|
|
134
|
+
Gets current cash and portfolio value from the broker.
|
|
135
|
+
"""
|
|
136
|
+
if not self._fundmode:
|
|
137
|
+
self.lines.value[0] = self._owner.broker.getvalue()
|
|
138
|
+
self.lines.cash[0] = self._owner.broker.getcash()
|
|
139
|
+
else:
|
|
140
|
+
self.lines.value[0] = self._owner.broker.fundvalue
|
|
141
|
+
self.lines.cash[0] = self._owner.broker.getcash()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
# fundvalue
|
|
145
|
+
class FundValue(Observer):
|
|
146
|
+
"""This observer keeps track of the current fund-like value
|
|
147
|
+
|
|
148
|
+
Params: None
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
_stclock = True
|
|
152
|
+
|
|
153
|
+
alias = ("FundShareValue", "FundVal")
|
|
154
|
+
lines = ("fundval",)
|
|
155
|
+
|
|
156
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
157
|
+
|
|
158
|
+
def next(self):
|
|
159
|
+
"""Update the fund value for the current period.
|
|
160
|
+
|
|
161
|
+
Gets current fund value from the broker.
|
|
162
|
+
"""
|
|
163
|
+
self.lines.fundval[0] = self._owner.broker.fundvalue
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# Fund shares
|
|
167
|
+
class FundShares(Observer):
|
|
168
|
+
"""This observer keeps track of the current fund-like shares
|
|
169
|
+
|
|
170
|
+
Params: None
|
|
171
|
+
"""
|
|
172
|
+
|
|
173
|
+
_stclock = True
|
|
174
|
+
|
|
175
|
+
lines = ("fundshares",)
|
|
176
|
+
|
|
177
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
178
|
+
|
|
179
|
+
def next(self):
|
|
180
|
+
"""Update the fund shares for the current period.
|
|
181
|
+
|
|
182
|
+
Gets current fund shares from the broker.
|
|
183
|
+
"""
|
|
184
|
+
self.lines.fundshares[0] = self._owner.broker.fundshares
|