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/indicator.py
ADDED
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Backtrader Indicator Module.
|
|
3
|
+
|
|
4
|
+
This module provides the base Indicator class and related infrastructure
|
|
5
|
+
for creating and managing technical analysis indicators. It replaces the
|
|
6
|
+
metaclass-based approach with explicit inheritance and registration.
|
|
7
|
+
|
|
8
|
+
The Indicator class serves as the foundation for all technical indicators
|
|
9
|
+
in backtrader, managing line data, minimum periods, and calculation logic.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from .lineiterator import IndicatorBase, LineIterator
|
|
13
|
+
from .lineseries import Lines
|
|
14
|
+
from .metabase import AutoInfoClass, OwnerContext
|
|
15
|
+
from .utils.log_message import get_logger
|
|
16
|
+
from .utils.py3 import range
|
|
17
|
+
|
|
18
|
+
logger = get_logger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class IndicatorRegistry:
|
|
22
|
+
"""Registry to manage indicator classes and provide caching functionality.
|
|
23
|
+
|
|
24
|
+
This class replaces the metaclass-based indicator registration and
|
|
25
|
+
caching mechanism from the original backtrader implementation.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
_indcol: dict = {}
|
|
29
|
+
_icache: dict = {}
|
|
30
|
+
_icacheuse = False
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def register(cls, name, indicator_cls):
|
|
34
|
+
"""Register an indicator class in the registry.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
name: Name of the indicator class
|
|
38
|
+
indicator_cls: The indicator class to register
|
|
39
|
+
"""
|
|
40
|
+
if not name.startswith("_") and name != "Indicator":
|
|
41
|
+
cls._indcol[name] = indicator_cls
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def cleancache(cls):
|
|
45
|
+
"""Clear the indicator cache."""
|
|
46
|
+
cls._icache = {}
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def usecache(cls, onoff):
|
|
50
|
+
"""Enable or disable indicator caching.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
onoff: If True, enable caching; if False, disable it
|
|
54
|
+
"""
|
|
55
|
+
cls._icacheuse = onoff
|
|
56
|
+
|
|
57
|
+
@classmethod
|
|
58
|
+
def get_cached_or_create(cls, indicator_cls, *args, **kwargs):
|
|
59
|
+
"""Get cached indicator instance or create new one.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
indicator_cls: The indicator class to instantiate
|
|
63
|
+
*args: Positional arguments for the indicator
|
|
64
|
+
**kwargs: Keyword arguments for the indicator
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Cached indicator instance if available and caching enabled,
|
|
68
|
+
otherwise a new indicator instance
|
|
69
|
+
"""
|
|
70
|
+
if not cls._icacheuse:
|
|
71
|
+
return indicator_cls(*args, **kwargs)
|
|
72
|
+
|
|
73
|
+
# Implement a cache to avoid duplicating lines actions
|
|
74
|
+
ckey = (indicator_cls, tuple(args), tuple(kwargs.items())) # tuples hashable
|
|
75
|
+
try:
|
|
76
|
+
return cls._icache[ckey]
|
|
77
|
+
except TypeError: # something is not hashable
|
|
78
|
+
return indicator_cls(*args, **kwargs)
|
|
79
|
+
except KeyError:
|
|
80
|
+
logger.debug("indicator:79 ignored KeyError")
|
|
81
|
+
# hashable but not in the cache
|
|
82
|
+
|
|
83
|
+
_obj = indicator_cls(*args, **kwargs)
|
|
84
|
+
return cls._icache.setdefault(ckey, _obj)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class Indicator(IndicatorBase):
|
|
88
|
+
"""Base class for all technical indicators in Backtrader.
|
|
89
|
+
|
|
90
|
+
This class provides the foundation for creating custom indicators.
|
|
91
|
+
It manages line data, minimum periods, and calculation logic.
|
|
92
|
+
Indicators inherit from IndicatorBase and integrate with the
|
|
93
|
+
LineIterator system for data flow.
|
|
94
|
+
|
|
95
|
+
Attributes:
|
|
96
|
+
_ltype: Line type set to IndType (0) for indicators
|
|
97
|
+
csv: Whether to output this indicator to CSV (default: False)
|
|
98
|
+
aliased: Whether this indicator has an alias name
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
_ltype = LineIterator.IndType
|
|
102
|
+
csv = False
|
|
103
|
+
|
|
104
|
+
def __getitem__(self, ago):
|
|
105
|
+
"""CRITICAL FIX: Forward item access to the first line (e.g., sma line)
|
|
106
|
+
|
|
107
|
+
For indicators with named lines like SMA (which has lines.sma), accessing
|
|
108
|
+
indicator[0] should return the value from the first line, not the indicator's
|
|
109
|
+
own array.
|
|
110
|
+
"""
|
|
111
|
+
# Use the first line if available
|
|
112
|
+
if hasattr(self, "lines") and hasattr(self.lines, "lines") and len(self.lines.lines) > 0:
|
|
113
|
+
return self.lines.lines[0][ago]
|
|
114
|
+
# Fallback to parent class behavior
|
|
115
|
+
return super().__getitem__(ago)
|
|
116
|
+
|
|
117
|
+
# Track if this is an aliased indicator
|
|
118
|
+
aliased = False
|
|
119
|
+
|
|
120
|
+
def __init_subclass__(cls, **kwargs):
|
|
121
|
+
"""Handle subclass registration and initialization.
|
|
122
|
+
|
|
123
|
+
This method is called when a subclass of Indicator is created.
|
|
124
|
+
It performs:
|
|
125
|
+
1. Lines creation using Lines infrastructure
|
|
126
|
+
2. Automatic registration in IndicatorRegistry
|
|
127
|
+
3. Alias handling for module-level access
|
|
128
|
+
4. next/once method setup for calculation modes
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
**kwargs: Additional keyword arguments
|
|
132
|
+
"""
|
|
133
|
+
super().__init_subclass__(**kwargs)
|
|
134
|
+
|
|
135
|
+
init = cls.__dict__.get("__init__")
|
|
136
|
+
if init is not None and not getattr(init, "_bt_owner_context_wrapped", False):
|
|
137
|
+
|
|
138
|
+
def owner_context_init(self, *args, **kwargs):
|
|
139
|
+
parent_owner = OwnerContext.get_current_owner(LineIterator)
|
|
140
|
+
with OwnerContext.set_owner(self):
|
|
141
|
+
result = init(self, *args, **kwargs)
|
|
142
|
+
|
|
143
|
+
if (
|
|
144
|
+
parent_owner is not None
|
|
145
|
+
and parent_owner is not self
|
|
146
|
+
and hasattr(parent_owner, "addindicator")
|
|
147
|
+
):
|
|
148
|
+
old_owner = getattr(self, "_owner", None)
|
|
149
|
+
if old_owner is not parent_owner:
|
|
150
|
+
try:
|
|
151
|
+
old_lists = getattr(old_owner, "_lineiterators", {})
|
|
152
|
+
for indicators in old_lists.values():
|
|
153
|
+
while self in indicators:
|
|
154
|
+
indicators.remove(self)
|
|
155
|
+
except Exception: # nosec B110
|
|
156
|
+
# Best-effort detach from a previous owner; ignore failures.
|
|
157
|
+
logger.warning("indicator:155 suppressed Exception")
|
|
158
|
+
self._owner = parent_owner
|
|
159
|
+
parent_owner.addindicator(self)
|
|
160
|
+
|
|
161
|
+
return result
|
|
162
|
+
|
|
163
|
+
owner_context_init.__name__ = getattr(init, "__name__", "__init__")
|
|
164
|
+
owner_context_init.__doc__ = getattr(init, "__doc__", None)
|
|
165
|
+
owner_context_init._bt_owner_context_wrapped = True
|
|
166
|
+
cls.__init__ = owner_context_init
|
|
167
|
+
|
|
168
|
+
# CRITICAL FIX: Handle lines creation for indicators like LineSeries does
|
|
169
|
+
# This ensures that lines tuples are converted to Lines instances
|
|
170
|
+
lines = cls.__dict__.get("lines", ())
|
|
171
|
+
extralines = cls.__dict__.get("extralines", 0)
|
|
172
|
+
|
|
173
|
+
# Ensure lines is a tuple (it might be a class type)
|
|
174
|
+
if not isinstance(lines, (tuple, list)):
|
|
175
|
+
if hasattr(lines, "_getlines"):
|
|
176
|
+
lines = lines._getlines() or ()
|
|
177
|
+
else:
|
|
178
|
+
lines = ()
|
|
179
|
+
else:
|
|
180
|
+
lines = tuple(lines) # Ensure it's a tuple
|
|
181
|
+
|
|
182
|
+
# Create lines class using the proper Lines infrastructure
|
|
183
|
+
if lines or extralines:
|
|
184
|
+
# Use the LineSeries mechanism to create the lines class
|
|
185
|
+
from .lineseries import Lines
|
|
186
|
+
|
|
187
|
+
cls.lines = Lines._derive("lines", lines, extralines, ())
|
|
188
|
+
|
|
189
|
+
# NOTE: __init__ patching for _finalize_minperiod disabled as it's handled elsewhere
|
|
190
|
+
# The minperiod calculation is now done explicitly in indicators that need it (like MACD)
|
|
191
|
+
|
|
192
|
+
# Register subclasses automatically
|
|
193
|
+
if not cls.aliased and cls.__name__ != "Indicator" and not cls.__name__.startswith("_"):
|
|
194
|
+
IndicatorRegistry.register(cls.__name__, cls)
|
|
195
|
+
|
|
196
|
+
# Handle aliases - register them to the indicators module
|
|
197
|
+
if hasattr(cls, "alias") and cls.alias:
|
|
198
|
+
import sys
|
|
199
|
+
|
|
200
|
+
indicators_module = sys.modules.get("backtrader.indicators")
|
|
201
|
+
if indicators_module:
|
|
202
|
+
# Set the main class name
|
|
203
|
+
setattr(indicators_module, cls.__name__, cls)
|
|
204
|
+
# Set all aliases - handle both tuple and list formats
|
|
205
|
+
aliases = cls.alias
|
|
206
|
+
if isinstance(aliases, (list, tuple)):
|
|
207
|
+
for alias in aliases:
|
|
208
|
+
if isinstance(alias, str):
|
|
209
|
+
setattr(indicators_module, alias, cls)
|
|
210
|
+
|
|
211
|
+
# Check if next and once have both been overridden
|
|
212
|
+
# Define default methods if they don't exist
|
|
213
|
+
if not hasattr(cls, "next"):
|
|
214
|
+
cls.next = lambda self: None
|
|
215
|
+
if not hasattr(cls, "once"):
|
|
216
|
+
cls.once = lambda self, start, end: None
|
|
217
|
+
|
|
218
|
+
next_over = getattr(cls, "next", None) != getattr(Indicator, "next", None)
|
|
219
|
+
once_over = getattr(cls, "once", None) != getattr(Indicator, "once", None)
|
|
220
|
+
|
|
221
|
+
# CRITICAL FIX: Also check if once() is the no-op from LineRoot
|
|
222
|
+
# If once is inherited from LineRoot (which is just 'pass'), treat it as not overridden
|
|
223
|
+
# This handles indicators that only set up line bindings without defining next/once
|
|
224
|
+
from .lineroot import LineRoot
|
|
225
|
+
|
|
226
|
+
if hasattr(LineRoot, "once") and getattr(cls, "once", None) == getattr(
|
|
227
|
+
LineRoot, "once", None
|
|
228
|
+
):
|
|
229
|
+
# LineRoot.once is a no-op, so always use once_via_next
|
|
230
|
+
cls.once = cls.once_via_next
|
|
231
|
+
cls.preonce = cls.preonce_via_prenext
|
|
232
|
+
cls.oncestart = cls.oncestart_via_nextstart
|
|
233
|
+
elif next_over and not once_over:
|
|
234
|
+
# No -> need pointer movement to once simulation via next
|
|
235
|
+
cls.once = cls.once_via_next
|
|
236
|
+
cls.preonce = cls.preonce_via_prenext
|
|
237
|
+
cls.oncestart = cls.oncestart_via_nextstart
|
|
238
|
+
|
|
239
|
+
# Cache related methods - moved from metaclass
|
|
240
|
+
@classmethod
|
|
241
|
+
def cleancache(cls):
|
|
242
|
+
"""Clear the indicator cache"""
|
|
243
|
+
IndicatorRegistry.cleancache()
|
|
244
|
+
|
|
245
|
+
@classmethod
|
|
246
|
+
def usecache(cls, onoff):
|
|
247
|
+
"""Enable or disable caching"""
|
|
248
|
+
IndicatorRegistry.usecache(onoff)
|
|
249
|
+
|
|
250
|
+
def _finalize_minperiod(self):
|
|
251
|
+
"""CRITICAL FIX: Finalize minimum period calculation after indicator __init__ completes.
|
|
252
|
+
|
|
253
|
+
This method is called after the subclass's __init__ has finished creating
|
|
254
|
+
sub-indicators and line bindings. It ensures that the minimum periods from
|
|
255
|
+
all data sources, lines and sub-indicators are properly propagated to this
|
|
256
|
+
indicator's _minperiod.
|
|
257
|
+
"""
|
|
258
|
+
# Step 0: Calculate minperiod from data sources first
|
|
259
|
+
# This is critical for indicators applied to other indicators/lines
|
|
260
|
+
try:
|
|
261
|
+
if hasattr(self, "datas") and self.datas:
|
|
262
|
+
data_minperiods = [getattr(d, "_minperiod", 1) for d in self.datas if d is not None]
|
|
263
|
+
if data_minperiods:
|
|
264
|
+
data_max = max(data_minperiods)
|
|
265
|
+
if data_max > self._minperiod:
|
|
266
|
+
self._minperiod = data_max
|
|
267
|
+
except (AttributeError, TypeError):
|
|
268
|
+
# No usable datas to derive a minperiod from; keep current value.
|
|
269
|
+
logger.debug("indicator:267 ignored AttributeError,TypeError")
|
|
270
|
+
|
|
271
|
+
# Step 1: Calculate minperiod from lines
|
|
272
|
+
try:
|
|
273
|
+
if hasattr(self, "lines") and self.lines is not None:
|
|
274
|
+
line_minperiods = []
|
|
275
|
+
for line in self.lines:
|
|
276
|
+
mp = getattr(line, "_minperiod", 1)
|
|
277
|
+
line_minperiods.append(mp)
|
|
278
|
+
if line_minperiods:
|
|
279
|
+
lines_max = max(line_minperiods)
|
|
280
|
+
if lines_max > self._minperiod:
|
|
281
|
+
self._minperiod = lines_max
|
|
282
|
+
except (AttributeError, TypeError):
|
|
283
|
+
# Lines not iterable yet; keep current minperiod.
|
|
284
|
+
logger.debug("indicator:282 ignored AttributeError,TypeError")
|
|
285
|
+
|
|
286
|
+
# Step 2: Calculate minperiod from sub-indicators
|
|
287
|
+
try:
|
|
288
|
+
if hasattr(self, "_lineiterators"):
|
|
289
|
+
indicators = self._lineiterators.get(LineIterator.IndType, [])
|
|
290
|
+
if indicators:
|
|
291
|
+
ind_minperiods = [getattr(ind, "_minperiod", 1) for ind in indicators]
|
|
292
|
+
if ind_minperiods:
|
|
293
|
+
ind_max = max(ind_minperiods)
|
|
294
|
+
if ind_max > self._minperiod:
|
|
295
|
+
self._minperiod = ind_max
|
|
296
|
+
except (AttributeError, TypeError):
|
|
297
|
+
# No sub-indicator registry available; keep current minperiod.
|
|
298
|
+
logger.debug("indicator:296 ignored AttributeError,TypeError")
|
|
299
|
+
|
|
300
|
+
# Step 3: Update minperiod on all lines
|
|
301
|
+
try:
|
|
302
|
+
if hasattr(self, "lines") and self.lines is not None:
|
|
303
|
+
for line in self.lines:
|
|
304
|
+
if hasattr(line, "updateminperiod"):
|
|
305
|
+
line.updateminperiod(self._minperiod)
|
|
306
|
+
except (AttributeError, TypeError):
|
|
307
|
+
# Lines not iterable; minperiod propagation is best-effort.
|
|
308
|
+
logger.debug("indicator:306 ignored AttributeError,TypeError")
|
|
309
|
+
|
|
310
|
+
def advance(self, size=1):
|
|
311
|
+
"""Advance indicator lines when data length is less than clock length.
|
|
312
|
+
|
|
313
|
+
Also advances sub-indicators so that during _oncepost() replay every
|
|
314
|
+
level of the indicator tree stays in sync (fixes runonce ATR/SMMA
|
|
315
|
+
index mismatch when an indicator uses sub_ind[0] in next()).
|
|
316
|
+
|
|
317
|
+
Args:
|
|
318
|
+
size: Number of steps to advance (default: 1)
|
|
319
|
+
"""
|
|
320
|
+
# Prefer the concrete secondary-feed clock resolved in
|
|
321
|
+
# Strategy._periodset() for indicators that follow a non-primary feed
|
|
322
|
+
# (e.g. SMA over an H1 LinesOperation inside an M15 strategy). Their
|
|
323
|
+
# _clock may point at a feed whose len() is correct, but when an
|
|
324
|
+
# explicit secondary clock was pinned we use it so the indicator
|
|
325
|
+
# advances in lockstep with that feed. See
|
|
326
|
+
# docs/DEV_REGRESSION_FAILURES.md.
|
|
327
|
+
adv_clock = getattr(self, "_resolved_secondary_clock", None) or self._clock
|
|
328
|
+
if len(self) < len(adv_clock):
|
|
329
|
+
self.lines.advance(size=size)
|
|
330
|
+
for ind in self._lineiterators.get(LineIterator.IndType, []):
|
|
331
|
+
ind.advance(size)
|
|
332
|
+
|
|
333
|
+
def preonce_via_prenext(self, start, end):
|
|
334
|
+
"""Implement preonce using prenext for batch calculation.
|
|
335
|
+
|
|
336
|
+
This is a generic implementation if prenext is overridden but preonce is not.
|
|
337
|
+
It loops through the range and calls prenext for each step.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
start: Starting index
|
|
341
|
+
end: Ending index
|
|
342
|
+
"""
|
|
343
|
+
# Generic implementation if prenext is overridden but preonce is not
|
|
344
|
+
for i in range(start, end):
|
|
345
|
+
# Advance all data feeds
|
|
346
|
+
for data in self.datas:
|
|
347
|
+
data.advance()
|
|
348
|
+
# Advance all sub-indicators
|
|
349
|
+
for indicator in self._lineiterators[LineIterator.IndType]:
|
|
350
|
+
indicator.advance()
|
|
351
|
+
# CRITICAL FIX: Directly advance lines instead of using self.advance()
|
|
352
|
+
self.lines.advance()
|
|
353
|
+
# Call prenext
|
|
354
|
+
self.prenext()
|
|
355
|
+
|
|
356
|
+
def oncestart_via_nextstart(self, start, end):
|
|
357
|
+
"""Implement oncestart using nextstart for batch calculation.
|
|
358
|
+
|
|
359
|
+
This is used when nextstart is overridden but oncestart is not.
|
|
360
|
+
|
|
361
|
+
Args:
|
|
362
|
+
start: Starting index
|
|
363
|
+
end: Ending index
|
|
364
|
+
"""
|
|
365
|
+
# nextstart has been overridden, but oncestart has not - call the overridden nextstart
|
|
366
|
+
for i in range(start, end):
|
|
367
|
+
for data in self.datas:
|
|
368
|
+
data.advance()
|
|
369
|
+
|
|
370
|
+
for indicator in self._lineiterators[LineIterator.IndType]:
|
|
371
|
+
indicator.advance()
|
|
372
|
+
|
|
373
|
+
# CRITICAL FIX: Directly advance lines instead of using self.advance()
|
|
374
|
+
self.lines.advance()
|
|
375
|
+
self.nextstart()
|
|
376
|
+
|
|
377
|
+
def once_via_next(self, start, end):
|
|
378
|
+
"""Implement once using next for batch calculation.
|
|
379
|
+
|
|
380
|
+
This is used when next is overridden but once is not.
|
|
381
|
+
It loops through the range and calls next for each step.
|
|
382
|
+
|
|
383
|
+
Args:
|
|
384
|
+
start: Starting index
|
|
385
|
+
end: Ending index
|
|
386
|
+
"""
|
|
387
|
+
# Not overridden, next must be there ...
|
|
388
|
+
# Simple implementation matching master branch - just advance and call next
|
|
389
|
+
for i in range(start, end):
|
|
390
|
+
for data in self.datas:
|
|
391
|
+
data.advance()
|
|
392
|
+
|
|
393
|
+
for indicator in self._lineiterators[LineIterator.IndType]:
|
|
394
|
+
indicator.advance()
|
|
395
|
+
|
|
396
|
+
# CRITICAL FIX: Directly advance lines instead of using self.advance()
|
|
397
|
+
# self.advance() checks len(self) < len(self._clock) which fails when
|
|
398
|
+
# _clock is MinimalClock (always returns 0) or when _clock is not properly
|
|
399
|
+
# synchronized. In once_via_next, we always need to advance.
|
|
400
|
+
self.lines.advance()
|
|
401
|
+
self.next()
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
class LinePlotterIndicatorBase(Indicator.__class__):
|
|
405
|
+
"""Base class for indicators that plot multiple lines.
|
|
406
|
+
|
|
407
|
+
Note: These classes are not currently used in the project.
|
|
408
|
+
They are kept for compatibility with the original backtrader.
|
|
409
|
+
"""
|
|
410
|
+
|
|
411
|
+
def donew(cls, *args, **kwargs):
|
|
412
|
+
"""Create a new LinePlotterIndicator instance.
|
|
413
|
+
|
|
414
|
+
Args:
|
|
415
|
+
*args: Positional arguments
|
|
416
|
+
**kwargs: Keyword arguments, must include 'name'
|
|
417
|
+
|
|
418
|
+
Returns:
|
|
419
|
+
tuple: (created_object, args, kwargs)
|
|
420
|
+
"""
|
|
421
|
+
# Get line name
|
|
422
|
+
lname = kwargs.pop("name")
|
|
423
|
+
# Get class name
|
|
424
|
+
name = cls.__name__
|
|
425
|
+
# Get cls lines, or return Lines if not present
|
|
426
|
+
lines = getattr(cls, "lines", Lines)
|
|
427
|
+
# Derive lines with the new line
|
|
428
|
+
cls.lines = lines._derive(name, (lname,), 0, [])
|
|
429
|
+
# Derive plotlines
|
|
430
|
+
plotlines = AutoInfoClass
|
|
431
|
+
newplotlines: dict = {}
|
|
432
|
+
newplotlines.setdefault(lname, {})
|
|
433
|
+
cls.plotlines = plotlines._derive(name, newplotlines, [], recurse=True)
|
|
434
|
+
|
|
435
|
+
# Create the object and set the params in place
|
|
436
|
+
_obj, args, kwargs = super().donew(*args, **kwargs)
|
|
437
|
+
# Set _obj owner attribute
|
|
438
|
+
_obj.owner = _obj.data.owner._clock
|
|
439
|
+
# Add another linebuffer
|
|
440
|
+
_obj.data.lines[0].addbinding(_obj.lines[0])
|
|
441
|
+
# Return the object and arguments to the chain
|
|
442
|
+
return _obj, args, kwargs
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
class LinePlotterIndicator(Indicator, LinePlotterIndicatorBase):
|
|
446
|
+
"""Indicator that plots multiple lines.
|
|
447
|
+
|
|
448
|
+
Note: This class is not currently used in the project.
|
|
449
|
+
"""
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Technical Analysis Indicators Module.
|
|
3
|
+
|
|
4
|
+
This module provides a comprehensive collection of technical analysis
|
|
5
|
+
indicators for trading strategies. It includes moving averages,
|
|
6
|
+
oscillators, momentum indicators, volatility indicators, and more.
|
|
7
|
+
|
|
8
|
+
Indicator Categories:
|
|
9
|
+
- Moving Averages: SMA, EMA, SMMA, WMA, DEMA, KAMA, HMA, etc.
|
|
10
|
+
- Oscillators: RSI, Stochastic, MACD, CCI, etc.
|
|
11
|
+
- Volatility: ATR, Bollinger Bands, Standard Deviation
|
|
12
|
+
- Momentum: ROC, Momentum, Ultimate Oscillator
|
|
13
|
+
- Trend: ADX, Aroon, Parabolic SAR, Ichimoku
|
|
14
|
+
- Volume: OBV, Money Flow Index
|
|
15
|
+
- Custom: Additional custom indicators
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
Using indicators in a strategy:
|
|
19
|
+
>>> class MyStrategy(bt.Strategy):
|
|
20
|
+
... def __init__(self):
|
|
21
|
+
... self.sma = bt.indicators.SMA(self.data.close, period=20)
|
|
22
|
+
... self.rsi = bt.indicators.RSI(self.data.close, period=14)
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import os as _os
|
|
26
|
+
|
|
27
|
+
from ..indicator import Indicator as Indicator
|
|
28
|
+
from ..functions import *
|
|
29
|
+
|
|
30
|
+
if _os.environ.get("BACKTRADER_LIGHT_IMPORT", "").strip().lower() in {
|
|
31
|
+
"1",
|
|
32
|
+
"true",
|
|
33
|
+
"yes",
|
|
34
|
+
"on",
|
|
35
|
+
}:
|
|
36
|
+
from .mabase import MovAv as MovAv
|
|
37
|
+
from .mabase import MovingAverage as MovingAverage
|
|
38
|
+
from .mabase import MovingAverageBase as MovingAverageBase
|
|
39
|
+
from .basicops import Highest as Highest
|
|
40
|
+
from .basicops import Lowest as Lowest
|
|
41
|
+
from .sma import SMA as SMA
|
|
42
|
+
from .sma import MovingAverageSimple as MovingAverageSimple
|
|
43
|
+
from .smma import SmoothedMovingAverage as SmoothedMovingAverage
|
|
44
|
+
from .ema import EMA as EMA
|
|
45
|
+
from .ema import ExponentialMovingAverage as ExponentialMovingAverage
|
|
46
|
+
from .deviation import StandardDeviation as StandardDeviation
|
|
47
|
+
from .deviation import StdDev as StdDev
|
|
48
|
+
from .atr import ATR as ATR
|
|
49
|
+
from .atr import AverageTrueRange as AverageTrueRange
|
|
50
|
+
from .bollinger import BollingerBands as BollingerBands
|
|
51
|
+
from .crossover import CrossOver as CrossOver
|
|
52
|
+
from .directionalmove import AverageDirectionalMovementIndex as AverageDirectionalMovementIndex
|
|
53
|
+
from .directionalmove import MinusDirectionalIndicator as MinusDirectionalIndicator
|
|
54
|
+
from .directionalmove import PlusDirectionalIndicator as PlusDirectionalIndicator
|
|
55
|
+
from .rsi import RSI as RSI
|
|
56
|
+
from .rsi import RelativeStrengthIndex as RelativeStrengthIndex
|
|
57
|
+
from .obv import OnBalanceVolume as OnBalanceVolume
|
|
58
|
+
|
|
59
|
+
OBV = OnBalanceVolume
|
|
60
|
+
|
|
61
|
+
SimpleMovingAverage = MovingAverageSimple
|
|
62
|
+
SMMA = SmoothedMovingAverage
|
|
63
|
+
ADX = AverageDirectionalMovementIndex
|
|
64
|
+
MinusDI = MinusDirectionalIndicator
|
|
65
|
+
PlusDI = PlusDirectionalIndicator
|
|
66
|
+
else:
|
|
67
|
+
# The modules below should/must define __all__ with the Indicator objects
|
|
68
|
+
# of prepend an "_" (underscore) to private classes/variables
|
|
69
|
+
from .basicops import *
|
|
70
|
+
|
|
71
|
+
# base for moving averages
|
|
72
|
+
from .mabase import *
|
|
73
|
+
|
|
74
|
+
# moving averages (so envelope and oscillators can be auto-generated)
|
|
75
|
+
from .sma import *
|
|
76
|
+
from .ema import *
|
|
77
|
+
from .smma import *
|
|
78
|
+
from .wma import *
|
|
79
|
+
from .dema import *
|
|
80
|
+
from .kama import *
|
|
81
|
+
from .zlema import *
|
|
82
|
+
from .hma import *
|
|
83
|
+
from .zlind import *
|
|
84
|
+
from .dma import *
|
|
85
|
+
|
|
86
|
+
# depends on moving averages
|
|
87
|
+
from .deviation import *
|
|
88
|
+
|
|
89
|
+
# depend on basicops, moving averages and deviations
|
|
90
|
+
from .atr import *
|
|
91
|
+
from .mt5atr import *
|
|
92
|
+
from .aroon import *
|
|
93
|
+
from .bollinger import *
|
|
94
|
+
from .cci import *
|
|
95
|
+
from .crossover import *
|
|
96
|
+
from .dpo import *
|
|
97
|
+
from .directionalmove import *
|
|
98
|
+
from .envelope import *
|
|
99
|
+
from .heikinashi import *
|
|
100
|
+
from .lrsi import *
|
|
101
|
+
from .spread import *
|
|
102
|
+
from .macd import *
|
|
103
|
+
from .momentum import *
|
|
104
|
+
from .oscillator import *
|
|
105
|
+
from .percentchange import *
|
|
106
|
+
from .percentrank import *
|
|
107
|
+
from .pivotpoint import *
|
|
108
|
+
from .prettygoodoscillator import *
|
|
109
|
+
from .priceoscillator import *
|
|
110
|
+
from .psar import *
|
|
111
|
+
from .rsi import *
|
|
112
|
+
from .stochastic import *
|
|
113
|
+
from .trix import *
|
|
114
|
+
from .tsi import *
|
|
115
|
+
from .ultimateoscillator import *
|
|
116
|
+
from .williams import *
|
|
117
|
+
from .rmi import *
|
|
118
|
+
from .awesomeoscillator import *
|
|
119
|
+
from .accdecoscillator import *
|
|
120
|
+
from .priceops_ext import *
|
|
121
|
+
from .moneyflow import *
|
|
122
|
+
from .obv import *
|
|
123
|
+
from .demarker import *
|
|
124
|
+
from .channels_ext import *
|
|
125
|
+
from .trend_ext import *
|
|
126
|
+
from .supertrend import *
|
|
127
|
+
|
|
128
|
+
from .dv2 import * # depends on percentrank
|
|
129
|
+
|
|
130
|
+
# Depends on Momentum
|
|
131
|
+
from .kst import *
|
|
132
|
+
|
|
133
|
+
from .ichimoku import *
|
|
134
|
+
|
|
135
|
+
from .hurst import *
|
|
136
|
+
from .ols import *
|
|
137
|
+
from .hadelta import *
|
|
138
|
+
from .vortex import *
|
|
139
|
+
|
|
140
|
+
# Add some custom indicators
|
|
141
|
+
from .myind import *
|
|
142
|
+
from .contrib import *
|
|
143
|
+
|
|
144
|
+
# # At the end of the file, after all imports
|
|
145
|
+
# from .mabase import _register_common_moving_averages
|
|
146
|
+
#
|
|
147
|
+
# # Register moving averages after all modules are loaded to avoid circular imports
|
|
148
|
+
# _register_common_moving_averages()
|