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,193 @@
|
|
|
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
|
+
SMA,
|
|
11
|
+
Indicator,
|
|
12
|
+
SmoothedMovingAverage,
|
|
13
|
+
WeightedMovingAverage,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"ColorStepXCCXIndicator",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def resolve_ma_class(name):
|
|
22
|
+
"""Resolve a moving-average mode name to a Backtrader MA class."""
|
|
23
|
+
mode = str(name).lower()
|
|
24
|
+
if mode in {"sma", "mode_sma"}:
|
|
25
|
+
return SMA
|
|
26
|
+
if mode in {"ema", "mode_ema"}:
|
|
27
|
+
return EMA
|
|
28
|
+
if mode in {"smma", "mode_smma"}:
|
|
29
|
+
return SmoothedMovingAverage
|
|
30
|
+
return WeightedMovingAverage
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def resolve_price_line(data, mode):
|
|
34
|
+
"""Return the selected price series from data for indicator calculations.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
data: Backtrader data feed.
|
|
38
|
+
mode: Price selector token from strategy configuration.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
A Backtrader data line used as input to indicators.
|
|
42
|
+
"""
|
|
43
|
+
price_mode = str(mode).lower()
|
|
44
|
+
if price_mode in {"price_open", "open"}:
|
|
45
|
+
return data.open
|
|
46
|
+
if price_mode in {"price_high", "high"}:
|
|
47
|
+
return data.high
|
|
48
|
+
if price_mode in {"price_low", "low"}:
|
|
49
|
+
return data.low
|
|
50
|
+
if price_mode in {"price_median", "median"}:
|
|
51
|
+
return (data.high + data.low) / 2.0
|
|
52
|
+
if price_mode in {"price_typical", "typical"}:
|
|
53
|
+
return (data.high + data.low + data.close) / 3.0
|
|
54
|
+
if price_mode in {"price_weighted", "weighted"}:
|
|
55
|
+
return (data.high + data.low + data.close + data.close) / 4.0
|
|
56
|
+
return data.close
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class ColorStepXCCXIndicator(Indicator):
|
|
60
|
+
"""Compute fast/slow XCCX channel lines for directional step signals."""
|
|
61
|
+
|
|
62
|
+
lines = (
|
|
63
|
+
"mplus",
|
|
64
|
+
"mminus",
|
|
65
|
+
)
|
|
66
|
+
params = (
|
|
67
|
+
("dsmooth_method", "jjma"),
|
|
68
|
+
("dperiod", 30),
|
|
69
|
+
("dphase", 100),
|
|
70
|
+
("msmooth_method", "t3"),
|
|
71
|
+
("mperiod", 7),
|
|
72
|
+
("mphase", 15),
|
|
73
|
+
("ipc", "price_typical"),
|
|
74
|
+
("step_size_fast", 5),
|
|
75
|
+
("step_size_slow", 30),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def __init__(self):
|
|
79
|
+
"""Initialize smoothed base/offset series and running channel states."""
|
|
80
|
+
price_line = resolve_price_line(self.data, self.p.ipc)
|
|
81
|
+
self._base = resolve_ma_class(self.p.dsmooth_method)(price_line, period=self.p.dperiod)
|
|
82
|
+
self._up = resolve_ma_class(self.p.msmooth_method)(
|
|
83
|
+
price_line - self._base, period=self.p.mperiod
|
|
84
|
+
)
|
|
85
|
+
self._dn = resolve_ma_class(self.p.msmooth_method)(
|
|
86
|
+
abs(price_line - self._base), period=self.p.mperiod
|
|
87
|
+
)
|
|
88
|
+
self._fmin1 = 999999.0
|
|
89
|
+
self._fmax1 = -999999.0
|
|
90
|
+
self._smin1 = 999999.0
|
|
91
|
+
self._smax1 = -999999.0
|
|
92
|
+
self._ftrend = 0
|
|
93
|
+
self._strend = 0
|
|
94
|
+
self.addminperiod(self.p.dperiod + self.p.mperiod + 5)
|
|
95
|
+
|
|
96
|
+
def next(self):
|
|
97
|
+
"""Update fast and slow channel lines on the next bar."""
|
|
98
|
+
xupccx = float(self._up[0])
|
|
99
|
+
xdnccx = float(self._dn[0])
|
|
100
|
+
xccx = 100.0 * xupccx / xdnccx if xupccx != 0.0 and xdnccx != 0.0 else 0.0
|
|
101
|
+
fmax0 = xccx + 2 * float(self.p.step_size_fast)
|
|
102
|
+
fmin0 = xccx - 2 * float(self.p.step_size_fast)
|
|
103
|
+
if xccx > self._fmax1:
|
|
104
|
+
self._ftrend = 1
|
|
105
|
+
if xccx < self._fmin1:
|
|
106
|
+
self._ftrend = -1
|
|
107
|
+
if self._ftrend > 0 and fmin0 < self._fmin1:
|
|
108
|
+
fmin0 = self._fmin1
|
|
109
|
+
if self._ftrend < 0 and fmax0 > self._fmax1:
|
|
110
|
+
fmax0 = self._fmax1
|
|
111
|
+
smax0 = xccx + 2 * float(self.p.step_size_slow)
|
|
112
|
+
smin0 = xccx - 2 * float(self.p.step_size_slow)
|
|
113
|
+
if xccx > self._smax1:
|
|
114
|
+
self._strend = 1
|
|
115
|
+
if xccx < self._smin1:
|
|
116
|
+
self._strend = -1
|
|
117
|
+
if self._strend > 0 and smin0 < self._smin1:
|
|
118
|
+
smin0 = self._smin1
|
|
119
|
+
if self._strend < 0 and smax0 > self._smax1:
|
|
120
|
+
smax0 = self._smax1
|
|
121
|
+
self.lines.mplus[0] = (
|
|
122
|
+
fmin0 + float(self.p.step_size_fast)
|
|
123
|
+
if self._ftrend > 0
|
|
124
|
+
else fmax0 - float(self.p.step_size_fast)
|
|
125
|
+
)
|
|
126
|
+
self.lines.mminus[0] = (
|
|
127
|
+
smin0 + float(self.p.step_size_slow)
|
|
128
|
+
if self._strend > 0
|
|
129
|
+
else smax0 - float(self.p.step_size_slow)
|
|
130
|
+
)
|
|
131
|
+
self._fmin1 = fmin0
|
|
132
|
+
self._fmax1 = fmax0
|
|
133
|
+
self._smin1 = smin0
|
|
134
|
+
self._smax1 = smax0
|
|
135
|
+
|
|
136
|
+
def once(self, start, end):
|
|
137
|
+
"""Compute channel lines for vectorized/cached bars from `start` to `end`."""
|
|
138
|
+
up_array = self._up.array
|
|
139
|
+
dn_array = self._dn.array
|
|
140
|
+
mplus_line = self.lines.mplus.array
|
|
141
|
+
mminus_line = self.lines.mminus.array
|
|
142
|
+
for line in (mplus_line, mminus_line):
|
|
143
|
+
while len(line) < end:
|
|
144
|
+
line.append(float("nan"))
|
|
145
|
+
|
|
146
|
+
fmin1 = 999999.0
|
|
147
|
+
fmax1 = -999999.0
|
|
148
|
+
smin1 = 999999.0
|
|
149
|
+
smax1 = -999999.0
|
|
150
|
+
ftrend = 0
|
|
151
|
+
strend = 0
|
|
152
|
+
fast_step = float(self.p.step_size_fast)
|
|
153
|
+
slow_step = float(self.p.step_size_slow)
|
|
154
|
+
actual_end = min(end, len(up_array), len(dn_array))
|
|
155
|
+
for i in range(start, actual_end):
|
|
156
|
+
xupccx = float(up_array[i])
|
|
157
|
+
xdnccx = float(dn_array[i])
|
|
158
|
+
xccx = 100.0 * xupccx / xdnccx if xupccx != 0.0 and xdnccx != 0.0 else 0.0
|
|
159
|
+
fmax0 = xccx + 2.0 * fast_step
|
|
160
|
+
fmin0 = xccx - 2.0 * fast_step
|
|
161
|
+
if xccx > fmax1:
|
|
162
|
+
ftrend = 1
|
|
163
|
+
if xccx < fmin1:
|
|
164
|
+
ftrend = -1
|
|
165
|
+
if ftrend > 0 and fmin0 < fmin1:
|
|
166
|
+
fmin0 = fmin1
|
|
167
|
+
if ftrend < 0 and fmax0 > fmax1:
|
|
168
|
+
fmax0 = fmax1
|
|
169
|
+
|
|
170
|
+
smax0 = xccx + 2.0 * slow_step
|
|
171
|
+
smin0 = xccx - 2.0 * slow_step
|
|
172
|
+
if xccx > smax1:
|
|
173
|
+
strend = 1
|
|
174
|
+
if xccx < smin1:
|
|
175
|
+
strend = -1
|
|
176
|
+
if strend > 0 and smin0 < smin1:
|
|
177
|
+
smin0 = smin1
|
|
178
|
+
if strend < 0 and smax0 > smax1:
|
|
179
|
+
smax0 = smax1
|
|
180
|
+
|
|
181
|
+
mplus_line[i] = fmin0 + fast_step if ftrend > 0 else fmax0 - fast_step
|
|
182
|
+
mminus_line[i] = smin0 + slow_step if strend > 0 else smax0 - slow_step
|
|
183
|
+
fmin1 = fmin0
|
|
184
|
+
fmax1 = fmax0
|
|
185
|
+
smin1 = smin0
|
|
186
|
+
smax1 = smax0
|
|
187
|
+
|
|
188
|
+
self._fmin1 = fmin1
|
|
189
|
+
self._fmax1 = fmax1
|
|
190
|
+
self._smin1 = smin1
|
|
191
|
+
self._smax1 = smax1
|
|
192
|
+
self._ftrend = ftrend
|
|
193
|
+
self._strend = strend
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import math
|
|
9
|
+
|
|
10
|
+
from .. import (
|
|
11
|
+
Indicator,
|
|
12
|
+
SimpleMovingAverage,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"ColorX2MA",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ColorX2MA(Indicator):
|
|
21
|
+
"""Indicator that outputs smoothed MA value and directional color index."""
|
|
22
|
+
|
|
23
|
+
lines = ("value", "color_idx")
|
|
24
|
+
params = (
|
|
25
|
+
("length1", 12),
|
|
26
|
+
("length2", 5),
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def __init__(self):
|
|
30
|
+
"""Initialize MA stacks and minimum period."""
|
|
31
|
+
ma1 = SimpleMovingAverage(self.data.close, period=max(2, self.p.length1))
|
|
32
|
+
ma2 = SimpleMovingAverage(ma1, period=max(2, self.p.length2))
|
|
33
|
+
self.lines.value = ma2
|
|
34
|
+
self.addminperiod(self.p.length1 + self.p.length2 + 2)
|
|
35
|
+
|
|
36
|
+
def next(self):
|
|
37
|
+
"""Update color index based on value momentum."""
|
|
38
|
+
current = float(self.lines.value[0])
|
|
39
|
+
prev = (
|
|
40
|
+
float(self.lines.value[-1])
|
|
41
|
+
if len(self) > 1 and math.isfinite(float(self.lines.value[-1]))
|
|
42
|
+
else current
|
|
43
|
+
)
|
|
44
|
+
color = 0.0
|
|
45
|
+
if prev < current:
|
|
46
|
+
color = 1.0
|
|
47
|
+
elif prev > current:
|
|
48
|
+
color = 2.0
|
|
49
|
+
self.lines.color_idx[0] = color
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
"ColorXDerivative",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ColorXDerivative(Indicator):
|
|
16
|
+
"""Smoothed price-derivative indicator with a momentum color state.
|
|
17
|
+
|
|
18
|
+
Computes the average rate of change of a weighted price over ``i_slowing``
|
|
19
|
+
bars, smoothed across ``xlength`` windows, and classifies it into a color
|
|
20
|
+
index: rising/falling while positive (0/1) or negative (3/4), with 2 as a
|
|
21
|
+
neutral state.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
lines = ("value", "color_idx")
|
|
25
|
+
params = (
|
|
26
|
+
("i_slowing", 34),
|
|
27
|
+
("xlength", 15),
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
"""Set the minimum period to cover the slowing and smoothing windows."""
|
|
32
|
+
self.addminperiod(max(self.p.i_slowing + 2, self.p.xlength + 2))
|
|
33
|
+
|
|
34
|
+
def _price(self, ago=0):
|
|
35
|
+
return (
|
|
36
|
+
float(self.data.high[ago])
|
|
37
|
+
+ float(self.data.low[ago])
|
|
38
|
+
+ 2.0 * float(self.data.close[ago])
|
|
39
|
+
) / 4.0
|
|
40
|
+
|
|
41
|
+
def next(self):
|
|
42
|
+
"""Compute the smoothed derivative value and its color state.
|
|
43
|
+
|
|
44
|
+
Stores the smoothed derivative on the ``value`` line and a color index on
|
|
45
|
+
``color_idx`` reflecting whether the value is rising or falling above or
|
|
46
|
+
below zero relative to the previous bar.
|
|
47
|
+
"""
|
|
48
|
+
der = 100.0 * (self._price(0) - self._price(-self.p.i_slowing)) / float(self.p.i_slowing)
|
|
49
|
+
window = [
|
|
50
|
+
100.0
|
|
51
|
+
* (self._price(-i) - self._price(-(i + self.p.i_slowing)))
|
|
52
|
+
/ float(self.p.i_slowing)
|
|
53
|
+
for i in range(self.p.xlength)
|
|
54
|
+
]
|
|
55
|
+
smooth = sum(window) / float(len(window)) if window else der
|
|
56
|
+
self.lines.value[0] = smooth
|
|
57
|
+
prev = float(self.lines.value[-1]) if len(self) > 1 else smooth
|
|
58
|
+
color = 2.0
|
|
59
|
+
if smooth > 0:
|
|
60
|
+
color = 0.0 if prev <= smooth else 1.0
|
|
61
|
+
elif smooth < 0:
|
|
62
|
+
color = 4.0 if prev >= smooth else 3.0
|
|
63
|
+
self.lines.color_idx[0] = color
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import math
|
|
9
|
+
|
|
10
|
+
from .. import (
|
|
11
|
+
DeMarkerRollingIndicator,
|
|
12
|
+
Indicator,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"ColorZerolagDeMarker",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ColorZerolagDeMarker(Indicator):
|
|
21
|
+
"""Blend five weighted DeMarker oscillators into fast and slow trend lines."""
|
|
22
|
+
|
|
23
|
+
lines = ("fast", "slow")
|
|
24
|
+
params = (
|
|
25
|
+
("smoothing", 15),
|
|
26
|
+
("factor1", 0.05),
|
|
27
|
+
("demarker_period1", 8),
|
|
28
|
+
("factor2", 0.1),
|
|
29
|
+
("demarker_period2", 21),
|
|
30
|
+
("factor3", 0.16),
|
|
31
|
+
("demarker_period3", 34),
|
|
32
|
+
("factor4", 0.26),
|
|
33
|
+
("demarker_period4", 55),
|
|
34
|
+
("factor5", 0.43),
|
|
35
|
+
("demarker_period5", 89),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
def __init__(self):
|
|
39
|
+
"""Build the five DeMarker sub-indicators and smoothing constants."""
|
|
40
|
+
periods = [
|
|
41
|
+
int(self.p.demarker_period1),
|
|
42
|
+
int(self.p.demarker_period2),
|
|
43
|
+
int(self.p.demarker_period3),
|
|
44
|
+
int(self.p.demarker_period4),
|
|
45
|
+
int(self.p.demarker_period5),
|
|
46
|
+
]
|
|
47
|
+
self.addminperiod(3 * max(periods) + 5)
|
|
48
|
+
self.dem1 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period1))
|
|
49
|
+
self.dem2 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period2))
|
|
50
|
+
self.dem3 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period3))
|
|
51
|
+
self.dem4 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period4))
|
|
52
|
+
self.dem5 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period5))
|
|
53
|
+
self.smooth_const = (float(self.p.smoothing) - 1.0) / float(self.p.smoothing)
|
|
54
|
+
self._initialized = False
|
|
55
|
+
|
|
56
|
+
def next(self):
|
|
57
|
+
"""Weight DeMarker values into a fast trend and smoothed slow trend."""
|
|
58
|
+
values = [
|
|
59
|
+
float(self.dem1[0]),
|
|
60
|
+
float(self.dem2[0]),
|
|
61
|
+
float(self.dem3[0]),
|
|
62
|
+
float(self.dem4[0]),
|
|
63
|
+
float(self.dem5[0]),
|
|
64
|
+
]
|
|
65
|
+
if any(not math.isfinite(value) for value in values):
|
|
66
|
+
self.lines.fast[0] = float("nan")
|
|
67
|
+
self.lines.slow[0] = float("nan")
|
|
68
|
+
return
|
|
69
|
+
osc1 = float(self.p.factor1) * values[0]
|
|
70
|
+
osc2 = float(self.p.factor2) * values[1]
|
|
71
|
+
osc3 = float(self.p.factor3) * values[2]
|
|
72
|
+
osc4 = float(self.p.factor4) * values[3]
|
|
73
|
+
osc5 = float(self.p.factor5) * values[4]
|
|
74
|
+
fast_trend = osc1 + osc2 + osc3 + osc4 + osc5
|
|
75
|
+
if not self._initialized:
|
|
76
|
+
slow_trend = fast_trend / float(self.p.smoothing)
|
|
77
|
+
self._initialized = True
|
|
78
|
+
else:
|
|
79
|
+
slow_trend = (
|
|
80
|
+
fast_trend / float(self.p.smoothing)
|
|
81
|
+
+ float(self.lines.slow[-1]) * self.smooth_const
|
|
82
|
+
)
|
|
83
|
+
self.lines.fast[0] = fast_trend
|
|
84
|
+
self.lines.slow[0] = slow_trend
|
|
@@ -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
|
+
StandardDeviation,
|
|
14
|
+
WeightedMovingAverage,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"CorrectedAverageIndicator",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def resolve_ma_class(name):
|
|
23
|
+
"""Return the backtrader moving-average class for a method name.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
name: MA method name (sma, ema, smma, or a weighted fallback).
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
The corresponding backtrader moving-average indicator class.
|
|
30
|
+
"""
|
|
31
|
+
mode = str(name).lower()
|
|
32
|
+
if mode in {"sma", "mode_sma"}:
|
|
33
|
+
return SimpleMovingAverage
|
|
34
|
+
if mode in {"ema", "mode_ema"}:
|
|
35
|
+
return ExponentialMovingAverage
|
|
36
|
+
if mode in {"smma", "mode_smma"}:
|
|
37
|
+
return SmoothedMovingAverage
|
|
38
|
+
return WeightedMovingAverage
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def resolve_price_line(data, mode):
|
|
42
|
+
"""Return the price line selected by an MT5 applied-price mode.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
data: The data feed providing OHLC lines.
|
|
46
|
+
mode: Applied-price mode name (e.g. ``price_close``, ``price_median``).
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
The line or line expression for the requested applied price; defaults
|
|
50
|
+
to the close line for unrecognized modes.
|
|
51
|
+
"""
|
|
52
|
+
price_mode = str(mode).lower()
|
|
53
|
+
if price_mode in {"price_open", "open"}:
|
|
54
|
+
return data.open
|
|
55
|
+
if price_mode in {"price_high", "high"}:
|
|
56
|
+
return data.high
|
|
57
|
+
if price_mode in {"price_low", "low"}:
|
|
58
|
+
return data.low
|
|
59
|
+
if price_mode in {"price_median", "median"}:
|
|
60
|
+
return (data.high + data.low) / 2.0
|
|
61
|
+
if price_mode in {"price_typical", "typical"}:
|
|
62
|
+
return (data.high + data.low + data.close) / 3.0
|
|
63
|
+
if price_mode in {"price_weighted", "weighted"}:
|
|
64
|
+
return (data.high + data.low + data.close + data.close) / 4.0
|
|
65
|
+
return data.close
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class CorrectedAverageIndicator(Indicator):
|
|
69
|
+
"""Ehlers-style adaptive Corrected Average with event and vectorized modes."""
|
|
70
|
+
|
|
71
|
+
lines = ("corrected",)
|
|
72
|
+
params = (
|
|
73
|
+
("ma_method", "sma"),
|
|
74
|
+
("length", 12),
|
|
75
|
+
("applied_price", "price_close"),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def __init__(self):
|
|
79
|
+
"""Build the base MA and standard deviation and set the min period."""
|
|
80
|
+
price_line = resolve_price_line(self.data, self.p.applied_price)
|
|
81
|
+
self._ma = resolve_ma_class(self.p.ma_method)(price_line, period=self.p.length)
|
|
82
|
+
self._std = StandardDeviation(price_line, period=self.p.length)
|
|
83
|
+
self.addminperiod(int(self.p.length) + 3)
|
|
84
|
+
|
|
85
|
+
def next(self):
|
|
86
|
+
"""Compute the corrected average for the current bar."""
|
|
87
|
+
ma = float(self._ma[0])
|
|
88
|
+
std = float(self._std[0])
|
|
89
|
+
prev = float(self.lines.corrected[-1]) if len(self) > 0 else ma
|
|
90
|
+
if prev != prev:
|
|
91
|
+
prev = ma
|
|
92
|
+
v1 = std**2
|
|
93
|
+
v2 = (prev - ma) ** 2
|
|
94
|
+
if v2 < v1 or v2 == 0:
|
|
95
|
+
k = 0.0
|
|
96
|
+
else:
|
|
97
|
+
k = 1.0 - v1 / v2
|
|
98
|
+
self.lines.corrected[0] = prev + k * (ma - prev)
|
|
99
|
+
|
|
100
|
+
def once(self, start, end):
|
|
101
|
+
"""Vectorized corrected-average computation over the array index range.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
start: Start index (inclusive) of the range to compute.
|
|
105
|
+
end: End index (exclusive) of the range to compute.
|
|
106
|
+
"""
|
|
107
|
+
ma_array = self._ma.array
|
|
108
|
+
std_array = self._std.array
|
|
109
|
+
corrected_line = self.lines.corrected.array
|
|
110
|
+
while len(corrected_line) < end:
|
|
111
|
+
corrected_line.append(float("nan"))
|
|
112
|
+
|
|
113
|
+
prev = None
|
|
114
|
+
actual_end = min(end, len(ma_array), len(std_array))
|
|
115
|
+
for i in range(start, actual_end):
|
|
116
|
+
ma = float(ma_array[i])
|
|
117
|
+
std = float(std_array[i])
|
|
118
|
+
previous = ma if prev is None else prev
|
|
119
|
+
v1 = std**2
|
|
120
|
+
v2 = (previous - ma) ** 2
|
|
121
|
+
if v2 < v1 or v2 == 0:
|
|
122
|
+
k = 0.0
|
|
123
|
+
else:
|
|
124
|
+
k = 1.0 - v1 / v2
|
|
125
|
+
value = previous + k * (ma - previous)
|
|
126
|
+
corrected_line[i] = value
|
|
127
|
+
prev = value
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
"DarvasBoxesSystem",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class DarvasBoxesSystem(Indicator):
|
|
16
|
+
"""Indicator that emits Darvas box color states from high/low progression."""
|
|
17
|
+
|
|
18
|
+
lines = ("color",)
|
|
19
|
+
params = (
|
|
20
|
+
("symmetry", True),
|
|
21
|
+
("shift", 2),
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
"""Initialize the indicator state and ensure required warmup bars."""
|
|
26
|
+
self.addminperiod(int(self.p.shift) + 8)
|
|
27
|
+
self.state = 0
|
|
28
|
+
self.box_top = None
|
|
29
|
+
self.box_bottom = None
|
|
30
|
+
|
|
31
|
+
def next(self):
|
|
32
|
+
"""Update the running Darvas box and emit the discrete color signal."""
|
|
33
|
+
if self.box_top is None:
|
|
34
|
+
self.box_top = float(self.data.high[-1])
|
|
35
|
+
self.box_bottom = float(self.data.low[-1])
|
|
36
|
+
self.state = 1
|
|
37
|
+
bar_high = float(self.data.high[0])
|
|
38
|
+
bar_low = float(self.data.low[0])
|
|
39
|
+
if self.state == 1:
|
|
40
|
+
self.box_top = bar_high
|
|
41
|
+
if self.p.symmetry:
|
|
42
|
+
self.box_bottom = bar_low
|
|
43
|
+
elif self.state == 2:
|
|
44
|
+
if self.box_top <= bar_high:
|
|
45
|
+
self.box_top = bar_high
|
|
46
|
+
elif self.state == 3:
|
|
47
|
+
if self.box_top > bar_high:
|
|
48
|
+
self.box_bottom = bar_low
|
|
49
|
+
else:
|
|
50
|
+
self.box_top = bar_high
|
|
51
|
+
elif self.state == 4:
|
|
52
|
+
if self.box_top > bar_high:
|
|
53
|
+
if self.box_bottom >= bar_low:
|
|
54
|
+
self.box_bottom = bar_low
|
|
55
|
+
else:
|
|
56
|
+
self.box_top = bar_high
|
|
57
|
+
elif self.state == 5:
|
|
58
|
+
if self.box_top > bar_high:
|
|
59
|
+
if self.box_bottom >= bar_low:
|
|
60
|
+
self.box_bottom = bar_low
|
|
61
|
+
else:
|
|
62
|
+
self.box_top = bar_high
|
|
63
|
+
self.state = 0
|
|
64
|
+
self.state += 1
|
|
65
|
+
shift = int(self.p.shift)
|
|
66
|
+
close = float(self.data.close[0])
|
|
67
|
+
open_ = float(self.data.open[0])
|
|
68
|
+
color = 2.0
|
|
69
|
+
if len(self.data) > shift and close > self.box_top:
|
|
70
|
+
color = 4.0 if open_ < close else 3.0
|
|
71
|
+
if len(self.data) > shift and close < self.box_bottom:
|
|
72
|
+
color = 0.0 if open_ > close else 1.0
|
|
73
|
+
self.lines.color[0] = color
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
DoubleExponentialMovingAverage,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"DemaRangeChannelColor",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DemaRangeChannelColor(Indicator):
|
|
19
|
+
"""Indicator computing DEMA-based upper/lower range channels with a color index for breakout direction."""
|
|
20
|
+
|
|
21
|
+
lines = ("color_idx", "upper", "lower")
|
|
22
|
+
params = (("period", 14),)
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
"""Initialize DEMA channels from high/low inputs."""
|
|
26
|
+
self.upper_dema = DoubleExponentialMovingAverage(self.data.high, period=self.p.period)
|
|
27
|
+
self.lower_dema = DoubleExponentialMovingAverage(self.data.low, period=self.p.period)
|
|
28
|
+
|
|
29
|
+
def next(self):
|
|
30
|
+
"""Set the upper, lower, and color_idx line values based on close position relative to DEMA band."""
|
|
31
|
+
upper = float(self.upper_dema[0])
|
|
32
|
+
lower = float(self.lower_dema[0])
|
|
33
|
+
close = float(self.data.close[0])
|
|
34
|
+
open_ = float(self.data.open[0])
|
|
35
|
+
self.lines.upper[0] = upper
|
|
36
|
+
self.lines.lower[0] = lower
|
|
37
|
+
color = 4.0
|
|
38
|
+
if close > upper:
|
|
39
|
+
color = 3.0 if close >= open_ else 2.0
|
|
40
|
+
elif close < lower:
|
|
41
|
+
color = 0.0 if close <= open_ else 1.0
|
|
42
|
+
self.lines.color_idx[0] = color
|