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,92 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
ExponentialMovingAverage,
|
|
10
|
+
Indicator,
|
|
11
|
+
SimpleMovingAverage,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"AccumulationDistributionLine",
|
|
16
|
+
"ChaikinOscillator",
|
|
17
|
+
"LineCCI",
|
|
18
|
+
"CCIDualOnMA",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class AccumulationDistributionLine(Indicator):
|
|
23
|
+
"""Accumulate the ADL indicator from price and volume progression."""
|
|
24
|
+
|
|
25
|
+
lines = ("adl",)
|
|
26
|
+
|
|
27
|
+
def next(self):
|
|
28
|
+
"""Compute one bar's accumulation/distribution line value."""
|
|
29
|
+
high = float(self.data.high[0])
|
|
30
|
+
low = float(self.data.low[0])
|
|
31
|
+
close = float(self.data.close[0])
|
|
32
|
+
volume = float(self.data.volume[0])
|
|
33
|
+
if high == low:
|
|
34
|
+
money_flow_multiplier = 0.0
|
|
35
|
+
else:
|
|
36
|
+
money_flow_multiplier = ((close - low) - (high - close)) / (high - low)
|
|
37
|
+
previous = float(self.lines.adl[-1]) if len(self) > 1 else 0.0
|
|
38
|
+
self.lines.adl[0] = previous + money_flow_multiplier * volume
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class ChaikinOscillator(Indicator):
|
|
42
|
+
"""Chaikin oscillator as EMA(short) minus EMA(long) of ADL."""
|
|
43
|
+
|
|
44
|
+
lines = ("cho",)
|
|
45
|
+
params = (
|
|
46
|
+
("fast_period", 3),
|
|
47
|
+
("slow_period", 10),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
def __init__(self):
|
|
51
|
+
"""Initialize fast/slow ADL EMAs."""
|
|
52
|
+
self.adl = AccumulationDistributionLine(self.data)
|
|
53
|
+
fast = ExponentialMovingAverage(self.adl, period=self.p.fast_period)
|
|
54
|
+
slow = ExponentialMovingAverage(self.adl, period=self.p.slow_period)
|
|
55
|
+
self.lines.cho = fast - slow
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class LineCCI(Indicator):
|
|
59
|
+
"""Custom CCI computation on the selected input data."""
|
|
60
|
+
|
|
61
|
+
lines = ("cci",)
|
|
62
|
+
params = (("period", 14),)
|
|
63
|
+
|
|
64
|
+
def next(self):
|
|
65
|
+
"""Calculate a bar's CCI value with zero-handling for degenerate windows."""
|
|
66
|
+
if len(self.data) < self.p.period:
|
|
67
|
+
self.lines.cci[0] = 0.0
|
|
68
|
+
return
|
|
69
|
+
values = [float(self.data[-i]) for i in range(self.p.period)]
|
|
70
|
+
mean_value = sum(values) / self.p.period
|
|
71
|
+
mean_dev = sum(abs(v - mean_value) for v in values) / self.p.period
|
|
72
|
+
if mean_dev == 0:
|
|
73
|
+
self.lines.cci[0] = 0.0
|
|
74
|
+
return
|
|
75
|
+
self.lines.cci[0] = (float(self.data[0]) - mean_value) / (0.015 * mean_dev)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class CCIDualOnMA(Indicator):
|
|
79
|
+
"""Provide fast/slow CCI values computed on a smoothing moving average."""
|
|
80
|
+
|
|
81
|
+
lines = ("fast", "slow")
|
|
82
|
+
params = (
|
|
83
|
+
("ma_period", 12),
|
|
84
|
+
("fast_period", 14),
|
|
85
|
+
("slow_period", 50),
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
def __init__(self):
|
|
89
|
+
"""Initialize smoothed MA and dual CCI lines."""
|
|
90
|
+
self.ma = SimpleMovingAverage(self.data.close, period=self.p.ma_period)
|
|
91
|
+
self.lines.fast = LineCCI(self.ma, period=self.p.fast_period)
|
|
92
|
+
self.lines.slow = LineCCI(self.ma, period=self.p.slow_period)
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
AverageTrueRange,
|
|
10
|
+
ExponentialMovingAverage,
|
|
11
|
+
Indicator,
|
|
12
|
+
MinusDirectionalIndicator,
|
|
13
|
+
PlusDirectionalIndicator,
|
|
14
|
+
SimpleMovingAverage,
|
|
15
|
+
SmoothedMovingAverage,
|
|
16
|
+
WeightedMovingAverage,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"ADXCrossHullStyleIndicator",
|
|
21
|
+
"UltraXMAIndicator",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def resolve_ma_class(name):
|
|
26
|
+
"""Map an MT5 moving-average method name to a backtrader indicator class.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
name: MT5 MA method name (e.g. ``'sma'``, ``'ema'``, ``'jjma'``).
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
The backtrader moving-average indicator class for the method, defaulting
|
|
33
|
+
to WeightedMovingAverage for unrecognized names.
|
|
34
|
+
"""
|
|
35
|
+
mode = str(name).lower()
|
|
36
|
+
if mode in {"mode_sma", "sma"}:
|
|
37
|
+
return SimpleMovingAverage
|
|
38
|
+
if mode in {
|
|
39
|
+
"mode_ema",
|
|
40
|
+
"ema",
|
|
41
|
+
"mode_jjma",
|
|
42
|
+
"jjma",
|
|
43
|
+
"mode_jurx",
|
|
44
|
+
"jurx",
|
|
45
|
+
"mode_parma",
|
|
46
|
+
"parma",
|
|
47
|
+
"mode_t3",
|
|
48
|
+
"t3",
|
|
49
|
+
"mode_vidya",
|
|
50
|
+
"vidya",
|
|
51
|
+
"mode_ama",
|
|
52
|
+
"ama",
|
|
53
|
+
}:
|
|
54
|
+
return ExponentialMovingAverage
|
|
55
|
+
if mode in {"mode_smma", "smma"}:
|
|
56
|
+
return SmoothedMovingAverage
|
|
57
|
+
return WeightedMovingAverage
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def resolve_price_line(data, mode):
|
|
61
|
+
"""Build an applied-price line from a data feed per MT5 price modes.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
data: The backtrader data feed providing OHLC lines.
|
|
65
|
+
mode: MT5 applied-price mode (e.g. ``'price_close'``, ``'price_typical'``).
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
A backtrader line expression for the selected applied price, defaulting
|
|
69
|
+
to the close line.
|
|
70
|
+
"""
|
|
71
|
+
price_mode = str(mode).lower()
|
|
72
|
+
if price_mode in {"price_open", "open"}:
|
|
73
|
+
return data.open
|
|
74
|
+
if price_mode in {"price_high", "high"}:
|
|
75
|
+
return data.high
|
|
76
|
+
if price_mode in {"price_low", "low"}:
|
|
77
|
+
return data.low
|
|
78
|
+
if price_mode in {"price_median", "median"}:
|
|
79
|
+
return (data.high + data.low) / 2.0
|
|
80
|
+
if price_mode in {"price_typical", "typical"}:
|
|
81
|
+
return (data.high + data.low + data.close) / 3.0
|
|
82
|
+
if price_mode in {"price_weighted", "weighted"}:
|
|
83
|
+
return (data.high + data.low + data.close + data.close) / 4.0
|
|
84
|
+
if price_mode in {"price_simple", "simple"}:
|
|
85
|
+
return (data.open + data.close) / 2.0
|
|
86
|
+
if price_mode in {"price_quarter", "quarter"}:
|
|
87
|
+
return (data.high + data.low + data.open + data.close) / 4.0
|
|
88
|
+
return data.close
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class ADXCrossHullStyleIndicator(Indicator):
|
|
92
|
+
"""Hull-style ADX cross indicator emitting up/down directional signal levels.
|
|
93
|
+
|
|
94
|
+
Builds smoothed +DI/-DI values from a full and a half-length directional
|
|
95
|
+
index and marks an ``up`` level on a bullish DI cross or a ``down`` level on a
|
|
96
|
+
bearish DI cross, each offset from price by a fraction of ATR.
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
lines = ("up", "down")
|
|
100
|
+
params = (("adx_period", 14),)
|
|
101
|
+
|
|
102
|
+
def __init__(self):
|
|
103
|
+
"""Construct the directional-index and ATR components and set min period."""
|
|
104
|
+
period = max(2, int(self.p.adx_period))
|
|
105
|
+
self._plus1 = PlusDirectionalIndicator(self.data, period=period)
|
|
106
|
+
self._plus2 = PlusDirectionalIndicator(self.data, period=max(2, period // 2))
|
|
107
|
+
self._minus1 = MinusDirectionalIndicator(self.data, period=period)
|
|
108
|
+
self._minus2 = MinusDirectionalIndicator(self.data, period=max(2, period // 2))
|
|
109
|
+
self._atr = AverageTrueRange(self.data, period=10)
|
|
110
|
+
self.addminperiod(period + 12)
|
|
111
|
+
|
|
112
|
+
def next(self):
|
|
113
|
+
"""Compute the per-bar up/down signal levels from smoothed DI crosses."""
|
|
114
|
+
b4plusdi = 2.0 * float(self._plus2[-1]) - float(self._plus1[-1])
|
|
115
|
+
nowplusdi = 2.0 * float(self._plus2[0]) - float(self._plus1[0])
|
|
116
|
+
b4minusdi = 2.0 * float(self._minus2[-1]) - float(self._minus1[-1])
|
|
117
|
+
nowminusdi = 2.0 * float(self._minus2[0]) - float(self._minus1[0])
|
|
118
|
+
self.lines.up[0] = 0.0
|
|
119
|
+
self.lines.down[0] = 0.0
|
|
120
|
+
if b4plusdi < b4minusdi and nowplusdi > nowminusdi:
|
|
121
|
+
self.lines.up[0] = float(self.data.low[0]) - 0.25 * float(self._atr[0])
|
|
122
|
+
if b4plusdi > b4minusdi and nowplusdi < nowminusdi:
|
|
123
|
+
self.lines.down[0] = float(self.data.high[0]) + 0.25 * float(self._atr[0])
|
|
124
|
+
|
|
125
|
+
def once(self, start, end):
|
|
126
|
+
"""Vectorized batch computation of up/down signal levels over a range.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
start: First index in the array range to compute.
|
|
130
|
+
end: One past the last index in the array range to compute.
|
|
131
|
+
"""
|
|
132
|
+
plus1 = self._plus1.array
|
|
133
|
+
plus2 = self._plus2.array
|
|
134
|
+
minus1 = self._minus1.array
|
|
135
|
+
minus2 = self._minus2.array
|
|
136
|
+
atr = self._atr.array
|
|
137
|
+
low = self.data.low.array
|
|
138
|
+
high = self.data.high.array
|
|
139
|
+
up_line = self.lines.up.array
|
|
140
|
+
down_line = self.lines.down.array
|
|
141
|
+
for line in (up_line, down_line):
|
|
142
|
+
while len(line) < end:
|
|
143
|
+
line.append(float("nan"))
|
|
144
|
+
|
|
145
|
+
actual_end = min(
|
|
146
|
+
end, len(plus1), len(plus2), len(minus1), len(minus2), len(atr), len(low), len(high)
|
|
147
|
+
)
|
|
148
|
+
for i in range(start, actual_end):
|
|
149
|
+
up_line[i] = 0.0
|
|
150
|
+
down_line[i] = 0.0
|
|
151
|
+
if i <= 0:
|
|
152
|
+
continue
|
|
153
|
+
b4plusdi = 2.0 * float(plus2[i - 1]) - float(plus1[i - 1])
|
|
154
|
+
nowplusdi = 2.0 * float(plus2[i]) - float(plus1[i])
|
|
155
|
+
b4minusdi = 2.0 * float(minus2[i - 1]) - float(minus1[i - 1])
|
|
156
|
+
nowminusdi = 2.0 * float(minus2[i]) - float(minus1[i])
|
|
157
|
+
if b4plusdi < b4minusdi and nowplusdi > nowminusdi:
|
|
158
|
+
up_line[i] = float(low[i]) - 0.25 * float(atr[i])
|
|
159
|
+
if b4plusdi > b4minusdi and nowplusdi < nowminusdi:
|
|
160
|
+
down_line[i] = float(high[i]) + 0.25 * float(atr[i])
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class UltraXMAIndicator(Indicator):
|
|
164
|
+
"""UltraXMA breadth indicator counting rising vs falling fanned moving averages.
|
|
165
|
+
|
|
166
|
+
Computes a fan of moving averages over increasing periods, counts how many
|
|
167
|
+
are rising (bulls) versus falling (bears) each bar, and smooths those counts
|
|
168
|
+
with an exponential factor to produce trend-strength breadth lines.
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
lines = ("bulls", "bears")
|
|
172
|
+
params = (
|
|
173
|
+
("w_method", "jjma"),
|
|
174
|
+
("start_length", 3),
|
|
175
|
+
("wphase", 100),
|
|
176
|
+
("step", 5),
|
|
177
|
+
("steps_total", 10),
|
|
178
|
+
("smooth_method", "jjma"),
|
|
179
|
+
("smooth_length", 3),
|
|
180
|
+
("smooth_phase", 100),
|
|
181
|
+
("ipc", "price_close"),
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
def __init__(self):
|
|
185
|
+
"""Build the fan of moving averages and breadth smoothing, set min period."""
|
|
186
|
+
price_line = resolve_price_line(self.data, self.p.ipc)
|
|
187
|
+
ma_cls = resolve_ma_class(self.p.w_method)
|
|
188
|
+
smooth_cls = resolve_ma_class(self.p.smooth_method)
|
|
189
|
+
self._periods = [
|
|
190
|
+
int(self.p.start_length + i * self.p.step) for i in range(int(self.p.steps_total) + 1)
|
|
191
|
+
]
|
|
192
|
+
self._ma_lines = [ma_cls(price_line, period=max(1, p)) for p in self._periods]
|
|
193
|
+
self._bull_smooth = smooth_cls(self.lines.bulls, period=max(1, int(self.p.smooth_length)))
|
|
194
|
+
self._bear_smooth = smooth_cls(self.lines.bears, period=max(1, int(self.p.smooth_length)))
|
|
195
|
+
self.addminperiod(max(self._periods) + int(self.p.smooth_length) + 5)
|
|
196
|
+
|
|
197
|
+
def next(self):
|
|
198
|
+
"""Compute and smooth the per-bar bullish/bearish moving-average counts."""
|
|
199
|
+
upsch = 0.0
|
|
200
|
+
dnsch = 0.0
|
|
201
|
+
for ma_line in self._ma_lines:
|
|
202
|
+
if float(ma_line[0]) > float(ma_line[-1]):
|
|
203
|
+
upsch += 1.0
|
|
204
|
+
else:
|
|
205
|
+
dnsch += 1.0
|
|
206
|
+
period = max(1, int(self.p.smooth_length))
|
|
207
|
+
alpha = 2.0 / (period + 1.0)
|
|
208
|
+
prev_bulls = float(self.lines.bulls[-1]) if len(self) > 0 else upsch
|
|
209
|
+
prev_bears = float(self.lines.bears[-1]) if len(self) > 0 else dnsch
|
|
210
|
+
if prev_bulls != prev_bulls:
|
|
211
|
+
prev_bulls = upsch
|
|
212
|
+
if prev_bears != prev_bears:
|
|
213
|
+
prev_bears = dnsch
|
|
214
|
+
self.lines.bulls[0] = alpha * upsch + (1.0 - alpha) * prev_bulls if len(self) > 0 else upsch
|
|
215
|
+
self.lines.bears[0] = alpha * dnsch + (1.0 - alpha) * prev_bears if len(self) > 0 else dnsch
|
|
216
|
+
|
|
217
|
+
def once(self, start, end):
|
|
218
|
+
"""Vectorized batch computation of smoothed breadth counts over a range.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
start: First index in the array range to compute.
|
|
222
|
+
end: One past the last index in the array range to compute.
|
|
223
|
+
"""
|
|
224
|
+
ma_arrays = [ma_line.array for ma_line in self._ma_lines]
|
|
225
|
+
bulls_line = self.lines.bulls.array
|
|
226
|
+
bears_line = self.lines.bears.array
|
|
227
|
+
for line in (bulls_line, bears_line):
|
|
228
|
+
while len(line) < end:
|
|
229
|
+
line.append(float("nan"))
|
|
230
|
+
|
|
231
|
+
period = max(1, int(self.p.smooth_length))
|
|
232
|
+
alpha = 2.0 / (period + 1.0)
|
|
233
|
+
prev_bulls = None
|
|
234
|
+
prev_bears = None
|
|
235
|
+
actual_end = min([end] + [len(array) for array in ma_arrays])
|
|
236
|
+
for i in range(start, actual_end):
|
|
237
|
+
upsch = 0.0
|
|
238
|
+
dnsch = 0.0
|
|
239
|
+
for ma_array in ma_arrays:
|
|
240
|
+
if i > 0 and float(ma_array[i]) > float(ma_array[i - 1]):
|
|
241
|
+
upsch += 1.0
|
|
242
|
+
else:
|
|
243
|
+
dnsch += 1.0
|
|
244
|
+
bulls = upsch if prev_bulls is None else alpha * upsch + (1.0 - alpha) * prev_bulls
|
|
245
|
+
bears = dnsch if prev_bears is None else alpha * dnsch + (1.0 - alpha) * prev_bears
|
|
246
|
+
bulls_line[i] = bulls
|
|
247
|
+
bears_line[i] = bears
|
|
248
|
+
prev_bulls = bulls
|
|
249
|
+
prev_bears = bears
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
Indicator,
|
|
10
|
+
MinusDirectionalIndicator,
|
|
11
|
+
PlusDirectionalIndicator,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"ADXDMI",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ADXDMI(Indicator):
|
|
20
|
+
"""DMI direction indicator exposing plus/minus directional values."""
|
|
21
|
+
|
|
22
|
+
lines = ("plus", "minus")
|
|
23
|
+
params = (("period", 14),)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Initialize plus and minus directional sub-indicators."""
|
|
27
|
+
self.addminperiod(int(self.p.period) + 3)
|
|
28
|
+
self.plus_di = PlusDirectionalIndicator(self.data, period=int(self.p.period))
|
|
29
|
+
self.minus_di = MinusDirectionalIndicator(self.data, period=int(self.p.period))
|
|
30
|
+
|
|
31
|
+
def next(self):
|
|
32
|
+
"""Write current directional index values to output lines."""
|
|
33
|
+
self.lines.plus[0] = float(self.plus_di[0])
|
|
34
|
+
self.lines.minus[0] = float(self.minus_di[0])
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
Indicator,
|
|
10
|
+
SimpleMovingAverage,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"AIAccelerationDecelerationOscillator",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AIAccelerationDecelerationOscillator(Indicator):
|
|
19
|
+
"""Indicator computing acceleration/deceleration oscillator from SMA spread."""
|
|
20
|
+
|
|
21
|
+
lines = ("ac",)
|
|
22
|
+
params = (
|
|
23
|
+
("fast", 5),
|
|
24
|
+
("slow", 34),
|
|
25
|
+
("signal", 5),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
"""Initialize AC line based on fast/slow/signal SMAs."""
|
|
30
|
+
median = (self.data.high + self.data.low) / 2.0
|
|
31
|
+
ao = SimpleMovingAverage(median, period=self.p.fast) - SimpleMovingAverage(
|
|
32
|
+
median, period=self.p.slow
|
|
33
|
+
)
|
|
34
|
+
self.lines.ac = ao - SimpleMovingAverage(ao, period=self.p.signal)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import math
|
|
9
|
+
|
|
10
|
+
from .. import (
|
|
11
|
+
AverageDirectionalMovementIndex,
|
|
12
|
+
Indicator,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"AltrTrendSignalV22",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AltrTrendSignalV22(Indicator):
|
|
21
|
+
"""Adaptive trend breakout indicator used by the strategy."""
|
|
22
|
+
|
|
23
|
+
lines = ("sell", "buy")
|
|
24
|
+
params = (
|
|
25
|
+
("k", 30),
|
|
26
|
+
("kstop", 0.5),
|
|
27
|
+
("kperiod", 150),
|
|
28
|
+
("per_adx", 14),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Create ADX trend indicator and initialize state."""
|
|
33
|
+
self.adx = AverageDirectionalMovementIndex(self.data, period=max(int(self.p.per_adx), 1))
|
|
34
|
+
self.addminperiod(max(int(self.p.per_adx), 1) + 2)
|
|
35
|
+
self._trend = 0
|
|
36
|
+
|
|
37
|
+
def next(self):
|
|
38
|
+
"""Compute breakout level and emit short/long trigger values."""
|
|
39
|
+
self.lines.buy[0] = 0.0
|
|
40
|
+
self.lines.sell[0] = 0.0
|
|
41
|
+
|
|
42
|
+
adx_prev = float(self.adx[-1]) if len(self) > 1 else float(self.adx[0])
|
|
43
|
+
if math.isnan(adx_prev) or adx_prev <= 0:
|
|
44
|
+
return
|
|
45
|
+
|
|
46
|
+
ssp = max(int(math.ceil(float(self.p.kperiod) / adx_prev)), 1)
|
|
47
|
+
lookback = min(ssp, len(self.data))
|
|
48
|
+
if lookback <= 0:
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
highs = []
|
|
52
|
+
lows = []
|
|
53
|
+
avg_range = 0.0
|
|
54
|
+
for idx in range(lookback):
|
|
55
|
+
high = float(self.data.high[-idx])
|
|
56
|
+
low = float(self.data.low[-idx])
|
|
57
|
+
highs.append(high)
|
|
58
|
+
lows.append(low)
|
|
59
|
+
avg_range += abs(high - low)
|
|
60
|
+
|
|
61
|
+
trading_range = avg_range / (ssp + 1.0)
|
|
62
|
+
ss_max = max(highs)
|
|
63
|
+
ss_min = min(lows)
|
|
64
|
+
threshold = (ss_max - ss_min) * float(self.p.k) / 100.0
|
|
65
|
+
smin = ss_min + threshold
|
|
66
|
+
smax = ss_max - threshold
|
|
67
|
+
|
|
68
|
+
previous_trend = self._trend
|
|
69
|
+
trend = previous_trend
|
|
70
|
+
close = float(self.data.close[0])
|
|
71
|
+
|
|
72
|
+
if close < smin:
|
|
73
|
+
trend = -1
|
|
74
|
+
if close > smax:
|
|
75
|
+
trend = 1
|
|
76
|
+
|
|
77
|
+
if previous_trend == 0:
|
|
78
|
+
previous_trend = trend
|
|
79
|
+
|
|
80
|
+
if trend != previous_trend and close > smax:
|
|
81
|
+
self.lines.buy[0] = float(self.data.low[0]) - trading_range * float(self.p.kstop)
|
|
82
|
+
if trend != previous_trend and close < smin:
|
|
83
|
+
self.lines.sell[0] = float(self.data.high[0]) + trading_range * float(self.p.kstop)
|
|
84
|
+
|
|
85
|
+
self._trend = trend if trend != 0 else previous_trend
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
ExponentialMovingAverage,
|
|
10
|
+
Indicator,
|
|
11
|
+
SimpleMovingAverage,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"AnchoredMomentumLine",
|
|
16
|
+
"AnchoredMomentumCandleIndicator",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AnchoredMomentumLine(Indicator):
|
|
21
|
+
"""Anchored Momentum line: EMA-vs-SMA percentage plus a zone classifier."""
|
|
22
|
+
|
|
23
|
+
lines = ("momentum", "zone")
|
|
24
|
+
params = (
|
|
25
|
+
("mom_period", 8),
|
|
26
|
+
("smooth_period", 6),
|
|
27
|
+
("up_level", 0.025),
|
|
28
|
+
("dn_level", -0.025),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Create the SMA/EMA sub-indicators and set the minimum period."""
|
|
33
|
+
self.sma = SimpleMovingAverage(self.data, period=int(self.p.mom_period))
|
|
34
|
+
self.ema = ExponentialMovingAverage(self.data, period=int(self.p.mom_period))
|
|
35
|
+
self.addminperiod(int(self.p.mom_period) + 2)
|
|
36
|
+
|
|
37
|
+
def next(self):
|
|
38
|
+
"""Compute the percentage momentum and assign its up/neutral/down zone."""
|
|
39
|
+
sma = float(self.sma[0])
|
|
40
|
+
if sma == 0:
|
|
41
|
+
momentum = 0.0
|
|
42
|
+
else:
|
|
43
|
+
momentum = 100.0 * (float(self.ema[0]) / sma - 1.0)
|
|
44
|
+
self.lines.momentum[0] = momentum
|
|
45
|
+
if momentum > float(self.p.up_level):
|
|
46
|
+
zone = 2
|
|
47
|
+
elif momentum < float(self.p.dn_level):
|
|
48
|
+
zone = 0
|
|
49
|
+
else:
|
|
50
|
+
zone = 1
|
|
51
|
+
self.lines.zone[0] = zone
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class AnchoredMomentumCandleIndicator(Indicator):
|
|
55
|
+
"""Synthetic candle from Anchored Momentum on each OHLC price plus colour."""
|
|
56
|
+
|
|
57
|
+
lines = ("a_open", "a_high", "a_low", "a_close", "color")
|
|
58
|
+
params = (
|
|
59
|
+
("mom_period", 8),
|
|
60
|
+
("smooth_period", 6),
|
|
61
|
+
("up_level", 0.025),
|
|
62
|
+
("dn_level", -0.025),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
def __init__(self):
|
|
66
|
+
"""Create the four per-price Anchored Momentum lines and set min period."""
|
|
67
|
+
self.mom_open = AnchoredMomentumLine(
|
|
68
|
+
self.data.open,
|
|
69
|
+
mom_period=self.p.mom_period,
|
|
70
|
+
smooth_period=self.p.smooth_period,
|
|
71
|
+
up_level=self.p.up_level,
|
|
72
|
+
dn_level=self.p.dn_level,
|
|
73
|
+
)
|
|
74
|
+
self.mom_high = AnchoredMomentumLine(
|
|
75
|
+
self.data.high,
|
|
76
|
+
mom_period=self.p.mom_period,
|
|
77
|
+
smooth_period=self.p.smooth_period,
|
|
78
|
+
up_level=self.p.up_level,
|
|
79
|
+
dn_level=self.p.dn_level,
|
|
80
|
+
)
|
|
81
|
+
self.mom_low = AnchoredMomentumLine(
|
|
82
|
+
self.data.low,
|
|
83
|
+
mom_period=self.p.mom_period,
|
|
84
|
+
smooth_period=self.p.smooth_period,
|
|
85
|
+
up_level=self.p.up_level,
|
|
86
|
+
dn_level=self.p.dn_level,
|
|
87
|
+
)
|
|
88
|
+
self.mom_close = AnchoredMomentumLine(
|
|
89
|
+
self.data.close,
|
|
90
|
+
mom_period=self.p.mom_period,
|
|
91
|
+
smooth_period=self.p.smooth_period,
|
|
92
|
+
up_level=self.p.up_level,
|
|
93
|
+
dn_level=self.p.dn_level,
|
|
94
|
+
)
|
|
95
|
+
self.addminperiod(int(self.p.mom_period) + 2)
|
|
96
|
+
|
|
97
|
+
def next(self):
|
|
98
|
+
"""Assemble the momentum candle OHLC and colour for the current bar."""
|
|
99
|
+
o = float(self.mom_open.momentum[0])
|
|
100
|
+
h = max(float(self.mom_high.momentum[0]), o)
|
|
101
|
+
low_price = min(float(self.mom_low.momentum[0]), o)
|
|
102
|
+
c = float(self.mom_close.momentum[0])
|
|
103
|
+
h = max(h, c)
|
|
104
|
+
low_price = min(low_price, c)
|
|
105
|
+
self.lines.a_open[0] = o
|
|
106
|
+
self.lines.a_high[0] = h
|
|
107
|
+
self.lines.a_low[0] = low_price
|
|
108
|
+
self.lines.a_close[0] = c
|
|
109
|
+
if o < c:
|
|
110
|
+
color = 2
|
|
111
|
+
elif o > c:
|
|
112
|
+
color = 0
|
|
113
|
+
else:
|
|
114
|
+
color = 1
|
|
115
|
+
self.lines.color[0] = color
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from backtrader.utils.dateintern import num2date
|
|
9
|
+
|
|
10
|
+
from .. import Indicator
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"AnyRangeCldTailIndicator",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AnyRangeCldTailIndicator(Indicator):
|
|
18
|
+
"""Compute a session-based daily channel and color-state trend signal."""
|
|
19
|
+
|
|
20
|
+
lines = ("color_state", "upper", "lower")
|
|
21
|
+
params = (
|
|
22
|
+
("time1", "02:00"),
|
|
23
|
+
("time2", "07:00"),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def __init__(self):
|
|
27
|
+
"""Initialize session boundaries and window tracking state."""
|
|
28
|
+
self._time1 = self._parse_hhmm(self.p.time1)
|
|
29
|
+
self._time2 = self._parse_hhmm(self.p.time2)
|
|
30
|
+
self._window_start = min(self._time1, self._time2)
|
|
31
|
+
self._window_end = max(self._time1, self._time2)
|
|
32
|
+
self._current_day = None
|
|
33
|
+
self._range_high = None
|
|
34
|
+
self._range_low = None
|
|
35
|
+
self._channel_high = None
|
|
36
|
+
self._channel_low = None
|
|
37
|
+
self._window_finalized = False
|
|
38
|
+
self.addminperiod(2)
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def _parse_hhmm(value):
|
|
42
|
+
hour, minute = value.split(":")
|
|
43
|
+
return int(hour) * 60 + int(minute)
|
|
44
|
+
|
|
45
|
+
def next(self):
|
|
46
|
+
"""Update channel bounds and emit color state for the current bar."""
|
|
47
|
+
dt = num2date(self.data.datetime[0])
|
|
48
|
+
day = dt.date()
|
|
49
|
+
minute = dt.hour * 60 + dt.minute
|
|
50
|
+
if self._current_day != day:
|
|
51
|
+
self._current_day = day
|
|
52
|
+
self._range_high = None
|
|
53
|
+
self._range_low = None
|
|
54
|
+
self._channel_high = None
|
|
55
|
+
self._channel_low = None
|
|
56
|
+
self._window_finalized = False
|
|
57
|
+
in_window = self._window_start < minute <= self._window_end
|
|
58
|
+
if in_window:
|
|
59
|
+
high = float(self.data.high[0])
|
|
60
|
+
low = float(self.data.low[0])
|
|
61
|
+
self._range_high = high if self._range_high is None else max(self._range_high, high)
|
|
62
|
+
self._range_low = low if self._range_low is None else min(self._range_low, low)
|
|
63
|
+
elif (
|
|
64
|
+
minute > self._window_end
|
|
65
|
+
and not self._window_finalized
|
|
66
|
+
and self._range_high is not None
|
|
67
|
+
and self._range_low is not None
|
|
68
|
+
):
|
|
69
|
+
self._channel_high = self._range_high
|
|
70
|
+
self._channel_low = self._range_low
|
|
71
|
+
self._window_finalized = True
|
|
72
|
+
color = 4.0
|
|
73
|
+
if self._channel_high is not None and self._channel_low is not None and not in_window:
|
|
74
|
+
close = float(self.data.close[0])
|
|
75
|
+
open_ = float(self.data.open[0])
|
|
76
|
+
if close > self._channel_high:
|
|
77
|
+
color = 3.0 if close >= open_ else 2.0
|
|
78
|
+
elif close < self._channel_low:
|
|
79
|
+
color = 0.0 if close <= open_ else 1.0
|
|
80
|
+
self.lines.color_state[0] = color
|
|
81
|
+
self.lines.upper[0] = self._channel_high if self._channel_high is not None else float("nan")
|
|
82
|
+
self.lines.lower[0] = self._channel_low if self._channel_low is not None else float("nan")
|