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,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 backtrader.functions as btfunc
|
|
9
|
+
|
|
10
|
+
from .. import (
|
|
11
|
+
EMA,
|
|
12
|
+
Highest,
|
|
13
|
+
Indicator,
|
|
14
|
+
Lowest,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"BlauTSStochastic",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _price_series(data, mode):
|
|
23
|
+
key = str(mode).lower()
|
|
24
|
+
if key in ("1", "close", "price_close"):
|
|
25
|
+
return data.close
|
|
26
|
+
if key in ("2", "open", "price_open"):
|
|
27
|
+
return data.open
|
|
28
|
+
if key in ("3", "high", "price_high"):
|
|
29
|
+
return data.high
|
|
30
|
+
if key in ("4", "low", "price_low"):
|
|
31
|
+
return data.low
|
|
32
|
+
if key in ("5", "median", "price_median"):
|
|
33
|
+
return (data.high + data.low) / 2.0
|
|
34
|
+
if key in ("6", "typical", "price_typical"):
|
|
35
|
+
return (data.high + data.low + data.close) / 3.0
|
|
36
|
+
if key in ("7", "weighted", "price_weighted"):
|
|
37
|
+
return (data.high + data.low + data.close + data.close) / 4.0
|
|
38
|
+
if key in ("8", "simple", "price_simpl"):
|
|
39
|
+
return (data.open + data.close) / 2.0
|
|
40
|
+
if key in ("9", "quarter", "price_quarter"):
|
|
41
|
+
return (data.high + data.low + data.open + data.close) / 4.0
|
|
42
|
+
return data.close
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class BlauTSStochastic(Indicator):
|
|
46
|
+
"""Blau TS Stochastic: triple-smoothed stochastic momentum oscillator.
|
|
47
|
+
|
|
48
|
+
A stochastic numerator (price minus lowest low) and its range (highest high
|
|
49
|
+
minus lowest low) are each triple-smoothed with EMAs; the histogram is
|
|
50
|
+
200 times their ratio minus 100 (guarded against division by zero), and an
|
|
51
|
+
EMA of the histogram forms the signal line exposed on the down line.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
lines = ("up", "down", "hist")
|
|
55
|
+
params = (
|
|
56
|
+
("xlength", 5),
|
|
57
|
+
("xlength1", 20),
|
|
58
|
+
("xlength2", 5),
|
|
59
|
+
("xlength3", 3),
|
|
60
|
+
("xlength4", 3),
|
|
61
|
+
("ipc", "close"),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
def __init__(self):
|
|
65
|
+
"""Build the triple-EMA stochastic chain for the hist/up/down lines."""
|
|
66
|
+
price = _price_series(self.data, self.p.ipc)
|
|
67
|
+
hh = Highest(self.data.high, period=int(self.p.xlength))
|
|
68
|
+
ll = Lowest(self.data.low, period=int(self.p.xlength))
|
|
69
|
+
stoch = price - ll
|
|
70
|
+
range_line = hh - ll
|
|
71
|
+
|
|
72
|
+
xstoch = EMA(stoch, period=int(self.p.xlength1))
|
|
73
|
+
xxstoch = EMA(xstoch, period=int(self.p.xlength2))
|
|
74
|
+
xxxstoch = EMA(xxstoch, period=int(self.p.xlength3))
|
|
75
|
+
|
|
76
|
+
xrange = EMA(range_line, period=int(self.p.xlength1))
|
|
77
|
+
xxrange = EMA(xrange, period=int(self.p.xlength2))
|
|
78
|
+
xxxrange = EMA(xxrange, period=int(self.p.xlength3))
|
|
79
|
+
|
|
80
|
+
hist = btfunc.DivByZero(200.0 * xxxstoch, xxxrange, zero=0.0) - 100.0
|
|
81
|
+
signal = EMA(hist, period=int(self.p.xlength4))
|
|
82
|
+
|
|
83
|
+
self.l.hist = hist
|
|
84
|
+
self.l.up = hist
|
|
85
|
+
self.l.down = signal
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
ExponentialMovingAverage,
|
|
12
|
+
Indicator,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"BlauTVI",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class BlauTVI(Indicator):
|
|
21
|
+
"""Blau Tick Volume Indicator: a triple-EMA-smoothed up/down tick oscillator."""
|
|
22
|
+
|
|
23
|
+
lines = ("value", "color_idx")
|
|
24
|
+
params = (
|
|
25
|
+
("xlength1", 12),
|
|
26
|
+
("xlength2", 12),
|
|
27
|
+
("xlength3", 12),
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
"""Build the up/down tick EMAs and the smoothed oscillator value line."""
|
|
32
|
+
up_ticks = (self.data.volume + (self.data.close - self.data.open) / 0.01) / 2.0
|
|
33
|
+
dn_ticks = (self.data.volume - (self.data.close - self.data.open) / 0.01) / 2.0
|
|
34
|
+
up_1 = ExponentialMovingAverage(up_ticks, period=self.p.xlength1)
|
|
35
|
+
dn_1 = ExponentialMovingAverage(dn_ticks, period=self.p.xlength1)
|
|
36
|
+
up_2 = ExponentialMovingAverage(up_1, period=self.p.xlength2)
|
|
37
|
+
dn_2 = ExponentialMovingAverage(dn_1, period=self.p.xlength2)
|
|
38
|
+
raw = 100.0 * (up_2 - dn_2) / (up_2 + dn_2 + 1e-12)
|
|
39
|
+
self.lines.value = ExponentialMovingAverage(raw, period=self.p.xlength3)
|
|
40
|
+
self.addminperiod(self.p.xlength1 + self.p.xlength2 + self.p.xlength3 + 2)
|
|
41
|
+
|
|
42
|
+
def next(self):
|
|
43
|
+
"""Assign a color index based on the value's sign and direction of change."""
|
|
44
|
+
current = float(self.lines.value[0])
|
|
45
|
+
prev = (
|
|
46
|
+
float(self.lines.value[-1])
|
|
47
|
+
if len(self) > 1 and math.isfinite(float(self.lines.value[-1]))
|
|
48
|
+
else current
|
|
49
|
+
)
|
|
50
|
+
color = 2.0
|
|
51
|
+
if current > 0:
|
|
52
|
+
color = 4.0 if current > prev else 3.0
|
|
53
|
+
elif current < 0:
|
|
54
|
+
color = 0.0 if current < prev else 1.0
|
|
55
|
+
self.lines.color_idx[0] = color
|
|
@@ -0,0 +1,128 @@
|
|
|
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
|
+
from collections import deque
|
|
10
|
+
|
|
11
|
+
from .. import Indicator
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"BrainTrend2Indicator",
|
|
15
|
+
"AbsolutelyNoLagLwmaIndicator",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BrainTrend2Indicator(Indicator):
|
|
20
|
+
"""ATR-derived trend-state indicator producing a four-state color signal."""
|
|
21
|
+
|
|
22
|
+
lines = ("color_state",)
|
|
23
|
+
params = (
|
|
24
|
+
("atr_period", 7),
|
|
25
|
+
("point_size", 0.01),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
"""Initialize transition state and adaptive ATR window."""
|
|
30
|
+
self._period = max(1, int(self.p.atr_period))
|
|
31
|
+
self._cecf = 0.7
|
|
32
|
+
self._trs = deque(maxlen=self._period)
|
|
33
|
+
self._river = None
|
|
34
|
+
self._emaxtra = None
|
|
35
|
+
self.addminperiod(self._period + 2)
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def _finite(value):
|
|
39
|
+
return value is not None and math.isfinite(value)
|
|
40
|
+
|
|
41
|
+
def next(self):
|
|
42
|
+
"""Update trend river state and emit a color code."""
|
|
43
|
+
prev_close = float(self.data.close[-1]) if len(self.data) > 1 else float(self.data.close[0])
|
|
44
|
+
spread = (
|
|
45
|
+
float(getattr(self.data, "spread")[0]) * self.p.point_size
|
|
46
|
+
if hasattr(self.data, "spread")
|
|
47
|
+
else 0.0
|
|
48
|
+
)
|
|
49
|
+
high = float(self.data.high[0])
|
|
50
|
+
low = float(self.data.low[0])
|
|
51
|
+
open_ = float(self.data.open[0])
|
|
52
|
+
close = float(self.data.close[0])
|
|
53
|
+
tr = spread + high - low
|
|
54
|
+
tr = max(tr, abs(spread + high - prev_close), abs(low - prev_close))
|
|
55
|
+
self._trs.append(tr)
|
|
56
|
+
if len(self._trs) < self._period:
|
|
57
|
+
self.lines.color_state[0] = float("nan")
|
|
58
|
+
return
|
|
59
|
+
weights = list(range(self._period, 0, -1))
|
|
60
|
+
atr = (
|
|
61
|
+
2.0
|
|
62
|
+
* sum(w * v for w, v in zip(weights, reversed(self._trs)))
|
|
63
|
+
/ (self._period * (self._period + 1.0))
|
|
64
|
+
)
|
|
65
|
+
widcha = self._cecf * atr
|
|
66
|
+
if self._river is None:
|
|
67
|
+
prev2_close = float(self.data.close[-2]) if len(self.data) > 2 else prev_close
|
|
68
|
+
self._river = prev2_close > prev_close
|
|
69
|
+
self._emaxtra = prev_close
|
|
70
|
+
if self._river and low < self._emaxtra - widcha:
|
|
71
|
+
self._river = False
|
|
72
|
+
self._emaxtra = spread + high
|
|
73
|
+
if (not self._river) and spread + high > self._emaxtra + widcha:
|
|
74
|
+
self._river = True
|
|
75
|
+
self._emaxtra = low
|
|
76
|
+
if self._river and low > self._emaxtra:
|
|
77
|
+
self._emaxtra = low
|
|
78
|
+
if (not self._river) and spread + high < self._emaxtra:
|
|
79
|
+
self._emaxtra = spread + high
|
|
80
|
+
if self._river:
|
|
81
|
+
color = 0.0 if open_ <= close else 1.0
|
|
82
|
+
else:
|
|
83
|
+
color = 4.0 if open_ >= close else 3.0
|
|
84
|
+
self.lines.color_state[0] = color
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class AbsolutelyNoLagLwmaIndicator(Indicator):
|
|
88
|
+
"""No-lag LWMA indicator with color state transitions."""
|
|
89
|
+
|
|
90
|
+
lines = ("line_value", "color_state")
|
|
91
|
+
params = (("length", 7),)
|
|
92
|
+
|
|
93
|
+
def __init__(self):
|
|
94
|
+
"""Prepare rolling windows for dual-weighted moving average updates."""
|
|
95
|
+
self._length = max(1, int(self.p.length))
|
|
96
|
+
self._price_window = deque(maxlen=self._length)
|
|
97
|
+
self._lwma_window = deque(maxlen=self._length)
|
|
98
|
+
self.addminperiod(self._length * 2)
|
|
99
|
+
|
|
100
|
+
def _weighted_ma(self, values):
|
|
101
|
+
weights = list(range(len(values), 0, -1))
|
|
102
|
+
total = sum(weights)
|
|
103
|
+
return sum(w * v for w, v in zip(weights, reversed(values))) / total
|
|
104
|
+
|
|
105
|
+
def next(self):
|
|
106
|
+
"""Compute smoothed LWMA and directional color for each bar."""
|
|
107
|
+
price = float(self.data.close[0])
|
|
108
|
+
self._price_window.append(price)
|
|
109
|
+
if len(self._price_window) < self._length:
|
|
110
|
+
self.lines.line_value[0] = float("nan")
|
|
111
|
+
self.lines.color_state[0] = float("nan")
|
|
112
|
+
return
|
|
113
|
+
lwma1 = self._weighted_ma(self._price_window)
|
|
114
|
+
self._lwma_window.append(lwma1)
|
|
115
|
+
if len(self._lwma_window) < self._length:
|
|
116
|
+
self.lines.line_value[0] = float("nan")
|
|
117
|
+
self.lines.color_state[0] = float("nan")
|
|
118
|
+
return
|
|
119
|
+
lwma2 = self._weighted_ma(self._lwma_window)
|
|
120
|
+
color = 1.0
|
|
121
|
+
prev = self.lines.line_value[-1] if len(self) > 0 else float("nan")
|
|
122
|
+
if prev == prev:
|
|
123
|
+
if prev < lwma2:
|
|
124
|
+
color = 2.0
|
|
125
|
+
elif prev > lwma2:
|
|
126
|
+
color = 0.0
|
|
127
|
+
self.lines.line_value[0] = lwma2
|
|
128
|
+
self.lines.color_state[0] = color
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
Indicator,
|
|
11
|
+
Stochastic,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"BrainTrendSignalProxy",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BrainTrendSignalProxy(Indicator):
|
|
20
|
+
"""Signal proxy that combines ATR and stochastic cross conditions."""
|
|
21
|
+
|
|
22
|
+
lines = ("buy_signal", "sell_signal")
|
|
23
|
+
params = (
|
|
24
|
+
("atr_period", 14),
|
|
25
|
+
("sto_period", 12),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
"""Initialize indicators and required warm-up bars."""
|
|
30
|
+
self.atr = AverageTrueRange(self.data, period=self.p.atr_period)
|
|
31
|
+
self.stoch = Stochastic(self.data, period=self.p.sto_period)
|
|
32
|
+
self.addminperiod(max(self.p.atr_period, self.p.sto_period) + 3)
|
|
33
|
+
|
|
34
|
+
def next(self):
|
|
35
|
+
"""Emit buy and sell trigger levels for the latest bar."""
|
|
36
|
+
buy_signal = 0.0
|
|
37
|
+
sell_signal = 0.0
|
|
38
|
+
close0 = float(self.data.close[0])
|
|
39
|
+
atr0 = float(self.atr[0])
|
|
40
|
+
k0 = float(self.stoch.percK[0])
|
|
41
|
+
k1 = float(self.stoch.percK[-1])
|
|
42
|
+
if k1 <= 20.0 and k0 > 20.0 and close0 > float(self.data.close[-1]) + atr0 * 0.1:
|
|
43
|
+
buy_signal = close0
|
|
44
|
+
elif k1 >= 80.0 and k0 < 80.0 and close0 < float(self.data.close[-1]) - atr0 * 0.1:
|
|
45
|
+
sell_signal = close0
|
|
46
|
+
self.lines.buy_signal[0] = buy_signal
|
|
47
|
+
self.lines.sell_signal[0] = sell_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 Indicator
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"BrakeParbIndicator",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BrakeParbIndicator(Indicator):
|
|
18
|
+
"""Parabolic-style trailing-stop indicator with flip arrows.
|
|
19
|
+
|
|
20
|
+
Maintains a power-curve stop that rises while long (and falls while short)
|
|
21
|
+
from a begin price; when price breaks the stop the direction flips. Exposes
|
|
22
|
+
the active stop on ``up``/``down`` lines and direction-flip cues on
|
|
23
|
+
``buy``/``sell`` lines.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
lines = ("buy", "sell", "up", "down")
|
|
27
|
+
params = (
|
|
28
|
+
("a", 1.5),
|
|
29
|
+
("b", 1.0),
|
|
30
|
+
("bigin_shift", 10.0),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def __init__(self):
|
|
34
|
+
"""Set the minimum period and initialize the parabolic-stop state."""
|
|
35
|
+
self.addminperiod(5)
|
|
36
|
+
self._is_long = True
|
|
37
|
+
self._max_price = float("-inf")
|
|
38
|
+
self._min_price = float("inf")
|
|
39
|
+
self._begin_bar = 0
|
|
40
|
+
self._begin_price = None
|
|
41
|
+
|
|
42
|
+
def next(self):
|
|
43
|
+
"""Advance the parabolic stop and emit up/down stop and flip lines.
|
|
44
|
+
|
|
45
|
+
Extends the stop along the power curve, flips direction (resetting the
|
|
46
|
+
begin price and extremes) when price breaks the stop, and sets the
|
|
47
|
+
``up``/``down`` stop lines plus ``buy``/``sell`` flip cues for the bar.
|
|
48
|
+
"""
|
|
49
|
+
if self._begin_price is None:
|
|
50
|
+
self._begin_price = float(self.data.low[0])
|
|
51
|
+
self._max_price = max(self._max_price, float(self.data.high[0]))
|
|
52
|
+
self._min_price = min(self._min_price, float(self.data.low[0]))
|
|
53
|
+
bars_since_begin = max(0, len(self.data) - 1 - self._begin_bar)
|
|
54
|
+
b = float(self.p.b) * 0.00001 * 15.0
|
|
55
|
+
bigin_shift = float(self.p.bigin_shift) * 0.00001
|
|
56
|
+
parab = math.pow(max(0.0, float(bars_since_begin)), float(self.p.a)) * b
|
|
57
|
+
value = self._begin_price + parab if self._is_long else self._begin_price - parab
|
|
58
|
+
if self._is_long and value > float(self.data.low[0]):
|
|
59
|
+
self._is_long = False
|
|
60
|
+
self._begin_price = self._max_price + bigin_shift
|
|
61
|
+
self._begin_bar = len(self.data) - 1
|
|
62
|
+
value = self._begin_price
|
|
63
|
+
self._max_price = float("-inf")
|
|
64
|
+
self._min_price = float("inf")
|
|
65
|
+
elif (not self._is_long) and value < float(self.data.high[0]):
|
|
66
|
+
self._is_long = True
|
|
67
|
+
self._begin_price = self._min_price - bigin_shift
|
|
68
|
+
self._begin_bar = len(self.data) - 1
|
|
69
|
+
value = self._begin_price
|
|
70
|
+
self._max_price = float("-inf")
|
|
71
|
+
self._min_price = float("inf")
|
|
72
|
+
prev_up = float(self.lines.up[-1]) if len(self) > 0 else 0.0
|
|
73
|
+
prev_dn = float(self.lines.down[-1]) if len(self) > 0 else 0.0
|
|
74
|
+
if self._is_long:
|
|
75
|
+
self.lines.up[0] = value
|
|
76
|
+
self.lines.down[0] = 0.0
|
|
77
|
+
else:
|
|
78
|
+
self.lines.up[0] = 0.0
|
|
79
|
+
self.lines.down[0] = value
|
|
80
|
+
self.lines.buy[0] = (
|
|
81
|
+
self.lines.down[0] if prev_up > 0.0 and float(self.lines.down[0]) > 0.0 else 0.0
|
|
82
|
+
)
|
|
83
|
+
self.lines.sell[0] = (
|
|
84
|
+
self.lines.up[0] if prev_dn > 0.0 and float(self.lines.up[0]) > 0.0 else 0.0
|
|
85
|
+
)
|
|
@@ -0,0 +1,121 @@
|
|
|
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
|
+
"BreakoutBarsTrendV2",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BreakoutBarsTrendV2(Indicator):
|
|
16
|
+
"""Custom trend-breakout indicator calculating dynamic trend boundaries and reversals.
|
|
17
|
+
|
|
18
|
+
Lines:
|
|
19
|
+
value: Trend state value (1.0 or positive series count for uptrend, -1.0 or negative series count for downtrend).
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
lines = ("value",)
|
|
23
|
+
params = (
|
|
24
|
+
("reversal_mode", "PERCENT"),
|
|
25
|
+
("delta", 1.0),
|
|
26
|
+
("point", 0.01),
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def __init__(self):
|
|
30
|
+
"""Initialize the indicator parameters, trend tracking states, and seed prices."""
|
|
31
|
+
self._mode = str(self.p.reversal_mode).upper()
|
|
32
|
+
self._delta = float(self.p.delta)
|
|
33
|
+
if self._mode == "PIPS":
|
|
34
|
+
if self._delta < 30.0:
|
|
35
|
+
self._delta = 1000.0
|
|
36
|
+
else:
|
|
37
|
+
if self._delta < 0.03 or self._delta > 30.0:
|
|
38
|
+
self._delta = 1.0
|
|
39
|
+
self._seed_close = None
|
|
40
|
+
self._seed_high = None
|
|
41
|
+
self._seed_low = None
|
|
42
|
+
self._initialized = False
|
|
43
|
+
self._uptrend = None
|
|
44
|
+
self._min_price = None
|
|
45
|
+
self._max_price = None
|
|
46
|
+
self.addminperiod(1)
|
|
47
|
+
|
|
48
|
+
def _reversal_distance(self, price):
|
|
49
|
+
"""Calculate the absolute price pullback distance threshold required for a trend reversal.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
price (float): Extreme reference price.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
float: Symmetrical price pullback distance.
|
|
56
|
+
"""
|
|
57
|
+
if self._mode == "PIPS":
|
|
58
|
+
return float(self._delta) * float(self.p.point)
|
|
59
|
+
return (float(price) / 100.0) * float(self._delta)
|
|
60
|
+
|
|
61
|
+
def next(self):
|
|
62
|
+
"""Determine if a trend reversal has occurred, and update trend extremes."""
|
|
63
|
+
close = float(self.data.close[0])
|
|
64
|
+
high = float(self.data.high[0])
|
|
65
|
+
low = float(self.data.low[0])
|
|
66
|
+
|
|
67
|
+
if self._seed_close is None:
|
|
68
|
+
self._seed_close = close
|
|
69
|
+
self._seed_high = high
|
|
70
|
+
self._seed_low = low
|
|
71
|
+
self.lines.value[0] = 0.0
|
|
72
|
+
return
|
|
73
|
+
|
|
74
|
+
if not self._initialized:
|
|
75
|
+
reversal = self._reversal_distance(self._seed_close)
|
|
76
|
+
if abs(close - self._seed_close) - reversal <= 0.00001:
|
|
77
|
+
self.lines.value[0] = 0.0
|
|
78
|
+
return
|
|
79
|
+
if close > self._seed_close:
|
|
80
|
+
self._initialized = True
|
|
81
|
+
self._uptrend = True
|
|
82
|
+
self._min_price = self._seed_low
|
|
83
|
+
self._max_price = high
|
|
84
|
+
self.lines.value[0] = 1.0
|
|
85
|
+
else:
|
|
86
|
+
self._initialized = True
|
|
87
|
+
self._uptrend = False
|
|
88
|
+
self._min_price = low
|
|
89
|
+
self._max_price = self._seed_high
|
|
90
|
+
self.lines.value[0] = -1.0
|
|
91
|
+
return
|
|
92
|
+
|
|
93
|
+
prev_value = float(self.lines.value[-1])
|
|
94
|
+
prev_high = float(self.data.high[-1])
|
|
95
|
+
prev_low = float(self.data.low[-1])
|
|
96
|
+
|
|
97
|
+
self._min_price = min(float(self._min_price), prev_low)
|
|
98
|
+
self._max_price = max(float(self._max_price), prev_high)
|
|
99
|
+
|
|
100
|
+
if self._uptrend:
|
|
101
|
+
reversal = self._reversal_distance(self._max_price)
|
|
102
|
+
if close > float(self._max_price):
|
|
103
|
+
self.lines.value[0] = prev_value + 1.0
|
|
104
|
+
elif close < max(float(self._max_price), high) - reversal and close < prev_low:
|
|
105
|
+
self._uptrend = False
|
|
106
|
+
self.lines.value[0] = -1.0
|
|
107
|
+
self._max_price = high
|
|
108
|
+
self._min_price = low
|
|
109
|
+
else:
|
|
110
|
+
self.lines.value[0] = prev_value
|
|
111
|
+
else:
|
|
112
|
+
reversal = self._reversal_distance(self._min_price)
|
|
113
|
+
if close < float(self._min_price):
|
|
114
|
+
self.lines.value[0] = prev_value - 1.0
|
|
115
|
+
elif close > min(float(self._min_price), low) + reversal and close > prev_high:
|
|
116
|
+
self._uptrend = True
|
|
117
|
+
self.lines.value[0] = 1.0
|
|
118
|
+
self._min_price = low
|
|
119
|
+
self._max_price = high
|
|
120
|
+
else:
|
|
121
|
+
self.lines.value[0] = prev_value
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
+
"BSIIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BSIIndicator(Indicator):
|
|
16
|
+
"""Balance of power-style indicator returning BSI value and trend color."""
|
|
17
|
+
|
|
18
|
+
lines = ("bsi", "color")
|
|
19
|
+
params = (
|
|
20
|
+
("range_period", 20),
|
|
21
|
+
("slowing", 3),
|
|
22
|
+
("avg_period", 3),
|
|
23
|
+
("volume_mode", "TICK"),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def __init__(self):
|
|
27
|
+
"""Set minimum period and initialize smoothing configuration."""
|
|
28
|
+
self.addminperiod(
|
|
29
|
+
int(self.p.range_period) + int(self.p.slowing) + int(self.p.avg_period) + 3
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def _component(self, ago):
|
|
33
|
+
sumpos = 0.0
|
|
34
|
+
sumneg = 0.0
|
|
35
|
+
sumhigh = 0.0
|
|
36
|
+
for k in range(int(self.p.slowing)):
|
|
37
|
+
idx = ago + k
|
|
38
|
+
highs = [float(self.data.high[-(idx + j)]) for j in range(int(self.p.range_period))]
|
|
39
|
+
lows = [float(self.data.low[-(idx + j)]) for j in range(int(self.p.range_period))]
|
|
40
|
+
hh = max(highs)
|
|
41
|
+
ll = min(lows)
|
|
42
|
+
rng = max(hh - ll, 1e-12)
|
|
43
|
+
bark_close = float(self.data.close[-idx])
|
|
44
|
+
bark_prev_close = float(self.data.close[-(idx + 1)])
|
|
45
|
+
bark_high = float(self.data.high[-idx])
|
|
46
|
+
bark_low = float(self.data.low[-idx])
|
|
47
|
+
sp = bark_high - bark_low
|
|
48
|
+
if self.p.volume_mode == "NONE":
|
|
49
|
+
vol = 1.0
|
|
50
|
+
elif self.p.volume_mode == "VOLUME":
|
|
51
|
+
vmax = max(
|
|
52
|
+
float(self.data.openinterest[-(idx + j)])
|
|
53
|
+
for j in range(int(self.p.range_period))
|
|
54
|
+
)
|
|
55
|
+
vol = float(self.data.openinterest[-idx]) / vmax if vmax else 0.0
|
|
56
|
+
else:
|
|
57
|
+
vmax = max(
|
|
58
|
+
float(self.data.volume[-(idx + j)]) for j in range(int(self.p.range_period))
|
|
59
|
+
)
|
|
60
|
+
vol = float(self.data.volume[-idx]) / vmax if vmax else 0.0
|
|
61
|
+
ratio = 0.0
|
|
62
|
+
if not (bark_prev_close - sp * 0.2 > bark_close):
|
|
63
|
+
ratio = 1.0 if bark_low == ll else (hh - bark_low) / rng
|
|
64
|
+
sumpos += (bark_close - bark_low) * ratio * vol
|
|
65
|
+
if not (bark_prev_close + sp * 0.2 < bark_close):
|
|
66
|
+
ratio = 1.0 if bark_high == hh else (bark_high - ll) / rng
|
|
67
|
+
sumneg += (bark_high - bark_close) * ratio * vol * -1.0
|
|
68
|
+
sumhigh += rng
|
|
69
|
+
if not sumhigh:
|
|
70
|
+
return 0.0
|
|
71
|
+
return (sumpos / sumhigh * 100.0) + (sumneg / sumhigh * 100.0)
|
|
72
|
+
|
|
73
|
+
def next(self):
|
|
74
|
+
"""Compute BSI and derive color from directional BSI movement."""
|
|
75
|
+
vals = [self._component(i) for i in range(int(self.p.avg_period))]
|
|
76
|
+
bsi = sum(vals) / float(int(self.p.avg_period))
|
|
77
|
+
self.lines.bsi[0] = bsi
|
|
78
|
+
if len(self) < 2:
|
|
79
|
+
self.lines.color[0] = 1.0
|
|
80
|
+
return
|
|
81
|
+
prev = float(self.lines.bsi[-1])
|
|
82
|
+
color = 1.0
|
|
83
|
+
if prev > bsi:
|
|
84
|
+
color = 0.0
|
|
85
|
+
if prev < bsi:
|
|
86
|
+
color = 2.0
|
|
87
|
+
self.lines.color[0] = color
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"BullsBearsEyes",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class BullsBearsEyes(Indicator):
|
|
19
|
+
"""Rebuild a signal oscillator from recursive smoothed directional momentum."""
|
|
20
|
+
|
|
21
|
+
lines = ("value",)
|
|
22
|
+
params = (
|
|
23
|
+
("period", 13),
|
|
24
|
+
("gamma", 0.6),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
"""Initialize EMA and recursive helper state used by the indicator."""
|
|
29
|
+
self.ema = ExponentialMovingAverage(self.data.close, period=int(self.p.period))
|
|
30
|
+
self.addminperiod(int(self.p.period) + 5)
|
|
31
|
+
self._l0 = 0.0
|
|
32
|
+
self._l1 = 0.0
|
|
33
|
+
self._l2 = 0.0
|
|
34
|
+
self._l3 = 0.0
|
|
35
|
+
|
|
36
|
+
def next(self):
|
|
37
|
+
"""Compute the next recursive signal value and write it to ``lines.value``."""
|
|
38
|
+
bulls = float(self.data.high[0] - self.ema[0])
|
|
39
|
+
bears = float(self.data.low[0] - self.ema[0])
|
|
40
|
+
gamma = float(self.p.gamma)
|
|
41
|
+
l0a = self._l0
|
|
42
|
+
l1a = self._l1
|
|
43
|
+
l2a = self._l2
|
|
44
|
+
l3a = self._l3
|
|
45
|
+
l0 = (1.0 - gamma) * (bears + bulls) + gamma * l0a
|
|
46
|
+
l1 = -gamma * l0 + l0a + gamma * l1a
|
|
47
|
+
l2 = -gamma * l1 + l1a + gamma * l2a
|
|
48
|
+
l3 = -gamma * l2 + l2a + gamma * l3a
|
|
49
|
+
cu = 0.0
|
|
50
|
+
cd = 0.0
|
|
51
|
+
if l0 >= l1:
|
|
52
|
+
cu += l0 - l1
|
|
53
|
+
else:
|
|
54
|
+
cd += l1 - l0
|
|
55
|
+
if l1 >= l2:
|
|
56
|
+
cu += l1 - l2
|
|
57
|
+
else:
|
|
58
|
+
cd += l2 - l1
|
|
59
|
+
if l2 >= l3:
|
|
60
|
+
cu += l2 - l3
|
|
61
|
+
else:
|
|
62
|
+
cd += l3 - l2
|
|
63
|
+
self.lines.value[0] = cu / (cu + cd) if (cu + cd) != 0.0 else 0.0
|
|
64
|
+
self._l0 = l0
|
|
65
|
+
self._l1 = l1
|
|
66
|
+
self._l2 = l2
|
|
67
|
+
self._l3 = l3
|