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,70 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
EMA,
|
|
10
|
+
SMA,
|
|
11
|
+
Indicator,
|
|
12
|
+
WeightedMovingAverage,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"CenterOfGravityIndicator",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CenterOfGravityIndicator(Indicator):
|
|
21
|
+
"""Center of Gravity indicator composed of price selection and smoothed center line."""
|
|
22
|
+
|
|
23
|
+
lines = (
|
|
24
|
+
"center",
|
|
25
|
+
"signal",
|
|
26
|
+
"state",
|
|
27
|
+
)
|
|
28
|
+
params = (
|
|
29
|
+
("period", 10),
|
|
30
|
+
("smooth_period", 3),
|
|
31
|
+
("ma_method", "sma"),
|
|
32
|
+
("applied_price", "close"),
|
|
33
|
+
("point", 0.01),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def __init__(self):
|
|
37
|
+
"""Initialize base MAs and derived center/signal/state lines."""
|
|
38
|
+
ma_cls = SMA if str(self.p.ma_method).lower() == "sma" else EMA
|
|
39
|
+
price = self._price_line()
|
|
40
|
+
sma = SMA(price, period=self.p.period)
|
|
41
|
+
lwma = WeightedMovingAverage(price, period=self.p.period)
|
|
42
|
+
self.lines.center = (sma * lwma) / self.p.point
|
|
43
|
+
self.lines.signal = ma_cls(self.lines.center, period=self.p.smooth_period)
|
|
44
|
+
self.addminperiod(self.p.period + self.p.smooth_period + 5)
|
|
45
|
+
|
|
46
|
+
def _price_line(self):
|
|
47
|
+
mode = str(self.p.applied_price).lower()
|
|
48
|
+
if mode == "open":
|
|
49
|
+
return self.data.open
|
|
50
|
+
if mode == "high":
|
|
51
|
+
return self.data.high
|
|
52
|
+
if mode == "low":
|
|
53
|
+
return self.data.low
|
|
54
|
+
if mode == "median":
|
|
55
|
+
return (self.data.high + self.data.low) / 2.0
|
|
56
|
+
if mode == "typical":
|
|
57
|
+
return (self.data.high + self.data.low + self.data.close) / 3.0
|
|
58
|
+
if mode == "weighted":
|
|
59
|
+
return (self.data.high + self.data.low + self.data.close + self.data.close) / 4.0
|
|
60
|
+
if mode == "simpl":
|
|
61
|
+
return (self.data.open + self.data.close) / 2.0
|
|
62
|
+
if mode == "quarter":
|
|
63
|
+
return (self.data.high + self.data.low + self.data.open + self.data.close) / 4.0
|
|
64
|
+
return self.data.close
|
|
65
|
+
|
|
66
|
+
def next(self):
|
|
67
|
+
"""Compute the state classification for the current bar."""
|
|
68
|
+
self.lines.state[0] = (
|
|
69
|
+
2.0 if float(self.lines.center[0]) < float(self.lines.signal[0]) else 1.0
|
|
70
|
+
)
|
|
@@ -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 Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"CGOscillator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CGOscillator(Indicator):
|
|
16
|
+
"""Center of Gravity (CG) oscillator with a one-bar-lagged signal line.
|
|
17
|
+
|
|
18
|
+
The main line is a length-weighted ratio of recent median prices, shifted
|
|
19
|
+
to centre around zero. The signal line is the previous bar's main value.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
lines = ("main", "signal")
|
|
23
|
+
params = (("length", 10),)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Set the minimum period and precompute the CG centring shift."""
|
|
27
|
+
self.addminperiod(int(self.p.length) + 1)
|
|
28
|
+
self.cgshift = (float(self.p.length) + 1.0) / 2.0
|
|
29
|
+
|
|
30
|
+
def next(self):
|
|
31
|
+
"""Compute the CG main and lagged signal value for the current bar."""
|
|
32
|
+
num = 0.0
|
|
33
|
+
denom = 0.0
|
|
34
|
+
length = int(self.p.length)
|
|
35
|
+
for count in range(length):
|
|
36
|
+
price = (float(self.data.high[-count]) + float(self.data.low[-count])) / 2.0
|
|
37
|
+
num += (1.0 + count) * price
|
|
38
|
+
denom += price
|
|
39
|
+
self.lines.main[0] = (-num / denom + self.cgshift) if denom else 0.0
|
|
40
|
+
self.lines.signal[0] = self.lines.main[-1] if len(self) > 1 else 0.0
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
Indicator,
|
|
10
|
+
MeanDev,
|
|
11
|
+
MovAv,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"CloseLineCCI",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CloseLineCCI(Indicator):
|
|
20
|
+
"""Custom CCI indicator designed to evaluate simple single close lines instead of HLC.
|
|
21
|
+
|
|
22
|
+
Lines:
|
|
23
|
+
cci (Line): Output Commodity Channel Index line.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
lines = ("cci",)
|
|
27
|
+
params = (
|
|
28
|
+
("period", 20),
|
|
29
|
+
("factor", 0.015),
|
|
30
|
+
("movav", MovAv.Simple),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def __init__(self):
|
|
34
|
+
"""Initialize and calculate close-based CCI indicator components."""
|
|
35
|
+
tp = self.data
|
|
36
|
+
tpmean = self.p.movav(tp, period=self.p.period)
|
|
37
|
+
meandev = MeanDev(tp, tpmean, period=self.p.period)
|
|
38
|
+
self.lines.cci = (tp - tpmean) / (self.p.factor * meandev)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"ClosePriceFractals",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ClosePriceFractals(Indicator):
|
|
16
|
+
"""Custom 5-period Fractal indicator calculated solely on closing prices.
|
|
17
|
+
|
|
18
|
+
Lines:
|
|
19
|
+
upper: Contains fractal peak closing price if upper fractal is formed.
|
|
20
|
+
lower: Contains fractal valley closing price if lower fractal is formed.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
lines = ("upper", "lower")
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Initialize the indicator with a minimum period of 5 bars."""
|
|
27
|
+
self.addminperiod(5)
|
|
28
|
+
|
|
29
|
+
def next(self):
|
|
30
|
+
"""Determine if a peak or valley fractal forms on bar -2 based on close prices."""
|
|
31
|
+
self.lines.upper[0] = float("nan")
|
|
32
|
+
self.lines.lower[0] = float("nan")
|
|
33
|
+
candidate = float(self.data.close[-2])
|
|
34
|
+
if (
|
|
35
|
+
candidate > float(self.data.close[-3])
|
|
36
|
+
and candidate > float(self.data.close[-4])
|
|
37
|
+
and candidate >= float(self.data.close[-1])
|
|
38
|
+
and candidate >= float(self.data.close[0])
|
|
39
|
+
):
|
|
40
|
+
self.lines.upper[0] = candidate
|
|
41
|
+
if (
|
|
42
|
+
candidate < float(self.data.close[-3])
|
|
43
|
+
and candidate < float(self.data.close[-4])
|
|
44
|
+
and candidate <= float(self.data.close[-1])
|
|
45
|
+
and candidate <= float(self.data.close[0])
|
|
46
|
+
):
|
|
47
|
+
self.lines.lower[0] = candidate
|
|
@@ -0,0 +1,122 @@
|
|
|
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
|
+
If,
|
|
11
|
+
Indicator,
|
|
12
|
+
SimpleMovingAverage,
|
|
13
|
+
SmoothedMovingAverage,
|
|
14
|
+
WeightedMovingAverage,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"Color3rdGenXMAIndicator",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def resolve_ma_class(name):
|
|
23
|
+
"""Map a moving-average name to its backtrader indicator class.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
name: MA type name (e.g. ``sma``, ``ema``, ``smma`` or MT5-style
|
|
27
|
+
``mode_*`` variants); several smoothing variants map to EMA.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
The matching backtrader moving-average indicator class, defaulting to
|
|
31
|
+
the weighted moving average for unrecognized names.
|
|
32
|
+
"""
|
|
33
|
+
mode = str(name).lower()
|
|
34
|
+
if mode in {"mode_sma", "sma"}:
|
|
35
|
+
return SimpleMovingAverage
|
|
36
|
+
if mode in {
|
|
37
|
+
"mode_ema",
|
|
38
|
+
"ema",
|
|
39
|
+
"mode_jjma",
|
|
40
|
+
"jjma",
|
|
41
|
+
"mode_jurx",
|
|
42
|
+
"jurx",
|
|
43
|
+
"mode_parma",
|
|
44
|
+
"parma",
|
|
45
|
+
"mode_t3",
|
|
46
|
+
"t3",
|
|
47
|
+
"mode_vidya",
|
|
48
|
+
"vidya",
|
|
49
|
+
"mode_ama",
|
|
50
|
+
"ama",
|
|
51
|
+
}:
|
|
52
|
+
return ExponentialMovingAverage
|
|
53
|
+
if mode in {"mode_smma", "smma"}:
|
|
54
|
+
return SmoothedMovingAverage
|
|
55
|
+
return WeightedMovingAverage
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def resolve_price_line(data, mode):
|
|
59
|
+
"""Return the applied-price line for a data feed given a price mode.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
data: The data feed providing OHLC lines.
|
|
63
|
+
mode: Applied-price selector (e.g. ``price_close``, ``price_typical``,
|
|
64
|
+
``price_weighted`` or their short forms).
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
A line expression for the selected applied price, defaulting to the
|
|
68
|
+
typical price for unrecognized modes.
|
|
69
|
+
"""
|
|
70
|
+
price_mode = str(mode).lower()
|
|
71
|
+
if price_mode in {"price_close", "close"}:
|
|
72
|
+
return data.close
|
|
73
|
+
if price_mode in {"price_open", "open"}:
|
|
74
|
+
return data.open
|
|
75
|
+
if price_mode in {"price_high", "high"}:
|
|
76
|
+
return data.high
|
|
77
|
+
if price_mode in {"price_low", "low"}:
|
|
78
|
+
return data.low
|
|
79
|
+
if price_mode in {"price_median", "median"}:
|
|
80
|
+
return (data.high + data.low) / 2.0
|
|
81
|
+
if price_mode in {"price_typical", "typical"}:
|
|
82
|
+
return (data.high + data.low + data.close) / 3.0
|
|
83
|
+
if price_mode in {"price_weighted", "weighted"}:
|
|
84
|
+
return (2.0 * data.close + data.high + data.low) / 4.0
|
|
85
|
+
if price_mode in {"price_simpl", "simpl"}:
|
|
86
|
+
return (data.open + data.close) / 2.0
|
|
87
|
+
if price_mode in {"price_quarter", "quarter"}:
|
|
88
|
+
return (data.high + data.low + data.open + data.close) / 4.0
|
|
89
|
+
return (data.high + data.low + data.close) / 3.0
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class Color3rdGenXMAIndicator(Indicator):
|
|
93
|
+
"""Third-generation (reduced-lag) moving average with a slope color.
|
|
94
|
+
|
|
95
|
+
Combines a base moving average with a re-smoothed version using a
|
|
96
|
+
lambda-derived alpha to cut lag, exposing the resulting line on ``value`` and
|
|
97
|
+
a ``color`` line marking whether it is rising (2), falling (0) or flat (1).
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
lines = ("value", "color")
|
|
101
|
+
params = (
|
|
102
|
+
("xma_method", "ema"),
|
|
103
|
+
("xlength", 50),
|
|
104
|
+
("xphase", 15),
|
|
105
|
+
("ipc", "price_typical"),
|
|
106
|
+
("price_shift", 0),
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
def __init__(self):
|
|
110
|
+
"""Build the two-stage moving average and the value/color lines."""
|
|
111
|
+
price = resolve_price_line(self.data, self.p.ipc)
|
|
112
|
+
ma_cls = resolve_ma_class(self.p.xma_method)
|
|
113
|
+
slength = max(1, int(self.p.xlength) * 2)
|
|
114
|
+
self._x1 = ma_cls(price, period=slength)
|
|
115
|
+
self._x2 = ma_cls(self._x1, period=max(1, int(self.p.xlength)))
|
|
116
|
+
lam = float(slength) / max(1.0, float(self.p.xlength))
|
|
117
|
+
self._alpha = lam * (slength - 1.0) / max(1e-9, (slength - lam))
|
|
118
|
+
self._dprice_shift = float(self.p.price_shift) * 0.00001
|
|
119
|
+
value = (self._alpha + 1.0) * self._x1 - self._alpha * self._x2 + self._dprice_shift
|
|
120
|
+
self.lines.value = value
|
|
121
|
+
self.lines.color = If(value > value(-1), 2.0, If(value < value(-1), 0.0, 1.0))
|
|
122
|
+
self.addminperiod(slength + int(self.p.xlength) + 5)
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
StandardDeviation,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"ColorBBCandlesIndicator",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ColorBBCandlesIndicator(Indicator):
|
|
21
|
+
"""Color BBCandles indicator producing zone states from volatility envelopes.
|
|
22
|
+
|
|
23
|
+
The indicator computes a moving-average center line and standard deviation
|
|
24
|
+
bands with multiple deviation levels, then emits a discrete state 0..10.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
lines = (
|
|
28
|
+
"state",
|
|
29
|
+
"price_line",
|
|
30
|
+
"mid",
|
|
31
|
+
)
|
|
32
|
+
params = (
|
|
33
|
+
("period", 100),
|
|
34
|
+
("deviation1", 1.0),
|
|
35
|
+
("deviation2", 1.5),
|
|
36
|
+
("deviation3", 2.0),
|
|
37
|
+
("deviation4", 2.5),
|
|
38
|
+
("deviation5", 3.0),
|
|
39
|
+
("ma_method", "ema"),
|
|
40
|
+
("applied_price", "close"),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
def __init__(self):
|
|
44
|
+
"""Prepare price line selector and required indicator buffers."""
|
|
45
|
+
ma_cls = EMA if str(self.p.ma_method).lower() == "ema" else SMA
|
|
46
|
+
self.price = self._price_line()
|
|
47
|
+
self.lines.price_line = self.price
|
|
48
|
+
self.lines.mid = ma_cls(self.price, period=self.p.period)
|
|
49
|
+
self.stddev = StandardDeviation(self.price, period=self.p.period)
|
|
50
|
+
self.addminperiod(self.p.period + 5)
|
|
51
|
+
|
|
52
|
+
def _price_line(self):
|
|
53
|
+
mode = str(self.p.applied_price).lower()
|
|
54
|
+
if mode == "open":
|
|
55
|
+
return self.data.open
|
|
56
|
+
if mode == "high":
|
|
57
|
+
return self.data.high
|
|
58
|
+
if mode == "low":
|
|
59
|
+
return self.data.low
|
|
60
|
+
if mode == "median":
|
|
61
|
+
return (self.data.high + self.data.low) / 2.0
|
|
62
|
+
if mode == "typical":
|
|
63
|
+
return (self.data.high + self.data.low + self.data.close) / 3.0
|
|
64
|
+
if mode == "weighted":
|
|
65
|
+
return (self.data.high + self.data.low + self.data.close + self.data.close) / 4.0
|
|
66
|
+
if mode == "simpl":
|
|
67
|
+
return (self.data.open + self.data.close) / 2.0
|
|
68
|
+
if mode == "quarter":
|
|
69
|
+
return (self.data.high + self.data.low + self.data.open + self.data.close) / 4.0
|
|
70
|
+
return self.data.close
|
|
71
|
+
|
|
72
|
+
def next(self):
|
|
73
|
+
"""Evaluate the current bar and emit the normalized volatility state."""
|
|
74
|
+
price = float(self.price[0])
|
|
75
|
+
mid = float(self.lines.mid[0])
|
|
76
|
+
stdev = float(self.stddev[0])
|
|
77
|
+
up1 = mid + stdev * self.p.deviation1
|
|
78
|
+
up2 = mid + stdev * self.p.deviation2
|
|
79
|
+
up3 = mid + stdev * self.p.deviation3
|
|
80
|
+
up4 = mid + stdev * self.p.deviation4
|
|
81
|
+
up5 = mid + stdev * self.p.deviation5
|
|
82
|
+
dn1 = mid - stdev * self.p.deviation1
|
|
83
|
+
dn2 = mid - stdev * self.p.deviation2
|
|
84
|
+
dn3 = mid - stdev * self.p.deviation3
|
|
85
|
+
dn4 = mid - stdev * self.p.deviation4
|
|
86
|
+
dn5 = mid - stdev * self.p.deviation5
|
|
87
|
+
state = 5.0
|
|
88
|
+
if price > up5:
|
|
89
|
+
state = 10.0
|
|
90
|
+
elif price > up4:
|
|
91
|
+
state = 9.0
|
|
92
|
+
elif price > up3:
|
|
93
|
+
state = 8.0
|
|
94
|
+
elif price > up2:
|
|
95
|
+
state = 7.0
|
|
96
|
+
elif price > up1:
|
|
97
|
+
state = 6.0
|
|
98
|
+
elif price < dn5:
|
|
99
|
+
state = 0.0
|
|
100
|
+
elif price < dn4:
|
|
101
|
+
state = 1.0
|
|
102
|
+
elif price < dn3:
|
|
103
|
+
state = 2.0
|
|
104
|
+
elif price < dn2:
|
|
105
|
+
state = 3.0
|
|
106
|
+
elif price < dn1:
|
|
107
|
+
state = 4.0
|
|
108
|
+
self.lines.state[0] = state
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
ExponentialMovingAverage,
|
|
10
|
+
Indicator,
|
|
11
|
+
SimpleMovingAverage,
|
|
12
|
+
SmoothedMovingAverage,
|
|
13
|
+
WeightedMovingAverage,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"ColorCoppockIndicator",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def resolve_ma_class(name):
|
|
22
|
+
"""Map configured MA mode strings to Backtrader MA classes.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
name: MA mode token from configuration.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
MA indicator class.
|
|
29
|
+
"""
|
|
30
|
+
mode = str(name).lower()
|
|
31
|
+
if mode in {"mode_sma", "sma"}:
|
|
32
|
+
return SimpleMovingAverage
|
|
33
|
+
if mode in {
|
|
34
|
+
"mode_ema",
|
|
35
|
+
"ema",
|
|
36
|
+
"mode_jjma",
|
|
37
|
+
"jjma",
|
|
38
|
+
"mode_jurx",
|
|
39
|
+
"jurx",
|
|
40
|
+
"mode_parma",
|
|
41
|
+
"parma",
|
|
42
|
+
"mode_t3",
|
|
43
|
+
"t3",
|
|
44
|
+
"mode_vidya",
|
|
45
|
+
"vidya",
|
|
46
|
+
"mode_ama",
|
|
47
|
+
"ama",
|
|
48
|
+
}:
|
|
49
|
+
return ExponentialMovingAverage
|
|
50
|
+
if mode in {"mode_smma", "smma"}:
|
|
51
|
+
return SmoothedMovingAverage
|
|
52
|
+
return WeightedMovingAverage
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def resolve_price_line(data, mode):
|
|
56
|
+
"""Resolve a price selector key to a data line for indicator input.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
data: Backtrader data feed.
|
|
60
|
+
mode: Price selector token.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Price series corresponding to the requested selector.
|
|
64
|
+
"""
|
|
65
|
+
price_mode = str(mode).lower()
|
|
66
|
+
if price_mode in {"price_open", "open"}:
|
|
67
|
+
return data.open
|
|
68
|
+
if price_mode in {"price_high", "high"}:
|
|
69
|
+
return data.high
|
|
70
|
+
if price_mode in {"price_low", "low"}:
|
|
71
|
+
return data.low
|
|
72
|
+
if price_mode in {"price_median", "median"}:
|
|
73
|
+
return (data.high + data.low) / 2.0
|
|
74
|
+
if price_mode in {"price_typical", "typical"}:
|
|
75
|
+
return (data.high + data.low + data.close) / 3.0
|
|
76
|
+
if price_mode in {"price_weighted", "weighted"}:
|
|
77
|
+
return (2.0 * data.close + data.high + data.low) / 4.0
|
|
78
|
+
if price_mode in {"price_simpl", "simpl"}:
|
|
79
|
+
return (data.open + data.close) / 2.0
|
|
80
|
+
if price_mode in {"price_quarter", "quarter"}:
|
|
81
|
+
return (data.high + data.low + data.open + data.close) / 4.0
|
|
82
|
+
return data.close
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class ColorCoppockIndicator(Indicator):
|
|
86
|
+
"""Compute Coppock oscillator value and its directional color state."""
|
|
87
|
+
|
|
88
|
+
lines = ("value", "color")
|
|
89
|
+
params = (
|
|
90
|
+
("roc1_period", 14),
|
|
91
|
+
("roc2_period", 10),
|
|
92
|
+
("xma_method", "lwma"),
|
|
93
|
+
("xma_period", 12),
|
|
94
|
+
("xma_phase", 100),
|
|
95
|
+
("applied_price", "price_close"),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def __init__(self):
|
|
99
|
+
"""Initialize ROC sum and the final smoothing moving average."""
|
|
100
|
+
price_line = resolve_price_line(self.data, self.p.applied_price)
|
|
101
|
+
roc1 = (price_line - price_line(-int(self.p.roc1_period))) / price_line(
|
|
102
|
+
-int(self.p.roc1_period)
|
|
103
|
+
)
|
|
104
|
+
roc2 = (price_line - price_line(-int(self.p.roc2_period))) / price_line(
|
|
105
|
+
-int(self.p.roc2_period)
|
|
106
|
+
)
|
|
107
|
+
self._roc_sum = roc1 + roc2
|
|
108
|
+
ma_cls = resolve_ma_class(self.p.xma_method)
|
|
109
|
+
self._smooth = ma_cls(self._roc_sum, period=max(1, int(self.p.xma_period)))
|
|
110
|
+
self.addminperiod(
|
|
111
|
+
max(int(self.p.roc1_period), int(self.p.roc2_period)) + int(self.p.xma_period) + 3
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
def next(self):
|
|
115
|
+
"""Update value and color for the current bar."""
|
|
116
|
+
value = float(self._smooth[0])
|
|
117
|
+
prev = float(self._smooth[-1])
|
|
118
|
+
self.lines.value[0] = value
|
|
119
|
+
color = 2
|
|
120
|
+
if value > 0:
|
|
121
|
+
if value > prev:
|
|
122
|
+
color = 4
|
|
123
|
+
elif value < prev:
|
|
124
|
+
color = 3
|
|
125
|
+
if value < 0:
|
|
126
|
+
if value < prev:
|
|
127
|
+
color = 0
|
|
128
|
+
elif value > prev:
|
|
129
|
+
color = 1
|
|
130
|
+
self.lines.color[0] = color
|
|
131
|
+
|
|
132
|
+
def once(self, start, end):
|
|
133
|
+
"""Fill value/color lines for preloaded bars in a batch run."""
|
|
134
|
+
smooth = self._smooth.array
|
|
135
|
+
value_line = self.lines.value.array
|
|
136
|
+
color_line = self.lines.color.array
|
|
137
|
+
for line in (value_line, color_line):
|
|
138
|
+
while len(line) < end:
|
|
139
|
+
line.append(float("nan"))
|
|
140
|
+
|
|
141
|
+
actual_end = min(end, len(smooth))
|
|
142
|
+
for i in range(start, actual_end):
|
|
143
|
+
value = float(smooth[i])
|
|
144
|
+
prev = float(smooth[i - 1]) if i > 0 else value
|
|
145
|
+
color = 2
|
|
146
|
+
if value > 0:
|
|
147
|
+
if value > prev:
|
|
148
|
+
color = 4
|
|
149
|
+
elif value < prev:
|
|
150
|
+
color = 3
|
|
151
|
+
if value < 0:
|
|
152
|
+
if value < prev:
|
|
153
|
+
color = 0
|
|
154
|
+
elif value > prev:
|
|
155
|
+
color = 1
|
|
156
|
+
value_line[i] = value
|
|
157
|
+
color_line[i] = color
|
|
@@ -0,0 +1,71 @@
|
|
|
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
|
+
"ColorHMA",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _weighted_ma(values):
|
|
18
|
+
weights = list(range(1, len(values) + 1))
|
|
19
|
+
denominator = float(sum(weights))
|
|
20
|
+
return sum(value * weight for value, weight in zip(values, weights)) / denominator
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ColorHMA(Indicator):
|
|
24
|
+
"""Hull Moving Average line plus its slope-direction ("color") line."""
|
|
25
|
+
|
|
26
|
+
lines = ("hma", "direction")
|
|
27
|
+
params = (("period", 13),)
|
|
28
|
+
|
|
29
|
+
def __init__(self):
|
|
30
|
+
"""Derive the half, full, and sqrt periods and set the warmup window."""
|
|
31
|
+
self.period = max(int(self.p.period), 2)
|
|
32
|
+
self.half_period = max(int(math.floor(self.period / 2.0)), 1)
|
|
33
|
+
self.sqrt_period = max(int(math.floor(math.sqrt(self.period))), 1)
|
|
34
|
+
self._dma_history = []
|
|
35
|
+
self.addminperiod(self.period + self.sqrt_period + 2)
|
|
36
|
+
|
|
37
|
+
def _window(self, length):
|
|
38
|
+
return [float(self.data[-idx]) for idx in range(length - 1, -1, -1)]
|
|
39
|
+
|
|
40
|
+
def next(self):
|
|
41
|
+
"""Compute the HMA value for this bar and update its slope direction."""
|
|
42
|
+
if len(self.data) < self.period:
|
|
43
|
+
current = (
|
|
44
|
+
float(self.data.close[0]) if hasattr(self.data, "close") else float(self.data[0])
|
|
45
|
+
)
|
|
46
|
+
self._dma_history.append(current)
|
|
47
|
+
self.l.hma[0] = current
|
|
48
|
+
self.l.direction[0] = 0.0
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
half_values = self._window(self.half_period)
|
|
52
|
+
full_values = self._window(self.period)
|
|
53
|
+
lwma_half = _weighted_ma(half_values)
|
|
54
|
+
lwma_full = _weighted_ma(full_values)
|
|
55
|
+
dma = 2.0 * lwma_half - lwma_full
|
|
56
|
+
self._dma_history.append(dma)
|
|
57
|
+
|
|
58
|
+
if len(self._dma_history) >= self.sqrt_period:
|
|
59
|
+
hma = _weighted_ma(self._dma_history[-self.sqrt_period :])
|
|
60
|
+
else:
|
|
61
|
+
hma = dma
|
|
62
|
+
|
|
63
|
+
self.l.hma[0] = hma
|
|
64
|
+
if len(self) < 2:
|
|
65
|
+
self.l.direction[0] = 0.0
|
|
66
|
+
elif self.l.hma[-1] < self.l.hma[0]:
|
|
67
|
+
self.l.direction[0] = 1.0
|
|
68
|
+
elif self.l.hma[-1] > self.l.hma[0]:
|
|
69
|
+
self.l.direction[0] = -1.0
|
|
70
|
+
else:
|
|
71
|
+
self.l.direction[0] = self.l.direction[-1]
|