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,164 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Renko Filter Module - Renko chart bars.
|
|
3
|
+
|
|
4
|
+
This module provides the Renko filter for converting price data
|
|
5
|
+
into Renko bricks for charting.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
Renko: Creates Renko bars from price data.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> data = bt.feeds.GenericCSVData(dataname='data.csv')
|
|
12
|
+
>>> data.addfilter(bt.filters.Renko(size=10))
|
|
13
|
+
>>> cerebro.adddata(data)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from . import Filter
|
|
17
|
+
|
|
18
|
+
__all__ = ["Renko"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Renko(Filter):
|
|
22
|
+
"""Modify the data stream to draw Renko bars (or bricks)
|
|
23
|
+
|
|
24
|
+
Params:
|
|
25
|
+
|
|
26
|
+
- ``hilo`` (default: *False*) Use high and low instead of close to decide
|
|
27
|
+
if a new brick is needed
|
|
28
|
+
|
|
29
|
+
- ``size`` (default: *None*) The size to consider for each brick
|
|
30
|
+
|
|
31
|
+
- ``autosize`` (default: *20.0*) If *size* is *None*, this will be used
|
|
32
|
+
to autocalculate the size of the bricks (simply dividing the current
|
|
33
|
+
price by the given value)
|
|
34
|
+
|
|
35
|
+
- ``dynamic`` (default: *False*) If *True* and using *autosize*, the size
|
|
36
|
+
of the bricks will be recalculated when moving to a new brick. This
|
|
37
|
+
will, of course, eliminate the perfect alignment of Renko bricks.
|
|
38
|
+
|
|
39
|
+
- ``align`` (default: *1.0*) Factor used to align the price boundaries of
|
|
40
|
+
the bricks. If the price is for example *3563.25* and *align* is
|
|
41
|
+
*10.0*, the resulting aligned price will be *3560*. The calculation:
|
|
42
|
+
|
|
43
|
+
- 3563.25 / 10.0 = 356.325
|
|
44
|
+
- round it and remove the decimals -> 356
|
|
45
|
+
- 356 * 10.0 -> 3560
|
|
46
|
+
|
|
47
|
+
- ``roundstart`` (default: *True*) If *True*, round the initial start
|
|
48
|
+
value to int. Else keep the original value, which should aid when
|
|
49
|
+
backtesting penny stocks
|
|
50
|
+
|
|
51
|
+
See:
|
|
52
|
+
- http://stockcharts.com/school/doku.php?id=chart_school:chart_analysis:renko
|
|
53
|
+
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
params = (
|
|
57
|
+
("hilo", False),
|
|
58
|
+
("size", None),
|
|
59
|
+
("autosize", 20.0),
|
|
60
|
+
("dynamic", False),
|
|
61
|
+
("align", 1.0),
|
|
62
|
+
("roundstart", True),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
def __init__(self, data, *args, **kwargs):
|
|
66
|
+
"""Initialize the Renko filter.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
data: The data feed to apply the filter to.
|
|
70
|
+
*args: Variable length argument list.
|
|
71
|
+
**kwargs: Additional keyword arguments passed to parent class.
|
|
72
|
+
"""
|
|
73
|
+
super().__init__(data, *args, **kwargs)
|
|
74
|
+
self._bot = None
|
|
75
|
+
self._top = None
|
|
76
|
+
self._size = None
|
|
77
|
+
|
|
78
|
+
def nextstart(self, data):
|
|
79
|
+
"""Initialize Renko brick boundaries on the first data point.
|
|
80
|
+
|
|
81
|
+
This method sets up the initial brick size and top/bottom boundaries
|
|
82
|
+
based on the opening price and configured parameters.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
data: The data feed containing the first bar.
|
|
86
|
+
"""
|
|
87
|
+
o = data.open[0]
|
|
88
|
+
o = round(o / self.p.align, 0) * self.p.align # aligned
|
|
89
|
+
self._size = self.p.size or (float(o // self.p.autosize) if self.p.autosize else 1.0)
|
|
90
|
+
if self.p.roundstart:
|
|
91
|
+
o = int(o)
|
|
92
|
+
|
|
93
|
+
self._top = o + self._size
|
|
94
|
+
self._bot = o - self._size
|
|
95
|
+
|
|
96
|
+
def next(self, data):
|
|
97
|
+
"""Process each bar to create Renko bricks.
|
|
98
|
+
|
|
99
|
+
This method analyzes the current price data and creates Renko bricks
|
|
100
|
+
when price moves beyond the current brick boundaries. Each brick has
|
|
101
|
+
a fixed size, and new bricks are created when price breaks through
|
|
102
|
+
the current brick's top or bottom boundary.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
data: The data feed containing current bar data.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
bool: True if the stream length changed (bar removed),
|
|
109
|
+
False if unchanged (Renko brick created).
|
|
110
|
+
"""
|
|
111
|
+
c = data.close[0]
|
|
112
|
+
h = data.high[0]
|
|
113
|
+
low = data.low[0]
|
|
114
|
+
|
|
115
|
+
if self.p.hilo:
|
|
116
|
+
hiprice = h
|
|
117
|
+
loprice = low
|
|
118
|
+
else:
|
|
119
|
+
hiprice = loprice = c
|
|
120
|
+
|
|
121
|
+
if hiprice >= self._top:
|
|
122
|
+
# deliver a renko brick from top -> top + size
|
|
123
|
+
self._bot = bot = self._top
|
|
124
|
+
|
|
125
|
+
if self.p.size is None and self.p.dynamic:
|
|
126
|
+
self._size = float(c // self.p.autosize) if self.p.autosize else 1.0
|
|
127
|
+
top = bot + self._size
|
|
128
|
+
top = round(top / self.p.align, 0) * self.p.align # aligned
|
|
129
|
+
else:
|
|
130
|
+
top = bot + self._size
|
|
131
|
+
|
|
132
|
+
self._top = top
|
|
133
|
+
|
|
134
|
+
data.open[0] = bot
|
|
135
|
+
data.low[0] = bot
|
|
136
|
+
data.high[0] = top
|
|
137
|
+
data.close[0] = top
|
|
138
|
+
data.volume[0] = 0.0
|
|
139
|
+
data.openinterest[0] = 0.0
|
|
140
|
+
return False # length of data stream is unaltered
|
|
141
|
+
|
|
142
|
+
if loprice <= self._bot:
|
|
143
|
+
# deliver a renko brick from bot -> bot - size
|
|
144
|
+
self._top = top = self._bot
|
|
145
|
+
|
|
146
|
+
if self.p.size is None and self.p.dynamic:
|
|
147
|
+
self._size = float(c // self.p.autosize) if self.p.autosize else 1.0
|
|
148
|
+
bot = top - self._size
|
|
149
|
+
bot = round(bot / self.p.align, 0) * self.p.align # aligned
|
|
150
|
+
else:
|
|
151
|
+
bot = top - self._size
|
|
152
|
+
|
|
153
|
+
self._bot = bot
|
|
154
|
+
|
|
155
|
+
data.open[0] = top
|
|
156
|
+
data.low[0] = top
|
|
157
|
+
data.high[0] = bot
|
|
158
|
+
data.close[0] = bot
|
|
159
|
+
data.volume[0] = 0.0
|
|
160
|
+
data.openinterest[0] = 0.0
|
|
161
|
+
return False # length of data stream is unaltered
|
|
162
|
+
|
|
163
|
+
data.backwards()
|
|
164
|
+
return True # length of stream was changed, get new bar
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Session Filter Module - Session bar filling.
|
|
3
|
+
|
|
4
|
+
This module provides the SessionFiller filter for adding missing
|
|
5
|
+
bars over gaps within a trading session.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
SessionFiller: Fills missing bars within a session.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> data = bt.feeds.GenericCSVData(dataname='data.csv')
|
|
12
|
+
>>> data.addfilter(bt.filters.SessionFiller())
|
|
13
|
+
>>> cerebro.adddata(data)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from datetime import datetime, timedelta
|
|
17
|
+
|
|
18
|
+
from ..dataseries import TimeFrame
|
|
19
|
+
from ..parameters import ParameterDescriptor, ParameterizedBase
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SessionFiller(ParameterizedBase):
|
|
23
|
+
"""
|
|
24
|
+
Bar Filler to add missing bars over gaps in a session.
|
|
25
|
+
|
|
26
|
+
This class has been refactored from MetaParams to the new ParameterizedBase
|
|
27
|
+
system for Day 36-38 of the metaprogramming removal project.
|
|
28
|
+
|
|
29
|
+
How to use it:
|
|
30
|
+
|
|
31
|
+
- Instantiate the class (1 instance per filter needed)
|
|
32
|
+
|
|
33
|
+
- ``addfilter`` it to the data with ``data.addfilter(filter_instance)``
|
|
34
|
+
|
|
35
|
+
Bar ``fill`` logic:
|
|
36
|
+
|
|
37
|
+
- The ``fill_price`` will be used to fill ``open``, ``high``, ``low`` and
|
|
38
|
+
``close``
|
|
39
|
+
|
|
40
|
+
If ``None`` then the ``close`` price of the last (previous) bar will be
|
|
41
|
+
used.
|
|
42
|
+
|
|
43
|
+
- Volume will be set to ``fill_vol``
|
|
44
|
+
|
|
45
|
+
- ``openinterest`` will be set to ``fill_oi``
|
|
46
|
+
|
|
47
|
+
Parameters:
|
|
48
|
+
|
|
49
|
+
- fill_price (def: None):
|
|
50
|
+
|
|
51
|
+
Price to be used to fill missing bars. If None will be used the closing
|
|
52
|
+
price of the previous bar
|
|
53
|
+
|
|
54
|
+
- fill_vol (def: float('NaN')):
|
|
55
|
+
|
|
56
|
+
Value to use to fill the missing volume
|
|
57
|
+
|
|
58
|
+
- Fill_oi (def: float('NaN')):
|
|
59
|
+
|
|
60
|
+
Value to use to fill the missing Open Interest
|
|
61
|
+
|
|
62
|
+
- Skip_first_fill (def: True):
|
|
63
|
+
|
|
64
|
+
Upon seeing the 1st valid bar do not fill from the sessionstart up to
|
|
65
|
+
that bar
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
# Use new parameter descriptor system to define parameters
|
|
69
|
+
fill_price = ParameterDescriptor(
|
|
70
|
+
default=None,
|
|
71
|
+
doc="Price to be used to fill missing bars. If None will be used the closing price of the previous bar",
|
|
72
|
+
)
|
|
73
|
+
fill_vol = ParameterDescriptor(
|
|
74
|
+
default=float("NaN"), type_=float, doc="Value to use to fill the missing volume"
|
|
75
|
+
)
|
|
76
|
+
fill_oi = ParameterDescriptor(
|
|
77
|
+
default=float("NaN"), type_=float, doc="Value to use to fill the missing Open Interest"
|
|
78
|
+
)
|
|
79
|
+
skip_first_fill = ParameterDescriptor(
|
|
80
|
+
default=True,
|
|
81
|
+
type_=bool,
|
|
82
|
+
doc="Upon seeing the 1st valid bar do not fill from the sessionstart up to that bar",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
MAXDATE = datetime.max
|
|
86
|
+
|
|
87
|
+
# Minimum delta unit in between bars
|
|
88
|
+
_tdeltas = {
|
|
89
|
+
TimeFrame.Minutes: timedelta(seconds=60),
|
|
90
|
+
TimeFrame.Seconds: timedelta(seconds=1),
|
|
91
|
+
TimeFrame.MicroSeconds: timedelta(microseconds=1),
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
def __init__(self, data, **kwargs):
|
|
95
|
+
"""Initialize the SessionFiller.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
data: The data feed to apply the filter to.
|
|
99
|
+
**kwargs: Additional keyword arguments passed to parent class.
|
|
100
|
+
"""
|
|
101
|
+
super().__init__(**kwargs)
|
|
102
|
+
# Calculate and save timedelta for timeframe
|
|
103
|
+
self._tdframe = self._tdeltas[data._timeframe]
|
|
104
|
+
self._tdunit = self._tdeltas[data._timeframe] * data._compression
|
|
105
|
+
|
|
106
|
+
self.seenbar = False # control if at least one bar has been seen
|
|
107
|
+
self.sessend = self.MAXDATE # maxdate is the control for session bar
|
|
108
|
+
|
|
109
|
+
def __call__(self, data):
|
|
110
|
+
"""
|
|
111
|
+
Params:
|
|
112
|
+
- data: the data source to filter/process
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
- False (always) because this filter does not remove bars from the
|
|
116
|
+
stream
|
|
117
|
+
|
|
118
|
+
The logic (starting with a session end control flag of MAXDATE)
|
|
119
|
+
|
|
120
|
+
- If new bar is over session end (never true for 1st bar)
|
|
121
|
+
|
|
122
|
+
Fill up to the session end.
|
|
123
|
+
Reset sessionend to MAXDATE & fall through
|
|
124
|
+
|
|
125
|
+
- If the session end is flagged as MAXDATE
|
|
126
|
+
|
|
127
|
+
Recalculate session limits and check whether the bar is within them
|
|
128
|
+
|
|
129
|
+
If so, fill up and record the last seen tim
|
|
130
|
+
|
|
131
|
+
- Else ... the incoming bar is in the session, fill up to it
|
|
132
|
+
"""
|
|
133
|
+
# Get time of current (from a data source) bar
|
|
134
|
+
ret = False
|
|
135
|
+
|
|
136
|
+
dtime_cur = data.datetime.datetime()
|
|
137
|
+
|
|
138
|
+
if dtime_cur > self.sessend:
|
|
139
|
+
# bar over session end - fill up and invalidate
|
|
140
|
+
# Do not put current bar in stack to let it be evaluated below
|
|
141
|
+
# Fill up to endsession + the smallest unit of timeframe
|
|
142
|
+
ret = self._fillbars(data, self.dtime_prev, self.sessend + self._tdframe, tostack=False)
|
|
143
|
+
self.sessend = self.MAXDATE
|
|
144
|
+
|
|
145
|
+
# Fall through from previous check ... the bar which is over the
|
|
146
|
+
# session could already be in a new session and within the limits
|
|
147
|
+
if self.sessend == self.MAXDATE:
|
|
148
|
+
# No bar seen yet or one went over the previous session limit
|
|
149
|
+
ddate = dtime_cur.date()
|
|
150
|
+
sessstart = datetime.combine(ddate, data.p.sessionstart)
|
|
151
|
+
self.sessend = sessend = datetime.combine(ddate, data.p.sessionend)
|
|
152
|
+
|
|
153
|
+
if sessstart <= dtime_cur <= sessend:
|
|
154
|
+
# 1st bar from session in the session - fill from session start
|
|
155
|
+
if self.seenbar or not self.get_param("skip_first_fill"):
|
|
156
|
+
ret = self._fillbars(data, sessstart - self._tdunit, dtime_cur)
|
|
157
|
+
|
|
158
|
+
self.seenbar = True
|
|
159
|
+
self.dtime_prev = dtime_cur
|
|
160
|
+
|
|
161
|
+
else:
|
|
162
|
+
# Seen a previous bar, and this is in the session - fill up to it
|
|
163
|
+
ret = self._fillbars(data, self.dtime_prev, dtime_cur)
|
|
164
|
+
self.dtime_prev = dtime_cur
|
|
165
|
+
|
|
166
|
+
return ret
|
|
167
|
+
|
|
168
|
+
def _fillbars(self, data, time_start, time_end, tostack=True):
|
|
169
|
+
"""
|
|
170
|
+
Fills one by one bars as needed from time_start to time_end
|
|
171
|
+
|
|
172
|
+
Invalidates the control dtime_prev if requested
|
|
173
|
+
"""
|
|
174
|
+
# Control flag - bars added to the stack
|
|
175
|
+
dirty = 0
|
|
176
|
+
|
|
177
|
+
time_start += self._tdunit
|
|
178
|
+
while time_start < time_end:
|
|
179
|
+
dirty += self._fillbar(data, time_start)
|
|
180
|
+
time_start += self._tdunit
|
|
181
|
+
|
|
182
|
+
if dirty and tostack:
|
|
183
|
+
data._save2stack(erase=True)
|
|
184
|
+
|
|
185
|
+
return bool(dirty) or not tostack
|
|
186
|
+
|
|
187
|
+
def _fillbar(self, data, dtime):
|
|
188
|
+
# Prepare an array of the necessary size
|
|
189
|
+
bar = [float("Nan")] * data.size()
|
|
190
|
+
|
|
191
|
+
# Fill datetime
|
|
192
|
+
bar[data.DateTime] = data.date2num(dtime)
|
|
193
|
+
|
|
194
|
+
# Fill the prices
|
|
195
|
+
price = self.get_param("fill_price") or data.close[-1]
|
|
196
|
+
for pricetype in [data.Open, data.High, data.Low, data.Close]:
|
|
197
|
+
bar[pricetype] = price
|
|
198
|
+
|
|
199
|
+
# Fill volume and open interest
|
|
200
|
+
bar[data.Volume] = self.get_param("fill_vol")
|
|
201
|
+
bar[data.OpenInterest] = self.get_param("fill_oi")
|
|
202
|
+
|
|
203
|
+
# Fill extra lines the data feed may have defined beyond DateTime
|
|
204
|
+
for i in range(data.DateTime + 1, data.size()):
|
|
205
|
+
bar[i] = data.lines[i][0]
|
|
206
|
+
|
|
207
|
+
# Add to the stack of bars to save
|
|
208
|
+
data._add2stack(bar)
|
|
209
|
+
|
|
210
|
+
return True
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class SessionFilterSimple(ParameterizedBase):
|
|
214
|
+
"""
|
|
215
|
+
This class can be applied to a data source as a filter and will filter out
|
|
216
|
+
intraday bars which fall outside the regular session times (ie: pre/post
|
|
217
|
+
market data)
|
|
218
|
+
|
|
219
|
+
This class has been refactored from MetaParams to the new ParameterizedBase
|
|
220
|
+
system for Day 36-38 of the metaprogramming removal project.
|
|
221
|
+
|
|
222
|
+
This is a "simple" filter and must NOT manage the stack of the data (passed
|
|
223
|
+
during init and __call__)
|
|
224
|
+
|
|
225
|
+
It needs no "last" method because it has nothing to deliver
|
|
226
|
+
|
|
227
|
+
Bar Management will be done by the SimpleFilterWrapper class made which is
|
|
228
|
+
added durint the DataBase.addfilter_simple call
|
|
229
|
+
"""
|
|
230
|
+
|
|
231
|
+
def __init__(self, data, **kwargs):
|
|
232
|
+
"""Initialize the SessionFilterSimple.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
data: The data feed to apply the filter to.
|
|
236
|
+
**kwargs: Additional keyword arguments passed to parent class.
|
|
237
|
+
"""
|
|
238
|
+
super().__init__(**kwargs)
|
|
239
|
+
|
|
240
|
+
def __call__(self, data):
|
|
241
|
+
"""
|
|
242
|
+
Return Values:
|
|
243
|
+
|
|
244
|
+
- False: nothing to filter
|
|
245
|
+
- True: filter current bar (because it's not in the session times)
|
|
246
|
+
"""
|
|
247
|
+
# Both ends of the comparison are in the session
|
|
248
|
+
return not (data.p.sessionstart <= data.datetime.time(0) <= data.p.sessionend)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class SessionFilter(ParameterizedBase):
|
|
252
|
+
"""
|
|
253
|
+
This class can be applied to a data source as a filter and will filter out
|
|
254
|
+
intraday bars which fall outside the regular session times (ie: pre/post
|
|
255
|
+
market data)
|
|
256
|
+
|
|
257
|
+
This class has been refactored from MetaParams to the new ParameterizedBase
|
|
258
|
+
system for Day 36-38 of the metaprogramming removal project.
|
|
259
|
+
|
|
260
|
+
This is a "non-simple" filter and must manage the stack of the data (passed
|
|
261
|
+
during init and __call__)
|
|
262
|
+
|
|
263
|
+
It needs no "last" method because it has nothing to deliver
|
|
264
|
+
"""
|
|
265
|
+
|
|
266
|
+
def __init__(self, data, **kwargs):
|
|
267
|
+
"""Initialize the SessionFilter.
|
|
268
|
+
|
|
269
|
+
Args:
|
|
270
|
+
data: The data feed to apply the filter to.
|
|
271
|
+
**kwargs: Additional keyword arguments passed to parent class.
|
|
272
|
+
"""
|
|
273
|
+
super().__init__(**kwargs)
|
|
274
|
+
|
|
275
|
+
def __call__(self, data):
|
|
276
|
+
"""
|
|
277
|
+
Return Values:
|
|
278
|
+
|
|
279
|
+
- False: data stream was not touched
|
|
280
|
+
- True: data stream was manipulated (bar outside session times and
|
|
281
|
+
- removed)
|
|
282
|
+
"""
|
|
283
|
+
if data.p.sessionstart <= data.datetime.time(0) <= data.p.sessionend:
|
|
284
|
+
# Both ends of the comparison are in the session
|
|
285
|
+
return False # say the stream is untouched
|
|
286
|
+
|
|
287
|
+
# bar outside the regular session times
|
|
288
|
+
data.backwards() # remove bar from data stack
|
|
289
|
+
return True # the signal the data was manipulated
|
backtrader/flt.py
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Filter Module - Data filtering for backtrader.
|
|
3
|
+
|
|
4
|
+
This module provides the base Filter class for data filtering operations.
|
|
5
|
+
Filters can be applied to data feeds to modify or filter bars during
|
|
6
|
+
backtesting.
|
|
7
|
+
|
|
8
|
+
Classes:
|
|
9
|
+
Filter: Base class for data filters.
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
>>> class MyFilter(bt.Filter):
|
|
13
|
+
... def next(self, data):
|
|
14
|
+
... # Modify data bar
|
|
15
|
+
... pass
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from .parameters import ParameterizedBase
|
|
19
|
+
|
|
20
|
+
__all__ = ["Filter"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Filter class - refactored to use new parameter system
|
|
24
|
+
class Filter(ParameterizedBase):
|
|
25
|
+
"""Base class for data filters in backtrader.
|
|
26
|
+
|
|
27
|
+
Filters process data bars and can modify or reject them. Subclasses
|
|
28
|
+
should override the next() method to implement custom filtering logic.
|
|
29
|
+
|
|
30
|
+
Attributes:
|
|
31
|
+
_firsttime: Tracks if this is the first call.
|
|
32
|
+
|
|
33
|
+
This class has been refactored from MetaParams to the new ParameterizedBase
|
|
34
|
+
system for Day 36-38 of the metaprogramming removal project.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
_firsttime = True
|
|
38
|
+
|
|
39
|
+
def __init__(self, data_, **kwargs):
|
|
40
|
+
"""Initialize the Filter.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
data_: The data feed to filter.
|
|
44
|
+
**kwargs: Additional keyword arguments for parameters.
|
|
45
|
+
"""
|
|
46
|
+
# Call parent class initialization
|
|
47
|
+
super().__init__(**kwargs)
|
|
48
|
+
|
|
49
|
+
def __call__(self, data):
|
|
50
|
+
"""Process a data bar through the filter.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
data: The data feed being filtered.
|
|
54
|
+
"""
|
|
55
|
+
# If first time, call nextstart, then set _firsttime to False
|
|
56
|
+
if self._firsttime:
|
|
57
|
+
self.nextstart(data)
|
|
58
|
+
self._firsttime = False
|
|
59
|
+
# Call next
|
|
60
|
+
self.next(data)
|
|
61
|
+
|
|
62
|
+
def nextstart(self, data):
|
|
63
|
+
"""Called on the first bar before filtering starts.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
data: The data feed being filtered.
|
|
67
|
+
|
|
68
|
+
Note:
|
|
69
|
+
Override this method to perform one-time initialization.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def next(self, data):
|
|
73
|
+
"""Process each data bar.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
data: The data feed being filtered.
|
|
77
|
+
|
|
78
|
+
Note:
|
|
79
|
+
Subclasses must override this method to implement filtering logic.
|
|
80
|
+
"""
|