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/writer.py
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Writer Module - Output writing for strategy execution results.
|
|
3
|
+
|
|
4
|
+
This module provides classes for writing strategy execution results
|
|
5
|
+
to files or stdout. It supports CSV output and custom formatting.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
WriterBase: Base class for writers.
|
|
9
|
+
WriterFile: Writes execution results to file or stdout.
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
Using WriterFile with cerebro:
|
|
13
|
+
>>> cerebro = bt.Cerebro()
|
|
14
|
+
>>> cerebro.addwriter(bt.WriterFile, out='results.csv', csv=True)
|
|
15
|
+
>>> results = cerebro.run()
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import io
|
|
19
|
+
import itertools
|
|
20
|
+
import sys
|
|
21
|
+
from collections.abc import Iterable
|
|
22
|
+
from typing import List, Optional, Union, cast
|
|
23
|
+
|
|
24
|
+
from .lineseries import LineSeries
|
|
25
|
+
from .parameters import ParameterizedBase
|
|
26
|
+
from .utils.log_message import get_logger
|
|
27
|
+
from .utils.py3 import integer_types, map, string_types
|
|
28
|
+
|
|
29
|
+
logger = get_logger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# WriterBase class - refactored to not use metaclass
|
|
33
|
+
class WriterBase(ParameterizedBase):
|
|
34
|
+
"""Base class for writers.
|
|
35
|
+
|
|
36
|
+
This is the base class for all writer implementations.
|
|
37
|
+
Subclasses should override the writing methods to provide
|
|
38
|
+
custom output formatting.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# WriterFile class - refactored to not use metaclass
|
|
43
|
+
class WriterFile(WriterBase):
|
|
44
|
+
"""The system-wide writer class.
|
|
45
|
+
|
|
46
|
+
Writes strategy execution results to a file or stdout.
|
|
47
|
+
|
|
48
|
+
Params:
|
|
49
|
+
out: Output stream (default: sys.stdout). If a string is passed,
|
|
50
|
+
it's treated as a filename. Use None for multiprocess optimization.
|
|
51
|
+
close_out: If True, explicitly close the output stream (default: False).
|
|
52
|
+
csv: If True, write CSV data during execution (default: False).
|
|
53
|
+
csv_filternan: If True, replace NaN values with empty fields (default: True).
|
|
54
|
+
csvsep: CSV separator character (default: ',').
|
|
55
|
+
indent: Indentation for formatted output (default: 2).
|
|
56
|
+
|
|
57
|
+
Example:
|
|
58
|
+
>>> cerebro.addwriter(bt.WriterFile, out='results.csv', csv=True)
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
params = ( # type: ignore[assignment]
|
|
62
|
+
("out", None),
|
|
63
|
+
("close_out", False),
|
|
64
|
+
("csv", False),
|
|
65
|
+
("csvsep", ","),
|
|
66
|
+
("csv_filternan", True),
|
|
67
|
+
("csv_counter", True),
|
|
68
|
+
("indent", 2),
|
|
69
|
+
("separators", ["=", "-", "+", "*", ".", "~", '"', "^", "#"]),
|
|
70
|
+
("seplen", 79),
|
|
71
|
+
("rounding", None),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# Initialize
|
|
75
|
+
def __init__(self, **kwargs):
|
|
76
|
+
"""Initialize the WriterFile instance.
|
|
77
|
+
|
|
78
|
+
Sets up the counter, headers list, and values list for tracking
|
|
79
|
+
data during execution.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
**kwargs: Keyword arguments for writer parameters.
|
|
83
|
+
"""
|
|
84
|
+
# Initialize parent class first
|
|
85
|
+
super().__init__(**kwargs)
|
|
86
|
+
# _len is a counter
|
|
87
|
+
# CRITICAL FIX: Change counter start value from 1 to 0 to match test expectations
|
|
88
|
+
# This fixes assertion error in test_writer.py: assert count == 256
|
|
89
|
+
self._len: "itertools.count[int]" = itertools.count(0)
|
|
90
|
+
# headers
|
|
91
|
+
self.headers: List[str] = []
|
|
92
|
+
# values
|
|
93
|
+
self.values: List[str] = []
|
|
94
|
+
# out and close_out are set in _start_output when start() is called
|
|
95
|
+
self.out: Optional[Union[io.TextIOBase, io.TextIOWrapper]] = None
|
|
96
|
+
self.close_out: bool = True
|
|
97
|
+
|
|
98
|
+
# Start output
|
|
99
|
+
def _start_output(self):
|
|
100
|
+
# open file if needed
|
|
101
|
+
# If there's no out attribute or self.out is None
|
|
102
|
+
if not hasattr(self, "out") or not self.out:
|
|
103
|
+
# If out parameter is None, set out to standard output, and close_out to False
|
|
104
|
+
if self.p.out is None:
|
|
105
|
+
self.out = cast(Union[io.TextIOBase, io.TextIOWrapper], sys.stdout)
|
|
106
|
+
self.close_out = False
|
|
107
|
+
# If self.p.out is a string_types, open file in write mode, close_out needs to be True
|
|
108
|
+
elif isinstance(self.p.out, string_types):
|
|
109
|
+
self.out = cast(
|
|
110
|
+
Union[io.TextIOBase, io.TextIOWrapper],
|
|
111
|
+
open(self.p.out, "w"),
|
|
112
|
+
)
|
|
113
|
+
self.close_out = True
|
|
114
|
+
# If self.p.out is neither None nor string format, self.out equals self.p.out
|
|
115
|
+
else:
|
|
116
|
+
self.out = cast(Union[io.TextIOBase, io.TextIOWrapper], self.p.out)
|
|
117
|
+
self.close_out = self.p.close_out
|
|
118
|
+
|
|
119
|
+
# Start
|
|
120
|
+
def start(self):
|
|
121
|
+
"""Initialize the writer at the start of execution.
|
|
122
|
+
|
|
123
|
+
Opens the output file/stream and writes CSV headers if CSV mode
|
|
124
|
+
is enabled.
|
|
125
|
+
"""
|
|
126
|
+
# Call _start_output to prepare for output
|
|
127
|
+
self._start_output()
|
|
128
|
+
# If csv is True
|
|
129
|
+
if self.p.csv:
|
|
130
|
+
# Write line separator
|
|
131
|
+
self.writelineseparator()
|
|
132
|
+
# Write column names to file, first column defaults to Id
|
|
133
|
+
self.writeiterable(self.headers, counter="Id")
|
|
134
|
+
|
|
135
|
+
# Stop, if close_out is True, close self.out
|
|
136
|
+
def stop(self):
|
|
137
|
+
"""Close the output stream when execution ends.
|
|
138
|
+
|
|
139
|
+
Closes the output file if close_out parameter is True.
|
|
140
|
+
"""
|
|
141
|
+
if self.close_out and self.out is not None:
|
|
142
|
+
try:
|
|
143
|
+
self.out.close()
|
|
144
|
+
except OSError:
|
|
145
|
+
# Stream already closed or not closable; nothing more to do.
|
|
146
|
+
logger.warning("writer:145 suppressed OSError")
|
|
147
|
+
|
|
148
|
+
def __enter__(self):
|
|
149
|
+
"""Support context manager protocol."""
|
|
150
|
+
self._start_output()
|
|
151
|
+
return self
|
|
152
|
+
|
|
153
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
154
|
+
"""Ensure output stream is closed when exiting context."""
|
|
155
|
+
self.stop()
|
|
156
|
+
return False
|
|
157
|
+
|
|
158
|
+
# If csv is True, save values to self.out each time, and set self.values to empty list
|
|
159
|
+
def next(self):
|
|
160
|
+
"""Write accumulated values to output.
|
|
161
|
+
|
|
162
|
+
Called during execution to write the current set of values
|
|
163
|
+
to the CSV output and reset the values list.
|
|
164
|
+
"""
|
|
165
|
+
if self.p.csv:
|
|
166
|
+
self.writeiterable(self.values, func=str, counter=next(self._len))
|
|
167
|
+
self.values = []
|
|
168
|
+
|
|
169
|
+
# If csv is True, add column names
|
|
170
|
+
def addheaders(self, headers):
|
|
171
|
+
"""Add column headers for CSV output.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
headers: List of header names to add.
|
|
175
|
+
"""
|
|
176
|
+
if self.p.csv:
|
|
177
|
+
self.headers.extend(headers)
|
|
178
|
+
|
|
179
|
+
# If csv is True and need to filter nan, replace nan with '', and add values to self.values
|
|
180
|
+
def addvalues(self, values):
|
|
181
|
+
"""Add values to be written to CSV output.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
values: Iterable of values to add.
|
|
185
|
+
"""
|
|
186
|
+
if self.p.csv:
|
|
187
|
+
if self.p.csv_filternan:
|
|
188
|
+
values = map(lambda x: x if x == x else "", values)
|
|
189
|
+
self.values.extend(values)
|
|
190
|
+
|
|
191
|
+
# Process iterable objects and write to standard output or csv file
|
|
192
|
+
def writeiterable(self, iterable, func=None, counter=""):
|
|
193
|
+
"""Write an iterable to the output as a CSV line.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
iterable: The data to write.
|
|
197
|
+
func: Optional function to apply to each element.
|
|
198
|
+
counter: Optional counter value to prepend.
|
|
199
|
+
"""
|
|
200
|
+
# If saving csv counter, add counter before iterable
|
|
201
|
+
if self.p.csv_counter:
|
|
202
|
+
iterable = itertools.chain([counter], iterable)
|
|
203
|
+
# If func is not None, apply func to iterable
|
|
204
|
+
if func is not None:
|
|
205
|
+
iterable = map(lambda x: func(x), iterable)
|
|
206
|
+
# Separate iterable with csv separator to form line
|
|
207
|
+
line = self.p.csvsep.join(iterable)
|
|
208
|
+
# Write line to self.out
|
|
209
|
+
self.writeline(line)
|
|
210
|
+
|
|
211
|
+
# Write line to self.out
|
|
212
|
+
def writeline(self, line):
|
|
213
|
+
"""Write a single line to the output.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
line: The line content to write.
|
|
217
|
+
"""
|
|
218
|
+
if self.out is None:
|
|
219
|
+
raise RuntimeError("Writer output not initialized; call start() first")
|
|
220
|
+
self.out.write(line + "\n")
|
|
221
|
+
|
|
222
|
+
# Write multiple lines to self.out
|
|
223
|
+
def writelines(self, lines):
|
|
224
|
+
"""Write multiple lines to the output.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
lines: Iterable of line contents to write.
|
|
228
|
+
"""
|
|
229
|
+
if self.out is None:
|
|
230
|
+
raise RuntimeError("Writer output not initialized; call start() first")
|
|
231
|
+
for line in lines:
|
|
232
|
+
self.out.write(line + "\n")
|
|
233
|
+
|
|
234
|
+
# Write line separator
|
|
235
|
+
def writelineseparator(self, level=0):
|
|
236
|
+
"""Write a separator line for visual formatting.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
level: Indentation level that determines separator style.
|
|
240
|
+
"""
|
|
241
|
+
# Decide which separator to use, default is first separator "="
|
|
242
|
+
sepnum = level % len(self.p.separators)
|
|
243
|
+
separator = self.p.separators[sepnum]
|
|
244
|
+
# Leading spaces, defaults to 0
|
|
245
|
+
line = " " * (level * self.p.indent)
|
|
246
|
+
# Entire line content
|
|
247
|
+
line += separator * (self.p.seplen - (level * self.p.indent))
|
|
248
|
+
self.writeline(line)
|
|
249
|
+
|
|
250
|
+
# Write dictionary
|
|
251
|
+
def writedict(self, dct, level=0, recurse=False):
|
|
252
|
+
"""Write a dictionary to the output with formatting.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
dct: Dictionary to write.
|
|
256
|
+
level: Indentation level for nested output.
|
|
257
|
+
recurse: Whether this is a recursive call.
|
|
258
|
+
"""
|
|
259
|
+
# If not recursing, write line separator
|
|
260
|
+
if not recurse:
|
|
261
|
+
self.writelineseparator(level)
|
|
262
|
+
# First line indentation
|
|
263
|
+
indent0 = level * self.p.indent
|
|
264
|
+
# Iterate dictionary
|
|
265
|
+
for key, val in dct.items():
|
|
266
|
+
# First line spaces
|
|
267
|
+
kline = " " * indent0
|
|
268
|
+
# If recursing, add a character '- '
|
|
269
|
+
if recurse:
|
|
270
|
+
kline += "- "
|
|
271
|
+
# Add a key :
|
|
272
|
+
kline += str(key) + ":"
|
|
273
|
+
# Check if val is a subclass of lineseries
|
|
274
|
+
try:
|
|
275
|
+
sclass = issubclass(val, LineSeries)
|
|
276
|
+
except TypeError:
|
|
277
|
+
sclass = False
|
|
278
|
+
# If subclass, add a space, add val name
|
|
279
|
+
if sclass:
|
|
280
|
+
kline += " " + val.__name__
|
|
281
|
+
self.writeline(kline)
|
|
282
|
+
# If string
|
|
283
|
+
elif isinstance(val, string_types):
|
|
284
|
+
# Add val to kline
|
|
285
|
+
kline += " " + val
|
|
286
|
+
# Write kline to self.out
|
|
287
|
+
self.writeline(kline)
|
|
288
|
+
# If integer
|
|
289
|
+
elif isinstance(val, integer_types):
|
|
290
|
+
# Convert val to string, add to kline
|
|
291
|
+
kline += " " + str(val)
|
|
292
|
+
self.writeline(kline)
|
|
293
|
+
# If float
|
|
294
|
+
elif isinstance(val, float):
|
|
295
|
+
# If rounding is not None, round the float
|
|
296
|
+
if self.p.rounding is not None:
|
|
297
|
+
val = round(val, self.p.rounding)
|
|
298
|
+
# Convert val to string, add to kline
|
|
299
|
+
kline += " " + str(val)
|
|
300
|
+
self.writeline(kline)
|
|
301
|
+
# If val is a dictionary
|
|
302
|
+
elif isinstance(val, dict):
|
|
303
|
+
# If recursing, write level
|
|
304
|
+
if recurse:
|
|
305
|
+
self.writelineseparator(level=level)
|
|
306
|
+
self.writeline(kline)
|
|
307
|
+
# Write dictionary
|
|
308
|
+
self.writedict(val, level=level + 1, recurse=True)
|
|
309
|
+
# If val is an iterable object
|
|
310
|
+
elif isinstance(val, (list, tuple)) or (
|
|
311
|
+
not isinstance(val, (str, dict)) and isinstance(val, Iterable)
|
|
312
|
+
):
|
|
313
|
+
# Form line and save to self.out
|
|
314
|
+
line = ", ".join(map(str, val))
|
|
315
|
+
self.writeline(kline + " " + line)
|
|
316
|
+
# In other cases, convert val to string and save
|
|
317
|
+
else:
|
|
318
|
+
kline += " " + str(val)
|
|
319
|
+
self.writeline(kline)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
# Write StringIO - refactored to not use metaclass
|
|
323
|
+
class WriterStringIO(WriterFile):
|
|
324
|
+
"""Writer that outputs to an in-memory StringIO buffer.
|
|
325
|
+
|
|
326
|
+
This writer stores all output in memory rather than writing to a file.
|
|
327
|
+
Useful for testing or when you need to capture output programmatically.
|
|
328
|
+
|
|
329
|
+
Attributes:
|
|
330
|
+
_stringio: The StringIO buffer holding the output.
|
|
331
|
+
|
|
332
|
+
Example:
|
|
333
|
+
>>> writer = WriterStringIO()
|
|
334
|
+
>>> cerebro.addwriter(writer)
|
|
335
|
+
>>> results = cerebro.run()
|
|
336
|
+
>>> output = writer.getvalue()
|
|
337
|
+
"""
|
|
338
|
+
|
|
339
|
+
# Parameter out set to StringIO
|
|
340
|
+
params = (("out", io.StringIO),) # type: ignore[assignment]
|
|
341
|
+
|
|
342
|
+
def __init__(self, **kwargs):
|
|
343
|
+
"""Initialize the WriterStringIO instance.
|
|
344
|
+
|
|
345
|
+
Creates a new StringIO buffer for storing output.
|
|
346
|
+
|
|
347
|
+
Args:
|
|
348
|
+
**kwargs: Keyword arguments for writer parameters.
|
|
349
|
+
"""
|
|
350
|
+
self._stringio = io.StringIO()
|
|
351
|
+
self.close_out = False
|
|
352
|
+
super().__init__(**kwargs)
|
|
353
|
+
|
|
354
|
+
@property
|
|
355
|
+
def out(self):
|
|
356
|
+
"""Always return our StringIO object."""
|
|
357
|
+
return self._stringio
|
|
358
|
+
|
|
359
|
+
@out.setter
|
|
360
|
+
def out(self, value):
|
|
361
|
+
"""Ignore attempts to set out - we control it."""
|
|
362
|
+
|
|
363
|
+
def stop(self):
|
|
364
|
+
"""Seek to beginning for reading."""
|
|
365
|
+
if self._stringio:
|
|
366
|
+
self._stringio.seek(0)
|
|
367
|
+
|
|
368
|
+
def getvalue(self):
|
|
369
|
+
"""Get the content from the StringIO object."""
|
|
370
|
+
if self._stringio:
|
|
371
|
+
return self._stringio.getvalue()
|
|
372
|
+
return ""
|