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,64 @@
|
|
|
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
|
+
"ThreeLineBreakIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ThreeLineBreakIndicator(Indicator):
|
|
16
|
+
"""Three Line Break indicator used as a higher-timeframe trend signal source.
|
|
17
|
+
|
|
18
|
+
The indicator tracks a directional swing state based on the last
|
|
19
|
+
``lines_break`` bars. A bearish-to-bullish and bullish-to-bearish shift
|
|
20
|
+
is confirmed by breakouts above the recent highs or below the recent lows.
|
|
21
|
+
|
|
22
|
+
Output lines:
|
|
23
|
+
- ``trend``: ``1.0`` for bullish trend, ``0.0`` for bearish trend.
|
|
24
|
+
- ``line_high``: current bar high value.
|
|
25
|
+
- ``line_low``: current bar low value.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
lines = ("trend", "line_high", "line_low")
|
|
29
|
+
params = (("lines_break", 3),)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Initialize internal swing state and minimum period.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
lines_break: Number of bars used for the breakout envelope.
|
|
36
|
+
"""
|
|
37
|
+
self._swing = True
|
|
38
|
+
self._initialized = False
|
|
39
|
+
self.addminperiod(int(self.p.lines_break) + 2)
|
|
40
|
+
|
|
41
|
+
def next(self):
|
|
42
|
+
"""Advance the Three Line Break trend and output the current trend lines.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
None.
|
|
46
|
+
"""
|
|
47
|
+
lines_break = int(self.p.lines_break)
|
|
48
|
+
if len(self.data) <= lines_break:
|
|
49
|
+
self.lines.trend[0] = 0.0 if self._swing else 1.0
|
|
50
|
+
self.lines.line_high[0] = float(self.data.high[0])
|
|
51
|
+
self.lines.line_low[0] = float(self.data.low[0])
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
hh = max(float(self.data.high[-i]) for i in range(1, lines_break + 1))
|
|
55
|
+
ll = min(float(self.data.low[-i]) for i in range(1, lines_break + 1))
|
|
56
|
+
|
|
57
|
+
if self._swing and float(self.data.low[0]) < ll:
|
|
58
|
+
self._swing = False
|
|
59
|
+
if (not self._swing) and float(self.data.high[0]) > hh:
|
|
60
|
+
self._swing = True
|
|
61
|
+
|
|
62
|
+
self.lines.line_high[0] = float(self.data.high[0])
|
|
63
|
+
self.lines.line_low[0] = float(self.data.low[0])
|
|
64
|
+
self.lines.trend[0] = 0.0 if self._swing else 1.0
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from backtrader.utils.dateintern import num2date
|
|
9
|
+
|
|
10
|
+
from .. import Indicator
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"TimeLine",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TimeLine(Indicator):
|
|
18
|
+
"""Time average price line indicator
|
|
19
|
+
|
|
20
|
+
Calculate the cumulative average of the day's closing prices as the time average price line
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
lines = ("day_avg_price",)
|
|
24
|
+
params = (("day_end_time", (15, 0, 0)),)
|
|
25
|
+
|
|
26
|
+
def __init__(self):
|
|
27
|
+
"""Initialize the TimeLine indicator.
|
|
28
|
+
|
|
29
|
+
Creates an empty list to store closing prices for the current day.
|
|
30
|
+
The cumulative average of these prices will be calculated as the
|
|
31
|
+
time average price line.
|
|
32
|
+
"""
|
|
33
|
+
self.day_close_price_list = []
|
|
34
|
+
|
|
35
|
+
def next(self):
|
|
36
|
+
"""Calculate the time average price for the current bar.
|
|
37
|
+
|
|
38
|
+
This method is called for each bar in the data series. It:
|
|
39
|
+
1. Appends the current bar's close price to the day's price list
|
|
40
|
+
2. Calculates the cumulative average of all prices in the list
|
|
41
|
+
3. Resets the price list at the end of the trading day
|
|
42
|
+
|
|
43
|
+
The time average price line is useful for intraday strategies as it
|
|
44
|
+
represents the average entry price of all market participants throughout
|
|
45
|
+
the day.
|
|
46
|
+
"""
|
|
47
|
+
self.day_close_price_list.append(self.data.close[0])
|
|
48
|
+
self.lines.day_avg_price[0] = sum(self.day_close_price_list) / len(
|
|
49
|
+
self.day_close_price_list
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
self.current_datetime = num2date(self.data.datetime[0])
|
|
53
|
+
self.current_hour = self.current_datetime.hour
|
|
54
|
+
self.current_minute = self.current_datetime.minute
|
|
55
|
+
day_end_hour, day_end_minute, _ = self.p.day_end_time
|
|
56
|
+
if self.current_hour == day_end_hour and self.current_minute == day_end_minute:
|
|
57
|
+
self.day_close_price_list = []
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
Indicator,
|
|
10
|
+
SimpleMovingAverage,
|
|
11
|
+
StandardDeviation,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"TradingChannelIndexProxy",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TradingChannelIndexProxy(Indicator):
|
|
20
|
+
"""Indicator computing Trading Channel Index (TCI) and quantized state."""
|
|
21
|
+
|
|
22
|
+
lines = ("tci", "color_index")
|
|
23
|
+
params = (
|
|
24
|
+
("length1", 60),
|
|
25
|
+
("length2", 30),
|
|
26
|
+
("coeff", 0.015),
|
|
27
|
+
("high_level", 50),
|
|
28
|
+
("low_level", -50),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Initialize indicator inputs used by the TCI computation."""
|
|
33
|
+
self.sma1 = SimpleMovingAverage(self.data.close, period=self.p.length1)
|
|
34
|
+
self.dev = StandardDeviation(self.data.close, period=self.p.length1)
|
|
35
|
+
self.addminperiod(max(self.p.length1, self.p.length2) + 5)
|
|
36
|
+
|
|
37
|
+
def next(self):
|
|
38
|
+
"""Compute raw TCI and discretized color state for the current bar."""
|
|
39
|
+
base = float(self.sma1[0])
|
|
40
|
+
dev = max(float(self.dev[0]), 1e-8)
|
|
41
|
+
raw = (float(self.data.close[0]) - base) / (dev * self.p.coeff)
|
|
42
|
+
self.lines.tci[0] = raw
|
|
43
|
+
if raw <= self.p.low_level:
|
|
44
|
+
self.lines.color_index[0] = 0.0
|
|
45
|
+
elif raw >= self.p.high_level:
|
|
46
|
+
self.lines.color_index[0] = 4.0
|
|
47
|
+
else:
|
|
48
|
+
self.lines.color_index[0] = 2.0
|
|
@@ -0,0 +1,109 @@
|
|
|
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
|
+
"TrendArrowsIndicator",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TrendArrowsIndicator(Indicator):
|
|
18
|
+
"""Reconstructs trend_arrows indicator.
|
|
19
|
+
|
|
20
|
+
Computes AverageHigh (avg of highest highs over iPeriod sub-windows)
|
|
21
|
+
and AverageLow (avg of lowest lows over iPeriod sub-windows).
|
|
22
|
+
TrendUp = LL when close > HH; TrendDown = HH when close < LL;
|
|
23
|
+
else continues previous trend.
|
|
24
|
+
SignUp when TrendUp appears fresh; SignDown when TrendDown appears fresh.
|
|
25
|
+
Buffers: 0=TrendUp, 1=TrendDown, 2=SignUp(buy), 3=SignDown(sell).
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
lines = ("trend_up", "trend_down", "sign_up", "sign_down")
|
|
29
|
+
params = (
|
|
30
|
+
("iperiod", 15),
|
|
31
|
+
("ifullperiods", 1),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
def __init__(self):
|
|
35
|
+
"""Initialize cached period lengths for trend arrow reconstruction."""
|
|
36
|
+
self._ip = int(self.p.iperiod)
|
|
37
|
+
self._ifp = int(self.p.ifullperiods)
|
|
38
|
+
self._window = self._ip + self._ifp
|
|
39
|
+
self.addminperiod(self._window + 2)
|
|
40
|
+
|
|
41
|
+
def next(self):
|
|
42
|
+
"""Compute trend and signal buffers for the current bar.
|
|
43
|
+
|
|
44
|
+
The method:
|
|
45
|
+
1. Splits the lookback window into `iperiod` sub-windows and averages highs/lows.
|
|
46
|
+
2. Generates TrendUp/TrendDown buffers based on close relative to aggregated levels.
|
|
47
|
+
3. Emits SignUp/SignDown only on fresh transitions from inactive to active.
|
|
48
|
+
"""
|
|
49
|
+
ip = self._ip
|
|
50
|
+
window = self._window
|
|
51
|
+
|
|
52
|
+
# Compute AverageHigh: average of highest highs over ip sub-windows
|
|
53
|
+
segment_size = max(window // ip, 1)
|
|
54
|
+
hh_sum = 0.0
|
|
55
|
+
ll_sum = 0.0
|
|
56
|
+
count = 0
|
|
57
|
+
for seg in range(ip):
|
|
58
|
+
start = seg * segment_size
|
|
59
|
+
end = min(start + segment_size, window)
|
|
60
|
+
if start >= len(self.data):
|
|
61
|
+
break
|
|
62
|
+
seg_high = -1e30
|
|
63
|
+
seg_low = 1e30
|
|
64
|
+
for k in range(start, min(end, len(self.data))):
|
|
65
|
+
h = float(self.data.high[-k]) if k > 0 else float(self.data.high[0])
|
|
66
|
+
low_price = float(self.data.low[-k]) if k > 0 else float(self.data.low[0])
|
|
67
|
+
if h > seg_high:
|
|
68
|
+
seg_high = h
|
|
69
|
+
if low_price < seg_low:
|
|
70
|
+
seg_low = low_price
|
|
71
|
+
hh_sum += seg_high
|
|
72
|
+
ll_sum += seg_low
|
|
73
|
+
count += 1
|
|
74
|
+
|
|
75
|
+
hh = hh_sum / count if count else float(self.data.high[0])
|
|
76
|
+
ll = ll_sum / count if count else float(self.data.low[0])
|
|
77
|
+
|
|
78
|
+
close_val = float(self.data.close[0])
|
|
79
|
+
prev_tu = float(self.lines.trend_up[-1]) if len(self.lines.trend_up) > 1 else 0.0
|
|
80
|
+
prev_td = float(self.lines.trend_down[-1]) if len(self.lines.trend_down) > 1 else 0.0
|
|
81
|
+
if math.isnan(prev_tu):
|
|
82
|
+
prev_tu = 0.0
|
|
83
|
+
if math.isnan(prev_td):
|
|
84
|
+
prev_td = 0.0
|
|
85
|
+
|
|
86
|
+
tu = 0.0
|
|
87
|
+
td = 0.0
|
|
88
|
+
|
|
89
|
+
if close_val > hh:
|
|
90
|
+
tu = ll
|
|
91
|
+
elif close_val < ll:
|
|
92
|
+
td = hh
|
|
93
|
+
else:
|
|
94
|
+
if prev_td != 0.0:
|
|
95
|
+
td = hh
|
|
96
|
+
if prev_tu != 0.0:
|
|
97
|
+
tu = ll
|
|
98
|
+
|
|
99
|
+
su = 0.0
|
|
100
|
+
sd = 0.0
|
|
101
|
+
if prev_tu == 0.0 and tu != 0.0:
|
|
102
|
+
su = tu
|
|
103
|
+
if prev_td == 0.0 and td != 0.0:
|
|
104
|
+
sd = td
|
|
105
|
+
|
|
106
|
+
self.lines.trend_up[0] = tu
|
|
107
|
+
self.lines.trend_down[0] = td
|
|
108
|
+
self.lines.sign_up[0] = su
|
|
109
|
+
self.lines.sign_down[0] = sd
|
|
@@ -0,0 +1,127 @@
|
|
|
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
|
+
"TrendContinuationIndicator",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def resolve_ma_class(name):
|
|
22
|
+
"""Resolve a strategy MA mode string to a Backtrader MA indicator class."""
|
|
23
|
+
mode = str(name).lower()
|
|
24
|
+
if mode in {"mode_sma", "sma"}:
|
|
25
|
+
return SimpleMovingAverage
|
|
26
|
+
if mode in {
|
|
27
|
+
"mode_ema",
|
|
28
|
+
"ema",
|
|
29
|
+
"mode_jjma",
|
|
30
|
+
"jjma",
|
|
31
|
+
"mode_jurx",
|
|
32
|
+
"jurx",
|
|
33
|
+
"mode_parma",
|
|
34
|
+
"parma",
|
|
35
|
+
"mode_t3",
|
|
36
|
+
"t3",
|
|
37
|
+
"mode_vidya",
|
|
38
|
+
"vidya",
|
|
39
|
+
"mode_ama",
|
|
40
|
+
"ama",
|
|
41
|
+
}:
|
|
42
|
+
return ExponentialMovingAverage
|
|
43
|
+
if mode in {"mode_smma", "smma"}:
|
|
44
|
+
return SmoothedMovingAverage
|
|
45
|
+
return WeightedMovingAverage
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def resolve_price_line(data, mode):
|
|
49
|
+
"""Resolve requested price source string to the corresponding line in data.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
data: Backtrader data feed.
|
|
53
|
+
mode: Configured price selector such as ``price_close`` or ``price_open``.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
A line object for the selected price representation.
|
|
57
|
+
"""
|
|
58
|
+
price_mode = str(mode).lower()
|
|
59
|
+
if price_mode in {"price_open", "open"}:
|
|
60
|
+
return data.open
|
|
61
|
+
if price_mode in {"price_high", "high"}:
|
|
62
|
+
return data.high
|
|
63
|
+
if price_mode in {"price_low", "low"}:
|
|
64
|
+
return data.low
|
|
65
|
+
if price_mode in {"price_median", "median"}:
|
|
66
|
+
return (data.high + data.low) / 2.0
|
|
67
|
+
if price_mode in {"price_typical", "typical"}:
|
|
68
|
+
return (data.high + data.low + data.close) / 3.0
|
|
69
|
+
if price_mode in {"price_weighted", "weighted"}:
|
|
70
|
+
return (2.0 * data.close + data.high + data.low) / 4.0
|
|
71
|
+
if price_mode in {"price_simpl", "simpl"}:
|
|
72
|
+
return (data.open + data.close) / 2.0
|
|
73
|
+
if price_mode in {"price_quarter", "quarter"}:
|
|
74
|
+
return (data.high + data.low + data.open + data.close) / 4.0
|
|
75
|
+
return data.close
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class TrendContinuationIndicator(Indicator):
|
|
79
|
+
"""Momentum continuation indicator using smoothed up/down directional components."""
|
|
80
|
+
|
|
81
|
+
lines = ("up", "down")
|
|
82
|
+
params = (
|
|
83
|
+
("nperiod", 20),
|
|
84
|
+
("xmethod", "t3"),
|
|
85
|
+
("xperiod", 5),
|
|
86
|
+
("xphase", 61),
|
|
87
|
+
("ipc", "price_close"),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def __init__(self):
|
|
91
|
+
"""Resolve price source and moving-average class then enforce warm-up period."""
|
|
92
|
+
self._price = resolve_price_line(self.data, self.p.ipc)
|
|
93
|
+
self._ma_cls = resolve_ma_class(self.p.xmethod)
|
|
94
|
+
self.addminperiod(int(self.p.nperiod) + int(self.p.xperiod) + 5)
|
|
95
|
+
|
|
96
|
+
def next(self):
|
|
97
|
+
"""Compute smoothed up/down continuation values from directional price differences."""
|
|
98
|
+
nperiod = max(2, int(self.p.nperiod))
|
|
99
|
+
float(self._price[0]) - float(self._price[-1])
|
|
100
|
+
positives = []
|
|
101
|
+
negatives = []
|
|
102
|
+
cf_p = []
|
|
103
|
+
cf_n = []
|
|
104
|
+
running_p = 0.0
|
|
105
|
+
running_n = 0.0
|
|
106
|
+
for i in range(nperiod):
|
|
107
|
+
diff = float(self._price[-i]) - float(self._price[-i - 1])
|
|
108
|
+
pos = -diff if diff > 0 else 0.0
|
|
109
|
+
neg = diff if diff < 0 else 0.0
|
|
110
|
+
running_p += pos
|
|
111
|
+
running_n += neg
|
|
112
|
+
positives.append(pos)
|
|
113
|
+
negatives.append(neg)
|
|
114
|
+
cf_p.append(running_p)
|
|
115
|
+
cf_n.append(running_n)
|
|
116
|
+
ch_p = sum(positives)
|
|
117
|
+
ch_n = sum(negatives)
|
|
118
|
+
cff_p = sum(cf_p)
|
|
119
|
+
cff_n = sum(cf_n)
|
|
120
|
+
k_p = ch_p - cff_n
|
|
121
|
+
k_n = ch_n - cff_p
|
|
122
|
+
period = max(1, int(self.p.xperiod))
|
|
123
|
+
alpha = 2.0 / (period + 1.0)
|
|
124
|
+
prev_up = float(self.lines.up[-1]) if len(self) > 0 else k_p
|
|
125
|
+
prev_dn = float(self.lines.down[-1]) if len(self) > 0 else k_n
|
|
126
|
+
self.lines.up[0] = alpha * k_p + (1.0 - alpha) * prev_up if len(self) > 0 else k_p
|
|
127
|
+
self.lines.down[0] = alpha * k_n + (1.0 - alpha) * prev_dn if len(self) > 0 else k_n
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
StandardDeviation,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"TrendIntensityIndexProxy",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TrendIntensityIndexProxy(Indicator):
|
|
21
|
+
"""Indicator computing Trend Intensity Index (TII) and quantized state."""
|
|
22
|
+
|
|
23
|
+
lines = ("tii", "color_index")
|
|
24
|
+
params = (
|
|
25
|
+
("length1", 60),
|
|
26
|
+
("length2", 30),
|
|
27
|
+
("high_level", 80),
|
|
28
|
+
("low_level", 20),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Initialize SMA/EMA/dev components for TII calculation."""
|
|
33
|
+
self.sma = SimpleMovingAverage(self.data.close, period=self.p.length1)
|
|
34
|
+
self.smooth = ExponentialMovingAverage(self.data.close, period=self.p.length2)
|
|
35
|
+
self.dev = StandardDeviation(self.data.close, period=self.p.length1)
|
|
36
|
+
self.addminperiod(max(self.p.length1, self.p.length2) + 5)
|
|
37
|
+
|
|
38
|
+
def next(self):
|
|
39
|
+
"""Compute normalized TII value and discretized color state."""
|
|
40
|
+
baseline = float(self.sma[0])
|
|
41
|
+
smoothed = float(self.smooth[0])
|
|
42
|
+
dev = max(float(self.dev[0]), 1e-8)
|
|
43
|
+
value = 50.0 + (smoothed - baseline) / dev * 10.0
|
|
44
|
+
value = max(0.0, min(100.0, value))
|
|
45
|
+
self.lines.tii[0] = value
|
|
46
|
+
if value <= self.p.low_level:
|
|
47
|
+
self.lines.color_index[0] = 0.0
|
|
48
|
+
elif value >= self.p.high_level:
|
|
49
|
+
self.lines.color_index[0] = 4.0
|
|
50
|
+
else:
|
|
51
|
+
self.lines.color_index[0] = 2.0
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
Indicator,
|
|
10
|
+
SimpleMovingAverage,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"TrendManagerIndicator",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TrendManagerIndicator(Indicator):
|
|
19
|
+
"""Simple MA-based trend indicator generating color state."""
|
|
20
|
+
|
|
21
|
+
lines = ("color_state", "fast_line", "slow_line")
|
|
22
|
+
params = (
|
|
23
|
+
("length1", 23),
|
|
24
|
+
("length2", 84),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
"""Initialize fast and slow SMAs for crossover detection."""
|
|
29
|
+
self.fast = SimpleMovingAverage(self.data.close, period=self.p.length1)
|
|
30
|
+
self.slow = SimpleMovingAverage(self.data.close, period=self.p.length2)
|
|
31
|
+
self.addminperiod(max(self.p.length1, self.p.length2) + 3)
|
|
32
|
+
|
|
33
|
+
def next(self):
|
|
34
|
+
"""Update trend lines and color state on each bar."""
|
|
35
|
+
fast = float(self.fast[0])
|
|
36
|
+
slow = float(self.slow[0])
|
|
37
|
+
self.lines.fast_line[0] = fast
|
|
38
|
+
self.lines.slow_line[0] = slow
|
|
39
|
+
self.lines.color_state[0] = 0.0 if fast >= slow else 1.0
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
TRIX,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"TriXCandleIndicator",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TriXCandleIndicator(Indicator):
|
|
19
|
+
"""Indicator that transforms TRIX values into a candle-style representation."""
|
|
20
|
+
|
|
21
|
+
lines = ("o", "h", "l", "c", "color")
|
|
22
|
+
params = (("period", 14),)
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
"""Initialize TRIX line calculators and minimum data warmup."""
|
|
26
|
+
self.addminperiod(int(self.p.period) + 2)
|
|
27
|
+
self.trix_open = TRIX(self.data.open, period=int(self.p.period))
|
|
28
|
+
self.trix_high = TRIX(self.data.high, period=int(self.p.period))
|
|
29
|
+
self.trix_low = TRIX(self.data.low, period=int(self.p.period))
|
|
30
|
+
self.trix_close = TRIX(self.data.close, period=int(self.p.period))
|
|
31
|
+
|
|
32
|
+
def next(self):
|
|
33
|
+
"""Compute per-bar TRIX O/H/L/C proxy values and color state."""
|
|
34
|
+
o = float(self.trix_open[0])
|
|
35
|
+
h = float(self.trix_high[0])
|
|
36
|
+
low_price = float(self.trix_low[0])
|
|
37
|
+
c = float(self.trix_close[0])
|
|
38
|
+
mx = max(o, c)
|
|
39
|
+
mn = min(o, c)
|
|
40
|
+
h = max(mx, h)
|
|
41
|
+
low_price = min(mn, low_price)
|
|
42
|
+
color = 1
|
|
43
|
+
if o < c:
|
|
44
|
+
color = 2
|
|
45
|
+
elif o > c:
|
|
46
|
+
color = 0
|
|
47
|
+
self.lines.o[0] = o
|
|
48
|
+
self.lines.h[0] = h
|
|
49
|
+
self.lines.l[0] = low_price
|
|
50
|
+
self.lines.c[0] = c
|
|
51
|
+
self.lines.color[0] = color
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
"TriggerLine",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TriggerLine(Indicator):
|
|
16
|
+
"""Trigger-line indicator tracking momentum-driven main and signal lines."""
|
|
17
|
+
|
|
18
|
+
lines = ("main", "signal")
|
|
19
|
+
params = (
|
|
20
|
+
("rperiod", 24),
|
|
21
|
+
("lsma_period", 6),
|
|
22
|
+
("price", "close"),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Initialize indicator coefficients and warmup."""
|
|
27
|
+
self.addminperiod(int(self.p.rperiod) + 3)
|
|
28
|
+
self.lengthvar = (int(self.p.rperiod) + 1) / 3.0
|
|
29
|
+
self.kr = 6.0 / (float(self.p.rperiod) * (float(self.p.rperiod) + 1.0))
|
|
30
|
+
self.klsma = 2.0 / (float(self.p.lsma_period) + 1.0)
|
|
31
|
+
|
|
32
|
+
def _price(self, index=0):
|
|
33
|
+
p = str(self.p.price).lower()
|
|
34
|
+
if p == "open":
|
|
35
|
+
return float(self.data.open[index])
|
|
36
|
+
if p == "high":
|
|
37
|
+
return float(self.data.high[index])
|
|
38
|
+
if p == "low":
|
|
39
|
+
return float(self.data.low[index])
|
|
40
|
+
if p == "median":
|
|
41
|
+
return (float(self.data.high[index]) + float(self.data.low[index])) / 2.0
|
|
42
|
+
if p == "typical":
|
|
43
|
+
return (
|
|
44
|
+
float(self.data.high[index])
|
|
45
|
+
+ float(self.data.low[index])
|
|
46
|
+
+ float(self.data.close[index])
|
|
47
|
+
) / 3.0
|
|
48
|
+
if p == "weighted":
|
|
49
|
+
return (
|
|
50
|
+
float(self.data.high[index])
|
|
51
|
+
+ float(self.data.low[index])
|
|
52
|
+
+ 2.0 * float(self.data.close[index])
|
|
53
|
+
) / 4.0
|
|
54
|
+
return float(self.data.close[index])
|
|
55
|
+
|
|
56
|
+
def next(self):
|
|
57
|
+
"""Compute main and signal values for current bar."""
|
|
58
|
+
total = 0.0
|
|
59
|
+
rp = int(self.p.rperiod)
|
|
60
|
+
for iii in range(rp, 0, -1):
|
|
61
|
+
idx = -(rp - iii)
|
|
62
|
+
total += (iii - self.lengthvar) * self._price(idx)
|
|
63
|
+
main = total * self.kr
|
|
64
|
+
prev_main = float(self.lines.main[-1]) if len(self) > 1 else main
|
|
65
|
+
self.lines.main[0] = main
|
|
66
|
+
self.lines.signal[0] = prev_main + (main - prev_main) * self.klsma
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
EMA,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"TripleEmaRate",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TripleEmaRate(Indicator):
|
|
19
|
+
"""TRIX: the bar-over-bar rate of change of a triple-smoothed EMA."""
|
|
20
|
+
|
|
21
|
+
lines = ("value",)
|
|
22
|
+
params = (("period", 14),)
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
"""Build the three chained EMAs and set the minimum warm-up period."""
|
|
26
|
+
self.ema1 = EMA(self.data, period=self.p.period)
|
|
27
|
+
self.ema2 = EMA(self.ema1, period=self.p.period)
|
|
28
|
+
self.ema3 = EMA(self.ema2, period=self.p.period)
|
|
29
|
+
self.addminperiod(self.p.period * 3 + 2)
|
|
30
|
+
|
|
31
|
+
def next(self):
|
|
32
|
+
"""Emit the fractional change of the triple EMA versus the prior bar."""
|
|
33
|
+
prev = float(self.ema3[-1])
|
|
34
|
+
self.lines.value[0] = (float(self.ema3[0]) - prev) / prev if prev else 0.0
|