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,153 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Heikin Ashi Indicator Module - Heikin Ashi candlesticks.
|
|
3
|
+
|
|
4
|
+
This module provides the Heikin Ashi candlestick indicator which
|
|
5
|
+
creates alternative candlestick charts for trend identification.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
HeikinAshi: Heikin Ashi candlestick lines.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.ha = bt.indicators.HeikinAshi(self.data)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
# Use Heikin Ashi close for trend analysis
|
|
17
|
+
if self.data.close[0] > self.ha.ha_close[0]:
|
|
18
|
+
self.buy()
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from . import Indicator
|
|
22
|
+
|
|
23
|
+
__all__ = ["HeikinAshi"]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class HeikinAshi(Indicator):
|
|
27
|
+
"""
|
|
28
|
+
Heikin Ashi candlesticks in the forms of lines
|
|
29
|
+
|
|
30
|
+
Formula:
|
|
31
|
+
ha_open = (ha_open(-1) + ha_close(-1)) / 2
|
|
32
|
+
ha_high = max (hi, ha_open, ha_close)
|
|
33
|
+
ha_low = min (lo, ha_open, ha_close)
|
|
34
|
+
ha_close = (open + high + low + close) / 4
|
|
35
|
+
|
|
36
|
+
See also:
|
|
37
|
+
https://en.wikipedia.org/wiki/Candlestick_chart#Heikin_Ashi_candlesticks
|
|
38
|
+
http://stockcharts.com/school/doku.php?id=chart_school:chart_analysis:heikin_ashi
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
lines = (
|
|
42
|
+
"ha_open",
|
|
43
|
+
"ha_high",
|
|
44
|
+
"ha_low",
|
|
45
|
+
"ha_close",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
linealias = (
|
|
49
|
+
(
|
|
50
|
+
"ha_open",
|
|
51
|
+
"open",
|
|
52
|
+
),
|
|
53
|
+
(
|
|
54
|
+
"ha_high",
|
|
55
|
+
"high",
|
|
56
|
+
),
|
|
57
|
+
(
|
|
58
|
+
"ha_low",
|
|
59
|
+
"low",
|
|
60
|
+
),
|
|
61
|
+
(
|
|
62
|
+
"ha_close",
|
|
63
|
+
"close",
|
|
64
|
+
),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
plotinfo = {"subplot": False}
|
|
68
|
+
|
|
69
|
+
_nextforce = True
|
|
70
|
+
|
|
71
|
+
def __init__(self):
|
|
72
|
+
"""Initialize the Heikin Ashi indicator.
|
|
73
|
+
|
|
74
|
+
Uses next()/once() methods for calculation to avoid recursive
|
|
75
|
+
line operation issues.
|
|
76
|
+
"""
|
|
77
|
+
# CRITICAL FIX: Call super().__init__() FIRST to ensure proper initialization
|
|
78
|
+
super().__init__()
|
|
79
|
+
# Use next()/once() methods for calculation to avoid recursive line operation issues
|
|
80
|
+
# that cause strategy's next() to never be called
|
|
81
|
+
|
|
82
|
+
def next(self):
|
|
83
|
+
"""Calculate Heikin Ashi values for the current bar.
|
|
84
|
+
|
|
85
|
+
Calculates ha_close, ha_open, ha_high, and ha_low using:
|
|
86
|
+
- ha_close = (open + high + low + close) / 4
|
|
87
|
+
- ha_open = (prev_ha_open + prev_ha_close) / 2
|
|
88
|
+
- ha_high = max(high, ha_open, ha_close)
|
|
89
|
+
- ha_low = min(low, ha_open, ha_close)
|
|
90
|
+
"""
|
|
91
|
+
# ha_close = (open + high + low + close) / 4
|
|
92
|
+
ha_close = (
|
|
93
|
+
self.data.open[0] + self.data.high[0] + self.data.low[0] + self.data.close[0]
|
|
94
|
+
) / 4.0
|
|
95
|
+
self.lines.ha_close[0] = ha_close
|
|
96
|
+
|
|
97
|
+
# ha_open = (ha_open[-1] + ha_close[-1]) / 2
|
|
98
|
+
# Uses PREVIOUS bar's ha_open and PREVIOUS bar's ha_close
|
|
99
|
+
if len(self) > 1:
|
|
100
|
+
ha_open = (self.lines.ha_open[-1] + self.lines.ha_close[-1]) / 2.0
|
|
101
|
+
else:
|
|
102
|
+
# First bar: seed with average of open and close
|
|
103
|
+
ha_open = (self.data.open[0] + self.data.close[0]) / 2.0
|
|
104
|
+
self.lines.ha_open[0] = ha_open
|
|
105
|
+
|
|
106
|
+
# ha_high = max(high, ha_open, ha_close)
|
|
107
|
+
self.lines.ha_high[0] = max(self.data.high[0], ha_open, ha_close)
|
|
108
|
+
|
|
109
|
+
# ha_low = min(low, ha_open, ha_close)
|
|
110
|
+
self.lines.ha_low[0] = min(self.data.low[0], ha_open, ha_close)
|
|
111
|
+
|
|
112
|
+
def prenext(self):
|
|
113
|
+
"""Calculate Heikin Ashi values before minimum period is reached.
|
|
114
|
+
|
|
115
|
+
Uses the same calculation as next() to show values from the start.
|
|
116
|
+
"""
|
|
117
|
+
# Same calculation as next() for prenext period
|
|
118
|
+
self.next()
|
|
119
|
+
|
|
120
|
+
def once(self, start, end):
|
|
121
|
+
"""Batch calculation for runonce mode - matches next() logic exactly"""
|
|
122
|
+
o_array = self.data.open.array
|
|
123
|
+
h_array = self.data.high.array
|
|
124
|
+
l_array = self.data.low.array
|
|
125
|
+
c_array = self.data.close.array
|
|
126
|
+
|
|
127
|
+
ha_open_array = self.lines.ha_open.array
|
|
128
|
+
ha_high_array = self.lines.ha_high.array
|
|
129
|
+
ha_low_array = self.lines.ha_low.array
|
|
130
|
+
ha_close_array = self.lines.ha_close.array
|
|
131
|
+
|
|
132
|
+
# Ensure arrays are properly sized
|
|
133
|
+
for arr in [ha_open_array, ha_high_array, ha_low_array, ha_close_array]:
|
|
134
|
+
while len(arr) < end:
|
|
135
|
+
arr.append(float("nan"))
|
|
136
|
+
|
|
137
|
+
data_len = min(end, len(o_array), len(h_array), len(l_array), len(c_array))
|
|
138
|
+
for i in range(start, data_len):
|
|
139
|
+
# ha_close = (open + high + low + close) / 4
|
|
140
|
+
ha_close = (o_array[i] + h_array[i] + l_array[i] + c_array[i]) / 4.0
|
|
141
|
+
ha_close_array[i] = ha_close
|
|
142
|
+
|
|
143
|
+
# ha_open = (ha_open[-1] + ha_close[-1]) / 2
|
|
144
|
+
# Uses PREVIOUS bar's ha_open and PREVIOUS bar's ha_close
|
|
145
|
+
if i > 0:
|
|
146
|
+
ha_open = (ha_open_array[i - 1] + ha_close_array[i - 1]) / 2.0
|
|
147
|
+
else:
|
|
148
|
+
ha_open = (o_array[i] + c_array[i]) / 2.0
|
|
149
|
+
ha_open_array[i] = ha_open
|
|
150
|
+
|
|
151
|
+
# ha_high and ha_low
|
|
152
|
+
ha_high_array[i] = max(h_array[i], ha_open, ha_close)
|
|
153
|
+
ha_low_array[i] = min(l_array[i], ha_open, ha_close)
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""HMA Indicator Module - Hull Moving Average.
|
|
3
|
+
|
|
4
|
+
This module provides the HMA (Hull Moving Average) indicator developed
|
|
5
|
+
by Alan Hull to reduce lag while maintaining smoothness.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
HullMovingAverage: HMA indicator (aliases: HMA, HullMA).
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.hma = bt.indicators.HMA(self.data.close, period=30)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
if self.data.close[0] > self.hma[0]:
|
|
17
|
+
self.buy()
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import math
|
|
21
|
+
|
|
22
|
+
from . import MovingAverageBase
|
|
23
|
+
from .wma import WMA
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class HullMovingAverage(MovingAverageBase):
|
|
27
|
+
"""By Alan Hull
|
|
28
|
+
|
|
29
|
+
The Hull Moving Average solves the age-old dilemma of making a moving
|
|
30
|
+
average more responsive to current price activity whilst maintaining curve
|
|
31
|
+
smoothness. In fact, the HMA almost eliminates lag altogether and manages to
|
|
32
|
+
improve smoothing at the same time.
|
|
33
|
+
|
|
34
|
+
Formula:
|
|
35
|
+
- hma = wma(2 * wma(data, period // 2) - wma(data, period), sqrt(period))
|
|
36
|
+
|
|
37
|
+
See also:
|
|
38
|
+
- http://alanhull.com/hull-moving-average
|
|
39
|
+
|
|
40
|
+
Note:
|
|
41
|
+
|
|
42
|
+
- Please note that the final minimum period is not the period passed with
|
|
43
|
+
the parameter `period`. A final moving average on moving average is
|
|
44
|
+
done in which the period is the *square root* of the original.
|
|
45
|
+
|
|
46
|
+
In the default case of `30`, the final minimum period before the
|
|
47
|
+
moving average produces a non-NAN value is ``34``
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
alias = (
|
|
51
|
+
"HMA",
|
|
52
|
+
"HullMA",
|
|
53
|
+
)
|
|
54
|
+
lines = ("hma",)
|
|
55
|
+
|
|
56
|
+
# param 'period' is inherited from MovingAverageBase
|
|
57
|
+
params = (("_movav", WMA),)
|
|
58
|
+
|
|
59
|
+
def __init__(self):
|
|
60
|
+
"""Initialize the Hull Moving Average.
|
|
61
|
+
|
|
62
|
+
Creates full-period and half-period WMAs for the HMA calculation.
|
|
63
|
+
"""
|
|
64
|
+
super().__init__()
|
|
65
|
+
self.wma_full = self.p._movav(self.data, period=self.p.period)
|
|
66
|
+
self.wma_half = self.p._movav(self.data, period=self.p.period // 2)
|
|
67
|
+
self.sqrtperiod = int(pow(self.p.period, 0.5))
|
|
68
|
+
# minperiod calculation
|
|
69
|
+
self._minperiod = max(self._minperiod, self.p.period + self.sqrtperiod - 1)
|
|
70
|
+
|
|
71
|
+
def _calc_wma(self, values, period):
|
|
72
|
+
"""Calculate WMA for a list of values.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
values: List of values to average.
|
|
76
|
+
period: Period for WMA calculation.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
float: Weighted moving average value.
|
|
80
|
+
"""
|
|
81
|
+
if len(values) < period:
|
|
82
|
+
return float("nan")
|
|
83
|
+
coef = 2.0 / (period * (period + 1.0))
|
|
84
|
+
weights = tuple(float(x) for x in range(1, period + 1))
|
|
85
|
+
weighted_sum = 0.0
|
|
86
|
+
for i in range(period):
|
|
87
|
+
weighted_sum += weights[period - 1 - i] * values[-(i + 1)]
|
|
88
|
+
return coef * weighted_sum
|
|
89
|
+
|
|
90
|
+
def next(self):
|
|
91
|
+
"""Calculate HMA for the current bar.
|
|
92
|
+
|
|
93
|
+
Formula: HMA = WMA(2*WMA(n/2) - WMA(n), sqrt(n))
|
|
94
|
+
"""
|
|
95
|
+
# Get raw values for final WMA calculation
|
|
96
|
+
sqrtperiod = self.sqrtperiod
|
|
97
|
+
raw_values = []
|
|
98
|
+
for i in range(sqrtperiod):
|
|
99
|
+
wma2_val = 2.0 * self.wma_half[-i]
|
|
100
|
+
wma_val = self.wma_full[-i]
|
|
101
|
+
raw_values.append(wma2_val - wma_val)
|
|
102
|
+
raw_values.reverse()
|
|
103
|
+
|
|
104
|
+
self.lines.hma[0] = self._calc_wma(raw_values, sqrtperiod)
|
|
105
|
+
|
|
106
|
+
def once(self, start, end):
|
|
107
|
+
"""Calculate HMA in runonce mode."""
|
|
108
|
+
wma_full_array = self.wma_full.lines[0].array
|
|
109
|
+
wma_half_array = self.wma_half.lines[0].array
|
|
110
|
+
larray = self.lines.hma.array
|
|
111
|
+
period = self.p.period
|
|
112
|
+
sqrtperiod = self.sqrtperiod
|
|
113
|
+
|
|
114
|
+
while len(larray) < end:
|
|
115
|
+
larray.append(float("nan"))
|
|
116
|
+
|
|
117
|
+
minperiod = period + sqrtperiod - 1
|
|
118
|
+
for i in range(min(minperiod - 1, len(wma_full_array))):
|
|
119
|
+
if i < len(larray):
|
|
120
|
+
larray[i] = float("nan")
|
|
121
|
+
|
|
122
|
+
# WMA coefficient
|
|
123
|
+
coef = 2.0 / (sqrtperiod * (sqrtperiod + 1.0))
|
|
124
|
+
weights = tuple(float(x) for x in range(1, sqrtperiod + 1))
|
|
125
|
+
|
|
126
|
+
for i in range(minperiod - 1, min(end, len(wma_full_array), len(wma_half_array))):
|
|
127
|
+
# Calculate raw = 2 * wma_half - wma_full for last sqrtperiod values
|
|
128
|
+
weighted_sum = 0.0
|
|
129
|
+
valid = True
|
|
130
|
+
for j in range(sqrtperiod):
|
|
131
|
+
idx = i - j
|
|
132
|
+
if idx >= 0 and idx < len(wma_full_array) and idx < len(wma_half_array):
|
|
133
|
+
wma_full_val = wma_full_array[idx]
|
|
134
|
+
wma_half_val = wma_half_array[idx]
|
|
135
|
+
if isinstance(wma_full_val, float) and math.isnan(wma_full_val):
|
|
136
|
+
valid = False
|
|
137
|
+
break
|
|
138
|
+
if isinstance(wma_half_val, float) and math.isnan(wma_half_val):
|
|
139
|
+
valid = False
|
|
140
|
+
break
|
|
141
|
+
raw = 2.0 * wma_half_val - wma_full_val
|
|
142
|
+
weighted_sum += weights[sqrtperiod - 1 - j] * raw
|
|
143
|
+
else:
|
|
144
|
+
valid = False
|
|
145
|
+
break
|
|
146
|
+
|
|
147
|
+
if valid and i < len(larray):
|
|
148
|
+
larray[i] = coef * weighted_sum
|
|
149
|
+
elif i < len(larray):
|
|
150
|
+
larray[i] = float("nan")
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
HMA = HullMovingAverage
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Hurst Exponent Module - Hurst exponent indicator.
|
|
3
|
+
|
|
4
|
+
This module provides the Hurst Exponent indicator for measuring
|
|
5
|
+
long-term memory of time series.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
HurstExponent: Hurst exponent indicator (alias: Hurst).
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
# Use at least 2000 samples for stable Hurst values
|
|
14
|
+
self.hurst = bt.indicators.Hurst(self.data.close, period=2000)
|
|
15
|
+
|
|
16
|
+
def next(self):
|
|
17
|
+
# H > 0.5: trending series, H < 0.5: mean-reverting
|
|
18
|
+
if len(self.data) >= 2000:
|
|
19
|
+
if self.hurst[0] > 0.5:
|
|
20
|
+
# Trend following strategy
|
|
21
|
+
pass
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from numpy import asarray, isnan, log10, polyfit, sqrt, std, subtract
|
|
25
|
+
|
|
26
|
+
from . import PeriodN
|
|
27
|
+
|
|
28
|
+
__all__ = ["HurstExponent", "Hurst"]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class HurstExponent(PeriodN):
|
|
32
|
+
"""
|
|
33
|
+
References:
|
|
34
|
+
|
|
35
|
+
- https://www.quantopian.com/posts/hurst-exponent
|
|
36
|
+
- https://www.quantopian.com/posts/some-code-from-ernie-chans-new-book-implemented-in-python
|
|
37
|
+
|
|
38
|
+
Interpretation of the results
|
|
39
|
+
|
|
40
|
+
1. Geometric random walk (H=0.5)
|
|
41
|
+
2. Mean-reverting series (H<0.5)
|
|
42
|
+
3. Trending Series (H>0.5)
|
|
43
|
+
|
|
44
|
+
Important notes:
|
|
45
|
+
|
|
46
|
+
- The default period is ``40``, but experimentation by users has shown
|
|
47
|
+
that it would be advisable to have at least 2000 samples (i.e.: a
|
|
48
|
+
period of at least 2000) to have stable values.
|
|
49
|
+
|
|
50
|
+
- The `lag_start` and `lag_end` values will default to be ``2`` and
|
|
51
|
+
``self.p.period / 2`` unless the parameters are specified.
|
|
52
|
+
|
|
53
|
+
Experimentation by users has also shown that values of around 10 and 500 produce good results
|
|
54
|
+
|
|
55
|
+
The original values (40, 2, self.p.period / 2) are kept for backwards
|
|
56
|
+
compatibility
|
|
57
|
+
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
frompackages = (("numpy", ("asarray", "log10", "polyfit", "sqrt", "std", "subtract")),)
|
|
61
|
+
|
|
62
|
+
alias = ("Hurst",)
|
|
63
|
+
lines = ("hurst",)
|
|
64
|
+
params = (
|
|
65
|
+
("period", 40), # 2000 was proposed
|
|
66
|
+
("lag_start", None), # 10 was proposed
|
|
67
|
+
("lag_end", None), # 500 was proposed
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def _plotlabel(self):
|
|
71
|
+
plabels = [self.p.period]
|
|
72
|
+
plabels += [self._lag_start]
|
|
73
|
+
plabels += [self._lag_end]
|
|
74
|
+
return plabels
|
|
75
|
+
|
|
76
|
+
def __init__(self):
|
|
77
|
+
"""Initialize the Hurst Exponent indicator.
|
|
78
|
+
|
|
79
|
+
Prepares lag arrays for calculating the Hurst exponent,
|
|
80
|
+
which measures the long-term memory of a time series.
|
|
81
|
+
"""
|
|
82
|
+
super().__init__()
|
|
83
|
+
# Prepare the lag array
|
|
84
|
+
self._lag_start = lag_start = self.p.lag_start or 2
|
|
85
|
+
self._lag_end = lag_end = self.p.lag_end or (self.p.period // 2)
|
|
86
|
+
self.lags = asarray(range(lag_start, lag_end))
|
|
87
|
+
self.log10lags = log10(self.lags)
|
|
88
|
+
|
|
89
|
+
def next(self):
|
|
90
|
+
"""Calculate Hurst Exponent for the current bar."""
|
|
91
|
+
# Fetch the data
|
|
92
|
+
ts = asarray(self.data.get(size=self.p.period))
|
|
93
|
+
|
|
94
|
+
# Calculate the array of the variances of the lagged differences
|
|
95
|
+
tau = [sqrt(std(subtract(ts[lag:], ts[:-lag]))) for lag in self.lags]
|
|
96
|
+
|
|
97
|
+
# Use a linear fit to estimate the Hurst Exponent
|
|
98
|
+
poly = polyfit(self.log10lags, log10(tau), 1)
|
|
99
|
+
|
|
100
|
+
# Return the Hurst exponent from the polyfit output
|
|
101
|
+
self.lines.hurst[0] = poly[0] * 2.0
|
|
102
|
+
|
|
103
|
+
def once(self, start, end):
|
|
104
|
+
"""Calculate Hurst Exponent in runonce mode"""
|
|
105
|
+
dst = self.lines[0].array
|
|
106
|
+
src = self.data.array
|
|
107
|
+
period = self.p.period
|
|
108
|
+
lags = self.lags
|
|
109
|
+
log10lags = self.log10lags
|
|
110
|
+
|
|
111
|
+
# Ensure destination array is large enough
|
|
112
|
+
while len(dst) < end:
|
|
113
|
+
dst.append(float("nan"))
|
|
114
|
+
|
|
115
|
+
# Calculate Hurst Exponent for each index
|
|
116
|
+
for i in range(start, end):
|
|
117
|
+
if i >= period - 1:
|
|
118
|
+
# Get data slice for this period
|
|
119
|
+
start_idx = i - period + 1
|
|
120
|
+
end_idx = i + 1
|
|
121
|
+
if end_idx <= len(src):
|
|
122
|
+
ts = asarray([float(x) for x in src[start_idx:end_idx]])
|
|
123
|
+
|
|
124
|
+
# Calculate the array of the variances of the lagged differences
|
|
125
|
+
tau = []
|
|
126
|
+
for lag in lags:
|
|
127
|
+
if lag < len(ts):
|
|
128
|
+
lagged_diff = subtract(ts[lag:], ts[:-lag])
|
|
129
|
+
if len(lagged_diff) > 0:
|
|
130
|
+
tau_val = sqrt(std(lagged_diff))
|
|
131
|
+
if not isnan(tau_val) and tau_val > 0:
|
|
132
|
+
tau.append(tau_val)
|
|
133
|
+
|
|
134
|
+
# Use a linear fit to estimate the Hurst Exponent
|
|
135
|
+
if len(tau) > 1 and len(tau) == len(lags):
|
|
136
|
+
try:
|
|
137
|
+
log10tau = log10(tau)
|
|
138
|
+
poly = polyfit(log10lags, log10tau, 1)
|
|
139
|
+
hurst = poly[0] * 2.0
|
|
140
|
+
dst[i] = float(hurst) if not isnan(hurst) else float("nan")
|
|
141
|
+
except (ValueError, TypeError, FloatingPointError):
|
|
142
|
+
dst[i] = float("nan")
|
|
143
|
+
else:
|
|
144
|
+
dst[i] = float("nan")
|
|
145
|
+
else:
|
|
146
|
+
dst[i] = float("nan")
|
|
147
|
+
else:
|
|
148
|
+
dst[i] = float("nan")
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
Hurst = HurstExponent
|