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,137 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"StepMANRTRIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class StepMANRTRIndicator(Indicator):
|
|
16
|
+
"""Reconstructs StepMA_NRTR indicator.
|
|
17
|
+
|
|
18
|
+
StepSizeCalc: Volty-based step size from ATR-like calculation.
|
|
19
|
+
StepMACalc: Trend-following MA with NRTR ratchet.
|
|
20
|
+
4 buffers: UpBuffer(0), DnBuffer(1), BuySignal(2), SellSignal(3).
|
|
21
|
+
Buy when trend flips from down to up. Sell on reverse.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
lines = ("trend_up", "trend_down", "buy_signal", "sell_signal")
|
|
25
|
+
params = (
|
|
26
|
+
("length", 10),
|
|
27
|
+
("kv", 1.0),
|
|
28
|
+
("step_size", 0),
|
|
29
|
+
("percentage", 0),
|
|
30
|
+
("switch", 1),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def __init__(self):
|
|
34
|
+
"""Initialize rolling state and derived parameters for indicator updates."""
|
|
35
|
+
self._length = int(self.p.length)
|
|
36
|
+
self._kv = float(self.p.kv)
|
|
37
|
+
self._step_size = int(self.p.step_size)
|
|
38
|
+
self._percentage = float(self.p.percentage)
|
|
39
|
+
self._switch = int(self.p.switch) # 0=Close, 1=HighLow
|
|
40
|
+
self._trend0 = 0
|
|
41
|
+
self._trend1 = 0
|
|
42
|
+
self._trend1_ = 0
|
|
43
|
+
self._smax1 = 0.0
|
|
44
|
+
self._smin1 = 0.0
|
|
45
|
+
self._first = True
|
|
46
|
+
self.addminperiod(self._length + 3)
|
|
47
|
+
|
|
48
|
+
def _step_size_calc(self, bar_idx):
|
|
49
|
+
length = self._length
|
|
50
|
+
kv = self._kv
|
|
51
|
+
if self._step_size > 0:
|
|
52
|
+
return self._step_size
|
|
53
|
+
# Volty calculation: average of high-low ranges
|
|
54
|
+
total = 0.0
|
|
55
|
+
for i in range(length):
|
|
56
|
+
h = float(self.data.high[-i])
|
|
57
|
+
low_price = float(self.data.low[-i])
|
|
58
|
+
total += h - low_price
|
|
59
|
+
avg = total / length if length > 0 else 0
|
|
60
|
+
# Convert to points-like value
|
|
61
|
+
step = avg * kv / self.data.close[0] * 10000 if self.data.close[0] != 0 else 0
|
|
62
|
+
return max(step, 1)
|
|
63
|
+
|
|
64
|
+
def _step_ma_calc(self):
|
|
65
|
+
step = self._step_size_calc(0)
|
|
66
|
+
point = float(self.data.close[0]) / 10000.0 if float(self.data.close[0]) > 10 else 0.0001
|
|
67
|
+
size_p = step * point
|
|
68
|
+
size_2p = size_p * 2
|
|
69
|
+
|
|
70
|
+
cur_high = float(self.data.high[0])
|
|
71
|
+
cur_low = float(self.data.low[0])
|
|
72
|
+
cur_close = float(self.data.close[0])
|
|
73
|
+
|
|
74
|
+
if self._first:
|
|
75
|
+
self._trend1 = 0
|
|
76
|
+
self._smax1 = cur_low + size_2p
|
|
77
|
+
self._smin1 = cur_high - size_2p
|
|
78
|
+
self._first = False
|
|
79
|
+
|
|
80
|
+
if self._switch: # HighLow mode
|
|
81
|
+
smax0 = cur_high - size_2p
|
|
82
|
+
smin0 = cur_low + size_2p
|
|
83
|
+
else:
|
|
84
|
+
smax0 = cur_close + size_2p
|
|
85
|
+
smin0 = cur_close - size_2p
|
|
86
|
+
|
|
87
|
+
self._trend0 = self._trend1
|
|
88
|
+
|
|
89
|
+
if cur_close > self._smax1:
|
|
90
|
+
self._trend0 = 1
|
|
91
|
+
if cur_close < self._smin1:
|
|
92
|
+
self._trend0 = -1
|
|
93
|
+
|
|
94
|
+
if self._trend0 > 0:
|
|
95
|
+
if smin0 < self._smin1:
|
|
96
|
+
smin0 = self._smin1
|
|
97
|
+
result = smin0 + size_p
|
|
98
|
+
else:
|
|
99
|
+
if smax0 > self._smax1:
|
|
100
|
+
smax0 = self._smax1
|
|
101
|
+
result = smax0 - size_p
|
|
102
|
+
|
|
103
|
+
self._trend1_ = self._trend1
|
|
104
|
+
self._smax1 = smax0
|
|
105
|
+
self._smin1 = smin0
|
|
106
|
+
self._trend1 = self._trend0
|
|
107
|
+
|
|
108
|
+
return result, size_p
|
|
109
|
+
|
|
110
|
+
def next(self):
|
|
111
|
+
"""Compute trend-up/down lines and buy/sell trigger levels for this bar."""
|
|
112
|
+
result, size_p = self._step_ma_calc()
|
|
113
|
+
ratio = self._percentage / 100.0 if self._percentage > 0 else 0
|
|
114
|
+
step = self._step_size_calc(0)
|
|
115
|
+
if step > 0:
|
|
116
|
+
result += ratio / step
|
|
117
|
+
|
|
118
|
+
tu = 0.0
|
|
119
|
+
td = 0.0
|
|
120
|
+
bs = 0.0
|
|
121
|
+
ss = 0.0
|
|
122
|
+
|
|
123
|
+
point = float(self.data.close[0]) / 10000.0 if float(self.data.close[0]) > 10 else 0.0001
|
|
124
|
+
|
|
125
|
+
if self._trend0 > 0:
|
|
126
|
+
tu = result - step * point
|
|
127
|
+
if self._trend1_ < 0:
|
|
128
|
+
bs = tu
|
|
129
|
+
if self._trend0 < 0:
|
|
130
|
+
td = result + step * point
|
|
131
|
+
if self._trend1_ > 0:
|
|
132
|
+
ss = td
|
|
133
|
+
|
|
134
|
+
self.lines.trend_up[0] = tu
|
|
135
|
+
self.lines.trend_down[0] = td
|
|
136
|
+
self.lines.buy_signal[0] = bs
|
|
137
|
+
self.lines.sell_signal[0] = ss
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"StochasticHistogramIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class StochasticHistogramIndicator(Indicator):
|
|
16
|
+
"""Stochastic-based indicator with a smoothed main line, signal line, and color state.
|
|
17
|
+
|
|
18
|
+
The indicator outputs:
|
|
19
|
+
- ``main``: smoothed %K values.
|
|
20
|
+
- ``signal``: smoothed trigger line derived from main.
|
|
21
|
+
- ``hist_base``: fixed base reference line (50.0).
|
|
22
|
+
- ``color_state``: 0 for overbought, 1 for neutral, 2 for oversold.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
lines = ("main", "signal", "hist_base", "color_state")
|
|
26
|
+
params = (
|
|
27
|
+
("k_period", 5),
|
|
28
|
+
("d_period", 3),
|
|
29
|
+
("slowing", 3),
|
|
30
|
+
("ma_method", "sma"),
|
|
31
|
+
("high_level", 60),
|
|
32
|
+
("low_level", 40),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
"""Set the minimum required bars from K, slowing, and D periods."""
|
|
37
|
+
self.addminperiod(int(self.p.k_period) + int(self.p.slowing) + int(self.p.d_period) + 2)
|
|
38
|
+
|
|
39
|
+
def _fast_k_at(self, i, high_array, low_array, close_array):
|
|
40
|
+
period = max(1, int(self.p.k_period))
|
|
41
|
+
if i - period + 1 < 0:
|
|
42
|
+
return float("nan")
|
|
43
|
+
lowest = min(float(low_array[idx]) for idx in range(i - period + 1, i + 1))
|
|
44
|
+
highest = max(float(high_array[idx]) for idx in range(i - period + 1, i + 1))
|
|
45
|
+
denom = highest - lowest
|
|
46
|
+
return 100.0 * (float(close_array[i]) - lowest) / denom if denom else 50.0
|
|
47
|
+
|
|
48
|
+
def _ma_value(self, values, period, previous=None):
|
|
49
|
+
if not values:
|
|
50
|
+
return float("nan")
|
|
51
|
+
mode = str(self.p.ma_method).strip().lower()
|
|
52
|
+
value = float(values[-1])
|
|
53
|
+
if mode in {"ema", "mode_ema"}:
|
|
54
|
+
if previous is None or previous != previous:
|
|
55
|
+
return value
|
|
56
|
+
alpha = 2.0 / (period + 1.0)
|
|
57
|
+
return previous + alpha * (value - previous)
|
|
58
|
+
if mode in {"smma", "mode_smma"}:
|
|
59
|
+
if previous is None or previous != previous:
|
|
60
|
+
return value
|
|
61
|
+
return ((period - 1.0) * previous + value) / period
|
|
62
|
+
if mode in {"lwma", "wma", "mode_lwma"}:
|
|
63
|
+
weights = list(range(1, len(values) + 1))
|
|
64
|
+
return sum(v * w for v, w in zip(values, weights)) / sum(weights)
|
|
65
|
+
return sum(values) / len(values)
|
|
66
|
+
|
|
67
|
+
def next(self):
|
|
68
|
+
"""Compute indicator values for one new bar in Backtrader streaming mode."""
|
|
69
|
+
k_period = max(1, int(self.p.k_period))
|
|
70
|
+
slowing = max(1, int(self.p.slowing))
|
|
71
|
+
d_period = max(1, int(self.p.d_period))
|
|
72
|
+
fast_values = []
|
|
73
|
+
for ago in range(slowing - 1, -1, -1):
|
|
74
|
+
if len(self.data) <= ago + k_period - 1:
|
|
75
|
+
return
|
|
76
|
+
low_values = [float(self.data.low[-ago - shift]) for shift in range(k_period)]
|
|
77
|
+
high_values = [float(self.data.high[-ago - shift]) for shift in range(k_period)]
|
|
78
|
+
lowest = min(low_values)
|
|
79
|
+
highest = max(high_values)
|
|
80
|
+
denom = highest - lowest
|
|
81
|
+
fast_values.append(
|
|
82
|
+
100.0 * (float(self.data.close[-ago]) - lowest) / denom if denom else 50.0
|
|
83
|
+
)
|
|
84
|
+
prev_main = float(self.lines.main[-1]) if len(self) > 1 else None
|
|
85
|
+
prev_signal = float(self.lines.signal[-1]) if len(self) > 1 else None
|
|
86
|
+
main = self._ma_value(fast_values, slowing, prev_main)
|
|
87
|
+
self.lines.main[0] = main
|
|
88
|
+
signal_values = [
|
|
89
|
+
float(self.lines.main[-ago]) for ago in range(min(len(self), d_period) - 1, 0, -1)
|
|
90
|
+
]
|
|
91
|
+
signal_values.append(main)
|
|
92
|
+
self.lines.signal[0] = self._ma_value(signal_values, d_period, prev_signal)
|
|
93
|
+
color = 1.0
|
|
94
|
+
if main > float(self.p.high_level):
|
|
95
|
+
color = 0.0
|
|
96
|
+
elif main < float(self.p.low_level):
|
|
97
|
+
color = 2.0
|
|
98
|
+
self.lines.color_state[0] = color
|
|
99
|
+
self.lines.hist_base[0] = 50.0
|
|
100
|
+
|
|
101
|
+
def once(self, start, end):
|
|
102
|
+
"""Compute indicator arrays for run-once mode from ``start`` to ``end`` indices."""
|
|
103
|
+
high_array = self.data.high.array
|
|
104
|
+
low_array = self.data.low.array
|
|
105
|
+
close_array = self.data.close.array
|
|
106
|
+
main_line = self.lines.main.array
|
|
107
|
+
signal_line = self.lines.signal.array
|
|
108
|
+
hist_base_line = self.lines.hist_base.array
|
|
109
|
+
color_state_line = self.lines.color_state.array
|
|
110
|
+
for line in (main_line, signal_line, hist_base_line, color_state_line):
|
|
111
|
+
while len(line) < end:
|
|
112
|
+
line.append(float("nan"))
|
|
113
|
+
|
|
114
|
+
slowing = max(1, int(self.p.slowing))
|
|
115
|
+
d_period = max(1, int(self.p.d_period))
|
|
116
|
+
actual_end = min(end, len(high_array), len(low_array), len(close_array))
|
|
117
|
+
fast_values = [
|
|
118
|
+
self._fast_k_at(i, high_array, low_array, close_array) for i in range(actual_end)
|
|
119
|
+
]
|
|
120
|
+
main_values = []
|
|
121
|
+
signal_values_all = []
|
|
122
|
+
prev_main = None
|
|
123
|
+
prev_signal = None
|
|
124
|
+
for i in range(actual_end):
|
|
125
|
+
main_start = max(0, i - slowing + 1)
|
|
126
|
+
main = self._ma_value(fast_values[main_start : i + 1], slowing, prev_main)
|
|
127
|
+
main_values.append(main)
|
|
128
|
+
prev_main = main
|
|
129
|
+
signal_start = max(0, i - d_period + 1)
|
|
130
|
+
signal = self._ma_value(main_values[signal_start : i + 1], d_period, prev_signal)
|
|
131
|
+
signal_values_all.append(signal)
|
|
132
|
+
prev_signal = signal
|
|
133
|
+
if i < start:
|
|
134
|
+
continue
|
|
135
|
+
main_line[i] = main
|
|
136
|
+
signal_line[i] = signal_values_all[i]
|
|
137
|
+
color = 1.0
|
|
138
|
+
if main > float(self.p.high_level):
|
|
139
|
+
color = 0.0
|
|
140
|
+
elif main < float(self.p.low_level):
|
|
141
|
+
color = 2.0
|
|
142
|
+
color_state_line[i] = color
|
|
143
|
+
hist_base_line[i] = 50.0
|
|
@@ -0,0 +1,125 @@
|
|
|
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
|
+
SmoothedMovingAverage,
|
|
13
|
+
WeightedMovingAverage,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"T3AlarmIndicator",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class T3AlarmIndicator(Indicator):
|
|
22
|
+
"""Double-smoothed MA slope indicator emitting direction and reversal alarms."""
|
|
23
|
+
|
|
24
|
+
lines = ("ma2", "direction", "buy_sig", "sell_sig")
|
|
25
|
+
params = (
|
|
26
|
+
("ma_period", 19),
|
|
27
|
+
("ma_shift", 0),
|
|
28
|
+
("ma_method", "ema"),
|
|
29
|
+
("ma_price", "close"),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def __init__(self):
|
|
33
|
+
"""Build the twice-applied moving average and reset the prior direction."""
|
|
34
|
+
price = self._price_line(self.p.ma_price)
|
|
35
|
+
ma_cls = self._ma_class(self.p.ma_method)
|
|
36
|
+
ma1 = ma_cls(price, period=self.p.ma_period)
|
|
37
|
+
self.lines.ma2 = ma_cls(ma1, period=self.p.ma_period)
|
|
38
|
+
self._ma_shift = int(self.p.ma_shift)
|
|
39
|
+
self._prev_direction = 0
|
|
40
|
+
|
|
41
|
+
def next(self):
|
|
42
|
+
"""Update the direction line and raise buy/sell alarms on slope flips."""
|
|
43
|
+
shift = self._ma_shift
|
|
44
|
+
ma2_curr = self.lines.ma2[-shift] if shift > 0 else self.lines.ma2[0]
|
|
45
|
+
ma2_prev = self.lines.ma2[-(shift + 1)] if True else self.lines.ma2[-1]
|
|
46
|
+
|
|
47
|
+
if ma2_curr > ma2_prev:
|
|
48
|
+
direction = 1
|
|
49
|
+
elif ma2_curr < ma2_prev:
|
|
50
|
+
direction = -1
|
|
51
|
+
else:
|
|
52
|
+
direction = self._prev_direction
|
|
53
|
+
|
|
54
|
+
prev_dir = self._prev_direction
|
|
55
|
+
self._prev_direction = direction
|
|
56
|
+
self.lines.direction[0] = float(direction)
|
|
57
|
+
self.lines.buy_sig[0] = 1.0 if (direction == 1 and prev_dir == -1) else 0.0
|
|
58
|
+
self.lines.sell_sig[0] = 1.0 if (direction == -1 and prev_dir == 1) else 0.0
|
|
59
|
+
|
|
60
|
+
def once(self, start, end):
|
|
61
|
+
"""Vectorised batch evaluation of direction and alarm lines.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
start: Inclusive start index of the range to fill.
|
|
65
|
+
end: Exclusive end index of the range to fill.
|
|
66
|
+
"""
|
|
67
|
+
ma2 = self.lines.ma2.array
|
|
68
|
+
direction_line = self.lines.direction.array
|
|
69
|
+
buy_line = self.lines.buy_sig.array
|
|
70
|
+
sell_line = self.lines.sell_sig.array
|
|
71
|
+
for line in (direction_line, buy_line, sell_line):
|
|
72
|
+
while len(line) < end:
|
|
73
|
+
line.append(float("nan"))
|
|
74
|
+
|
|
75
|
+
shift = self._ma_shift
|
|
76
|
+
prev_direction = 0
|
|
77
|
+
actual_end = min(end, len(ma2))
|
|
78
|
+
for i in range(start, actual_end):
|
|
79
|
+
curr_idx = i - shift if shift > 0 else i
|
|
80
|
+
prev_idx = i - shift - 1
|
|
81
|
+
if curr_idx < 0 or prev_idx < 0:
|
|
82
|
+
direction = prev_direction
|
|
83
|
+
else:
|
|
84
|
+
ma2_curr = ma2[curr_idx]
|
|
85
|
+
ma2_prev = ma2[prev_idx]
|
|
86
|
+
if ma2_curr > ma2_prev:
|
|
87
|
+
direction = 1
|
|
88
|
+
elif ma2_curr < ma2_prev:
|
|
89
|
+
direction = -1
|
|
90
|
+
else:
|
|
91
|
+
direction = prev_direction
|
|
92
|
+
|
|
93
|
+
prev_dir = prev_direction
|
|
94
|
+
prev_direction = direction
|
|
95
|
+
direction_line[i] = float(direction)
|
|
96
|
+
buy_line[i] = 1.0 if (direction == 1 and prev_dir == -1) else 0.0
|
|
97
|
+
sell_line[i] = 1.0 if (direction == -1 and prev_dir == 1) else 0.0
|
|
98
|
+
self._prev_direction = prev_direction
|
|
99
|
+
|
|
100
|
+
def _ma_class(self, method):
|
|
101
|
+
name = str(method).lower()
|
|
102
|
+
mapping = {
|
|
103
|
+
"sma": SimpleMovingAverage,
|
|
104
|
+
"ema": ExponentialMovingAverage,
|
|
105
|
+
"smma": SmoothedMovingAverage,
|
|
106
|
+
"lwma": WeightedMovingAverage,
|
|
107
|
+
"wma": WeightedMovingAverage,
|
|
108
|
+
}
|
|
109
|
+
return mapping.get(name, ExponentialMovingAverage)
|
|
110
|
+
|
|
111
|
+
def _price_line(self, price_name):
|
|
112
|
+
name = str(price_name).lower()
|
|
113
|
+
if name == "open":
|
|
114
|
+
return self.data.open
|
|
115
|
+
if name == "high":
|
|
116
|
+
return self.data.high
|
|
117
|
+
if name == "low":
|
|
118
|
+
return self.data.low
|
|
119
|
+
if name == "median":
|
|
120
|
+
return (self.data.high + self.data.low) / 2.0
|
|
121
|
+
if name == "typical":
|
|
122
|
+
return (self.data.high + self.data.low + self.data.close) / 3.0
|
|
123
|
+
if name == "weighted":
|
|
124
|
+
return (self.data.high + self.data.low + self.data.close + self.data.close) / 4.0
|
|
125
|
+
return self.data.close
|
|
@@ -0,0 +1,76 @@
|
|
|
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 backtrader.functions as btfunc
|
|
9
|
+
|
|
10
|
+
from .. import (
|
|
11
|
+
EMA,
|
|
12
|
+
Indicator,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"T3Average",
|
|
17
|
+
"T3Trix",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class T3Average(Indicator):
|
|
22
|
+
"""Tillson T3 moving average built from a six-stage EMA cascade."""
|
|
23
|
+
|
|
24
|
+
lines = ("t3",)
|
|
25
|
+
params = (
|
|
26
|
+
("period", 10),
|
|
27
|
+
("vfactor", 0.7),
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
"""Build the six EMA stages and combine them into the T3 line.
|
|
32
|
+
|
|
33
|
+
Side effects:
|
|
34
|
+
Creates the cascade of six EMAs and assigns ``t3`` as the
|
|
35
|
+
volume-factor-weighted combination of the third through sixth stages.
|
|
36
|
+
"""
|
|
37
|
+
period = max(int(self.p.period), 1)
|
|
38
|
+
vfactor = min(max(float(self.p.vfactor), 0.0), 1.0)
|
|
39
|
+
e1 = EMA(self.data, period=period)
|
|
40
|
+
e2 = EMA(e1, period=period)
|
|
41
|
+
e3 = EMA(e2, period=period)
|
|
42
|
+
e4 = EMA(e3, period=period)
|
|
43
|
+
e5 = EMA(e4, period=period)
|
|
44
|
+
e6 = EMA(e5, period=period)
|
|
45
|
+
|
|
46
|
+
c1 = -(vfactor**3)
|
|
47
|
+
c2 = 3 * vfactor**2 + 3 * vfactor**3
|
|
48
|
+
c3 = -6 * vfactor**2 - 3 * vfactor - 3 * vfactor**3
|
|
49
|
+
c4 = 1 + 3 * vfactor + vfactor**3 + 3 * vfactor**2
|
|
50
|
+
self.l.t3 = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class T3Trix(Indicator):
|
|
54
|
+
"""TRIX-style oscillator built from fast and slow T3 rate-of-change lines."""
|
|
55
|
+
|
|
56
|
+
lines = ("fast", "slow", "hist")
|
|
57
|
+
params = (
|
|
58
|
+
("xlength1", 10),
|
|
59
|
+
("xlength2", 18),
|
|
60
|
+
("xphase", 70),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def __init__(self):
|
|
64
|
+
"""Build fast/slow T3 averages and their normalized rate-of-change lines.
|
|
65
|
+
|
|
66
|
+
Side effects:
|
|
67
|
+
Derives the volume factor from ``xphase``, builds the fast and slow
|
|
68
|
+
``T3Average`` lines, and assigns ``fast``/``slow`` as their per-bar
|
|
69
|
+
relative changes with ``hist`` aliased to ``fast``.
|
|
70
|
+
"""
|
|
71
|
+
vfactor = min(max(float(self.p.xphase) / 100.0, 0.0), 1.0)
|
|
72
|
+
fast_t3 = T3Average(self.data.close, period=int(self.p.xlength1), vfactor=vfactor)
|
|
73
|
+
slow_t3 = T3Average(self.data.close, period=int(self.p.xlength2), vfactor=vfactor)
|
|
74
|
+
self.l.fast = btfunc.DivByZero(fast_t3 - fast_t3(-1), fast_t3(-1), zero=0.0)
|
|
75
|
+
self.l.slow = btfunc.DivByZero(slow_t3 - slow_t3(-1), slow_t3(-1), zero=0.0)
|
|
76
|
+
self.l.hist = self.l.fast
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
EMA,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"T3Indicator",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class T3Indicator(Indicator):
|
|
19
|
+
"""Tillson T3 moving average — six cascaded EMAs with volume factor."""
|
|
20
|
+
|
|
21
|
+
lines = ("t3",)
|
|
22
|
+
params = (
|
|
23
|
+
("period", 4),
|
|
24
|
+
("vfactor", 0.7),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
"""Build the six cascaded EMAs and the T3 weighted combination line."""
|
|
29
|
+
e1 = EMA(self.data, period=self.p.period)
|
|
30
|
+
e2 = EMA(e1, period=self.p.period)
|
|
31
|
+
e3 = EMA(e2, period=self.p.period)
|
|
32
|
+
e4 = EMA(e3, period=self.p.period)
|
|
33
|
+
e5 = EMA(e4, period=self.p.period)
|
|
34
|
+
e6 = EMA(e5, period=self.p.period)
|
|
35
|
+
v = self.p.vfactor
|
|
36
|
+
c1 = -(v * v * v)
|
|
37
|
+
c2 = 3 * v * v + 3 * v * v * v
|
|
38
|
+
c3 = -6 * v * v - 3 * v - 3 * v * v * v
|
|
39
|
+
c4 = 1 + 3 * v + v * v * v + 3 * v * v
|
|
40
|
+
self.lines.t3 = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
ATR,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"The20sV020Signal",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class The20sV020Signal(Indicator):
|
|
19
|
+
"""Reversal signal from prior-bar 20% zones with an ATR-offset entry."""
|
|
20
|
+
|
|
21
|
+
lines = ("sell", "buy")
|
|
22
|
+
params = (
|
|
23
|
+
("alg", "MODE_1"),
|
|
24
|
+
("level", 100),
|
|
25
|
+
("ratio", 0.2),
|
|
26
|
+
("direct", False),
|
|
27
|
+
("atr_period", 15),
|
|
28
|
+
("point", 0.01),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Build the ATR sub-indicator and set the warm-up minimum period."""
|
|
33
|
+
self.atr = ATR(self.data, period=max(int(self.p.atr_period), 1))
|
|
34
|
+
self.addminperiod(max(int(self.p.atr_period), 5) + 6)
|
|
35
|
+
|
|
36
|
+
def next(self):
|
|
37
|
+
"""Emit buy/sell signal levels from the prior-bar 20% zone logic.
|
|
38
|
+
|
|
39
|
+
Resets both lines to zero, and once enough bars exist computes the
|
|
40
|
+
prior-bar range, its upper/lower 20% zones, and the ATR. Under MODE_1 it
|
|
41
|
+
flags a reversal when the previous bar spans the band and the current bar
|
|
42
|
+
breaks beyond it by the level threshold; under MODE_2 it uses a three-bar
|
|
43
|
+
expansion-then-inside pattern. The ``direct`` flag optionally swaps the
|
|
44
|
+
buy and sell outputs.
|
|
45
|
+
"""
|
|
46
|
+
self.lines.buy[0] = 0.0
|
|
47
|
+
self.lines.sell[0] = 0.0
|
|
48
|
+
|
|
49
|
+
if len(self.data) < 6:
|
|
50
|
+
return
|
|
51
|
+
|
|
52
|
+
dlevel = float(self.p.level) * float(self.p.point)
|
|
53
|
+
last_range = float(self.data.high[-1]) - float(self.data.low[-1])
|
|
54
|
+
top20 = float(self.data.high[-1]) - last_range * float(self.p.ratio)
|
|
55
|
+
bottom20 = float(self.data.low[-1]) + last_range * float(self.p.ratio)
|
|
56
|
+
atr = float(self.atr[0])
|
|
57
|
+
|
|
58
|
+
raw_buy = 0.0
|
|
59
|
+
raw_sell = 0.0
|
|
60
|
+
|
|
61
|
+
if str(self.p.alg) == "MODE_1":
|
|
62
|
+
if (
|
|
63
|
+
float(self.data.open[-1]) >= top20
|
|
64
|
+
and float(self.data.close[-1]) <= bottom20
|
|
65
|
+
and float(self.data.low[0]) <= float(self.data.low[-1]) - dlevel
|
|
66
|
+
):
|
|
67
|
+
raw_buy = float(self.data.low[0]) - atr * 3.0 / 8.0
|
|
68
|
+
elif (
|
|
69
|
+
float(self.data.open[-1]) <= bottom20
|
|
70
|
+
and float(self.data.close[-1]) >= top20
|
|
71
|
+
and float(self.data.high[0]) >= float(self.data.high[-1]) + dlevel
|
|
72
|
+
):
|
|
73
|
+
raw_sell = float(self.data.high[0]) + atr * 3.0 / 8.0
|
|
74
|
+
else:
|
|
75
|
+
cond = (
|
|
76
|
+
(float(self.data.high[-4]) - float(self.data.low[-4]) > last_range)
|
|
77
|
+
and (float(self.data.high[-3]) - float(self.data.low[-3]) > last_range)
|
|
78
|
+
and (float(self.data.high[-2]) - float(self.data.low[-2]) > last_range)
|
|
79
|
+
and float(self.data.high[-2]) > float(self.data.high[-1])
|
|
80
|
+
and float(self.data.low[-2]) < float(self.data.low[-1])
|
|
81
|
+
)
|
|
82
|
+
if cond:
|
|
83
|
+
if float(self.data.open[0]) <= bottom20:
|
|
84
|
+
raw_buy = float(self.data.low[0]) - atr * 3.0 / 8.0
|
|
85
|
+
if float(self.data.open[0]) >= top20:
|
|
86
|
+
raw_sell = float(self.data.high[0]) + atr * 3.0 / 8.0
|
|
87
|
+
|
|
88
|
+
if bool(self.p.direct):
|
|
89
|
+
self.lines.buy[0] = raw_buy
|
|
90
|
+
self.lines.sell[0] = raw_sell
|
|
91
|
+
else:
|
|
92
|
+
self.lines.buy[0] = raw_sell
|
|
93
|
+
self.lines.sell[0] = raw_buy
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"ThreeCandlesIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ThreeCandlesIndicator(Indicator):
|
|
16
|
+
"""Indicator producing three-candle reversal signal labels."""
|
|
17
|
+
|
|
18
|
+
lines = ("signal",)
|
|
19
|
+
params = (
|
|
20
|
+
("max_bar1", 300),
|
|
21
|
+
("volume_type", "tick"),
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
"""Require enough history before the indicator can emit stable signals."""
|
|
26
|
+
self.addminperiod(5)
|
|
27
|
+
|
|
28
|
+
def next(self):
|
|
29
|
+
"""Evaluate bullish/bearish setups and emit normalized signal codes."""
|
|
30
|
+
self.lines.signal[0] = 2.0
|
|
31
|
+
|
|
32
|
+
chk_vol = True
|
|
33
|
+
range_points = float(self.data.high[-3] - self.data.low[-3])
|
|
34
|
+
point = float(getattr(self.data, "_point_value", 0.01) or 0.01)
|
|
35
|
+
if point > 0 and range_points / point > float(self.p.max_bar1):
|
|
36
|
+
chk_vol = False
|
|
37
|
+
|
|
38
|
+
bullish_setup = (
|
|
39
|
+
float(self.data.open[-3]) < float(self.data.close[-3])
|
|
40
|
+
and float(self.data.open[-2]) < float(self.data.close[-2])
|
|
41
|
+
and float(self.data.close[-2]) < float(self.data.high[-3])
|
|
42
|
+
and float(self.data.open[-1]) > float(self.data.close[-1])
|
|
43
|
+
and float(self.data.close[-1]) < float(self.data.open[-2])
|
|
44
|
+
)
|
|
45
|
+
bearish_setup = (
|
|
46
|
+
float(self.data.open[-3]) > float(self.data.close[-3])
|
|
47
|
+
and float(self.data.open[-2]) > float(self.data.close[-2])
|
|
48
|
+
and float(self.data.close[-2]) > float(self.data.low[-3])
|
|
49
|
+
and float(self.data.open[-1]) < float(self.data.close[-1])
|
|
50
|
+
and float(self.data.close[-1]) > float(self.data.open[-2])
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
vol_series = self.data.volume
|
|
54
|
+
|
|
55
|
+
def volume_filter_ok():
|
|
56
|
+
if not chk_vol or self.p.volume_type == "none":
|
|
57
|
+
return True
|
|
58
|
+
v3 = float(vol_series[-3])
|
|
59
|
+
v2 = float(vol_series[-2])
|
|
60
|
+
v1 = float(vol_series[-1])
|
|
61
|
+
return v3 < v2 or v1 > v2 or v1 > v3
|
|
62
|
+
|
|
63
|
+
if bullish_setup and volume_filter_ok():
|
|
64
|
+
self.lines.signal[0] = (
|
|
65
|
+
0.0 if float(self.data.close[0]) < float(self.data.open[0]) else 1.0
|
|
66
|
+
)
|
|
67
|
+
if bearish_setup and volume_filter_ok():
|
|
68
|
+
self.lines.signal[0] = (
|
|
69
|
+
3.0 if float(self.data.close[0]) < float(self.data.open[0]) else 4.0
|
|
70
|
+
)
|