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,105 @@
|
|
|
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
|
+
"SidusIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SidusIndicator(Indicator):
|
|
16
|
+
"""Reconstructs Sidus indicator from its MQ5 source.
|
|
17
|
+
|
|
18
|
+
Uses 4 MAs: FastEMA, SlowEMA, FastLWMA, SlowLWMA + ATR(15).
|
|
19
|
+
Buy arrows on: FastLWMA crosses above SlowLWMA, or SlowLWMA crosses above SlowEMA.
|
|
20
|
+
Sell arrows on reverse crosses.
|
|
21
|
+
Arrow offset = ATR * digit scaling.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
lines = ("buy_arrow", "sell_arrow")
|
|
25
|
+
params = (
|
|
26
|
+
("fast_ema", 18),
|
|
27
|
+
("slow_ema", 28),
|
|
28
|
+
("fast_lwma", 5),
|
|
29
|
+
("slow_lwma", 8),
|
|
30
|
+
("digit", 0),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def __init__(self):
|
|
34
|
+
"""Cache MA periods and digit scaling, and set the indicator warmup."""
|
|
35
|
+
self._fe = int(self.p.fast_ema)
|
|
36
|
+
self._se = int(self.p.slow_ema)
|
|
37
|
+
self._fl = int(self.p.fast_lwma)
|
|
38
|
+
self._sl = int(self.p.slow_lwma)
|
|
39
|
+
self._digit = float(10 ** int(self.p.digit)) if int(self.p.digit) > 0 else 0.0
|
|
40
|
+
self.addminperiod(max(self._fe, self._se, self._fl, self._sl) + 3)
|
|
41
|
+
|
|
42
|
+
def _ema(self, period, ago):
|
|
43
|
+
# Simple EMA approximation using close prices
|
|
44
|
+
k = 2.0 / (period + 1)
|
|
45
|
+
val = float(self.data.close[-(ago + period - 1)])
|
|
46
|
+
for i in range(ago + period - 2, ago - 1, -1):
|
|
47
|
+
val = float(self.data.close[-i]) * k + val * (1 - k) if i >= 0 else val
|
|
48
|
+
return val
|
|
49
|
+
|
|
50
|
+
def _lwma(self, period, ago):
|
|
51
|
+
total = 0.0
|
|
52
|
+
wsum = 0.0
|
|
53
|
+
for i in range(period):
|
|
54
|
+
w = float(period - i)
|
|
55
|
+
total += float(self.data.close[-(ago + i)]) * w
|
|
56
|
+
wsum += w
|
|
57
|
+
return total / wsum if wsum > 0 else 0.0
|
|
58
|
+
|
|
59
|
+
def _atr(self, period, ago):
|
|
60
|
+
total = 0.0
|
|
61
|
+
for i in range(period):
|
|
62
|
+
idx = ago + i
|
|
63
|
+
h = float(self.data.high[-idx])
|
|
64
|
+
low_price = float(self.data.low[-idx])
|
|
65
|
+
if idx + 1 < len(self.data):
|
|
66
|
+
pc = float(self.data.close[-(idx + 1)])
|
|
67
|
+
tr = max(h - low_price, abs(h - pc), abs(low_price - pc))
|
|
68
|
+
else:
|
|
69
|
+
tr = h - low_price
|
|
70
|
+
total += tr
|
|
71
|
+
return total / period
|
|
72
|
+
|
|
73
|
+
def next(self):
|
|
74
|
+
"""Emit buy/sell arrow offsets when the LWMA/EMA cross conditions fire."""
|
|
75
|
+
# Current bar (ago=0) and previous bar (ago=1)
|
|
76
|
+
self._ema(self._fe, 0)
|
|
77
|
+
slw_ema_0 = self._ema(self._se, 0)
|
|
78
|
+
fst_lwma_0 = self._lwma(self._fl, 0)
|
|
79
|
+
slw_lwma_0 = self._lwma(self._sl, 0)
|
|
80
|
+
|
|
81
|
+
fst_lwma_1 = self._lwma(self._fl, 1)
|
|
82
|
+
slw_lwma_1 = self._lwma(self._sl, 1)
|
|
83
|
+
slw_ema_1 = self._ema(self._se, 1)
|
|
84
|
+
|
|
85
|
+
atr_val = self._atr(15, 0)
|
|
86
|
+
rng = atr_val * 3.0
|
|
87
|
+
digit = self._digit
|
|
88
|
+
|
|
89
|
+
buy_val = 0.0
|
|
90
|
+
sell_val = 0.0
|
|
91
|
+
|
|
92
|
+
# Buy: FastLWMA crosses above SlowLWMA, or SlowLWMA crosses above SlowEMA
|
|
93
|
+
if fst_lwma_0 > slw_lwma_0 + digit and fst_lwma_1 <= slw_lwma_1:
|
|
94
|
+
buy_val = float(self.data.low[0]) - rng
|
|
95
|
+
if slw_lwma_0 > slw_ema_0 + digit and slw_lwma_1 <= slw_ema_1:
|
|
96
|
+
buy_val = float(self.data.low[0]) - rng
|
|
97
|
+
|
|
98
|
+
# Sell: FastLWMA crosses below SlowLWMA, or SlowLWMA crosses below SlowEMA
|
|
99
|
+
if fst_lwma_0 < slw_lwma_0 - digit and fst_lwma_1 >= slw_lwma_1:
|
|
100
|
+
sell_val = float(self.data.high[0]) + rng
|
|
101
|
+
if slw_lwma_0 < slw_ema_0 - digit and slw_lwma_1 >= slw_ema_1:
|
|
102
|
+
sell_val = float(self.data.high[0]) + rng
|
|
103
|
+
|
|
104
|
+
self.lines.buy_arrow[0] = buy_val
|
|
105
|
+
self.lines.sell_arrow[0] = sell_val
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
"SilverTrendIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SilverTrendIndicator(Indicator):
|
|
16
|
+
"""Reconstructs SilverTrend_Signal from its MQ5 source.
|
|
17
|
+
|
|
18
|
+
Uses SSP-period average range to compute smin/smax bands.
|
|
19
|
+
K = RISK * 100.
|
|
20
|
+
smin = SsMin + (SsMax - SsMin) * K / 100
|
|
21
|
+
smax = SsMax - (SsMax - SsMin) * K / 100
|
|
22
|
+
Trend toggles: close < smin → downtrend, close > smax → uptrend.
|
|
23
|
+
Buy arrow on uptrend toggle, sell arrow on downtrend toggle.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
lines = ("buy_arrow", "sell_arrow")
|
|
27
|
+
params = (
|
|
28
|
+
("ssp", 9),
|
|
29
|
+
("risk", 3),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def __init__(self):
|
|
33
|
+
"""Cache SSP/risk parameters, reset trend state, and set min period."""
|
|
34
|
+
self._ssp = int(self.p.ssp)
|
|
35
|
+
self._k = float(self.p.risk) * 100.0
|
|
36
|
+
self._uptrend = False
|
|
37
|
+
self._old = False
|
|
38
|
+
self.addminperiod(self._ssp + 2)
|
|
39
|
+
|
|
40
|
+
def next(self):
|
|
41
|
+
"""Update the adaptive bands and emit buy/sell arrows on trend flips."""
|
|
42
|
+
ssp = self._ssp
|
|
43
|
+
|
|
44
|
+
# Compute average range over SSP bars
|
|
45
|
+
total_range = 0.0
|
|
46
|
+
for i in range(ssp):
|
|
47
|
+
h = float(self.data.high[-i])
|
|
48
|
+
low_price = float(self.data.low[-i])
|
|
49
|
+
total_range += h - low_price
|
|
50
|
+
avg_range = total_range / ssp
|
|
51
|
+
rng = avg_range
|
|
52
|
+
|
|
53
|
+
# SsMax = highest high over SSP bars, SsMin = lowest low
|
|
54
|
+
ss_max = max(float(self.data.high[-i]) for i in range(ssp))
|
|
55
|
+
ss_min = min(float(self.data.low[-i]) for i in range(ssp))
|
|
56
|
+
|
|
57
|
+
k = self._k
|
|
58
|
+
smin = ss_min + (ss_max - ss_min) * k / 100.0
|
|
59
|
+
smax = ss_max - (ss_max - ss_min) * k / 100.0
|
|
60
|
+
|
|
61
|
+
cur_close = float(self.data.close[0])
|
|
62
|
+
|
|
63
|
+
if cur_close < smin:
|
|
64
|
+
self._uptrend = False
|
|
65
|
+
if cur_close > smax:
|
|
66
|
+
self._uptrend = True
|
|
67
|
+
|
|
68
|
+
buy_val = 0.0
|
|
69
|
+
sell_val = 0.0
|
|
70
|
+
|
|
71
|
+
if self._uptrend != self._old and self._uptrend:
|
|
72
|
+
buy_val = float(self.data.low[0]) - rng * 0.5
|
|
73
|
+
if self._uptrend != self._old and not self._uptrend:
|
|
74
|
+
sell_val = float(self.data.high[0]) + rng * 0.5
|
|
75
|
+
|
|
76
|
+
self._old = self._uptrend
|
|
77
|
+
|
|
78
|
+
self.lines.buy_arrow[0] = buy_val
|
|
79
|
+
self.lines.sell_arrow[0] = sell_val
|
|
@@ -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 Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"SlidingRangeColor",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SlidingRangeColor(Indicator):
|
|
16
|
+
"""Indicator computing sliding-window average range channels with a color index for breakout direction."""
|
|
17
|
+
|
|
18
|
+
lines = ("color_idx", "upper", "lower")
|
|
19
|
+
params = (
|
|
20
|
+
("up_calc_period_range", 5),
|
|
21
|
+
("up_calc_period_shift", 0),
|
|
22
|
+
("dn_calc_period_range", 5),
|
|
23
|
+
("dn_calc_period_shift", 0),
|
|
24
|
+
("up_digit", 2),
|
|
25
|
+
("dn_digit", 2),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def next(self):
|
|
29
|
+
"""Compute rounded average of recent highs/lows and set color based on close relative to the range."""
|
|
30
|
+
up_end = len(self.data) - 1 - self.p.up_calc_period_shift
|
|
31
|
+
up_start = max(0, up_end - self.p.up_calc_period_range + 1)
|
|
32
|
+
dn_end = len(self.data) - 1 - self.p.dn_calc_period_shift
|
|
33
|
+
dn_start = max(0, dn_end - self.p.dn_calc_period_range + 1)
|
|
34
|
+
highs = [
|
|
35
|
+
float(self.data.high[-idx])
|
|
36
|
+
for idx in range(len(self.data) - 1 - up_end, len(self.data) - up_start)
|
|
37
|
+
]
|
|
38
|
+
lows = [
|
|
39
|
+
float(self.data.low[-idx])
|
|
40
|
+
for idx in range(len(self.data) - 1 - dn_end, len(self.data) - dn_start)
|
|
41
|
+
]
|
|
42
|
+
if not highs or not lows:
|
|
43
|
+
self.lines.color_idx[0] = 4.0
|
|
44
|
+
return
|
|
45
|
+
upper = round(sum(highs) / len(highs), self.p.up_digit)
|
|
46
|
+
lower = round(sum(lows) / len(lows), self.p.dn_digit)
|
|
47
|
+
close = float(self.data.close[0])
|
|
48
|
+
open_ = float(self.data.open[0])
|
|
49
|
+
self.lines.upper[0] = upper
|
|
50
|
+
self.lines.lower[0] = lower
|
|
51
|
+
color = 4.0
|
|
52
|
+
if close > upper:
|
|
53
|
+
color = 3.0 if close >= open_ else 2.0
|
|
54
|
+
elif close < lower:
|
|
55
|
+
color = 0.0 if close <= open_ else 1.0
|
|
56
|
+
self.lines.color_idx[0] = color
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import (
|
|
9
|
+
ExponentialMovingAverage,
|
|
10
|
+
Indicator,
|
|
11
|
+
StochasticFull,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"SlowStoch",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SlowStoch(Indicator):
|
|
20
|
+
"""EMA-smoothed slow stochastic exposing an oscillator and a signal line."""
|
|
21
|
+
|
|
22
|
+
lines = ("sto", "signal")
|
|
23
|
+
params = (
|
|
24
|
+
("k_period", 5),
|
|
25
|
+
("d_period", 3),
|
|
26
|
+
("slowing", 3),
|
|
27
|
+
("xlength", 5),
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
"""Build the StochasticFull and EMA-smooth its %D and slow %D lines."""
|
|
32
|
+
stoch = StochasticFull(
|
|
33
|
+
self.data,
|
|
34
|
+
period=max(int(self.p.k_period), 1),
|
|
35
|
+
period_dfast=max(int(self.p.d_period), 1),
|
|
36
|
+
period_dslow=max(int(self.p.slowing), 1),
|
|
37
|
+
safediv=True,
|
|
38
|
+
)
|
|
39
|
+
self.l.sto = ExponentialMovingAverage(stoch.percD, period=max(int(self.p.xlength), 1))
|
|
40
|
+
self.l.signal = ExponentialMovingAverage(
|
|
41
|
+
stoch.percDSlow, period=max(int(self.p.xlength), 1)
|
|
42
|
+
)
|
|
@@ -0,0 +1,86 @@
|
|
|
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
|
+
ADX,
|
|
10
|
+
ExponentialMovingAverage,
|
|
11
|
+
Indicator,
|
|
12
|
+
MinusDirectionalIndicator,
|
|
13
|
+
PlusDirectionalIndicator,
|
|
14
|
+
SimpleMovingAverage,
|
|
15
|
+
SmoothedMovingAverage,
|
|
16
|
+
WeightedMovingAverage,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"SmoothedADXIndicator",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def resolve_ma_class(name):
|
|
25
|
+
"""Map a moving-average name to its backtrader indicator class.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
name: MA type name (e.g. ``t3``, ``ema``, ``sma``, ``smma`` or MT5-style
|
|
29
|
+
``mode_*`` variants); several smoothing variants map to EMA.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
The matching backtrader moving-average indicator class, defaulting to
|
|
33
|
+
the weighted moving average for unrecognized names.
|
|
34
|
+
"""
|
|
35
|
+
mode = str(name).lower()
|
|
36
|
+
if mode in {
|
|
37
|
+
"mode_t3",
|
|
38
|
+
"t3",
|
|
39
|
+
"mode_ema",
|
|
40
|
+
"ema",
|
|
41
|
+
"mode_ama",
|
|
42
|
+
"ama",
|
|
43
|
+
"mode_jjma",
|
|
44
|
+
"jjma",
|
|
45
|
+
"mode_jurx",
|
|
46
|
+
"jurx",
|
|
47
|
+
"mode_vidya",
|
|
48
|
+
"vidya",
|
|
49
|
+
"mode_parma",
|
|
50
|
+
"parma",
|
|
51
|
+
}:
|
|
52
|
+
return ExponentialMovingAverage
|
|
53
|
+
if mode in {"mode_sma", "sma"}:
|
|
54
|
+
return SimpleMovingAverage
|
|
55
|
+
if mode in {"mode_smma", "smma"}:
|
|
56
|
+
return SmoothedMovingAverage
|
|
57
|
+
return WeightedMovingAverage
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class SmoothedADXIndicator(Indicator):
|
|
61
|
+
"""ADX/DI system with each line smoothed by a configurable moving average.
|
|
62
|
+
|
|
63
|
+
Computes raw +DI, -DI and ADX over ``adx_period`` and exposes moving-average
|
|
64
|
+
smoothed versions on the ``plus_di``, ``minus_di`` and ``adx`` lines.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
lines = ("plus_di", "minus_di", "adx")
|
|
68
|
+
params = (
|
|
69
|
+
("xma_method", "t3"),
|
|
70
|
+
("adx_period", 14),
|
|
71
|
+
("adx_phase", 100),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
def __init__(self):
|
|
75
|
+
"""Build the raw +DI/-DI/ADX indicators and their smoothed lines."""
|
|
76
|
+
ma_cls = resolve_ma_class(self.p.xma_method)
|
|
77
|
+
self._plus = PlusDirectionalIndicator(self.data, period=max(1, int(self.p.adx_period)))
|
|
78
|
+
self._minus = MinusDirectionalIndicator(self.data, period=max(1, int(self.p.adx_period)))
|
|
79
|
+
self._adx_raw = ADX(self.data, period=max(1, int(self.p.adx_period)))
|
|
80
|
+
self._plus_smooth = ma_cls(self._plus, period=max(1, int(self.p.adx_period)))
|
|
81
|
+
self._minus_smooth = ma_cls(self._minus, period=max(1, int(self.p.adx_period)))
|
|
82
|
+
self._adx_smooth = ma_cls(self._adx_raw, period=max(1, int(self.p.adx_period)))
|
|
83
|
+
self.lines.plus_di = self._plus_smooth
|
|
84
|
+
self.lines.minus_di = self._minus_smooth
|
|
85
|
+
self.lines.adx = self._adx_smooth
|
|
86
|
+
self.addminperiod(int(self.p.adx_period) * 3)
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
RSI,
|
|
10
|
+
Indicator,
|
|
11
|
+
SimpleMovingAverage,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"SmoothedRsi",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SmoothedRsi(Indicator):
|
|
20
|
+
"""Smooth RSI value using an outer simple moving average."""
|
|
21
|
+
|
|
22
|
+
lines = ("value",)
|
|
23
|
+
params = (
|
|
24
|
+
("period", 14),
|
|
25
|
+
("smoothing", 6),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
"""Initialize RSI and smoothed value lines from configured parameters."""
|
|
30
|
+
rsi = RSI(self.data, period=self.p.period)
|
|
31
|
+
self.lines.value = SimpleMovingAverage(rsi, period=self.p.smoothing)
|
|
@@ -0,0 +1,60 @@
|
|
|
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
|
+
"SpearmanRankCorrelationHistogram",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SpearmanRankCorrelationHistogram(Indicator):
|
|
16
|
+
"""Compute a Spearman-rank-style correlation histogram and regime color."""
|
|
17
|
+
|
|
18
|
+
lines = ("value", "color")
|
|
19
|
+
params = (
|
|
20
|
+
("range_n", 14),
|
|
21
|
+
("direction", True),
|
|
22
|
+
("in_high_level", 0.5),
|
|
23
|
+
("in_low_level", -0.5),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def __init__(self):
|
|
27
|
+
"""Set the indicator minimum period."""
|
|
28
|
+
self.addminperiod(int(self.p.range_n) + 2)
|
|
29
|
+
|
|
30
|
+
def _ranks(self, values):
|
|
31
|
+
indexed = list(enumerate(values))
|
|
32
|
+
sorted_values = sorted(indexed, key=lambda item: item[1], reverse=bool(self.p.direction))
|
|
33
|
+
ranks = [0.0] * len(values)
|
|
34
|
+
i = 0
|
|
35
|
+
while i < len(sorted_values):
|
|
36
|
+
j = i + 1
|
|
37
|
+
while j < len(sorted_values) and sorted_values[j][1] == sorted_values[i][1]:
|
|
38
|
+
j += 1
|
|
39
|
+
avg_rank = (i + 1 + j) / 2.0
|
|
40
|
+
for k in range(i, j):
|
|
41
|
+
ranks[sorted_values[k][0]] = avg_rank
|
|
42
|
+
i = j
|
|
43
|
+
return ranks
|
|
44
|
+
|
|
45
|
+
def next(self):
|
|
46
|
+
"""Compute one step of correlation value and color code."""
|
|
47
|
+
n = int(self.p.range_n)
|
|
48
|
+
values = [int(round(float(self.data.close[-i]) * 100.0)) for i in range(n)]
|
|
49
|
+
ranks = self._ranks(values)
|
|
50
|
+
z2 = 0.0
|
|
51
|
+
for i, rank in enumerate(ranks):
|
|
52
|
+
z2 += (rank - (i + 1)) ** 2
|
|
53
|
+
res = 1.0 - 6.0 * z2 / (n**3 - n)
|
|
54
|
+
self.lines.value[0] = res
|
|
55
|
+
clr = 2
|
|
56
|
+
if res > 0:
|
|
57
|
+
clr = 4 if res > float(self.p.in_high_level) else 3
|
|
58
|
+
elif res < 0:
|
|
59
|
+
clr = 0 if res < float(self.p.in_low_level) else 1
|
|
60
|
+
self.lines.color[0] = clr
|
|
@@ -0,0 +1,152 @@
|
|
|
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
|
+
"StalinIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class StalinIndicator(Indicator):
|
|
16
|
+
"""Reconstructs Stalin indicator from its MQ5 source.
|
|
17
|
+
|
|
18
|
+
Uses Fast/Slow MA crossover with optional RSI filter.
|
|
19
|
+
BU() fires buy arrow at low if flat distance check passes.
|
|
20
|
+
BD() fires sell arrow at high if flat distance check passes.
|
|
21
|
+
Optional Confirm parameter adds a price-distance confirmation step.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
lines = ("buy_arrow", "sell_arrow")
|
|
25
|
+
params = (
|
|
26
|
+
("ma_method", "ema"),
|
|
27
|
+
("fast", 14),
|
|
28
|
+
("slow", 21),
|
|
29
|
+
("rsi_period", 17),
|
|
30
|
+
("confirm", 0),
|
|
31
|
+
("flat", 0),
|
|
32
|
+
("point", 0.0001),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
"""Prepare cached MA/RSI parameters and state for BU/BD arrow generation."""
|
|
37
|
+
self._fast = int(self.p.fast)
|
|
38
|
+
self._slow = int(self.p.slow)
|
|
39
|
+
self._rsi = int(self.p.rsi_period)
|
|
40
|
+
self._confirm2 = float(self.p.confirm) * float(self.p.point)
|
|
41
|
+
self._flat2 = float(self.p.flat) * float(self.p.point)
|
|
42
|
+
self._e1 = 0.0 # last buy arrow price
|
|
43
|
+
self._e2 = 0.0 # last sell arrow price
|
|
44
|
+
self._iup = 0.0 # pending buy confirmation price
|
|
45
|
+
self._idn = 0.0 # pending sell confirmation price
|
|
46
|
+
self.addminperiod(max(self._fast, self._slow, self._rsi if self._rsi > 0 else 1) + 3)
|
|
47
|
+
|
|
48
|
+
def _calc_ema(self, period, ago):
|
|
49
|
+
k = 2.0 / (period + 1)
|
|
50
|
+
val = float(self.data.close[-(ago + period - 1)])
|
|
51
|
+
for i in range(ago + period - 2, ago - 1, -1):
|
|
52
|
+
val = float(self.data.close[-i]) * k + val * (1 - k) if i >= 0 else val
|
|
53
|
+
return val
|
|
54
|
+
|
|
55
|
+
def _calc_lwma(self, period, ago):
|
|
56
|
+
total = 0.0
|
|
57
|
+
wsum = 0.0
|
|
58
|
+
for i in range(period):
|
|
59
|
+
w = float(period - i)
|
|
60
|
+
total += float(self.data.close[-(ago + i)]) * w
|
|
61
|
+
wsum += w
|
|
62
|
+
return total / wsum if wsum > 0 else 0.0
|
|
63
|
+
|
|
64
|
+
def _calc_sma(self, period, ago):
|
|
65
|
+
total = 0.0
|
|
66
|
+
for i in range(period):
|
|
67
|
+
total += float(self.data.close[-(ago + i)])
|
|
68
|
+
return total / period
|
|
69
|
+
|
|
70
|
+
def _calc_ma(self, period, ago):
|
|
71
|
+
method = str(self.p.ma_method).lower()
|
|
72
|
+
if method == "lwma":
|
|
73
|
+
return self._calc_lwma(period, ago)
|
|
74
|
+
if method == "sma":
|
|
75
|
+
return self._calc_sma(period, ago)
|
|
76
|
+
return self._calc_ema(period, ago)
|
|
77
|
+
|
|
78
|
+
def _calc_rsi(self, period, ago):
|
|
79
|
+
gains = 0.0
|
|
80
|
+
losses = 0.0
|
|
81
|
+
for i in range(period):
|
|
82
|
+
idx = ago + i
|
|
83
|
+
c = float(self.data.close[-idx])
|
|
84
|
+
cp = float(self.data.close[-(idx + 1)])
|
|
85
|
+
diff = c - cp
|
|
86
|
+
if diff > 0:
|
|
87
|
+
gains += diff
|
|
88
|
+
else:
|
|
89
|
+
losses -= diff
|
|
90
|
+
avg_gain = gains / period
|
|
91
|
+
avg_loss = losses / period
|
|
92
|
+
if avg_loss == 0:
|
|
93
|
+
return 100.0
|
|
94
|
+
rs = avg_gain / avg_loss
|
|
95
|
+
return 100.0 - (100.0 / (1.0 + rs))
|
|
96
|
+
|
|
97
|
+
def next(self):
|
|
98
|
+
"""Compute MA crossover and optional RSI filters, then emit buy/sell arrows."""
|
|
99
|
+
fast_ma_0 = self._calc_ma(self._fast, 0)
|
|
100
|
+
slow_ma_0 = self._calc_ma(self._slow, 0)
|
|
101
|
+
fast_ma_1 = self._calc_ma(self._fast, 1)
|
|
102
|
+
slow_ma_1 = self._calc_ma(self._slow, 1)
|
|
103
|
+
|
|
104
|
+
use_rsi = self._rsi > 0
|
|
105
|
+
rsi_val = self._calc_rsi(self._rsi, 0) if use_rsi else 50.0
|
|
106
|
+
|
|
107
|
+
buy_val = 0.0
|
|
108
|
+
sell_val = 0.0
|
|
109
|
+
|
|
110
|
+
cur_low = float(self.data.low[0])
|
|
111
|
+
cur_high = float(self.data.high[0])
|
|
112
|
+
cur_close = float(self.data.close[0])
|
|
113
|
+
flat2 = self._flat2
|
|
114
|
+
confirm2 = self._confirm2
|
|
115
|
+
|
|
116
|
+
# MA crossover buy signal
|
|
117
|
+
if (not use_rsi) or (fast_ma_1 < slow_ma_1 and fast_ma_0 > slow_ma_0 and rsi_val > 50):
|
|
118
|
+
if not confirm2:
|
|
119
|
+
# BU: fire buy arrow if flat distance passes
|
|
120
|
+
if cur_low >= (self._e1 + flat2) or cur_low <= (self._e1 - flat2):
|
|
121
|
+
buy_val = cur_low
|
|
122
|
+
self._e1 = cur_low
|
|
123
|
+
else:
|
|
124
|
+
self._iup = cur_low
|
|
125
|
+
self._idn = 0.0
|
|
126
|
+
|
|
127
|
+
# MA crossover sell signal
|
|
128
|
+
if (not use_rsi) or (fast_ma_1 > slow_ma_1 and fast_ma_0 < slow_ma_0 and rsi_val < 50):
|
|
129
|
+
if not confirm2:
|
|
130
|
+
if cur_high >= (self._e2 + flat2) or cur_high <= (self._e2 - flat2):
|
|
131
|
+
sell_val = cur_high
|
|
132
|
+
self._e2 = cur_high
|
|
133
|
+
else:
|
|
134
|
+
self._idn = cur_high
|
|
135
|
+
self._iup = 0.0
|
|
136
|
+
|
|
137
|
+
# Confirm pending buy
|
|
138
|
+
if self._iup and cur_high - self._iup >= confirm2 and cur_close <= cur_high:
|
|
139
|
+
if cur_low >= (self._e1 + flat2) or cur_low <= (self._e1 - flat2):
|
|
140
|
+
buy_val = cur_low
|
|
141
|
+
self._e1 = cur_low
|
|
142
|
+
self._iup = 0.0
|
|
143
|
+
|
|
144
|
+
# Confirm pending sell
|
|
145
|
+
if self._idn and self._idn - cur_low >= confirm2 and float(self.data.open[0]) >= cur_close:
|
|
146
|
+
if cur_high >= (self._e2 + flat2) or cur_high <= (self._e2 - flat2):
|
|
147
|
+
sell_val = cur_high
|
|
148
|
+
self._e2 = cur_high
|
|
149
|
+
self._idn = 0.0
|
|
150
|
+
|
|
151
|
+
self.lines.buy_arrow[0] = buy_val
|
|
152
|
+
self.lines.sell_arrow[0] = sell_val
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
"StarterLaguerreFilter",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class StarterLaguerreFilter(Indicator):
|
|
16
|
+
"""Laguerre filter oscillator bounded in the [0, 1] range.
|
|
17
|
+
|
|
18
|
+
Implements Ehlers' four-stage Laguerre filter and converts the staged
|
|
19
|
+
values into a normalised oscillator. Readings near 0 indicate oversold
|
|
20
|
+
conditions and readings near 1 indicate overbought conditions.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
lines = ("value",)
|
|
24
|
+
params = (("gamma", 0.7),)
|
|
25
|
+
|
|
26
|
+
def __init__(self):
|
|
27
|
+
"""Set the minimum period and reset the four Laguerre stage buffers."""
|
|
28
|
+
self.addminperiod(2)
|
|
29
|
+
self._l0 = None
|
|
30
|
+
self._l1 = None
|
|
31
|
+
self._l2 = None
|
|
32
|
+
self._l3 = None
|
|
33
|
+
|
|
34
|
+
def next(self):
|
|
35
|
+
"""Advance the Laguerre stages and emit the normalised oscillator value."""
|
|
36
|
+
price = float(self.data[0])
|
|
37
|
+
gamma = float(self.p.gamma)
|
|
38
|
+
if self._l0 is None:
|
|
39
|
+
self._l0 = price
|
|
40
|
+
self._l1 = price
|
|
41
|
+
self._l2 = price
|
|
42
|
+
self._l3 = price
|
|
43
|
+
self.lines.value[0] = 0.5
|
|
44
|
+
return
|
|
45
|
+
l0_prev = self._l0
|
|
46
|
+
l1_prev = self._l1
|
|
47
|
+
l2_prev = self._l2
|
|
48
|
+
l3_prev = self._l3
|
|
49
|
+
self._l0 = (1.0 - gamma) * price + gamma * l0_prev
|
|
50
|
+
self._l1 = -gamma * self._l0 + l0_prev + gamma * l1_prev
|
|
51
|
+
self._l2 = -gamma * self._l1 + l1_prev + gamma * l2_prev
|
|
52
|
+
self._l3 = -gamma * self._l2 + l2_prev + gamma * l3_prev
|
|
53
|
+
cu = 0.0
|
|
54
|
+
cd = 0.0
|
|
55
|
+
pairs = ((self._l0, self._l1), (self._l1, self._l2), (self._l2, self._l3))
|
|
56
|
+
for left, right in pairs:
|
|
57
|
+
if left >= right:
|
|
58
|
+
cu += left - right
|
|
59
|
+
else:
|
|
60
|
+
cd += right - left
|
|
61
|
+
denom = cu + cd
|
|
62
|
+
self.lines.value[0] = cu / denom if denom else self.lines.value[-1]
|