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,202 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""TRIX Indicator Module - Triple exponential moving average slope.
|
|
3
|
+
|
|
4
|
+
This module provides the TRIX indicator developed by Jack Hutson in the
|
|
5
|
+
1980s to show the rate of change of a triple smoothed moving average.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
Trix: TRIX indicator (alias: TRIX).
|
|
9
|
+
TrixSignal: TRIX with signal line.
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
class MyStrategy(bt.Strategy):
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self.trix = bt.indicators.TRIX(self.data.close, period=15)
|
|
15
|
+
|
|
16
|
+
def next(self):
|
|
17
|
+
if self.trix[0] > 0:
|
|
18
|
+
self.buy()
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import math
|
|
22
|
+
|
|
23
|
+
from . import Indicator
|
|
24
|
+
from .ema import EMA
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Trix(Indicator):
|
|
28
|
+
"""
|
|
29
|
+
Defined by Jack Hutson in the 80s and shows the Rate of Change (%) or slope
|
|
30
|
+
of a triple exponentially smoothed moving average
|
|
31
|
+
|
|
32
|
+
Formula:
|
|
33
|
+
- ema1 = EMA(data, period)
|
|
34
|
+
- ema2 = EMA(ema1, period)
|
|
35
|
+
- ema3 = EMA(ema2, period)
|
|
36
|
+
- trix = 100 * (ema3 - ema3(-1)) / ema3(-1)
|
|
37
|
+
|
|
38
|
+
The final formula can be simplified to: 100 * (ema3 / ema3(-1) - 1)
|
|
39
|
+
|
|
40
|
+
The moving average used is the one originally defined by Wilder,
|
|
41
|
+
the SmoothedMovingAverage
|
|
42
|
+
|
|
43
|
+
See:
|
|
44
|
+
- https://en.wikipedia.org/wiki/Trix_(technical_analysis)
|
|
45
|
+
- http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:trix
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
alias = ("TRIX",)
|
|
49
|
+
lines = ("trix",)
|
|
50
|
+
params = (
|
|
51
|
+
("period", 15),
|
|
52
|
+
("_rocperiod", 1),
|
|
53
|
+
("_movav", EMA),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
plotinfo = {"plothlines": [0.0]}
|
|
57
|
+
|
|
58
|
+
def _plotlabel(self):
|
|
59
|
+
plabels = [self.p.period]
|
|
60
|
+
plabels += [self.p._rocperiod] * self.p.notdefault("_rocperiod")
|
|
61
|
+
plabels += [self.p._movav] * self.p.notdefault("_movav")
|
|
62
|
+
return plabels
|
|
63
|
+
|
|
64
|
+
def __init__(self):
|
|
65
|
+
"""Initialize the TRIX indicator.
|
|
66
|
+
|
|
67
|
+
Creates triple EMA structure for TRIX calculation.
|
|
68
|
+
"""
|
|
69
|
+
super().__init__()
|
|
70
|
+
self.ema1 = self.p._movav(self.data, period=self.p.period)
|
|
71
|
+
self.ema2 = self.p._movav(self.ema1, period=self.p.period)
|
|
72
|
+
self.ema3 = self.p._movav(self.ema2, period=self.p.period)
|
|
73
|
+
# minperiod = 3 * period + rocperiod
|
|
74
|
+
self._minperiod = max(self._minperiod, 3 * self.p.period + self.p._rocperiod - 2)
|
|
75
|
+
|
|
76
|
+
def next(self):
|
|
77
|
+
"""Calculate TRIX for the current bar.
|
|
78
|
+
|
|
79
|
+
Formula: TRIX = 100 * (ema3 / ema3_rocperiod_ago - 1.0)
|
|
80
|
+
"""
|
|
81
|
+
rocperiod = self.p._rocperiod
|
|
82
|
+
ema3_curr = self.ema3[0]
|
|
83
|
+
ema3_prev = self.ema3[-rocperiod]
|
|
84
|
+
if ema3_prev != 0:
|
|
85
|
+
self.lines.trix[0] = 100.0 * (ema3_curr / ema3_prev - 1.0)
|
|
86
|
+
else:
|
|
87
|
+
self.lines.trix[0] = 0.0
|
|
88
|
+
|
|
89
|
+
def once(self, start, end):
|
|
90
|
+
"""Calculate TRIX in runonce mode.
|
|
91
|
+
|
|
92
|
+
Computes triple EMA rate of change percentage across all bars.
|
|
93
|
+
"""
|
|
94
|
+
ema3_array = self.ema3.lines[0].array
|
|
95
|
+
larray = self.lines.trix.array
|
|
96
|
+
rocperiod = self.p._rocperiod
|
|
97
|
+
minperiod = 3 * self.p.period + rocperiod - 2
|
|
98
|
+
|
|
99
|
+
while len(larray) < end:
|
|
100
|
+
larray.append(float("nan"))
|
|
101
|
+
|
|
102
|
+
for i in range(min(minperiod, len(ema3_array))):
|
|
103
|
+
if i < len(larray):
|
|
104
|
+
larray[i] = float("nan")
|
|
105
|
+
|
|
106
|
+
for i in range(minperiod, min(end, len(ema3_array))):
|
|
107
|
+
ema3_curr = ema3_array[i] if i < len(ema3_array) else 0.0
|
|
108
|
+
ema3_prev = (
|
|
109
|
+
ema3_array[i - rocperiod]
|
|
110
|
+
if i >= rocperiod and i - rocperiod < len(ema3_array)
|
|
111
|
+
else 0.0
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
if (
|
|
115
|
+
isinstance(ema3_curr, float)
|
|
116
|
+
and math.isnan(ema3_curr)
|
|
117
|
+
or isinstance(ema3_prev, float)
|
|
118
|
+
and math.isnan(ema3_prev)
|
|
119
|
+
):
|
|
120
|
+
larray[i] = float("nan")
|
|
121
|
+
elif ema3_prev != 0:
|
|
122
|
+
larray[i] = 100.0 * (ema3_curr / ema3_prev - 1.0)
|
|
123
|
+
else:
|
|
124
|
+
larray[i] = 0.0
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class TrixSignal(Trix):
|
|
128
|
+
"""
|
|
129
|
+
Extension of Trix with a signal line (ala MACD)
|
|
130
|
+
|
|
131
|
+
Formula:
|
|
132
|
+
- trix = Trix(data, period)
|
|
133
|
+
- signal = EMA(trix, sigperiod)
|
|
134
|
+
|
|
135
|
+
See:
|
|
136
|
+
- http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:trix
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
lines = ("signal",)
|
|
140
|
+
params = (("sigperiod", 9),)
|
|
141
|
+
|
|
142
|
+
def __init__(self):
|
|
143
|
+
"""Initialize the TRIX Signal indicator.
|
|
144
|
+
|
|
145
|
+
Sets up signal line EMA smoothing parameters.
|
|
146
|
+
"""
|
|
147
|
+
super().__init__()
|
|
148
|
+
self.signal_alpha = 2.0 / (1.0 + self.p.sigperiod)
|
|
149
|
+
self.signal_alpha1 = 1.0 - self.signal_alpha
|
|
150
|
+
|
|
151
|
+
def nextstart(self):
|
|
152
|
+
"""Seed TRIX Signal calculation on first valid bar.
|
|
153
|
+
|
|
154
|
+
Initializes signal line with TRIX value.
|
|
155
|
+
"""
|
|
156
|
+
super().next()
|
|
157
|
+
self.lines.signal[0] = self.lines.trix[0]
|
|
158
|
+
|
|
159
|
+
def next(self):
|
|
160
|
+
"""Calculate TRIX and signal line for current bar.
|
|
161
|
+
|
|
162
|
+
Signal line is EMA of TRIX values.
|
|
163
|
+
"""
|
|
164
|
+
super().next()
|
|
165
|
+
self.lines.signal[0] = (
|
|
166
|
+
self.lines.signal[-1] * self.signal_alpha1 + self.lines.trix[0] * self.signal_alpha
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def once(self, start, end):
|
|
170
|
+
"""Calculate TRIX Signal in runonce mode.
|
|
171
|
+
|
|
172
|
+
Computes signal line as EMA of TRIX values across all bars.
|
|
173
|
+
"""
|
|
174
|
+
super().once(start, end)
|
|
175
|
+
trix_array = self.lines.trix.array
|
|
176
|
+
signal_array = self.lines.signal.array
|
|
177
|
+
signal_alpha = self.signal_alpha
|
|
178
|
+
signal_alpha1 = self.signal_alpha1
|
|
179
|
+
|
|
180
|
+
while len(signal_array) < end:
|
|
181
|
+
signal_array.append(float("nan"))
|
|
182
|
+
|
|
183
|
+
# Find first valid trix value for seed
|
|
184
|
+
seed_idx = -1
|
|
185
|
+
for i in range(len(trix_array)):
|
|
186
|
+
if i < len(trix_array):
|
|
187
|
+
val = trix_array[i]
|
|
188
|
+
if not (isinstance(val, float) and math.isnan(val)):
|
|
189
|
+
seed_idx = i
|
|
190
|
+
break
|
|
191
|
+
|
|
192
|
+
if seed_idx >= 0 and seed_idx < len(signal_array):
|
|
193
|
+
prev_signal = trix_array[seed_idx]
|
|
194
|
+
signal_array[seed_idx] = prev_signal
|
|
195
|
+
|
|
196
|
+
for i in range(seed_idx + 1, min(end, len(trix_array))):
|
|
197
|
+
trix_val = trix_array[i] if i < len(trix_array) else 0.0
|
|
198
|
+
if isinstance(trix_val, float) and math.isnan(trix_val):
|
|
199
|
+
signal_array[i] = float("nan")
|
|
200
|
+
else:
|
|
201
|
+
prev_signal = prev_signal * signal_alpha1 + trix_val * signal_alpha
|
|
202
|
+
signal_array[i] = prev_signal
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""TSI Indicator Module - True Strength Index.
|
|
3
|
+
|
|
4
|
+
This module provides the TSI (True Strength Index) indicator developed
|
|
5
|
+
by William Blau for measuring momentum with double smoothing.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
TrueStrengthIndicator: TSI indicator (alias: TSI).
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.tsi = bt.indicators.TSI(self.data.close, period1=25, period2=13)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
if self.tsi[0] > 0:
|
|
17
|
+
self.buy()
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from . import Indicator
|
|
21
|
+
from .ema import ExponentialMovingAverage
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TrueStrengthIndicator(Indicator):
|
|
25
|
+
"""
|
|
26
|
+
The True Strength Indicators was first introduced in Stocks & Commodities
|
|
27
|
+
Magazine by its author William Blau. It measures momentum with a double
|
|
28
|
+
exponential (default) of the prices.
|
|
29
|
+
|
|
30
|
+
It shows divergence if the extremes keep on growign but closing prices
|
|
31
|
+
do not in the same manner (distance to the extremes grows)
|
|
32
|
+
|
|
33
|
+
Formula:
|
|
34
|
+
- price_change = close - close(pchange periods ago)
|
|
35
|
+
- sm1_simple = EMA(price_close_change, period1)
|
|
36
|
+
- sm1_double = EMA(sm1_simple, period2)
|
|
37
|
+
- sm2_simple = EMA(abs(price_close_change), period1)
|
|
38
|
+
- sm2_double = EMA(sm2_simple, period2)
|
|
39
|
+
- tsi = 100.0 * sm1_double / sm2_double
|
|
40
|
+
|
|
41
|
+
See:
|
|
42
|
+
- http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:true_strength_index
|
|
43
|
+
|
|
44
|
+
Params
|
|
45
|
+
|
|
46
|
+
- ``period1``: the period for the first smoothing
|
|
47
|
+
- ``period2``: the period for the second smoothing
|
|
48
|
+
- ``pchange``: the lookback period for the price change
|
|
49
|
+
- ``_movav``: the moving average to apply for the smoothing
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
alias = ("TSI",)
|
|
53
|
+
params = (
|
|
54
|
+
("period1", 25),
|
|
55
|
+
("period2", 13),
|
|
56
|
+
("pchange", 1),
|
|
57
|
+
("_movav", ExponentialMovingAverage),
|
|
58
|
+
)
|
|
59
|
+
lines = ("tsi",)
|
|
60
|
+
|
|
61
|
+
def __init__(self):
|
|
62
|
+
"""Initialize the TSI indicator.
|
|
63
|
+
|
|
64
|
+
Calculates alpha values for double smoothing and sets
|
|
65
|
+
minimum period based on pchange + period1 + period2.
|
|
66
|
+
"""
|
|
67
|
+
super().__init__()
|
|
68
|
+
# Store sub-indicators for direct calculation
|
|
69
|
+
self.alpha1 = 2.0 / (1.0 + self.p.period1)
|
|
70
|
+
self.alpha1_1 = 1.0 - self.alpha1
|
|
71
|
+
self.alpha2 = 2.0 / (1.0 + self.p.period2)
|
|
72
|
+
self.alpha2_1 = 1.0 - self.alpha2
|
|
73
|
+
|
|
74
|
+
self._sm1 = 0.0
|
|
75
|
+
self._sm12 = 0.0
|
|
76
|
+
self._sm2 = 0.0
|
|
77
|
+
self._sm22 = 0.0
|
|
78
|
+
|
|
79
|
+
self.addminperiod(self.p.pchange + self.p.period1 + self.p.period2)
|
|
80
|
+
|
|
81
|
+
def nextstart(self):
|
|
82
|
+
"""Seed TSI calculation on first valid bar.
|
|
83
|
+
|
|
84
|
+
Initializes smoothed momentum values with first price change.
|
|
85
|
+
"""
|
|
86
|
+
pc = self.data[0] - self.data[-self.p.pchange]
|
|
87
|
+
self._sm1 = pc
|
|
88
|
+
self._sm12 = pc
|
|
89
|
+
self._sm2 = abs(pc)
|
|
90
|
+
self._sm22 = abs(pc)
|
|
91
|
+
|
|
92
|
+
if self._sm22 != 0:
|
|
93
|
+
self.lines.tsi[0] = 100.0 * self._sm12 / self._sm22
|
|
94
|
+
else:
|
|
95
|
+
self.lines.tsi[0] = 0.0
|
|
96
|
+
|
|
97
|
+
def next(self):
|
|
98
|
+
"""Calculate TSI for the current bar.
|
|
99
|
+
|
|
100
|
+
Applies double smoothing to price change and absolute price change,
|
|
101
|
+
then computes the ratio as a percentage.
|
|
102
|
+
"""
|
|
103
|
+
pc = self.data[0] - self.data[-self.p.pchange]
|
|
104
|
+
|
|
105
|
+
self._sm1 = self._sm1 * self.alpha1_1 + pc * self.alpha1
|
|
106
|
+
self._sm12 = self._sm12 * self.alpha2_1 + self._sm1 * self.alpha2
|
|
107
|
+
|
|
108
|
+
self._sm2 = self._sm2 * self.alpha1_1 + abs(pc) * self.alpha1
|
|
109
|
+
self._sm22 = self._sm22 * self.alpha2_1 + self._sm2 * self.alpha2
|
|
110
|
+
|
|
111
|
+
if self._sm22 != 0:
|
|
112
|
+
self.lines.tsi[0] = 100.0 * self._sm12 / self._sm22
|
|
113
|
+
else:
|
|
114
|
+
self.lines.tsi[0] = 0.0
|
|
115
|
+
|
|
116
|
+
def once(self, start, end):
|
|
117
|
+
"""Calculate TSI in runonce mode.
|
|
118
|
+
|
|
119
|
+
Computes double-smoothed momentum values and TSI ratio
|
|
120
|
+
across all bars.
|
|
121
|
+
"""
|
|
122
|
+
darray = self.data.array
|
|
123
|
+
larray = self.lines.tsi.array
|
|
124
|
+
pchange = self.p.pchange
|
|
125
|
+
alpha1 = self.alpha1
|
|
126
|
+
alpha1_1 = self.alpha1_1
|
|
127
|
+
alpha2 = self.alpha2
|
|
128
|
+
alpha2_1 = self.alpha2_1
|
|
129
|
+
minperiod = pchange + self.p.period1 + self.p.period2
|
|
130
|
+
|
|
131
|
+
while len(larray) < end:
|
|
132
|
+
larray.append(float("nan"))
|
|
133
|
+
|
|
134
|
+
for i in range(min(minperiod - 1, len(darray))):
|
|
135
|
+
if i < len(larray):
|
|
136
|
+
larray[i] = float("nan")
|
|
137
|
+
|
|
138
|
+
sm1 = 0.0
|
|
139
|
+
sm12 = 0.0
|
|
140
|
+
sm2 = 0.0
|
|
141
|
+
sm22 = 0.0
|
|
142
|
+
|
|
143
|
+
for i in range(pchange, min(end, len(darray))):
|
|
144
|
+
pc = darray[i] - darray[i - pchange]
|
|
145
|
+
|
|
146
|
+
sm1 = sm1 * alpha1_1 + pc * alpha1
|
|
147
|
+
sm12 = sm12 * alpha2_1 + sm1 * alpha2
|
|
148
|
+
sm2 = sm2 * alpha1_1 + abs(pc) * alpha1
|
|
149
|
+
sm22 = sm22 * alpha2_1 + sm2 * alpha2
|
|
150
|
+
|
|
151
|
+
if i >= minperiod - 1:
|
|
152
|
+
if sm22 != 0:
|
|
153
|
+
larray[i] = 100.0 * sm12 / sm22
|
|
154
|
+
else:
|
|
155
|
+
larray[i] = 0.0
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Ultimate Oscillator Module - Ultimate Oscillator indicator.
|
|
3
|
+
|
|
4
|
+
This module provides the Ultimate Oscillator indicator which combines
|
|
5
|
+
multiple timeframes to reduce false signals.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
UltimateOscillator: Ultimate Oscillator indicator.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.uo = bt.indicators.UltimateOscillator(self.data)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
if self.uo[0] > 70:
|
|
17
|
+
self.sell()
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from . import Indicator, TrueLow, TrueRange
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class UltimateOscillator(Indicator):
|
|
24
|
+
"""
|
|
25
|
+
Formula:
|
|
26
|
+
# Buying Pressure = Close - TrueLow
|
|
27
|
+
BP = Close - Minimum (Low or Prior Close)
|
|
28
|
+
|
|
29
|
+
# TrueRange = TrueHigh - TrueLow
|
|
30
|
+
TR = Maximum (High or Prior Close) - Minimum (Low or Prior Close)
|
|
31
|
+
|
|
32
|
+
Average7 = (7-period BP Sum) / (7-period TR Sum)
|
|
33
|
+
Average14 = (14-period BP Sum) / (14-period TR Sum)
|
|
34
|
+
Average28 = (28-period BP Sum) / (28-period TR Sum)
|
|
35
|
+
|
|
36
|
+
UO = 100 x [(4 x Average7)+(2 x Average14)+Average28]/(4+2+1)
|
|
37
|
+
|
|
38
|
+
See:
|
|
39
|
+
|
|
40
|
+
- https://en.wikipedia.org/wiki/Ultimate_oscillator
|
|
41
|
+
- http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ultimate_oscillator
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
lines = ("uo",)
|
|
45
|
+
|
|
46
|
+
params = (
|
|
47
|
+
("p1", 7),
|
|
48
|
+
("p2", 14),
|
|
49
|
+
("p3", 28),
|
|
50
|
+
("upperband", 70.0),
|
|
51
|
+
("lowerband", 30.0),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def _plotinit(self):
|
|
55
|
+
baseticks = [10.0, 50.0, 90.0]
|
|
56
|
+
hlines = [self.p.upperband, self.p.lowerband]
|
|
57
|
+
|
|
58
|
+
# Plot lines at 0 & 100 to make the scale complete + upper/lower/bands
|
|
59
|
+
self.plotinfo.plotyhlines = hlines
|
|
60
|
+
# Plot ticks at "baseticks" + the user specified upper/lower bands
|
|
61
|
+
self.plotinfo.plotyticks = baseticks + hlines
|
|
62
|
+
|
|
63
|
+
def __init__(self):
|
|
64
|
+
"""Initialize the Ultimate Oscillator indicator.
|
|
65
|
+
|
|
66
|
+
Creates TrueLow and TrueRange indicators for BP/TR calculations.
|
|
67
|
+
"""
|
|
68
|
+
super().__init__()
|
|
69
|
+
self.truelow = TrueLow(self.data)
|
|
70
|
+
self.truerange = TrueRange(self.data)
|
|
71
|
+
# TrueRange/TrueLow already contribute minperiod=2 (they need close[-1]).
|
|
72
|
+
# We need a total minperiod of p3 + 1 because we read close[-i]/truelow[-i]/
|
|
73
|
+
# truerange[-i] for i in [0, p3-1], so we need p3 historical bars plus the
|
|
74
|
+
# current one. addminperiod(p3 + 1) accumulates correctly under the new
|
|
75
|
+
# max-path semantics in LineMultiple.addminperiod.
|
|
76
|
+
self.addminperiod(self.p.p3 + 1)
|
|
77
|
+
|
|
78
|
+
def next(self):
|
|
79
|
+
"""Calculate Ultimate Oscillator for the current bar.
|
|
80
|
+
|
|
81
|
+
Combines 3 timeframes (p1, p2, p3) to reduce false signals.
|
|
82
|
+
"""
|
|
83
|
+
p1, p2, p3 = self.p.p1, self.p.p2, self.p.p3
|
|
84
|
+
|
|
85
|
+
# Calculate BP and TR sums for each period
|
|
86
|
+
bp_sum1 = tr_sum1 = 0.0
|
|
87
|
+
bp_sum2 = tr_sum2 = 0.0
|
|
88
|
+
bp_sum3 = tr_sum3 = 0.0
|
|
89
|
+
|
|
90
|
+
for i in range(p3):
|
|
91
|
+
bp = self.data.close[-i] - self.truelow[-i]
|
|
92
|
+
tr = self.truerange[-i]
|
|
93
|
+
|
|
94
|
+
if i < p1:
|
|
95
|
+
bp_sum1 += bp
|
|
96
|
+
tr_sum1 += tr
|
|
97
|
+
if i < p2:
|
|
98
|
+
bp_sum2 += bp
|
|
99
|
+
tr_sum2 += tr
|
|
100
|
+
bp_sum3 += bp
|
|
101
|
+
tr_sum3 += tr
|
|
102
|
+
|
|
103
|
+
av7 = bp_sum1 / tr_sum1 if tr_sum1 != 0 else 0.0
|
|
104
|
+
av14 = bp_sum2 / tr_sum2 if tr_sum2 != 0 else 0.0
|
|
105
|
+
av28 = bp_sum3 / tr_sum3 if tr_sum3 != 0 else 0.0
|
|
106
|
+
|
|
107
|
+
factor = 100.0 / 7.0
|
|
108
|
+
self.lines.uo[0] = (4.0 * factor) * av7 + (2.0 * factor) * av14 + factor * av28
|
|
109
|
+
|
|
110
|
+
def once(self, start, end):
|
|
111
|
+
"""Calculate Ultimate Oscillator in runonce mode.
|
|
112
|
+
|
|
113
|
+
Combines BP/TR sums across 3 timeframes for all bars.
|
|
114
|
+
"""
|
|
115
|
+
close_array = self.data.close.array
|
|
116
|
+
tl_array = self.truelow.lines[0].array
|
|
117
|
+
tr_array = self.truerange.lines[0].array
|
|
118
|
+
larray = self.lines.uo.array
|
|
119
|
+
p1, p2, p3 = self.p.p1, self.p.p2, self.p.p3
|
|
120
|
+
|
|
121
|
+
while len(larray) < end:
|
|
122
|
+
larray.append(float("nan"))
|
|
123
|
+
|
|
124
|
+
for i in range(min(p3 - 1, len(close_array))):
|
|
125
|
+
if i < len(larray):
|
|
126
|
+
larray[i] = float("nan")
|
|
127
|
+
|
|
128
|
+
for i in range(p3 - 1, min(end, len(close_array), len(tl_array), len(tr_array))):
|
|
129
|
+
bp_sum1 = tr_sum1 = 0.0
|
|
130
|
+
bp_sum2 = tr_sum2 = 0.0
|
|
131
|
+
bp_sum3 = tr_sum3 = 0.0
|
|
132
|
+
|
|
133
|
+
for j in range(p3):
|
|
134
|
+
idx = i - j
|
|
135
|
+
if (
|
|
136
|
+
idx >= 0
|
|
137
|
+
and idx < len(close_array)
|
|
138
|
+
and idx < len(tl_array)
|
|
139
|
+
and idx < len(tr_array)
|
|
140
|
+
):
|
|
141
|
+
bp = close_array[idx] - tl_array[idx]
|
|
142
|
+
tr = tr_array[idx]
|
|
143
|
+
|
|
144
|
+
if j < p1:
|
|
145
|
+
bp_sum1 += bp
|
|
146
|
+
tr_sum1 += tr
|
|
147
|
+
if j < p2:
|
|
148
|
+
bp_sum2 += bp
|
|
149
|
+
tr_sum2 += tr
|
|
150
|
+
bp_sum3 += bp
|
|
151
|
+
tr_sum3 += tr
|
|
152
|
+
|
|
153
|
+
av7 = bp_sum1 / tr_sum1 if tr_sum1 != 0 else 0.0
|
|
154
|
+
av14 = bp_sum2 / tr_sum2 if tr_sum2 != 0 else 0.0
|
|
155
|
+
av28 = bp_sum3 / tr_sum3 if tr_sum3 != 0 else 0.0
|
|
156
|
+
|
|
157
|
+
factor = 100.0 / 7.0
|
|
158
|
+
larray[i] = (4.0 * factor) * av7 + (2.0 * factor) * av14 + factor * av28
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Vortex Indicator Module - Vortex trend indicator.
|
|
3
|
+
|
|
4
|
+
This module provides the Vortex indicator for identifying trend
|
|
5
|
+
direction and strength.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
Vortex: Vortex indicator with VI+ and VI- lines.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.vortex = bt.indicators.Vortex(self.data, period=14)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
# VI+ crossing above VI- indicates uptrend
|
|
17
|
+
if self.vortex.vi_plus[0] > self.vortex.vi_minus[0]:
|
|
18
|
+
self.buy()
|
|
19
|
+
# VI- crossing above VI+ indicates downtrend
|
|
20
|
+
elif self.vortex.vi_minus[0] > self.vortex.vi_plus[0]:
|
|
21
|
+
self.sell()
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from . import Indicator, Max, SumN
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Vortex(Indicator):
|
|
28
|
+
"""
|
|
29
|
+
See:
|
|
30
|
+
- http://www.vortexindicator.com/VFX_VORTEX.PDF
|
|
31
|
+
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
lines = (
|
|
35
|
+
"vi_plus",
|
|
36
|
+
"vi_minus",
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
params = (("period", 14),)
|
|
40
|
+
|
|
41
|
+
plotlines = {"vi_plus": {"_name": "+VI"}, "vi_minus": {"_name": "-VI"}}
|
|
42
|
+
|
|
43
|
+
def __init__(self):
|
|
44
|
+
"""Initialize the Vortex indicator.
|
|
45
|
+
|
|
46
|
+
Sets up VI+ and VI- calculations based on True Range and
|
|
47
|
+
directional movement.
|
|
48
|
+
"""
|
|
49
|
+
h0l1 = abs(self.data.high(0) - self.data.low(-1))
|
|
50
|
+
vm_plus = SumN(h0l1, period=self.p.period)
|
|
51
|
+
|
|
52
|
+
l0h1 = abs(self.data.low(0) - self.data.high(-1))
|
|
53
|
+
vm_minus = SumN(l0h1, period=self.p.period)
|
|
54
|
+
|
|
55
|
+
h0c1 = abs(self.data.high(0) - self.data.close(-1))
|
|
56
|
+
l0c1 = abs(self.data.low(0) - self.data.close(-1))
|
|
57
|
+
h0l0 = abs(self.data.high(0) - self.data.low(0))
|
|
58
|
+
|
|
59
|
+
tr = SumN(Max(h0l0, h0c1, l0c1), period=self.p.period)
|
|
60
|
+
|
|
61
|
+
self.l.vi_plus = vm_plus / tr
|
|
62
|
+
self.l.vi_minus = vm_minus / tr
|