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,53 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"RKDIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RKDIndicator(Indicator):
|
|
16
|
+
"""Compute a custom RKD line set from RSV/K/D values."""
|
|
17
|
+
|
|
18
|
+
lines = ("rsv", "k", "d")
|
|
19
|
+
params = (
|
|
20
|
+
("kd_period", 30),
|
|
21
|
+
("m1", 3),
|
|
22
|
+
("m2", 6),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Define indicator warm-up length before valid line updates."""
|
|
27
|
+
self.addminperiod(max(int(self.p.kd_period), int(self.p.m1), int(self.p.m2)) + 2)
|
|
28
|
+
|
|
29
|
+
def next(self):
|
|
30
|
+
"""Update RSV, K, and D for the latest bar."""
|
|
31
|
+
kd_period = int(self.p.kd_period)
|
|
32
|
+
m1 = int(self.p.m1)
|
|
33
|
+
m2 = int(self.p.m2)
|
|
34
|
+
highs = [float(self.data.high[-i]) for i in range(kd_period)]
|
|
35
|
+
lows = [float(self.data.low[-i]) for i in range(kd_period)]
|
|
36
|
+
max_high = max(highs)
|
|
37
|
+
min_low = min(lows)
|
|
38
|
+
denom = max_high - min_low
|
|
39
|
+
if denom == 0:
|
|
40
|
+
rsv = 0.0
|
|
41
|
+
else:
|
|
42
|
+
rsv = (float(self.data.close[0]) - min_low) / denom * 100.0
|
|
43
|
+
self.lines.rsv[0] = rsv
|
|
44
|
+
|
|
45
|
+
if len(self) < m1:
|
|
46
|
+
self.lines.k[0] = 0.0
|
|
47
|
+
else:
|
|
48
|
+
self.lines.k[0] = sum(float(self.lines.rsv[-i]) for i in range(m1)) / m1
|
|
49
|
+
|
|
50
|
+
if len(self) < m2:
|
|
51
|
+
self.lines.d[0] = 0.0
|
|
52
|
+
else:
|
|
53
|
+
self.lines.d[0] = sum(float(self.lines.k[-i]) for i in range(m2)) / m2
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"ROC2VGIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _calc_roc(price, prev_price, roc_type):
|
|
16
|
+
if prev_price == 0:
|
|
17
|
+
return 0.0
|
|
18
|
+
if roc_type == 1: # MOM
|
|
19
|
+
return price - prev_price
|
|
20
|
+
if roc_type == 2: # ROC
|
|
21
|
+
return ((price / prev_price) - 1) * 100
|
|
22
|
+
if roc_type == 3: # ROCP
|
|
23
|
+
return (price - prev_price) / prev_price
|
|
24
|
+
if roc_type == 4: # ROCR
|
|
25
|
+
return price / prev_price
|
|
26
|
+
if roc_type == 5: # ROCR100
|
|
27
|
+
return (price / prev_price) * 100
|
|
28
|
+
return (price - prev_price) / prev_price
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ROC2VGIndicator(Indicator):
|
|
32
|
+
"""Reconstructs ROC2_VG indicator.
|
|
33
|
+
|
|
34
|
+
DRAW_FILLING between ROC1 and ROC2.
|
|
35
|
+
Buffer 0 = ROC1 (period1, type1), Buffer 1 = ROC2 (period2, type2).
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
lines = ("roc1", "roc2")
|
|
39
|
+
params = (
|
|
40
|
+
("roc_period1", 8),
|
|
41
|
+
("roc_type1", 1),
|
|
42
|
+
("roc_period2", 14),
|
|
43
|
+
("roc_type2", 1),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
def __init__(self):
|
|
47
|
+
"""Initialize ROC periods and required minimum history window."""
|
|
48
|
+
self._p1 = int(self.p.roc_period1)
|
|
49
|
+
self._p2 = int(self.p.roc_period2)
|
|
50
|
+
self._t1 = int(self.p.roc_type1)
|
|
51
|
+
self._t2 = int(self.p.roc_type2)
|
|
52
|
+
self.addminperiod(max(self._p1, self._p2) + 2)
|
|
53
|
+
|
|
54
|
+
def next(self):
|
|
55
|
+
"""Populate ``roc1`` and ``roc2`` for the current bar."""
|
|
56
|
+
price = float(self.data.close[0])
|
|
57
|
+
|
|
58
|
+
if self._p1 < len(self.data):
|
|
59
|
+
prev1 = float(self.data.close[-self._p1])
|
|
60
|
+
else:
|
|
61
|
+
prev1 = price
|
|
62
|
+
self.lines.roc1[0] = _calc_roc(price, prev1, self._t1)
|
|
63
|
+
|
|
64
|
+
if self._p2 < len(self.data):
|
|
65
|
+
prev2 = float(self.data.close[-self._p2])
|
|
66
|
+
else:
|
|
67
|
+
prev2 = price
|
|
68
|
+
self.lines.roc2[0] = _calc_roc(price, prev2, self._t2)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
RSI,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"RSIHistogramIndicator",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RSIHistogramIndicator(Indicator):
|
|
19
|
+
"""Compute RSI values and convert to a three-state color histogram."""
|
|
20
|
+
|
|
21
|
+
lines = ("value", "midline", "color_state")
|
|
22
|
+
params = (
|
|
23
|
+
("rsi_period", 14),
|
|
24
|
+
("high_level", 60),
|
|
25
|
+
("low_level", 40),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
"""Initialize RSI and minimum period."""
|
|
30
|
+
self.rsi = RSI(self.data.close, period=self.p.rsi_period, safediv=True)
|
|
31
|
+
self.addminperiod(self.p.rsi_period + 1)
|
|
32
|
+
|
|
33
|
+
def next(self):
|
|
34
|
+
"""Update value, midline, and current color state."""
|
|
35
|
+
rsi_value = float(self.rsi[0])
|
|
36
|
+
color = 1.0
|
|
37
|
+
if rsi_value > float(self.p.high_level):
|
|
38
|
+
color = 0.0
|
|
39
|
+
elif rsi_value < float(self.p.low_level):
|
|
40
|
+
color = 2.0
|
|
41
|
+
self.lines.value[0] = rsi_value
|
|
42
|
+
self.lines.midline[0] = 50.0
|
|
43
|
+
self.lines.color_state[0] = color
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
ATR,
|
|
10
|
+
RSI,
|
|
11
|
+
Indicator,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"RSISlowdown",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RSISlowdown(Indicator):
|
|
20
|
+
"""RSI Slowdown — detects RSI extreme flattening as reversal signal.
|
|
21
|
+
|
|
22
|
+
Fires buy when RSI(2) >= level_max (overbought) and the change between
|
|
23
|
+
consecutive bars is small (slowdown). Fires sell symmetrically at
|
|
24
|
+
level_min (oversold). Signal lines store ATR-scaled price levels.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
lines = ("sell", "buy")
|
|
28
|
+
params = (
|
|
29
|
+
("rsi_period", 2),
|
|
30
|
+
("level_max", 90.0),
|
|
31
|
+
("level_min", 10.0),
|
|
32
|
+
("seek_slowdown", True),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
"""Create RSI and ATR indicators and set minimum required periods."""
|
|
37
|
+
self.addminperiod(max(int(self.p.rsi_period) + 2, 18))
|
|
38
|
+
self.rsi = RSI(self.data, period=int(self.p.rsi_period))
|
|
39
|
+
self.atr = ATR(self.data, period=15)
|
|
40
|
+
|
|
41
|
+
def next(self):
|
|
42
|
+
"""Compute RSI slowdown signal for the current bar.
|
|
43
|
+
|
|
44
|
+
Sets buy/sell lines to ATR-derived price levels when the RSI extreme
|
|
45
|
+
+ slowdown condition is met, or NaN otherwise.
|
|
46
|
+
"""
|
|
47
|
+
self.lines.buy[0] = float("nan")
|
|
48
|
+
self.lines.sell[0] = float("nan")
|
|
49
|
+
r0 = float(self.rsi[0])
|
|
50
|
+
r1 = float(self.rsi[-1])
|
|
51
|
+
atr = float(self.atr[0])
|
|
52
|
+
if r0 >= float(self.p.level_max):
|
|
53
|
+
if (not self.p.seek_slowdown) or abs(r1 - r0) < 1.0:
|
|
54
|
+
self.lines.buy[0] = float(self.data.low[0]) - atr * 3.0 / 8.0
|
|
55
|
+
if r0 <= float(self.p.level_min):
|
|
56
|
+
if (not self.p.seek_slowdown) or abs(r1 - r0) < 1.0:
|
|
57
|
+
self.lines.sell[0] = float(self.data.high[0]) + atr * 3.0 / 8.0
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
EMA,
|
|
10
|
+
RSI,
|
|
11
|
+
Indicator,
|
|
12
|
+
Momentum,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"RsiomaV2",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class RsiomaV2(Indicator):
|
|
21
|
+
"""RSIOMA V2 indicator: an RSI of smoothed price with an EMA signal line.
|
|
22
|
+
|
|
23
|
+
The price close is smoothed with an EMA (optionally transformed by a
|
|
24
|
+
Momentum step), an RSI is computed on that series to form the rsioma line,
|
|
25
|
+
and the rsioma is smoothed again with an EMA to form the signal line.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
lines = ("rsioma", "signal")
|
|
29
|
+
params = (
|
|
30
|
+
("rsioma_period", 14),
|
|
31
|
+
("ma_rsioma_period", 21),
|
|
32
|
+
("mom_period", 1),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
"""Build the EMA/Momentum/RSI/EMA chain for the rsioma and signal lines."""
|
|
37
|
+
base = EMA(self.data.close, period=max(int(self.p.rsioma_period), 1))
|
|
38
|
+
if int(self.p.mom_period) > 1:
|
|
39
|
+
base = Momentum(base, period=int(self.p.mom_period))
|
|
40
|
+
self.l.rsioma = RSI(base, period=max(int(self.p.rsioma_period), 1), safediv=True)
|
|
41
|
+
self.l.signal = EMA(self.l.rsioma, period=max(int(self.p.ma_rsioma_period), 1))
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"RVIHistogramIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class _RollingWeightedAverage4:
|
|
16
|
+
"""Symmetric 4-bar weighted average (weights 1-2-2-1) over a rolling window."""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
"""Initialize the rolling value buffer."""
|
|
20
|
+
self.values = []
|
|
21
|
+
|
|
22
|
+
def update(self, value):
|
|
23
|
+
"""Add a value and return the 4-bar weighted average.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
value: The new value to incorporate.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
The weighted average once four values are buffered, else 0.0.
|
|
30
|
+
"""
|
|
31
|
+
self.values.append(float(value))
|
|
32
|
+
if len(self.values) > 4:
|
|
33
|
+
self.values.pop(0)
|
|
34
|
+
if len(self.values) < 4:
|
|
35
|
+
return 0.0
|
|
36
|
+
return (self.values[3] + 2.0 * self.values[2] + 2.0 * self.values[1] + self.values[0]) / 6.0
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class _RollingSimpleAverage:
|
|
40
|
+
"""Simple moving average over a fixed-length rolling window."""
|
|
41
|
+
|
|
42
|
+
def __init__(self, period):
|
|
43
|
+
"""Initialize the rolling buffer.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
period: Window length (clamped to at least 1).
|
|
47
|
+
"""
|
|
48
|
+
self.period = max(int(period), 1)
|
|
49
|
+
self.values = []
|
|
50
|
+
|
|
51
|
+
def update(self, value):
|
|
52
|
+
"""Add a value and return the current simple moving average.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
value: The new value to incorporate.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
The simple moving average of the buffered values.
|
|
59
|
+
"""
|
|
60
|
+
self.values.append(float(value))
|
|
61
|
+
if len(self.values) > self.period:
|
|
62
|
+
self.values.pop(0)
|
|
63
|
+
if not self.values:
|
|
64
|
+
return 0.0
|
|
65
|
+
return sum(self.values) / len(self.values)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class RVIHistogramIndicator(Indicator):
|
|
69
|
+
"""Relative Vigor Index with a smoothed signal line and color state."""
|
|
70
|
+
|
|
71
|
+
lines = ("main", "signal", "hist_base", "color_state")
|
|
72
|
+
params = (
|
|
73
|
+
("rvi_period", 14),
|
|
74
|
+
("high_level", 0.3),
|
|
75
|
+
("low_level", -0.3),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def __init__(self):
|
|
79
|
+
"""Build the weighted/simple averagers used by the RVI computation."""
|
|
80
|
+
self._co_avg4 = _RollingWeightedAverage4()
|
|
81
|
+
self._hl_avg4 = _RollingWeightedAverage4()
|
|
82
|
+
self._num_sma = _RollingSimpleAverage(self.p.rvi_period)
|
|
83
|
+
self._den_sma = _RollingSimpleAverage(self.p.rvi_period)
|
|
84
|
+
self._main_avg4 = _RollingWeightedAverage4()
|
|
85
|
+
self.addminperiod(int(self.p.rvi_period) + 6)
|
|
86
|
+
|
|
87
|
+
def next(self):
|
|
88
|
+
"""Compute the RVI main/signal lines and the level-based color state."""
|
|
89
|
+
co = float(self.data.close[0]) - float(self.data.open[0])
|
|
90
|
+
hl = float(self.data.high[0]) - float(self.data.low[0])
|
|
91
|
+
weighted_co = self._co_avg4.update(co)
|
|
92
|
+
weighted_hl = self._hl_avg4.update(hl)
|
|
93
|
+
num = self._num_sma.update(weighted_co)
|
|
94
|
+
den = self._den_sma.update(weighted_hl)
|
|
95
|
+
main = num / den if abs(den) > 1e-12 else 0.0
|
|
96
|
+
signal = self._main_avg4.update(main)
|
|
97
|
+
|
|
98
|
+
color = 1.0
|
|
99
|
+
if main > float(self.p.high_level):
|
|
100
|
+
color = 0.0
|
|
101
|
+
elif main < float(self.p.low_level):
|
|
102
|
+
color = 2.0
|
|
103
|
+
|
|
104
|
+
self.lines.main[0] = main
|
|
105
|
+
self.lines.signal[0] = signal
|
|
106
|
+
self.lines.hist_base[0] = 0.0
|
|
107
|
+
self.lines.color_state[0] = color
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"SafeADX",
|
|
12
|
+
"SafeAMA",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SafeADX(Indicator):
|
|
17
|
+
"""ADX indicator implementation without division by zero pitfalls."""
|
|
18
|
+
|
|
19
|
+
lines = ("adx",)
|
|
20
|
+
params = (("period", 14),)
|
|
21
|
+
|
|
22
|
+
def __init__(self):
|
|
23
|
+
"""Set minimum lookback period."""
|
|
24
|
+
self.addminperiod(self.p.period + 3)
|
|
25
|
+
|
|
26
|
+
def next(self):
|
|
27
|
+
"""Compute safe directional movement and ADX-like intensity."""
|
|
28
|
+
pdm_vals = []
|
|
29
|
+
mdm_vals = []
|
|
30
|
+
tr_vals = []
|
|
31
|
+
for idx in range(self.p.period):
|
|
32
|
+
high0 = float(self.data.high[-idx])
|
|
33
|
+
high1 = float(self.data.high[-idx - 1])
|
|
34
|
+
low0 = float(self.data.low[-idx])
|
|
35
|
+
low1 = float(self.data.low[-idx - 1])
|
|
36
|
+
close1 = float(self.data.close[-idx - 1])
|
|
37
|
+
up_move = high0 - high1
|
|
38
|
+
down_move = low1 - low0
|
|
39
|
+
pdm = up_move if up_move > down_move and up_move > 0 else 0.0
|
|
40
|
+
mdm = down_move if down_move > up_move and down_move > 0 else 0.0
|
|
41
|
+
tr = max(high0 - low0, abs(high0 - close1), abs(low0 - close1))
|
|
42
|
+
pdm_vals.append(pdm)
|
|
43
|
+
mdm_vals.append(mdm)
|
|
44
|
+
tr_vals.append(tr)
|
|
45
|
+
tr_sum = sum(tr_vals)
|
|
46
|
+
if tr_sum <= 1e-12:
|
|
47
|
+
self.lines.adx[0] = 0.0
|
|
48
|
+
return
|
|
49
|
+
pdi = 100.0 * sum(pdm_vals) / tr_sum
|
|
50
|
+
mdi = 100.0 * sum(mdm_vals) / tr_sum
|
|
51
|
+
denom = pdi + mdi
|
|
52
|
+
if denom <= 1e-12:
|
|
53
|
+
self.lines.adx[0] = 0.0
|
|
54
|
+
return
|
|
55
|
+
self.lines.adx[0] = 100.0 * abs(pdi - mdi) / denom
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class SafeAMA(Indicator):
|
|
59
|
+
"""Adaptive moving average indicator with safe initialization."""
|
|
60
|
+
|
|
61
|
+
lines = ("ama",)
|
|
62
|
+
params = (
|
|
63
|
+
("period", 9),
|
|
64
|
+
("fast_period", 2),
|
|
65
|
+
("slow_period", 30),
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def __init__(self):
|
|
69
|
+
"""Initialize adaptive moving average state and warm-up window."""
|
|
70
|
+
self._prev = None
|
|
71
|
+
self.addminperiod(self.p.period + 3)
|
|
72
|
+
|
|
73
|
+
def next(self):
|
|
74
|
+
"""Update AMA based on efficiency ratio and smoothing."""
|
|
75
|
+
if len(self) == 0 or self._prev is None:
|
|
76
|
+
self._prev = float(self.data.close[0])
|
|
77
|
+
self.lines.ama[0] = self._prev
|
|
78
|
+
return
|
|
79
|
+
direction = abs(float(self.data.close[0]) - float(self.data.close[-self.p.period]))
|
|
80
|
+
volatility = 0.0
|
|
81
|
+
for idx in range(self.p.period):
|
|
82
|
+
volatility += abs(float(self.data.close[-idx]) - float(self.data.close[-idx - 1]))
|
|
83
|
+
efficiency = 0.0 if volatility <= 1e-12 else direction / volatility
|
|
84
|
+
fast_sc = 2.0 / (self.p.fast_period + 1.0)
|
|
85
|
+
slow_sc = 2.0 / (self.p.slow_period + 1.0)
|
|
86
|
+
smoothing = (efficiency * (fast_sc - slow_sc) + slow_sc) ** 2
|
|
87
|
+
current = self._prev + smoothing * (float(self.data.close[0]) - self._prev)
|
|
88
|
+
self.lines.ama[0] = current
|
|
89
|
+
self._prev = current
|