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,104 @@
|
|
|
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
|
+
"PriceChannelStopIndicator",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class PriceChannelStopIndicator(Indicator):
|
|
18
|
+
"""Reconstructs PriceChannel_Stop from its MQ5 source.
|
|
19
|
+
|
|
20
|
+
6 output buffers mapped to lines:
|
|
21
|
+
0=DownTrendSignal, 1=DownTrendBuffer, 2=DownTrendLine
|
|
22
|
+
3=UpTrendSignal, 4=UpTrendBuffer, 5=UpTrendLine
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
lines = ("down_signal", "down_buffer", "down_line", "up_signal", "up_buffer", "up_line")
|
|
26
|
+
params = (
|
|
27
|
+
("channel_period", 5),
|
|
28
|
+
("risk", 0.1),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Initialize oscillator state and force initial warm-up period."""
|
|
33
|
+
self._cp = int(self.p.channel_period)
|
|
34
|
+
self._risk = float(self.p.risk)
|
|
35
|
+
self._trend = 0
|
|
36
|
+
self._prev_bsmax = 0.0
|
|
37
|
+
self._prev_bsmin = 0.0
|
|
38
|
+
self.addminperiod(self._cp + 2)
|
|
39
|
+
|
|
40
|
+
def next(self):
|
|
41
|
+
"""Update indicator lines from current and rolling high/low windows."""
|
|
42
|
+
cp = self._cp
|
|
43
|
+
risk = self._risk
|
|
44
|
+
|
|
45
|
+
# Highest high and lowest low over [bar, bar+ChannelPeriod)
|
|
46
|
+
hi = max(float(self.data.high[-i]) for i in range(cp))
|
|
47
|
+
lo = min(float(self.data.low[-i]) for i in range(cp))
|
|
48
|
+
|
|
49
|
+
d_price = (hi - lo) * risk
|
|
50
|
+
bsmax = hi - d_price
|
|
51
|
+
bsmin = lo + d_price
|
|
52
|
+
|
|
53
|
+
cur_close = float(self.data.close[0])
|
|
54
|
+
|
|
55
|
+
if cur_close > self._prev_bsmax:
|
|
56
|
+
self._trend = 1
|
|
57
|
+
if cur_close < self._prev_bsmin:
|
|
58
|
+
self._trend = -1
|
|
59
|
+
|
|
60
|
+
# Ratchet
|
|
61
|
+
if self._trend > 0 and bsmin < self._prev_bsmin:
|
|
62
|
+
bsmin = self._prev_bsmin
|
|
63
|
+
if self._trend < 0 and bsmax > self._prev_bsmax:
|
|
64
|
+
bsmax = self._prev_bsmax
|
|
65
|
+
|
|
66
|
+
# Reset all
|
|
67
|
+
self.lines.down_signal[0] = 0.0
|
|
68
|
+
self.lines.down_buffer[0] = 0.0
|
|
69
|
+
self.lines.down_line[0] = 0.0
|
|
70
|
+
self.lines.up_signal[0] = 0.0
|
|
71
|
+
self.lines.up_buffer[0] = 0.0
|
|
72
|
+
self.lines.up_line[0] = 0.0
|
|
73
|
+
|
|
74
|
+
prev_down_buffer = (
|
|
75
|
+
float(self.lines.down_buffer[-1])
|
|
76
|
+
if len(self) > 1 and not math.isnan(float(self.lines.down_buffer[-1]))
|
|
77
|
+
else 0.0
|
|
78
|
+
)
|
|
79
|
+
prev_up_buffer = (
|
|
80
|
+
float(self.lines.up_buffer[-1])
|
|
81
|
+
if len(self) > 1 and not math.isnan(float(self.lines.up_buffer[-1]))
|
|
82
|
+
else 0.0
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if self._trend > 0:
|
|
86
|
+
price = bsmin
|
|
87
|
+
if prev_down_buffer > 0:
|
|
88
|
+
self.lines.up_signal[0] = price
|
|
89
|
+
self.lines.up_line[0] = price
|
|
90
|
+
else:
|
|
91
|
+
self.lines.up_buffer[0] = price
|
|
92
|
+
self.lines.up_line[0] = price
|
|
93
|
+
|
|
94
|
+
if self._trend < 0:
|
|
95
|
+
price = bsmax
|
|
96
|
+
if prev_up_buffer > 0:
|
|
97
|
+
self.lines.down_signal[0] = price
|
|
98
|
+
self.lines.down_line[0] = price
|
|
99
|
+
else:
|
|
100
|
+
self.lines.down_buffer[0] = price
|
|
101
|
+
self.lines.down_line[0] = price
|
|
102
|
+
|
|
103
|
+
self._prev_bsmax = bsmax
|
|
104
|
+
self._prev_bsmin = bsmin
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
Highest,
|
|
10
|
+
Indicator,
|
|
11
|
+
Lowest,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"PriceExtremeChannel",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class PriceExtremeChannel(Indicator):
|
|
20
|
+
"""Custom indicator calculating local highest highs and lowest lows.
|
|
21
|
+
|
|
22
|
+
Lines:
|
|
23
|
+
upper (Line): Channel upper boundary.
|
|
24
|
+
lower (Line): Channel lower boundary.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
lines = ("upper", "lower")
|
|
28
|
+
params = (("multiplier", 5),)
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
"""Initialize the custom highest/lowest channel lines and establish minimum warmup period."""
|
|
32
|
+
period = max(int(self.p.multiplier), 1)
|
|
33
|
+
self.lines.upper = Highest(self.data.high(-1), period=period)
|
|
34
|
+
self.lines.lower = Lowest(self.data.low(-1), period=period)
|
|
35
|
+
self.addminperiod(period + 2)
|
|
@@ -0,0 +1,129 @@
|
|
|
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
|
+
RelativeStrengthIndex,
|
|
12
|
+
SimpleMovingAverage,
|
|
13
|
+
SmoothedMovingAverage,
|
|
14
|
+
WeightedMovingAverage,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"QQECloudIndicator",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def resolve_ma_class(name):
|
|
23
|
+
"""Resolve moving-average class from strategy configuration value."""
|
|
24
|
+
mode = str(name).lower()
|
|
25
|
+
if mode in {"mode_sma", "sma"}:
|
|
26
|
+
return SimpleMovingAverage
|
|
27
|
+
if mode in {
|
|
28
|
+
"mode_ema",
|
|
29
|
+
"ema",
|
|
30
|
+
"mode_jjma",
|
|
31
|
+
"jjma",
|
|
32
|
+
"mode_jurx",
|
|
33
|
+
"jurx",
|
|
34
|
+
"mode_parma",
|
|
35
|
+
"parma",
|
|
36
|
+
"mode_t3",
|
|
37
|
+
"t3",
|
|
38
|
+
"mode_vidya",
|
|
39
|
+
"vidya",
|
|
40
|
+
"mode_ama",
|
|
41
|
+
"ama",
|
|
42
|
+
}:
|
|
43
|
+
return ExponentialMovingAverage
|
|
44
|
+
if mode in {"mode_smma", "smma"}:
|
|
45
|
+
return SmoothedMovingAverage
|
|
46
|
+
return WeightedMovingAverage
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class QQECloudIndicator(Indicator):
|
|
50
|
+
"""Indicator computing smoothed QQE-like trend values from RSI.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
rsi_period: RSI lookback period.
|
|
54
|
+
sf: Smoothing factor for XRSI and momentum smoothers.
|
|
55
|
+
darfactor: ATR-like factor used to offset trailing reference.
|
|
56
|
+
xma_method: Moving-average method alias used for RSI smoothing.
|
|
57
|
+
xphase: Unused legacy parameter preserved for compatibility.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
lines = ("up", "down")
|
|
61
|
+
params = (
|
|
62
|
+
("rsi_period", 14),
|
|
63
|
+
("sf", 5),
|
|
64
|
+
("darfactor", 4.236),
|
|
65
|
+
("xma_method", "sma"),
|
|
66
|
+
("xphase", 15),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def __init__(self):
|
|
70
|
+
"""Initialize RSI, smoothed RSI, and momentum smoothing components."""
|
|
71
|
+
self._rsi = RelativeStrengthIndex(self.data.close, period=max(2, int(self.p.rsi_period)))
|
|
72
|
+
ma_cls = resolve_ma_class(self.p.xma_method)
|
|
73
|
+
self._xrsi = ma_cls(self._rsi, period=max(1, int(self.p.sf)))
|
|
74
|
+
wilders_period = max(2, int(self.p.rsi_period) * 2 - 1)
|
|
75
|
+
self._mom = abs(self._xrsi - self._xrsi(-1))
|
|
76
|
+
self._xmom = ma_cls(self._mom, period=wilders_period)
|
|
77
|
+
self._xxmom = ma_cls(self._xmom, period=wilders_period)
|
|
78
|
+
self.addminperiod(int(self.p.rsi_period) + int(self.p.sf) + wilders_period * 2 + 5)
|
|
79
|
+
|
|
80
|
+
def next(self):
|
|
81
|
+
"""Update output lines on each tick using previous envelope state."""
|
|
82
|
+
xrsi = float(self._xrsi[0])
|
|
83
|
+
prev_xrsi = float(self._xrsi[-1])
|
|
84
|
+
dar = float(self._xxmom[0]) * float(self.p.darfactor)
|
|
85
|
+
prev_tr = float(self.lines.down[-1]) if len(self) > 0 else 50.0
|
|
86
|
+
if prev_tr != prev_tr:
|
|
87
|
+
prev_tr = 50.0
|
|
88
|
+
tr = prev_tr
|
|
89
|
+
dv = tr
|
|
90
|
+
if xrsi < tr:
|
|
91
|
+
tr = xrsi + dar
|
|
92
|
+
if prev_xrsi < dv and tr > dv:
|
|
93
|
+
tr = dv
|
|
94
|
+
elif xrsi > tr:
|
|
95
|
+
tr = xrsi - dar
|
|
96
|
+
if prev_xrsi > dv and tr < dv:
|
|
97
|
+
tr = dv
|
|
98
|
+
self.lines.up[0] = xrsi
|
|
99
|
+
self.lines.down[0] = tr
|
|
100
|
+
|
|
101
|
+
def once(self, start, end):
|
|
102
|
+
"""Vectorized indicator evaluation for vectorized Backtrader runs."""
|
|
103
|
+
xrsi_array = self._xrsi.array
|
|
104
|
+
xxmom_array = self._xxmom.array
|
|
105
|
+
up_line = self.lines.up.array
|
|
106
|
+
down_line = self.lines.down.array
|
|
107
|
+
for line in (up_line, down_line):
|
|
108
|
+
while len(line) < end:
|
|
109
|
+
line.append(float("nan"))
|
|
110
|
+
|
|
111
|
+
prev_tr = 50.0
|
|
112
|
+
actual_end = min(end, len(xrsi_array), len(xxmom_array))
|
|
113
|
+
for i in range(start, actual_end):
|
|
114
|
+
xrsi = float(xrsi_array[i])
|
|
115
|
+
prev_xrsi = float(xrsi_array[i - 1]) if i > 0 else xrsi
|
|
116
|
+
dar = float(xxmom_array[i]) * float(self.p.darfactor)
|
|
117
|
+
tr = prev_tr
|
|
118
|
+
dv = tr
|
|
119
|
+
if xrsi < tr:
|
|
120
|
+
tr = xrsi + dar
|
|
121
|
+
if prev_xrsi < dv and tr > dv:
|
|
122
|
+
tr = dv
|
|
123
|
+
elif xrsi > tr:
|
|
124
|
+
tr = xrsi - dar
|
|
125
|
+
if prev_xrsi > dv and tr < dv:
|
|
126
|
+
tr = dv
|
|
127
|
+
up_line[i] = xrsi
|
|
128
|
+
down_line[i] = tr
|
|
129
|
+
prev_tr = tr
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
ExponentialMovingAverage,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"RaviIndicator",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RaviIndicator(Indicator):
|
|
19
|
+
"""RAVI oscillator: percentage spread between a fast and slow EMA of close."""
|
|
20
|
+
|
|
21
|
+
lines = ("ravi",)
|
|
22
|
+
params = (
|
|
23
|
+
("fast_length", 7),
|
|
24
|
+
("slow_length", 65),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
"""Build the fast/slow EMAs and set the indicator warmup period."""
|
|
29
|
+
self.fast_ma = ExponentialMovingAverage(self.data.close, period=self.p.fast_length)
|
|
30
|
+
self.slow_ma = ExponentialMovingAverage(self.data.close, period=self.p.slow_length)
|
|
31
|
+
self.addminperiod(self.p.slow_length + 3)
|
|
32
|
+
|
|
33
|
+
def next(self):
|
|
34
|
+
"""Compute the RAVI value as the percent spread of fast over slow EMA."""
|
|
35
|
+
slow = float(self.slow_ma[0])
|
|
36
|
+
if abs(slow) <= 1e-12:
|
|
37
|
+
value = 0.0
|
|
38
|
+
else:
|
|
39
|
+
value = 100.0 * (float(self.fast_ma[0]) - slow) / slow
|
|
40
|
+
self.lines.ravi[0] = value
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
"RawCloseCloseStochastic",
|
|
15
|
+
"CloseCloseEmaStochastic",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RawCloseCloseStochastic(Indicator):
|
|
20
|
+
"""Raw close-based Stochastic (%K numerator) over a close-only window."""
|
|
21
|
+
|
|
22
|
+
lines = ("raw",)
|
|
23
|
+
params = (("period", 5),)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Set the minimum period required before emitting values."""
|
|
27
|
+
self.addminperiod(int(self.p.period))
|
|
28
|
+
|
|
29
|
+
def next(self):
|
|
30
|
+
"""Compute the raw close-based Stochastic value for the current bar."""
|
|
31
|
+
period = int(self.p.period)
|
|
32
|
+
closes = [float(self.data.close[-i]) for i in range(period)]
|
|
33
|
+
highest = max(closes)
|
|
34
|
+
lowest = min(closes)
|
|
35
|
+
denom = highest - lowest
|
|
36
|
+
if denom == 0:
|
|
37
|
+
self.lines.raw[0] = 0.0
|
|
38
|
+
return
|
|
39
|
+
self.lines.raw[0] = 100.0 * (float(self.data.close[0]) - lowest) / denom
|
|
40
|
+
|
|
41
|
+
def once(self, start, end):
|
|
42
|
+
"""Vectorized raw close-based Stochastic over the array index range.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
start: Start index (inclusive) of the range to compute.
|
|
46
|
+
end: End index (exclusive) of the range to compute.
|
|
47
|
+
"""
|
|
48
|
+
period = int(self.p.period)
|
|
49
|
+
closes = self.data.close.array
|
|
50
|
+
raw = self.lines.raw.array
|
|
51
|
+
for i in range(start, end):
|
|
52
|
+
window_start = max(0, i - period + 1)
|
|
53
|
+
window = closes[window_start : i + 1]
|
|
54
|
+
highest = max(window)
|
|
55
|
+
lowest = min(window)
|
|
56
|
+
denom = highest - lowest
|
|
57
|
+
raw[i] = 0.0 if denom == 0 else 100.0 * (closes[i] - lowest) / denom
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class CloseCloseEmaStochastic(Indicator):
|
|
61
|
+
"""EMA-smoothed close-based Stochastic exposing ``percK`` and ``percD``."""
|
|
62
|
+
|
|
63
|
+
lines = ("percK", "percD")
|
|
64
|
+
params = (
|
|
65
|
+
("period", 5),
|
|
66
|
+
("slowing", 3),
|
|
67
|
+
("dperiod", 3),
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def __init__(self):
|
|
71
|
+
"""Build the EMA-smoothed %K and %D lines from the raw Stochastic."""
|
|
72
|
+
raw = RawCloseCloseStochastic(self.data, period=int(self.p.period))
|
|
73
|
+
self.lines.percK = ExponentialMovingAverage(raw, period=int(self.p.slowing))
|
|
74
|
+
self.lines.percD = ExponentialMovingAverage(self.lines.percK, period=int(self.p.dperiod))
|
|
@@ -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
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"RDTrendTriggerIndicator",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RDTrendTriggerIndicator(Indicator):
|
|
19
|
+
"""Custom indicator that derives normalized range-trend trigger values."""
|
|
20
|
+
|
|
21
|
+
lines = ("value",)
|
|
22
|
+
params = (
|
|
23
|
+
("regress", 15),
|
|
24
|
+
("t3_length", 5),
|
|
25
|
+
("t3_phase", 70),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
"""Initialize helper buffers and required warmup length."""
|
|
30
|
+
self._ema = ExponentialMovingAverage(self.lines.value, period=max(1, int(self.p.t3_length)))
|
|
31
|
+
self.addminperiod(int(self.p.regress) * 2 + int(self.p.t3_length) + 3)
|
|
32
|
+
|
|
33
|
+
def next(self):
|
|
34
|
+
"""Compute trend trigger value from rolling high/low comparisons."""
|
|
35
|
+
regress = int(self.p.regress)
|
|
36
|
+
highs_recent = [float(self.data.high[-i]) for i in range(regress)]
|
|
37
|
+
highs_older = [float(self.data.high[-regress - i]) for i in range(regress)]
|
|
38
|
+
lows_recent = [float(self.data.low[-i]) for i in range(regress)]
|
|
39
|
+
lows_older = [float(self.data.low[-regress - i]) for i in range(regress)]
|
|
40
|
+
highest_high_recent = max(highs_recent)
|
|
41
|
+
highest_high_older = max(highs_older)
|
|
42
|
+
lowest_low_recent = min(lows_recent)
|
|
43
|
+
lowest_low_older = min(lows_older)
|
|
44
|
+
buy_power = highest_high_recent - lowest_low_older
|
|
45
|
+
sell_power = highest_high_older - lowest_low_recent
|
|
46
|
+
denom = buy_power + sell_power
|
|
47
|
+
ttf = ((buy_power - sell_power) / (0.5 * denom) * 100.0) if denom else 0.0
|
|
48
|
+
prev = float(self.lines.value[-1]) if len(self) > 0 else ttf
|
|
49
|
+
period = max(1, int(self.p.t3_length))
|
|
50
|
+
alpha = 2.0 / (period + 1.0)
|
|
51
|
+
self.lines.value[0] = alpha * ttf + (1.0 - alpha) * prev
|
|
@@ -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
|
+
"RenkoLevel",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class RenkoLevel(Indicator):
|
|
18
|
+
"""Fixed-brick Renko level tracker emitting upper/lower levels and color."""
|
|
19
|
+
|
|
20
|
+
lines = ("upper", "lower", "color_idx")
|
|
21
|
+
params = (
|
|
22
|
+
("size_of_block", 30),
|
|
23
|
+
("point_size", 0.01),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def __init__(self):
|
|
27
|
+
"""Precompute the brick price step and epsilon, set minimum period."""
|
|
28
|
+
self.step_price = self.p.size_of_block * self.p.point_size
|
|
29
|
+
self.eps = self.p.point_size * 0.1
|
|
30
|
+
self.addminperiod(1)
|
|
31
|
+
|
|
32
|
+
def _levels(self, price):
|
|
33
|
+
"""Round a price to its enclosing Renko brick levels.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
price: The price to snap to the brick grid.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
A tuple ``(price_ceil, price_round, price_floor)`` of brick levels.
|
|
40
|
+
"""
|
|
41
|
+
step = self.step_price
|
|
42
|
+
price_round = round(price / step) * step
|
|
43
|
+
price_ceil = math.ceil((price_round + step / 2.0) / step) * step
|
|
44
|
+
price_floor = math.floor((price_round - step / 2.0) / step) * step
|
|
45
|
+
return price_ceil, price_round, price_floor
|
|
46
|
+
|
|
47
|
+
def next(self):
|
|
48
|
+
"""Advance the Renko brick levels for the current bar's close."""
|
|
49
|
+
close_price = float(self.data.close[0])
|
|
50
|
+
if (
|
|
51
|
+
len(self) == 1
|
|
52
|
+
or not math.isfinite(float(self.lines.upper[-1]))
|
|
53
|
+
or not math.isfinite(float(self.lines.lower[-1]))
|
|
54
|
+
):
|
|
55
|
+
price_ceil, price_round, price_floor = self._levels(close_price)
|
|
56
|
+
self.lines.upper[0] = price_round
|
|
57
|
+
self.lines.lower[0] = price_floor
|
|
58
|
+
self.lines.color_idx[0] = 0.0
|
|
59
|
+
return
|
|
60
|
+
prev_up = float(self.lines.upper[-1])
|
|
61
|
+
prev_down = float(self.lines.lower[-1])
|
|
62
|
+
prev_color = (
|
|
63
|
+
float(self.lines.color_idx[-1])
|
|
64
|
+
if math.isfinite(float(self.lines.color_idx[-1]))
|
|
65
|
+
else 0.0
|
|
66
|
+
)
|
|
67
|
+
price_ceil, price_round, price_floor = self._levels(close_price)
|
|
68
|
+
upper = prev_up
|
|
69
|
+
lower = prev_down
|
|
70
|
+
color = prev_color
|
|
71
|
+
if prev_down <= close_price <= prev_up:
|
|
72
|
+
pass
|
|
73
|
+
elif close_price < prev_down:
|
|
74
|
+
if abs(price_round - prev_down) > self.eps:
|
|
75
|
+
upper = price_ceil
|
|
76
|
+
lower = price_round
|
|
77
|
+
color = 1.0
|
|
78
|
+
elif close_price > prev_up:
|
|
79
|
+
if abs(price_round - prev_up) > self.eps:
|
|
80
|
+
lower = price_floor
|
|
81
|
+
upper = price_round
|
|
82
|
+
color = 0.0
|
|
83
|
+
self.lines.upper[0] = upper
|
|
84
|
+
self.lines.lower[0] = lower
|
|
85
|
+
self.lines.color_idx[0] = color
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
"RenkoLineBreak",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RenkoLineBreak(Indicator):
|
|
16
|
+
"""Indicator that models renko-like box transitions."""
|
|
17
|
+
|
|
18
|
+
lines = ("upper", "lower", "boxes")
|
|
19
|
+
params = (
|
|
20
|
+
("min_box_size", 500),
|
|
21
|
+
("point", 0.01),
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
"""Initialize box size and state."""
|
|
26
|
+
box_size = float(self.p.min_box_size)
|
|
27
|
+
if box_size < 0:
|
|
28
|
+
box_size = 300.0
|
|
29
|
+
self._box_size = box_size * float(self.p.point)
|
|
30
|
+
self._seed_close = None
|
|
31
|
+
self._initialized = False
|
|
32
|
+
self._up = False
|
|
33
|
+
self.addminperiod(1)
|
|
34
|
+
|
|
35
|
+
def next(self):
|
|
36
|
+
"""Update Renko upper/lower/box count states each bar."""
|
|
37
|
+
price = float(self.data.close[0])
|
|
38
|
+
|
|
39
|
+
if self._seed_close is None:
|
|
40
|
+
self._seed_close = price
|
|
41
|
+
self.lines.upper[0] = 0.0
|
|
42
|
+
self.lines.lower[0] = 0.0
|
|
43
|
+
self.lines.boxes[0] = 0.0
|
|
44
|
+
return
|
|
45
|
+
|
|
46
|
+
if not self._initialized:
|
|
47
|
+
if abs(price - self._seed_close) < self._box_size:
|
|
48
|
+
self.lines.upper[0] = 0.0
|
|
49
|
+
self.lines.lower[0] = 0.0
|
|
50
|
+
self.lines.boxes[0] = 0.0
|
|
51
|
+
return
|
|
52
|
+
if price > self._seed_close:
|
|
53
|
+
self.lines.upper[0] = price
|
|
54
|
+
self.lines.lower[0] = self._seed_close
|
|
55
|
+
self.lines.boxes[0] = 1.0
|
|
56
|
+
self._up = True
|
|
57
|
+
else:
|
|
58
|
+
self.lines.upper[0] = self._seed_close
|
|
59
|
+
self.lines.lower[0] = price
|
|
60
|
+
self.lines.boxes[0] = -1.0
|
|
61
|
+
self._up = False
|
|
62
|
+
self._initialized = True
|
|
63
|
+
return
|
|
64
|
+
|
|
65
|
+
prev_up = float(self.lines.upper[-1])
|
|
66
|
+
prev_dn = float(self.lines.lower[-1])
|
|
67
|
+
prev_boxes = float(self.lines.boxes[-1])
|
|
68
|
+
|
|
69
|
+
if price >= prev_up + self._box_size:
|
|
70
|
+
self.lines.upper[0] = price
|
|
71
|
+
self.lines.lower[0] = prev_up
|
|
72
|
+
if self._up:
|
|
73
|
+
self.lines.boxes[0] = prev_boxes + 1.0
|
|
74
|
+
else:
|
|
75
|
+
self._up = True
|
|
76
|
+
self.lines.boxes[0] = 1.0
|
|
77
|
+
return
|
|
78
|
+
|
|
79
|
+
if price <= prev_dn - self._box_size:
|
|
80
|
+
self.lines.upper[0] = prev_dn
|
|
81
|
+
self.lines.lower[0] = price
|
|
82
|
+
if self._up:
|
|
83
|
+
self._up = False
|
|
84
|
+
self.lines.boxes[0] = -1.0
|
|
85
|
+
else:
|
|
86
|
+
self.lines.boxes[0] = prev_boxes - 1.0
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
self.lines.upper[0] = prev_up
|
|
90
|
+
self.lines.lower[0] = prev_dn
|
|
91
|
+
self.lines.boxes[0] = prev_boxes
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
"RFTLIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
RFTL_WEIGHTS = [
|
|
16
|
+
-0.0025097319,
|
|
17
|
+
0.0513007762,
|
|
18
|
+
0.1142800493,
|
|
19
|
+
0.1699342860,
|
|
20
|
+
0.2025269304,
|
|
21
|
+
0.2025269304,
|
|
22
|
+
0.1699342860,
|
|
23
|
+
0.1142800493,
|
|
24
|
+
0.0513007762,
|
|
25
|
+
-0.0025097319,
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class RFTLIndicator(Indicator):
|
|
30
|
+
"""Indicator that computes a weighted RFTL value from weighted close history."""
|
|
31
|
+
|
|
32
|
+
lines = ("rftl",)
|
|
33
|
+
params = (("weights", tuple(RFTL_WEIGHTS)),)
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
"""Build the RFTL weighted sum and enforce warmup period."""
|
|
37
|
+
total = 0.0
|
|
38
|
+
for idx, weight in enumerate(self.p.weights):
|
|
39
|
+
total += float(weight) * self.data.close(-idx)
|
|
40
|
+
self.lines.rftl = total
|
|
41
|
+
self.addminperiod(len(self.p.weights) + 1)
|