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,56 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
ExponentialMovingAverage,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"BullsPower",
|
|
15
|
+
"BearsPower",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BullsPower(Indicator):
|
|
20
|
+
"""Indicator for Bulls Power built from high price minus EMA."""
|
|
21
|
+
|
|
22
|
+
lines = ("value",)
|
|
23
|
+
params = (("period", 5),)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Initialize EMA and minimum period.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
self: Instance reference.
|
|
30
|
+
"""
|
|
31
|
+
self.ema = ExponentialMovingAverage(self.data.close, period=self.p.period)
|
|
32
|
+
self.addminperiod(self.p.period + 3)
|
|
33
|
+
|
|
34
|
+
def next(self):
|
|
35
|
+
"""Update current Bulls Power value."""
|
|
36
|
+
self.lines.value[0] = float(self.data.high[0]) - float(self.ema[0])
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class BearsPower(Indicator):
|
|
40
|
+
"""Indicator for Bears Power built from low price minus EMA."""
|
|
41
|
+
|
|
42
|
+
lines = ("value",)
|
|
43
|
+
params = (("period", 5),)
|
|
44
|
+
|
|
45
|
+
def __init__(self):
|
|
46
|
+
"""Initialize EMA and minimum period.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
self: Instance reference.
|
|
50
|
+
"""
|
|
51
|
+
self.ema = ExponentialMovingAverage(self.data.close, period=self.p.period)
|
|
52
|
+
self.addminperiod(self.p.period + 3)
|
|
53
|
+
|
|
54
|
+
def next(self):
|
|
55
|
+
"""Update current Bears Power value."""
|
|
56
|
+
self.lines.value[0] = float(self.data.low[0]) - float(self.ema[0])
|
|
@@ -0,0 +1,102 @@
|
|
|
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
|
+
ATR,
|
|
10
|
+
Indicator,
|
|
11
|
+
SmoothedMovingAverage,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"BWWiseMan1Signal",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BWWiseMan1Signal(Indicator):
|
|
20
|
+
"""Generate long/short trigger values based on Alligator-like MAs and ATR.
|
|
21
|
+
|
|
22
|
+
The indicator outputs two value lines (`buy`, `sell`) that represent candidate
|
|
23
|
+
entry levels for short and long flips under the configured market regime.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
lines = ("sell", "buy")
|
|
27
|
+
params = (
|
|
28
|
+
("retrogradely", True),
|
|
29
|
+
("back", 2),
|
|
30
|
+
("jaw_period", 13),
|
|
31
|
+
("jaw_shift", 8),
|
|
32
|
+
("teeth_period", 8),
|
|
33
|
+
("teeth_shift", 5),
|
|
34
|
+
("lips_period", 5),
|
|
35
|
+
("lips_shift", 3),
|
|
36
|
+
("atr_period", 15),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def __init__(self):
|
|
40
|
+
"""Initialize moving average and ATR lines and minimum period requirements."""
|
|
41
|
+
median_price = (self.data.high + self.data.low) / 2.0
|
|
42
|
+
self.jaw = SmoothedMovingAverage(median_price, period=max(int(self.p.jaw_period), 1))
|
|
43
|
+
self.teeth = SmoothedMovingAverage(median_price, period=max(int(self.p.teeth_period), 1))
|
|
44
|
+
self.lips = SmoothedMovingAverage(median_price, period=max(int(self.p.lips_period), 1))
|
|
45
|
+
self.atr = ATR(self.data, period=max(int(self.p.atr_period), 1))
|
|
46
|
+
self.addminperiod(
|
|
47
|
+
max(
|
|
48
|
+
int(self.p.jaw_period) + int(self.p.jaw_shift),
|
|
49
|
+
int(self.p.teeth_period) + int(self.p.teeth_shift),
|
|
50
|
+
int(self.p.lips_period) + int(self.p.lips_shift),
|
|
51
|
+
int(self.p.atr_period),
|
|
52
|
+
)
|
|
53
|
+
+ int(self.p.back)
|
|
54
|
+
+ 2
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
def next(self):
|
|
58
|
+
"""Compute current `buy`/`sell` trigger values from MA and ATR relationships."""
|
|
59
|
+
self.lines.buy[0] = 0.0
|
|
60
|
+
self.lines.sell[0] = 0.0
|
|
61
|
+
|
|
62
|
+
if len(self.data) <= max(
|
|
63
|
+
int(self.p.jaw_shift), int(self.p.teeth_shift), int(self.p.lips_shift), int(self.p.back)
|
|
64
|
+
):
|
|
65
|
+
return
|
|
66
|
+
|
|
67
|
+
jaw = float(self.jaw[-int(self.p.jaw_shift)])
|
|
68
|
+
teeth = float(self.teeth[-int(self.p.teeth_shift)])
|
|
69
|
+
lips = float(self.lips[-int(self.p.lips_shift)])
|
|
70
|
+
high = float(self.data.high[0])
|
|
71
|
+
low = float(self.data.low[0])
|
|
72
|
+
close = float(self.data.close[0])
|
|
73
|
+
mid = (high + low) / 2.0
|
|
74
|
+
atr = float(self.atr[0])
|
|
75
|
+
|
|
76
|
+
raw_sell = 0.0
|
|
77
|
+
raw_buy = 0.0
|
|
78
|
+
|
|
79
|
+
if low > lips and low > teeth and low > jaw and close < mid:
|
|
80
|
+
contup = True
|
|
81
|
+
for i in range(1, int(self.p.back) + 1):
|
|
82
|
+
if high <= float(self.data.high[-i]):
|
|
83
|
+
contup = False
|
|
84
|
+
break
|
|
85
|
+
if contup:
|
|
86
|
+
raw_sell = high + atr * 3.0 / 8.0
|
|
87
|
+
|
|
88
|
+
if high < lips and high < teeth and high < jaw and close > mid:
|
|
89
|
+
contup = True
|
|
90
|
+
for i in range(1, int(self.p.back) + 1):
|
|
91
|
+
if low >= float(self.data.low[-i]):
|
|
92
|
+
contup = False
|
|
93
|
+
break
|
|
94
|
+
if contup:
|
|
95
|
+
raw_buy = low - atr * 3.0 / 8.0
|
|
96
|
+
|
|
97
|
+
if bool(self.p.retrogradely):
|
|
98
|
+
self.lines.buy[0] = raw_sell
|
|
99
|
+
self.lines.sell[0] = raw_buy
|
|
100
|
+
else:
|
|
101
|
+
self.lines.buy[0] = raw_buy
|
|
102
|
+
self.lines.sell[0] = raw_sell
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"BykovTrendIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BykovTrendIndicator(Indicator):
|
|
16
|
+
"""Reconstructs BykovTrend from its MQ5 source.
|
|
17
|
+
|
|
18
|
+
Uses WPR(SSP) + ATR(15) to detect trend flips.
|
|
19
|
+
Outputs buy_arrow / sell_arrow (non-zero price level when arrow fires).
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
lines = ("buy_arrow", "sell_arrow")
|
|
23
|
+
params = (
|
|
24
|
+
("risk", 3),
|
|
25
|
+
("ssp", 9),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
"""Cache WPR/ATR periods, the risk threshold, and set indicator warmup."""
|
|
30
|
+
self._k = 33 - int(self.p.risk)
|
|
31
|
+
self._atr_period = 15
|
|
32
|
+
self._wpr_period = int(self.p.ssp)
|
|
33
|
+
self._uptrend = True
|
|
34
|
+
self._old = True
|
|
35
|
+
self.addminperiod(max(self._wpr_period, self._atr_period) + 2)
|
|
36
|
+
|
|
37
|
+
def _calc_wpr(self):
|
|
38
|
+
period = self._wpr_period
|
|
39
|
+
if len(self.data) < period:
|
|
40
|
+
return 0.0
|
|
41
|
+
hh = max(float(self.data.high[-i]) for i in range(period))
|
|
42
|
+
ll = min(float(self.data.low[-i]) for i in range(period))
|
|
43
|
+
close_val = float(self.data.close[0])
|
|
44
|
+
if hh == ll:
|
|
45
|
+
return 0.0
|
|
46
|
+
return -100.0 * (hh - close_val) / (hh - ll)
|
|
47
|
+
|
|
48
|
+
def _calc_atr(self):
|
|
49
|
+
period = self._atr_period
|
|
50
|
+
if len(self.data) < period + 1:
|
|
51
|
+
return 0.0
|
|
52
|
+
total = 0.0
|
|
53
|
+
for i in range(period):
|
|
54
|
+
hi = float(self.data.high[-i])
|
|
55
|
+
lo = float(self.data.low[-i])
|
|
56
|
+
prev_close = float(self.data.close[-(i + 1)])
|
|
57
|
+
tr = max(hi - lo, abs(hi - prev_close), abs(prev_close - lo))
|
|
58
|
+
total += tr
|
|
59
|
+
return total / period
|
|
60
|
+
|
|
61
|
+
def next(self):
|
|
62
|
+
"""Update the trend state and emit buy/sell arrow offsets on flips."""
|
|
63
|
+
k = self._k
|
|
64
|
+
wpr = self._calc_wpr()
|
|
65
|
+
atr = self._calc_atr()
|
|
66
|
+
rng = atr * 3.0 / 8.0
|
|
67
|
+
|
|
68
|
+
uptrend = self._uptrend
|
|
69
|
+
if wpr < -100 + k:
|
|
70
|
+
uptrend = False
|
|
71
|
+
if wpr > -k:
|
|
72
|
+
uptrend = True
|
|
73
|
+
|
|
74
|
+
buy_val = 0.0
|
|
75
|
+
sell_val = 0.0
|
|
76
|
+
if not self._old and uptrend:
|
|
77
|
+
buy_val = float(self.data.low[0]) - rng
|
|
78
|
+
if self._old and not uptrend:
|
|
79
|
+
sell_val = float(self.data.high[0]) + rng
|
|
80
|
+
|
|
81
|
+
self.lines.buy_arrow[0] = buy_val
|
|
82
|
+
self.lines.sell_arrow[0] = sell_val
|
|
83
|
+
|
|
84
|
+
self._old = uptrend
|
|
85
|
+
self._uptrend = uptrend
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
"CandleStopColor",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CandleStopColor(Indicator):
|
|
16
|
+
"""Indicator computing highest-high/ lowest-low trailing stop channels with color breakout signal."""
|
|
17
|
+
|
|
18
|
+
lines = ("color_idx", "upper", "lower")
|
|
19
|
+
params = (
|
|
20
|
+
("up_trail_periods", 5),
|
|
21
|
+
("up_trail_shift", 5),
|
|
22
|
+
("dn_trail_periods", 5),
|
|
23
|
+
("dn_trail_shift", 5),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def next(self):
|
|
27
|
+
"""Compute trailing high/low range and set color index based on close position."""
|
|
28
|
+
hh_indices = range(self.p.up_trail_shift, self.p.up_trail_shift + self.p.up_trail_periods)
|
|
29
|
+
ll_indices = range(self.p.dn_trail_shift, self.p.dn_trail_shift + self.p.dn_trail_periods)
|
|
30
|
+
highs = [float(self.data.high[-idx]) for idx in hh_indices if len(self.data) > idx]
|
|
31
|
+
lows = [float(self.data.low[-idx]) for idx in ll_indices if len(self.data) > idx]
|
|
32
|
+
if not highs or not lows:
|
|
33
|
+
self.lines.color_idx[0] = 4.0
|
|
34
|
+
return
|
|
35
|
+
upper = max(highs)
|
|
36
|
+
lower = min(lows)
|
|
37
|
+
close = float(self.data.close[0])
|
|
38
|
+
open_ = float(self.data.open[0])
|
|
39
|
+
self.lines.upper[0] = upper
|
|
40
|
+
self.lines.lower[0] = lower
|
|
41
|
+
color = 4.0
|
|
42
|
+
if close > upper:
|
|
43
|
+
color = 3.0 if close >= open_ else 2.0
|
|
44
|
+
elif close < lower:
|
|
45
|
+
color = 0.0 if close <= open_ else 1.0
|
|
46
|
+
self.lines.color_idx[0] = color
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
"CandlesXSmoothedIndicator",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def resolve_ma_class(name):
|
|
22
|
+
"""Resolve moving-average strategy by string key.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
name (str): MA method key from config.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
indicator: Corresponding Backtrader MA class.
|
|
29
|
+
"""
|
|
30
|
+
mode = str(name).lower()
|
|
31
|
+
if mode in {"sma", "mode_sma"}:
|
|
32
|
+
return SMA
|
|
33
|
+
if mode in {"ema", "mode_ema"}:
|
|
34
|
+
return EMA
|
|
35
|
+
if mode in {"smma", "mode_smma"}:
|
|
36
|
+
return SmoothedMovingAverage
|
|
37
|
+
return WeightedMovingAverage
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class CandlesXSmoothedIndicator(Indicator):
|
|
41
|
+
"""Indicator that smooths OHLC bars with configurable MA and derives color state."""
|
|
42
|
+
|
|
43
|
+
lines = (
|
|
44
|
+
"smooth_open",
|
|
45
|
+
"smooth_high",
|
|
46
|
+
"smooth_low",
|
|
47
|
+
"smooth_close",
|
|
48
|
+
"color_state",
|
|
49
|
+
)
|
|
50
|
+
params = (
|
|
51
|
+
("ma_method", "lwma"),
|
|
52
|
+
("ma_length", 30),
|
|
53
|
+
("ma_phase", 100),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
def __init__(self):
|
|
57
|
+
"""Initialize all smoothed OHLC lines and color state."""
|
|
58
|
+
ma_cls = resolve_ma_class(self.p.ma_method)
|
|
59
|
+
self.lines.smooth_open = ma_cls(self.data.open, period=self.p.ma_length)
|
|
60
|
+
self.lines.smooth_high = ma_cls(self.data.high, period=self.p.ma_length)
|
|
61
|
+
self.lines.smooth_low = ma_cls(self.data.low, period=self.p.ma_length)
|
|
62
|
+
self.lines.smooth_close = ma_cls(self.data.close, period=self.p.ma_length)
|
|
63
|
+
self.addminperiod(self.p.ma_length + 2)
|
|
64
|
+
|
|
65
|
+
def next(self):
|
|
66
|
+
"""Set color state to bullish (`0`) or bearish (`1`) for current bar."""
|
|
67
|
+
self.lines.color_state[0] = (
|
|
68
|
+
0.0 if float(self.lines.smooth_open[0]) < float(self.lines.smooth_close[0]) else 1.0
|
|
69
|
+
)
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
SMA,
|
|
10
|
+
AwesomeOscillator,
|
|
11
|
+
Indicator,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"CandlesticksBW",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CandlesticksBW(Indicator):
|
|
20
|
+
"""Indicator that encodes AO/AC state into a numeric candle color code."""
|
|
21
|
+
|
|
22
|
+
lines = ("color",)
|
|
23
|
+
params = ()
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Set up AO and AC dependencies and minimum period."""
|
|
27
|
+
self.addminperiod(40)
|
|
28
|
+
self.ao = AwesomeOscillator(self.data)
|
|
29
|
+
self.ac = self.ao - SMA(self.ao, period=5)
|
|
30
|
+
|
|
31
|
+
def next(self):
|
|
32
|
+
"""Compute the color code for the current bar."""
|
|
33
|
+
ao0 = float(self.ao[0])
|
|
34
|
+
ao1 = float(self.ao[-1])
|
|
35
|
+
ac0 = float(self.ac[0])
|
|
36
|
+
ac1 = float(self.ac[-1])
|
|
37
|
+
open_ = float(self.data.open[0])
|
|
38
|
+
close = float(self.data.close[0])
|
|
39
|
+
if ao0 >= ao1 and ac0 >= ac1:
|
|
40
|
+
color = 0.0 if open_ <= close else 1.0
|
|
41
|
+
elif ao0 <= ao1 and ac0 <= ac1:
|
|
42
|
+
color = 5.0 if open_ >= close else 4.0
|
|
43
|
+
else:
|
|
44
|
+
color = 2.0 if open_ <= close else 3.0
|
|
45
|
+
self.lines.color[0] = color
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
Indicator,
|
|
10
|
+
SimpleMovingAverage,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"CaudateXPeriodCandleColor",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class CaudateXPeriodCandleColor(Indicator):
|
|
19
|
+
"""Synthetic period-candle indicator emitting a color index and smoothed OHLC."""
|
|
20
|
+
|
|
21
|
+
lines = ("color_idx", "xopen", "xclose", "xhigh", "xlow")
|
|
22
|
+
params = (
|
|
23
|
+
("cperiod", 5),
|
|
24
|
+
("ma_length", 3),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
"""Build the smoothed OHLC moving averages and set the warmup period."""
|
|
29
|
+
self.smooth_open = SimpleMovingAverage(self.data.open, period=self.p.ma_length)
|
|
30
|
+
self.smooth_high = SimpleMovingAverage(self.data.high, period=self.p.ma_length)
|
|
31
|
+
self.smooth_low = SimpleMovingAverage(self.data.low, period=self.p.ma_length)
|
|
32
|
+
self.smooth_close = SimpleMovingAverage(self.data.close, period=self.p.ma_length)
|
|
33
|
+
self.addminperiod(self.p.ma_length + self.p.cperiod)
|
|
34
|
+
|
|
35
|
+
def next(self):
|
|
36
|
+
"""Build the period candle and assign its color index from the midpoint."""
|
|
37
|
+
lookback = max(1, int(self.p.cperiod))
|
|
38
|
+
start = -(lookback - 1)
|
|
39
|
+
xopen = float(self.smooth_open[start])
|
|
40
|
+
xclose = float(self.smooth_close[0])
|
|
41
|
+
highs = [float(self.smooth_high[-i]) for i in range(lookback)]
|
|
42
|
+
lows = [float(self.smooth_low[-i]) for i in range(lookback)]
|
|
43
|
+
xhigh = max(highs)
|
|
44
|
+
xlow = min(lows)
|
|
45
|
+
self.lines.xopen[0] = xopen
|
|
46
|
+
self.lines.xclose[0] = xclose
|
|
47
|
+
self.lines.xhigh[0] = xhigh
|
|
48
|
+
self.lines.xlow[0] = xlow
|
|
49
|
+
|
|
50
|
+
color = 2.0 if xopen <= xclose else 4.0
|
|
51
|
+
candle_half = (xhigh + xlow) / 2.0
|
|
52
|
+
if xopen > candle_half and xclose > candle_half:
|
|
53
|
+
color = 0.0 if xopen <= xclose else 1.0
|
|
54
|
+
elif xopen < candle_half and xclose < candle_half:
|
|
55
|
+
color = 6.0 if xopen >= xclose else 5.0
|
|
56
|
+
self.lines.color_idx[0] = color
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
CommodityChannelIndex,
|
|
10
|
+
Indicator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"CCIHistogramIndicator",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class CCIHistogramIndicator(Indicator):
|
|
19
|
+
"""CCI-based colour-state indicator classifying CCI into three zones.
|
|
20
|
+
|
|
21
|
+
Lines
|
|
22
|
+
-----
|
|
23
|
+
cci : float
|
|
24
|
+
Commodity Channel Index value.
|
|
25
|
+
color_state : float
|
|
26
|
+
0.0 = overbought (CCI > high_level), 1.0 = neutral, 2.0 = oversold.
|
|
27
|
+
hist_base : float
|
|
28
|
+
Always 0.0 (placeholder for histogram baseline).
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
lines = ("cci", "color_state", "hist_base")
|
|
32
|
+
params = (
|
|
33
|
+
("cci_period", 14),
|
|
34
|
+
("high_level", 100),
|
|
35
|
+
("low_level", -100),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
def __init__(self):
|
|
39
|
+
"""Initialise indicator state: attach CCI sub-indicator and set minimum period."""
|
|
40
|
+
cci = CommodityChannelIndex(self.data, period=int(self.p.cci_period))
|
|
41
|
+
self.lines.cci = cci
|
|
42
|
+
self.addminperiod(int(self.p.cci_period) + 2)
|
|
43
|
+
|
|
44
|
+
def next(self):
|
|
45
|
+
"""Classify current CCI value into colour state (0=overbought, 1=neutral, 2=oversold)."""
|
|
46
|
+
cci_value = float(self.lines.cci[0])
|
|
47
|
+
color = 1.0
|
|
48
|
+
if cci_value > float(self.p.high_level):
|
|
49
|
+
color = 0.0
|
|
50
|
+
elif cci_value < float(self.p.low_level):
|
|
51
|
+
color = 2.0
|
|
52
|
+
self.lines.color_state[0] = color
|
|
53
|
+
self.lines.hist_base[0] = 0.0
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
"CCIWoodiesIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _applied_price(data, price_type, ago=0):
|
|
16
|
+
"""Get price based on ENUM_APPLIED_PRICE."""
|
|
17
|
+
o = float(data.open[-ago])
|
|
18
|
+
h = float(data.high[-ago])
|
|
19
|
+
low_price = float(data.low[-ago])
|
|
20
|
+
c = float(data.close[-ago])
|
|
21
|
+
if price_type == 0:
|
|
22
|
+
return c # PRICE_CLOSE
|
|
23
|
+
if price_type == 1:
|
|
24
|
+
return o # PRICE_OPEN
|
|
25
|
+
if price_type == 2:
|
|
26
|
+
return h # PRICE_HIGH
|
|
27
|
+
if price_type == 3:
|
|
28
|
+
return low_price # PRICE_LOW
|
|
29
|
+
if price_type == 4:
|
|
30
|
+
return (h + low_price) / 2 # PRICE_MEDIAN
|
|
31
|
+
if price_type == 5:
|
|
32
|
+
return (h + low_price + c) / 3 # PRICE_TYPICAL
|
|
33
|
+
if price_type == 6:
|
|
34
|
+
return (h + low_price + c + c) / 4 # PRICE_WEIGHTED
|
|
35
|
+
return c
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class CCIWoodiesIndicator(Indicator):
|
|
39
|
+
"""Reconstructs CCI_Woodies indicator.
|
|
40
|
+
|
|
41
|
+
DRAW_FILLING between FastCCI and SlowCCI.
|
|
42
|
+
Buffer 0 = FastCCI, Buffer 1 = SlowCCI.
|
|
43
|
+
When Fast > Slow → bullish (Lime fill); when Fast < Slow → bearish (Plum fill).
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
lines = ("fast_cci", "slow_cci")
|
|
47
|
+
params = (
|
|
48
|
+
("fast_period", 6),
|
|
49
|
+
("fast_price", 4),
|
|
50
|
+
("slow_period", 14),
|
|
51
|
+
("slow_price", 4),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def __init__(self):
|
|
55
|
+
"""Build internal period and price type state for fast and slow CCI."""
|
|
56
|
+
self._fp = int(self.p.fast_period)
|
|
57
|
+
self._sp = int(self.p.slow_period)
|
|
58
|
+
self._fpr = int(self.p.fast_price)
|
|
59
|
+
self._spr = int(self.p.slow_price)
|
|
60
|
+
self.addminperiod(max(self._fp, self._sp) + 2)
|
|
61
|
+
|
|
62
|
+
def _calc_cci(self, period, price_type):
|
|
63
|
+
prices = []
|
|
64
|
+
for i in range(period):
|
|
65
|
+
if i >= len(self.data):
|
|
66
|
+
break
|
|
67
|
+
prices.append(_applied_price(self.data, price_type, i))
|
|
68
|
+
if not prices:
|
|
69
|
+
return 0.0
|
|
70
|
+
mean = sum(prices) / len(prices)
|
|
71
|
+
mad = sum(abs(p - mean) for p in prices) / len(prices)
|
|
72
|
+
tp = prices[0] # current bar
|
|
73
|
+
if mad == 0:
|
|
74
|
+
return 0.0
|
|
75
|
+
return (tp - mean) / (0.015 * mad)
|
|
76
|
+
|
|
77
|
+
def next(self):
|
|
78
|
+
"""Compute and store current fast and slow CCI values for each bar."""
|
|
79
|
+
self.lines.fast_cci[0] = self._calc_cci(self._fp, self._fpr)
|
|
80
|
+
self.lines.slow_cci[0] = self._calc_cci(self._sp, self._spr)
|
|
@@ -0,0 +1,83 @@
|
|
|
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
|
+
"CenterOfGravityCandleIndicator",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class CenterOfGravityCandleIndicator(Indicator):
|
|
22
|
+
"""Center-of-Gravity Candle indicator exposing center, signal, and state lines."""
|
|
23
|
+
|
|
24
|
+
lines = ("center", "signal", "state")
|
|
25
|
+
params = (
|
|
26
|
+
("period", 10),
|
|
27
|
+
("smooth_period", 3),
|
|
28
|
+
("ma_method", "sma"),
|
|
29
|
+
("applied_price", "close"),
|
|
30
|
+
("point", 0.01),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def __init__(self):
|
|
34
|
+
"""Build the center, signal, and warmup period from the applied price.
|
|
35
|
+
|
|
36
|
+
Side effects:
|
|
37
|
+
Computes ``center`` as the point-scaled product of an SMA and a LWMA
|
|
38
|
+
of the applied price, derives ``signal`` by smoothing ``center``, and
|
|
39
|
+
sets the minimum warmup period.
|
|
40
|
+
"""
|
|
41
|
+
ma_cls = self._ma_class()
|
|
42
|
+
price = self._price_line()
|
|
43
|
+
sma = SimpleMovingAverage(price, period=self.p.period)
|
|
44
|
+
lwma = WeightedMovingAverage(price, period=self.p.period)
|
|
45
|
+
self.lines.center = (sma * lwma) / self.p.point
|
|
46
|
+
self.lines.signal = ma_cls(self.lines.center, period=self.p.smooth_period)
|
|
47
|
+
self.addminperiod(self.p.period + self.p.smooth_period + 5)
|
|
48
|
+
|
|
49
|
+
def _ma_class(self):
|
|
50
|
+
mode = str(self.p.ma_method).lower()
|
|
51
|
+
if mode in {"ema", "mode_ema"}:
|
|
52
|
+
return ExponentialMovingAverage
|
|
53
|
+
if mode in {"smma", "smoothed", "mode_smma"}:
|
|
54
|
+
return SmoothedMovingAverage
|
|
55
|
+
if mode in {"lwma", "wma", "mode_lwma"}:
|
|
56
|
+
return WeightedMovingAverage
|
|
57
|
+
return SimpleMovingAverage
|
|
58
|
+
|
|
59
|
+
def _price_line(self):
|
|
60
|
+
mode = str(self.p.applied_price).lower()
|
|
61
|
+
if mode == "open":
|
|
62
|
+
return self.data.open
|
|
63
|
+
if mode == "high":
|
|
64
|
+
return self.data.high
|
|
65
|
+
if mode == "low":
|
|
66
|
+
return self.data.low
|
|
67
|
+
if mode == "median":
|
|
68
|
+
return (self.data.high + self.data.low) / 2.0
|
|
69
|
+
if mode == "typical":
|
|
70
|
+
return (self.data.high + self.data.low + self.data.close) / 3.0
|
|
71
|
+
if mode == "weighted":
|
|
72
|
+
return (self.data.high + self.data.low + self.data.close + self.data.close) / 4.0
|
|
73
|
+
if mode == "simpl":
|
|
74
|
+
return (self.data.open + self.data.close) / 2.0
|
|
75
|
+
if mode == "quarter":
|
|
76
|
+
return (self.data.high + self.data.low + self.data.open + self.data.close) / 4.0
|
|
77
|
+
return self.data.close
|
|
78
|
+
|
|
79
|
+
def next(self):
|
|
80
|
+
"""Set ``state`` to 2 when center is above signal, else 0, for the bar."""
|
|
81
|
+
self.lines.state[0] = (
|
|
82
|
+
2.0 if float(self.lines.center[0]) > float(self.lines.signal[0]) else 0.0
|
|
83
|
+
)
|