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,194 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Williams Indicator Module - Williams %R indicator.
|
|
3
|
+
|
|
4
|
+
This module provides the WilliamsR indicator developed by Larry
|
|
5
|
+
Williams to show overbought/oversold conditions.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
WilliamsR: Williams %R indicator.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.williamsr = bt.indicators.WilliamsR(self.data, period=14)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
# Williams %R above -20 indicates overbought
|
|
17
|
+
if self.williamsr.percR[0] > -20:
|
|
18
|
+
self.sell()
|
|
19
|
+
# Williams %R below -80 indicates oversold
|
|
20
|
+
elif self.williamsr.percR[0] < -80:
|
|
21
|
+
self.buy()
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import math
|
|
25
|
+
|
|
26
|
+
from . import DownDay, Highest, Indicator, Lowest, TrueHigh, TrueLow, UpDay
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class WilliamsR(Indicator):
|
|
30
|
+
"""
|
|
31
|
+
Developed by Larry Williams to show the relation of closing prices to
|
|
32
|
+
the highest-lowest range of a given period.
|
|
33
|
+
|
|
34
|
+
Known as Williams %R (but % is not allowed in Python identifiers)
|
|
35
|
+
|
|
36
|
+
Formula:
|
|
37
|
+
- num = highest_period - close
|
|
38
|
+
- den = highestg_period - lowest_period
|
|
39
|
+
- percR = (num / den) * -100.0
|
|
40
|
+
|
|
41
|
+
See:
|
|
42
|
+
- http://en.wikipedia.org/wiki/Williams_%25R
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
lines = ("percR",)
|
|
46
|
+
params = (
|
|
47
|
+
("period", 14),
|
|
48
|
+
("upperband", -20.0),
|
|
49
|
+
("lowerband", -80.0),
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
plotinfo = {"plotname": "Williams R%"}
|
|
53
|
+
plotlines = {"percR": {"_name": "R%"}}
|
|
54
|
+
|
|
55
|
+
def _plotinif(self):
|
|
56
|
+
self.plotinfo.plotyhlines = [self.p.upperband, self.p.lowerband]
|
|
57
|
+
|
|
58
|
+
def __init__(self):
|
|
59
|
+
"""Initialize the Williams %R indicator.
|
|
60
|
+
|
|
61
|
+
Creates Highest and Lowest indicators for calculation.
|
|
62
|
+
"""
|
|
63
|
+
super().__init__()
|
|
64
|
+
self.highest = Highest(self.data.high, period=self.p.period)
|
|
65
|
+
self.lowest = Lowest(self.data.low, period=self.p.period)
|
|
66
|
+
|
|
67
|
+
def next(self):
|
|
68
|
+
"""Calculate Williams %R for the current bar.
|
|
69
|
+
|
|
70
|
+
%R = -100 * (highest - close) / (highest - lowest)
|
|
71
|
+
Returns 0.0 if denominator is 0 to avoid division by zero.
|
|
72
|
+
"""
|
|
73
|
+
h = self.highest[0]
|
|
74
|
+
low = self.lowest[0]
|
|
75
|
+
c = self.data.close[0]
|
|
76
|
+
den = h - low
|
|
77
|
+
if den != 0:
|
|
78
|
+
self.lines.percR[0] = -100.0 * (h - c) / den
|
|
79
|
+
else:
|
|
80
|
+
self.lines.percR[0] = 0.0
|
|
81
|
+
|
|
82
|
+
def once(self, start, end):
|
|
83
|
+
"""Calculate Williams %R in runonce mode.
|
|
84
|
+
|
|
85
|
+
Computes %R values across all bars.
|
|
86
|
+
"""
|
|
87
|
+
h_array = self.highest.lines[0].array
|
|
88
|
+
l_array = self.lowest.lines[0].array
|
|
89
|
+
c_array = self.data.close.array
|
|
90
|
+
larray = self.lines.percR.array
|
|
91
|
+
|
|
92
|
+
while len(larray) < end:
|
|
93
|
+
larray.append(float("nan"))
|
|
94
|
+
|
|
95
|
+
for i in range(start, min(end, len(h_array), len(l_array), len(c_array))):
|
|
96
|
+
h = h_array[i] if i < len(h_array) else 0.0
|
|
97
|
+
low = l_array[i] if i < len(l_array) else 0.0
|
|
98
|
+
c = c_array[i] if i < len(c_array) else 0.0
|
|
99
|
+
|
|
100
|
+
if isinstance(h, float) and math.isnan(h) or isinstance(low, float) and math.isnan(low):
|
|
101
|
+
larray[i] = float("nan")
|
|
102
|
+
else:
|
|
103
|
+
den = h - low
|
|
104
|
+
if den != 0:
|
|
105
|
+
larray[i] = -100.0 * (h - c) / den
|
|
106
|
+
else:
|
|
107
|
+
larray[i] = 0.0
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class WilliamsAD(Indicator):
|
|
111
|
+
"""
|
|
112
|
+
By Larry Williams. It does cumulatively measure if the price is
|
|
113
|
+
accumulating (upwards) or distributing (downwards) by using the concept of
|
|
114
|
+
UpDays and DownDays.
|
|
115
|
+
|
|
116
|
+
Prices can go upwards but do so in a fashion that no longer shows
|
|
117
|
+
accumulation because updays and downdays are canceling out each other,
|
|
118
|
+
creating a divergence.
|
|
119
|
+
|
|
120
|
+
See:
|
|
121
|
+
- http://www.metastock.com/Customer/Resources/TAAZ/?p=125
|
|
122
|
+
- http://ta.mql4.com/indicators/trends/williams_accumulation_distribution
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
lines = ("ad",)
|
|
126
|
+
|
|
127
|
+
def __init__(self):
|
|
128
|
+
"""Initialize the Williams A/D indicator.
|
|
129
|
+
|
|
130
|
+
Creates up/down day and true high/low indicators.
|
|
131
|
+
"""
|
|
132
|
+
super().__init__()
|
|
133
|
+
self.upday = UpDay(self.data.close)
|
|
134
|
+
self.downday = DownDay(self.data.close)
|
|
135
|
+
self.truelow = TrueLow(self.data)
|
|
136
|
+
self.truehigh = TrueHigh(self.data)
|
|
137
|
+
self._accum = 0.0
|
|
138
|
+
|
|
139
|
+
def next(self):
|
|
140
|
+
"""Calculate Williams A/D for the current bar.
|
|
141
|
+
|
|
142
|
+
Accumulates based on up days and down days using true range.
|
|
143
|
+
"""
|
|
144
|
+
upday_val = self.upday[0]
|
|
145
|
+
downday_val = self.downday[0]
|
|
146
|
+
|
|
147
|
+
if upday_val > 0:
|
|
148
|
+
adup = self.data.close[0] - self.truelow[0]
|
|
149
|
+
else:
|
|
150
|
+
adup = 0.0
|
|
151
|
+
|
|
152
|
+
if downday_val > 0:
|
|
153
|
+
addown = self.data.close[0] - self.truehigh[0]
|
|
154
|
+
else:
|
|
155
|
+
addown = 0.0
|
|
156
|
+
|
|
157
|
+
self._accum += adup + addown
|
|
158
|
+
self.lines.ad[0] = self._accum
|
|
159
|
+
|
|
160
|
+
def once(self, start, end):
|
|
161
|
+
"""Calculate Williams A/D in runonce mode.
|
|
162
|
+
|
|
163
|
+
Accumulates values across all bars.
|
|
164
|
+
"""
|
|
165
|
+
upday_array = self.upday.lines[0].array
|
|
166
|
+
downday_array = self.downday.lines[0].array
|
|
167
|
+
truelow_array = self.truelow.lines[0].array
|
|
168
|
+
truehigh_array = self.truehigh.lines[0].array
|
|
169
|
+
c_array = self.data.close.array
|
|
170
|
+
larray = self.lines.ad.array
|
|
171
|
+
|
|
172
|
+
while len(larray) < end:
|
|
173
|
+
larray.append(float("nan"))
|
|
174
|
+
|
|
175
|
+
accum = 0.0
|
|
176
|
+
for i in range(start, min(end, len(upday_array), len(downday_array), len(c_array))):
|
|
177
|
+
upday_val = upday_array[i] if i < len(upday_array) else 0.0
|
|
178
|
+
downday_val = downday_array[i] if i < len(downday_array) else 0.0
|
|
179
|
+
close = c_array[i] if i < len(c_array) else 0.0
|
|
180
|
+
tl = truelow_array[i] if i < len(truelow_array) else 0.0
|
|
181
|
+
th = truehigh_array[i] if i < len(truehigh_array) else 0.0
|
|
182
|
+
|
|
183
|
+
if upday_val > 0:
|
|
184
|
+
adup = close - tl
|
|
185
|
+
else:
|
|
186
|
+
adup = 0.0
|
|
187
|
+
|
|
188
|
+
if downday_val > 0:
|
|
189
|
+
addown = close - th
|
|
190
|
+
else:
|
|
191
|
+
addown = 0.0
|
|
192
|
+
|
|
193
|
+
accum += adup + addown
|
|
194
|
+
larray[i] = accum
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""WMA Indicator Module - Weighted Moving Average.
|
|
3
|
+
|
|
4
|
+
This module provides the WMA (Weighted Moving Average) indicator
|
|
5
|
+
which gives more weight to recent prices.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
WeightedMovingAverage: WMA indicator (alias: WMA).
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.wma = bt.indicators.WMA(self.data.close, period=20)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
# Price above WMA indicates uptrend
|
|
17
|
+
if self.data.close[0] > self.wma[0]:
|
|
18
|
+
self.buy()
|
|
19
|
+
# Price below WMA indicates downtrend
|
|
20
|
+
elif self.data.close[0] < self.wma[0]:
|
|
21
|
+
self.sell()
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import math
|
|
25
|
+
|
|
26
|
+
from ..utils.py3 import range
|
|
27
|
+
from . import MovingAverageBase
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class WeightedMovingAverage(MovingAverageBase):
|
|
31
|
+
"""
|
|
32
|
+
A Moving Average which gives an arithmetic weighting to values with the
|
|
33
|
+
newest having the more weight
|
|
34
|
+
|
|
35
|
+
Formula:
|
|
36
|
+
- weights = range(1, period + 1)
|
|
37
|
+
- coef = 2 / (period * (period + 1))
|
|
38
|
+
- movav = coef * Sum(weight[i] * data[period - i] for i in range(period))
|
|
39
|
+
|
|
40
|
+
See also:
|
|
41
|
+
- http://en.wikipedia.org/wiki/Moving_average#Weighted_moving_average
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
alias = (
|
|
45
|
+
"WMA",
|
|
46
|
+
"MovingAverageWeighted",
|
|
47
|
+
)
|
|
48
|
+
lines = ("wma",)
|
|
49
|
+
|
|
50
|
+
def __init__(self):
|
|
51
|
+
"""Initialize the WMA indicator.
|
|
52
|
+
|
|
53
|
+
Calculates weights and coefficient for weighted moving average.
|
|
54
|
+
"""
|
|
55
|
+
super().__init__()
|
|
56
|
+
self.coef = 2.0 / (self.p.period * (self.p.period + 1.0))
|
|
57
|
+
self.weights = tuple(float(x) for x in range(1, self.p.period + 1))
|
|
58
|
+
|
|
59
|
+
def next(self):
|
|
60
|
+
"""Calculate WMA for the current bar.
|
|
61
|
+
|
|
62
|
+
Applies arithmetic weighting with newest values having more weight.
|
|
63
|
+
Uses math.fsum over chronological (oldest-first) order to match the
|
|
64
|
+
framework's WeightedAverage accumulation exactly and avoid 1-ULP
|
|
65
|
+
drift between runonce and event modes.
|
|
66
|
+
"""
|
|
67
|
+
period = self.p.period
|
|
68
|
+
coef = self.coef
|
|
69
|
+
weights = self.weights
|
|
70
|
+
|
|
71
|
+
# data oldest-first: data[-(period-1)] .. data[0]
|
|
72
|
+
data = [self.data[-(period - 1 - i)] for i in range(period)]
|
|
73
|
+
self.lines.wma[0] = coef * math.fsum(weights[i] * data[i] for i in range(period))
|
|
74
|
+
|
|
75
|
+
def once(self, start, end):
|
|
76
|
+
"""Calculate WMA in runonce mode.
|
|
77
|
+
|
|
78
|
+
Applies weighted average calculation across all bars. Uses math.fsum
|
|
79
|
+
over the chronological window (oldest-first) so results match the
|
|
80
|
+
framework's WeightedAverage and the event-mode next() bit-for-bit.
|
|
81
|
+
"""
|
|
82
|
+
darray = self.data.array
|
|
83
|
+
larray = self.lines.wma.array
|
|
84
|
+
period = self.p.period
|
|
85
|
+
coef = self.coef
|
|
86
|
+
weights = self.weights
|
|
87
|
+
|
|
88
|
+
while len(larray) < end:
|
|
89
|
+
larray.append(float("nan"))
|
|
90
|
+
|
|
91
|
+
# Pre-fill warmup with NaN
|
|
92
|
+
for i in range(min(period - 1, len(darray))):
|
|
93
|
+
if i < len(larray):
|
|
94
|
+
larray[i] = float("nan")
|
|
95
|
+
|
|
96
|
+
darray_len = len(darray)
|
|
97
|
+
for i in range(period - 1, min(end, darray_len)):
|
|
98
|
+
window = darray[i - period + 1 : i + 1]
|
|
99
|
+
# window is oldest-first; weights[0]=1.0 weights the oldest value.
|
|
100
|
+
larray[i] = coef * math.fsum(weights[j] * window[j] for j in range(period))
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
WMA = WeightedMovingAverage
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""ZLEMA Indicator Module - Zero Lag Exponential Moving Average.
|
|
3
|
+
|
|
4
|
+
This module provides the ZLEMA (Zero Lag Exponential Moving Average)
|
|
5
|
+
indicator which aims to reduce lag in the standard EMA.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
ZeroLagExponentialMovingAverage: ZLEMA indicator (aliases: ZLEMA, ZeroLagEma).
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.zlema = bt.indicators.ZLEMA(self.data.close, period=20)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
# Price above ZLEMA indicates uptrend
|
|
17
|
+
if self.data.close[0] > self.zlema[0]:
|
|
18
|
+
self.buy()
|
|
19
|
+
# Price below ZLEMA indicates downtrend
|
|
20
|
+
elif self.data.close[0] < self.zlema[0]:
|
|
21
|
+
self.sell()
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import math
|
|
25
|
+
|
|
26
|
+
from . import MovingAverageBase
|
|
27
|
+
from .ema import EMA
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ZeroLagExponentialMovingAverage(MovingAverageBase):
|
|
31
|
+
"""
|
|
32
|
+
The zero-lag exponential moving average (ZLEMA) is a variation of the EMA
|
|
33
|
+
which adds a momentum term aiming to reduce lag in the average to
|
|
34
|
+
track current prices more closely.
|
|
35
|
+
|
|
36
|
+
Formula:
|
|
37
|
+
- lag = (period - 1) / 2
|
|
38
|
+
- zlema = ema(2 * data - data(-lag))
|
|
39
|
+
|
|
40
|
+
See also:
|
|
41
|
+
- http://user42.tuxfamily.org/chart/manual/Zero_002dLag-Exponential-Moving-Average.html
|
|
42
|
+
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
alias = (
|
|
46
|
+
"ZLEMA",
|
|
47
|
+
"ZeroLagEma",
|
|
48
|
+
)
|
|
49
|
+
lines = ("zlema",)
|
|
50
|
+
params = (("_movav", EMA),)
|
|
51
|
+
|
|
52
|
+
def __init__(self):
|
|
53
|
+
"""Initialize the ZLEMA indicator.
|
|
54
|
+
|
|
55
|
+
Calculates lag and alpha values for zero-lag EMA.
|
|
56
|
+
"""
|
|
57
|
+
super().__init__()
|
|
58
|
+
self.lag = (self.p.period - 1) // 2
|
|
59
|
+
self.alpha = 2.0 / (1.0 + self.p.period)
|
|
60
|
+
self.alpha1 = 1.0 - self.alpha
|
|
61
|
+
self.addminperiod(self.lag + self.p.period)
|
|
62
|
+
|
|
63
|
+
def nextstart(self):
|
|
64
|
+
"""Seed ZLEMA calculation with SMA on first valid bar.
|
|
65
|
+
|
|
66
|
+
Uses SMA of lag-adjusted data for initial seed value.
|
|
67
|
+
"""
|
|
68
|
+
# Seed with SMA of adjusted data
|
|
69
|
+
period = self.p.period
|
|
70
|
+
lag = self.lag
|
|
71
|
+
data_sum = 0.0
|
|
72
|
+
for i in range(period):
|
|
73
|
+
adjusted = 2.0 * self.data[-i] - self.data[-i - lag]
|
|
74
|
+
data_sum += adjusted
|
|
75
|
+
self.lines.zlema[0] = data_sum / period
|
|
76
|
+
|
|
77
|
+
def next(self):
|
|
78
|
+
"""Calculate ZLEMA for the current bar.
|
|
79
|
+
|
|
80
|
+
Applies EMA to lag-adjusted data: 2 * data - data(-lag).
|
|
81
|
+
"""
|
|
82
|
+
lag = self.lag
|
|
83
|
+
adjusted = 2.0 * self.data[0] - self.data[-lag]
|
|
84
|
+
self.lines.zlema[0] = self.lines.zlema[-1] * self.alpha1 + adjusted * self.alpha
|
|
85
|
+
|
|
86
|
+
def once(self, start, end):
|
|
87
|
+
"""Calculate ZLEMA in runonce mode.
|
|
88
|
+
|
|
89
|
+
Applies EMA to lag-adjusted data across all bars.
|
|
90
|
+
"""
|
|
91
|
+
darray = self.data.array
|
|
92
|
+
larray = self.lines.zlema.array
|
|
93
|
+
period = self.p.period
|
|
94
|
+
lag = self.lag
|
|
95
|
+
alpha = self.alpha
|
|
96
|
+
alpha1 = self.alpha1
|
|
97
|
+
|
|
98
|
+
while len(larray) < end:
|
|
99
|
+
larray.append(float("nan"))
|
|
100
|
+
|
|
101
|
+
minperiod = lag + period
|
|
102
|
+
for i in range(min(minperiod - 1, len(darray))):
|
|
103
|
+
if i < len(larray):
|
|
104
|
+
larray[i] = float("nan")
|
|
105
|
+
|
|
106
|
+
# Seed value
|
|
107
|
+
seed_idx = minperiod - 1
|
|
108
|
+
if seed_idx < len(darray) and seed_idx >= lag:
|
|
109
|
+
seed_sum = 0.0
|
|
110
|
+
for j in range(period):
|
|
111
|
+
idx = seed_idx - j
|
|
112
|
+
if idx >= lag and idx < len(darray) and idx - lag >= 0:
|
|
113
|
+
adjusted = 2.0 * darray[idx] - darray[idx - lag]
|
|
114
|
+
seed_sum += adjusted
|
|
115
|
+
prev = seed_sum / period
|
|
116
|
+
if seed_idx < len(larray):
|
|
117
|
+
larray[seed_idx] = prev
|
|
118
|
+
else:
|
|
119
|
+
prev = 0.0
|
|
120
|
+
|
|
121
|
+
# Calculate ZLEMA
|
|
122
|
+
for i in range(minperiod, min(end, len(darray))):
|
|
123
|
+
if i >= lag and i - lag >= 0:
|
|
124
|
+
adjusted = 2.0 * darray[i] - darray[i - lag]
|
|
125
|
+
else:
|
|
126
|
+
adjusted = darray[i]
|
|
127
|
+
|
|
128
|
+
if i > 0 and i - 1 < len(larray):
|
|
129
|
+
prev_val = larray[i - 1]
|
|
130
|
+
if not (isinstance(prev_val, float) and math.isnan(prev_val)):
|
|
131
|
+
prev = prev_val
|
|
132
|
+
|
|
133
|
+
prev = prev * alpha1 + adjusted * alpha
|
|
134
|
+
if i < len(larray):
|
|
135
|
+
larray[i] = prev
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Zero Lag Indicator Module - Zero-lag error correction.
|
|
3
|
+
|
|
4
|
+
This module provides the ZeroLagIndicator developed by John Ehlers
|
|
5
|
+
and Ric Way to reduce lag in moving averages.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
ZeroLagIndicator: Zero-lag indicator with error correction.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
class MyStrategy(bt.Strategy):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self.zlind = bt.indicators.ZeroLagIndicator(self.data.close, period=20, gainlimit=50)
|
|
14
|
+
|
|
15
|
+
def next(self):
|
|
16
|
+
# Price above ZeroLagIndicator indicates uptrend
|
|
17
|
+
if self.data.close[0] > self.zlind[0]:
|
|
18
|
+
self.buy()
|
|
19
|
+
# Price below ZeroLagIndicator indicates downtrend
|
|
20
|
+
elif self.data.close[0] < self.zlind[0]:
|
|
21
|
+
self.sell()
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from backtrader.utils.py3 import MAXINT
|
|
25
|
+
|
|
26
|
+
from . import MovingAverageBase
|
|
27
|
+
from .ema import EMA
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ZeroLagIndicator(MovingAverageBase):
|
|
31
|
+
"""By John Ehlers and Ric Way
|
|
32
|
+
|
|
33
|
+
The zero-lag indicator (ZLIndicator) is a variation of the EMA
|
|
34
|
+
which modifies the EMA by trying to minimize the error (distance price -
|
|
35
|
+
error correction) and thus reduce the lag
|
|
36
|
+
|
|
37
|
+
Formula:
|
|
38
|
+
- EMA(data, period)
|
|
39
|
+
|
|
40
|
+
- For each iteration calculate a best-error-correction of the ema (see
|
|
41
|
+
the paper and/or the code) iterating over ``-bestgain`` ->
|
|
42
|
+
``+bestgain`` for the error correction factor (both incl.)
|
|
43
|
+
|
|
44
|
+
- The default moving average is EMA, but can be changed with the
|
|
45
|
+
parameter ``_movav``
|
|
46
|
+
|
|
47
|
+
::note:: the passed moving average must calculate alpha (and 1 -
|
|
48
|
+
alpha) and make them available as attributes ``alpha`` and
|
|
49
|
+
``alpha1`` in the instance
|
|
50
|
+
|
|
51
|
+
See also:
|
|
52
|
+
- http://www.mesasoftware.com/papers/ZeroLag.pdf
|
|
53
|
+
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
alias = (
|
|
57
|
+
"ZLIndicator",
|
|
58
|
+
"ZLInd",
|
|
59
|
+
"EC",
|
|
60
|
+
"ErrorCorrecting",
|
|
61
|
+
)
|
|
62
|
+
lines = ("ec",)
|
|
63
|
+
params = (
|
|
64
|
+
("gainlimit", 50),
|
|
65
|
+
("_movav", EMA),
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def _plotlabel(self):
|
|
69
|
+
plabels = [self.p.period, self.p.gainlimit]
|
|
70
|
+
plabels += [self.p._movav] * self.p.notdefault("_movav")
|
|
71
|
+
return plabels
|
|
72
|
+
|
|
73
|
+
def __init__(self):
|
|
74
|
+
"""Initialize the Zero Lag Indicator.
|
|
75
|
+
|
|
76
|
+
Creates EMA and sets up gain limits for error correction.
|
|
77
|
+
"""
|
|
78
|
+
self.ema = self.p._movav(period=self.p.period)
|
|
79
|
+
self.limits = [-self.p.gainlimit, self.p.gainlimit + 1]
|
|
80
|
+
|
|
81
|
+
# To make mixins work - super at the end for cooperative inheritance
|
|
82
|
+
super().__init__()
|
|
83
|
+
|
|
84
|
+
def next(self):
|
|
85
|
+
"""Calculate zero lag indicator for the current bar.
|
|
86
|
+
|
|
87
|
+
Iterates over gain values to find the error correction that
|
|
88
|
+
minimizes the difference between price and corrected EMA.
|
|
89
|
+
"""
|
|
90
|
+
leasterror = MAXINT # 1000000 in original code
|
|
91
|
+
bestec = ema = self.ema[0] # seed value 1st time for ec
|
|
92
|
+
price = self.data[0]
|
|
93
|
+
ec1 = self.lines.ec[-1]
|
|
94
|
+
alpha, alpha1 = self.ema.alpha, self.ema.alpha1
|
|
95
|
+
|
|
96
|
+
for value1 in range(*self.limits):
|
|
97
|
+
gain = value1 / 10
|
|
98
|
+
ec = alpha * (ema + gain * (price - ec1)) + alpha1 * ec1
|
|
99
|
+
error = abs(price - ec)
|
|
100
|
+
if error < leasterror:
|
|
101
|
+
leasterror = error
|
|
102
|
+
bestec = ec
|
|
103
|
+
|
|
104
|
+
self.lines.ec[0] = bestec
|