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,57 @@
|
|
|
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
|
+
"Mt5StochasticCloseClose",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Mt5StochasticCloseClose(Indicator):
|
|
16
|
+
"""Close-close based Smoothed Stochastic oscillator implementation."""
|
|
17
|
+
|
|
18
|
+
lines = ("main", "signal")
|
|
19
|
+
params = (
|
|
20
|
+
("k_period", 5),
|
|
21
|
+
("d_period", 3),
|
|
22
|
+
("slowing", 3),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Set calculation parameters and initial EMA-smoothed state."""
|
|
27
|
+
self.addminperiod(self.p.k_period + max(self.p.d_period, self.p.slowing) + 2)
|
|
28
|
+
self._slow_prev = None
|
|
29
|
+
self._signal_prev = None
|
|
30
|
+
self._alpha_slow = 2.0 / (self.p.slowing + 1.0)
|
|
31
|
+
self._alpha_signal = 2.0 / (self.p.d_period + 1.0)
|
|
32
|
+
|
|
33
|
+
def next(self):
|
|
34
|
+
"""Compute smoothed %K/%D and emit current oscillator lines."""
|
|
35
|
+
closes = [float(self.data.close[-i]) for i in range(self.p.k_period)]
|
|
36
|
+
highest_close = max(closes)
|
|
37
|
+
lowest_close = min(closes)
|
|
38
|
+
close0 = float(self.data.close[0])
|
|
39
|
+
if highest_close == lowest_close:
|
|
40
|
+
raw_k = 0.0
|
|
41
|
+
else:
|
|
42
|
+
raw_k = 100.0 * (close0 - lowest_close) / (highest_close - lowest_close)
|
|
43
|
+
|
|
44
|
+
if self._slow_prev is None:
|
|
45
|
+
slow_val = raw_k
|
|
46
|
+
else:
|
|
47
|
+
slow_val = self._slow_prev + self._alpha_slow * (raw_k - self._slow_prev)
|
|
48
|
+
|
|
49
|
+
if self._signal_prev is None:
|
|
50
|
+
signal_val = slow_val
|
|
51
|
+
else:
|
|
52
|
+
signal_val = self._signal_prev + self._alpha_signal * (slow_val - self._signal_prev)
|
|
53
|
+
|
|
54
|
+
self.lines.main[0] = slow_val
|
|
55
|
+
self.lines.signal[0] = signal_val
|
|
56
|
+
self._slow_prev = slow_val
|
|
57
|
+
self._signal_prev = signal_val
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import math
|
|
9
|
+
|
|
10
|
+
from .. import (
|
|
11
|
+
ExponentialMovingAverage,
|
|
12
|
+
Indicator,
|
|
13
|
+
SimpleMovingAverage,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"MUVNorDiffCloudIndicator",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class MUVNorDiffCloudIndicator(Indicator):
|
|
22
|
+
"""Calculate normalized DIFF cloud signals used by the strategy."""
|
|
23
|
+
|
|
24
|
+
lines = ("buy", "sell", "sma_res", "ema_res")
|
|
25
|
+
params = (
|
|
26
|
+
("ma_period", 14),
|
|
27
|
+
("momentum", 1),
|
|
28
|
+
("kperiod", 14),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Initialize SMA/EMA buffers and minimum bars required for reliable signals."""
|
|
33
|
+
price = self.data.close
|
|
34
|
+
self._sma = SimpleMovingAverage(price, period=max(1, int(self.p.ma_period)))
|
|
35
|
+
self._ema = ExponentialMovingAverage(price, period=max(1, int(self.p.ma_period)))
|
|
36
|
+
self.addminperiod(int(self.p.ma_period) + int(self.p.momentum) + int(self.p.kperiod) + 5)
|
|
37
|
+
|
|
38
|
+
def next(self):
|
|
39
|
+
"""Compute cloud values for the current bar."""
|
|
40
|
+
momentum = max(1, int(self.p.momentum))
|
|
41
|
+
kperiod = max(2, int(self.p.kperiod))
|
|
42
|
+
sma_vals = []
|
|
43
|
+
ema_vals = []
|
|
44
|
+
for i in range(kperiod):
|
|
45
|
+
sma_vals.append(float(self._sma[-i]) - float(self._sma[-i - momentum]))
|
|
46
|
+
ema_vals.append(float(self._ema[-i]) - float(self._ema[-i - momentum]))
|
|
47
|
+
sma_cur = sma_vals[0]
|
|
48
|
+
ema_cur = ema_vals[0]
|
|
49
|
+
sma_max = max(sma_vals)
|
|
50
|
+
sma_min = min(sma_vals)
|
|
51
|
+
ema_max = max(ema_vals)
|
|
52
|
+
ema_min = min(ema_vals)
|
|
53
|
+
sma_range = sma_max - sma_min
|
|
54
|
+
ema_range = ema_max - ema_min
|
|
55
|
+
sma_res = 100.0 - 200.0 * (sma_max - sma_cur) / sma_range if sma_range > 0 else 100.0
|
|
56
|
+
ema_res = 100.0 - 200.0 * (ema_max - ema_cur) / ema_range if ema_range > 0 else 100.0
|
|
57
|
+
self.lines.sma_res[0] = sma_res
|
|
58
|
+
self.lines.ema_res[0] = ema_res
|
|
59
|
+
self.lines.buy[0] = 100.0 if sma_res == 100.0 or ema_res == 100.0 else 0.0
|
|
60
|
+
self.lines.sell[0] = -100.0 if sma_res == -100.0 or ema_res == -100.0 else 0.0
|
|
61
|
+
|
|
62
|
+
def once(self, start, end):
|
|
63
|
+
"""Compute cloud values for a pre-allocated bar range in vectorized mode."""
|
|
64
|
+
momentum = max(1, int(self.p.momentum))
|
|
65
|
+
kperiod = max(2, int(self.p.kperiod))
|
|
66
|
+
sma = self._sma.array
|
|
67
|
+
ema = self._ema.array
|
|
68
|
+
buy = self.lines.buy.array
|
|
69
|
+
sell = self.lines.sell.array
|
|
70
|
+
sma_res_line = self.lines.sma_res.array
|
|
71
|
+
ema_res_line = self.lines.ema_res.array
|
|
72
|
+
|
|
73
|
+
for i in range(start, end):
|
|
74
|
+
sma_vals = []
|
|
75
|
+
ema_vals = []
|
|
76
|
+
for j in range(kperiod):
|
|
77
|
+
idx = i - j
|
|
78
|
+
prev = idx - momentum
|
|
79
|
+
if prev < 0:
|
|
80
|
+
continue
|
|
81
|
+
sma_delta = float(sma[idx]) - float(sma[prev])
|
|
82
|
+
ema_delta = float(ema[idx]) - float(ema[prev])
|
|
83
|
+
if math.isfinite(sma_delta):
|
|
84
|
+
sma_vals.append(sma_delta)
|
|
85
|
+
if math.isfinite(ema_delta):
|
|
86
|
+
ema_vals.append(ema_delta)
|
|
87
|
+
if not sma_vals or not ema_vals:
|
|
88
|
+
sma_res = ema_res = 0.0
|
|
89
|
+
else:
|
|
90
|
+
sma_cur = sma_vals[0]
|
|
91
|
+
ema_cur = ema_vals[0]
|
|
92
|
+
sma_max = max(sma_vals)
|
|
93
|
+
sma_min = min(sma_vals)
|
|
94
|
+
ema_max = max(ema_vals)
|
|
95
|
+
ema_min = min(ema_vals)
|
|
96
|
+
sma_range = sma_max - sma_min
|
|
97
|
+
ema_range = ema_max - ema_min
|
|
98
|
+
sma_res = (
|
|
99
|
+
100.0 - 200.0 * (sma_max - sma_cur) / sma_range if sma_range > 0 else 100.0
|
|
100
|
+
)
|
|
101
|
+
ema_res = (
|
|
102
|
+
100.0 - 200.0 * (ema_max - ema_cur) / ema_range if ema_range > 0 else 100.0
|
|
103
|
+
)
|
|
104
|
+
sma_res_line[i] = sma_res
|
|
105
|
+
ema_res_line[i] = ema_res
|
|
106
|
+
buy[i] = 100.0 if sma_res == 100.0 or ema_res == 100.0 else 0.0
|
|
107
|
+
sell[i] = -100.0 if sma_res == -100.0 or ema_res == -100.0 else 0.0
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import math
|
|
9
|
+
|
|
10
|
+
from .. import Indicator
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"NonLagDotIndicator",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
PI = math.pi
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class NonLagDotIndicator(Indicator):
|
|
21
|
+
"""Reconstructs NonLagDot from its MQ5 source.
|
|
22
|
+
|
|
23
|
+
Applies a weighted cosine kernel over SMA values to produce a non-lag MA,
|
|
24
|
+
then assigns color: 0=gray, 1=magenta(down), 2=green(up).
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
lines = ("nlm", "color")
|
|
28
|
+
params = (
|
|
29
|
+
("length", 10),
|
|
30
|
+
("filter_pts", 0),
|
|
31
|
+
("deviation", 0.0),
|
|
32
|
+
("point", 0.0001),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
"""Pre-compute kernel parameters and allocate indicator state."""
|
|
37
|
+
self._length = int(self.p.length)
|
|
38
|
+
coeff = 3 * PI
|
|
39
|
+
phase = self._length - 1
|
|
40
|
+
cycle = 4
|
|
41
|
+
self._len_total = int(self._length * cycle + phase)
|
|
42
|
+
self._dT1 = (2 * cycle - 1) / (cycle * self._length - 1)
|
|
43
|
+
self._dT2 = 1.0 / (phase - 1) if phase > 1 else 1.0
|
|
44
|
+
self._kd = 1.0 + self.p.deviation / 100.0
|
|
45
|
+
self._fi = int(self.p.filter_pts) * float(self.p.point)
|
|
46
|
+
self._coeff = coeff
|
|
47
|
+
self._phase = phase
|
|
48
|
+
self._cycle = cycle
|
|
49
|
+
self._trend = 0
|
|
50
|
+
self.addminperiod(self._length + self._len_total + 2)
|
|
51
|
+
|
|
52
|
+
def _calc_sma(self, ago):
|
|
53
|
+
length = self._length
|
|
54
|
+
total = 0.0
|
|
55
|
+
for i in range(length):
|
|
56
|
+
total += float(self.data.close[-(ago + i)])
|
|
57
|
+
return total / length
|
|
58
|
+
|
|
59
|
+
def next(self):
|
|
60
|
+
"""Compute smoothed value and trend color for current bar.
|
|
61
|
+
|
|
62
|
+
The method calculates weighted SMA contributions, applies optional filtering,
|
|
63
|
+
and updates `nlm` and `color` lines.
|
|
64
|
+
"""
|
|
65
|
+
len_total = self._len_total
|
|
66
|
+
coeff = self._coeff
|
|
67
|
+
phase = self._phase
|
|
68
|
+
fi = self._fi
|
|
69
|
+
|
|
70
|
+
# Build weighted sum using cosine kernel over SMA values
|
|
71
|
+
total_sum = 0.0
|
|
72
|
+
total_weight = 0.0
|
|
73
|
+
t = 0.0
|
|
74
|
+
|
|
75
|
+
for i in range(int(len_total)):
|
|
76
|
+
# SMA at offset i (0 = current bar)
|
|
77
|
+
sma_val = self._calc_sma(i)
|
|
78
|
+
if i <= phase - 1:
|
|
79
|
+
alfa = 1.0
|
|
80
|
+
else:
|
|
81
|
+
alfa = 1.0 / (1.0 + math.exp((i - phase + 0.5) * coeff / len_total))
|
|
82
|
+
|
|
83
|
+
beta = math.cos(PI * t)
|
|
84
|
+
g = 1.0 / (coeff * t + 1.0)
|
|
85
|
+
if t <= 0.5:
|
|
86
|
+
g = 1.0
|
|
87
|
+
|
|
88
|
+
total_sum += sma_val * beta * g * alfa
|
|
89
|
+
total_weight += beta * g * alfa
|
|
90
|
+
|
|
91
|
+
if t < 0.5:
|
|
92
|
+
t += self._dT2
|
|
93
|
+
elif t < len_total - 1:
|
|
94
|
+
t += self._dT1
|
|
95
|
+
|
|
96
|
+
nlm_val = self._kd * total_sum / total_weight if total_weight > 0 else 0.0
|
|
97
|
+
|
|
98
|
+
# Filter: if change < fi, hold previous value
|
|
99
|
+
prev_nlm = (
|
|
100
|
+
float(self.lines.nlm[-1])
|
|
101
|
+
if len(self.lines.nlm) > 1 and not math.isnan(float(self.lines.nlm[-1]))
|
|
102
|
+
else nlm_val
|
|
103
|
+
)
|
|
104
|
+
if fi > 0 and abs(nlm_val - prev_nlm) < fi:
|
|
105
|
+
nlm_val = prev_nlm
|
|
106
|
+
|
|
107
|
+
self.lines.nlm[0] = nlm_val
|
|
108
|
+
|
|
109
|
+
# Trend detection
|
|
110
|
+
trend = self._trend
|
|
111
|
+
if nlm_val - prev_nlm > fi:
|
|
112
|
+
trend = 1 # up
|
|
113
|
+
if prev_nlm - nlm_val > fi:
|
|
114
|
+
trend = -1 # down
|
|
115
|
+
|
|
116
|
+
# Color: 0=gray, 1=magenta(down), 2=green(up)
|
|
117
|
+
color = 0.0
|
|
118
|
+
if trend > 0:
|
|
119
|
+
color = 2.0
|
|
120
|
+
if trend < 0:
|
|
121
|
+
color = 1.0
|
|
122
|
+
|
|
123
|
+
self.lines.color[0] = color
|
|
124
|
+
self._trend = trend
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
"NRTRExtrIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class NRTRExtrIndicator(Indicator):
|
|
16
|
+
"""Reconstructs NRTR_extr indicator from its MQ5 source.
|
|
17
|
+
|
|
18
|
+
Same as NRTR but uses high/low extremes instead of close for price tracking.
|
|
19
|
+
In uptrend: price = max(price, high[bar]); check close < value.
|
|
20
|
+
In downtrend: price = min(price, low[bar]); check close > value.
|
|
21
|
+
On flip up: price = low[bar], value = price*(1-dK).
|
|
22
|
+
On flip down: price = high[bar], value = price*(1+dK).
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
lines = ("trend_up", "trend_down", "sign_up", "sign_down")
|
|
26
|
+
params = (
|
|
27
|
+
("iperiod", 10),
|
|
28
|
+
("idig", 0),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Initialize internal NRTR state and warm-up period."""
|
|
33
|
+
self._period = int(self.p.iperiod)
|
|
34
|
+
self._idig = int(self.p.idig)
|
|
35
|
+
self._trend = 0
|
|
36
|
+
self._trend_prev = 0
|
|
37
|
+
self._price = 0.0
|
|
38
|
+
self._value = 0.0
|
|
39
|
+
self._first = True
|
|
40
|
+
self.addminperiod(self._period + 2)
|
|
41
|
+
|
|
42
|
+
def next(self):
|
|
43
|
+
"""Update trend state, channel values, and signal lines."""
|
|
44
|
+
period = self._period
|
|
45
|
+
|
|
46
|
+
if self._first:
|
|
47
|
+
self._trend_prev = 0
|
|
48
|
+
self._price = float(self.data.close[0])
|
|
49
|
+
self._value = self._price
|
|
50
|
+
self._first = False
|
|
51
|
+
|
|
52
|
+
self._trend = self._trend_prev
|
|
53
|
+
price = self._price
|
|
54
|
+
value = self._value
|
|
55
|
+
|
|
56
|
+
avg_range = 0.0
|
|
57
|
+
for i in range(period):
|
|
58
|
+
avg_range += abs(float(self.data.high[-i]) - float(self.data.low[-i]))
|
|
59
|
+
avg_range /= period
|
|
60
|
+
|
|
61
|
+
digits_diff = 5 - self._idig
|
|
62
|
+
dK = avg_range / pow(10, digits_diff) if pow(10, digits_diff) != 0 else avg_range
|
|
63
|
+
|
|
64
|
+
cur_close = float(self.data.close[0])
|
|
65
|
+
cur_high = float(self.data.high[0])
|
|
66
|
+
cur_low = float(self.data.low[0])
|
|
67
|
+
|
|
68
|
+
if self._trend >= 0:
|
|
69
|
+
price = max(price, cur_high) # uses high instead of close
|
|
70
|
+
value = max(value, price * (1.0 - dK))
|
|
71
|
+
if cur_close < value:
|
|
72
|
+
price = cur_high # uses high
|
|
73
|
+
value = price * (1.0 + dK)
|
|
74
|
+
self._trend = -1
|
|
75
|
+
elif self._trend <= 0:
|
|
76
|
+
price = min(price, cur_low) # uses low instead of close
|
|
77
|
+
value = min(value, price * (1.0 + dK))
|
|
78
|
+
if cur_close > value:
|
|
79
|
+
price = cur_low # uses low
|
|
80
|
+
value = price * (1.0 - dK)
|
|
81
|
+
self._trend = 1
|
|
82
|
+
|
|
83
|
+
tu = value if self._trend > 0 else 0.0
|
|
84
|
+
td = value if self._trend < 0 else 0.0
|
|
85
|
+
su = tu if self._trend_prev < 0 and self._trend > 0 else 0.0
|
|
86
|
+
sd = td if self._trend_prev > 0 and self._trend < 0 else 0.0
|
|
87
|
+
|
|
88
|
+
self._trend_prev = self._trend
|
|
89
|
+
self._price = price
|
|
90
|
+
self._value = value
|
|
91
|
+
|
|
92
|
+
self.lines.trend_up[0] = tu
|
|
93
|
+
self.lines.trend_down[0] = td
|
|
94
|
+
self.lines.sign_up[0] = su
|
|
95
|
+
self.lines.sign_down[0] = sd
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
"NRTRIndicator",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class NRTRIndicator(Indicator):
|
|
16
|
+
"""Reconstructs NRTR indicator from its MQ5 source.
|
|
17
|
+
|
|
18
|
+
Uses iPeriod average range to compute dK scaling factor.
|
|
19
|
+
Tracks price (close-based) and value with trend ratchet.
|
|
20
|
+
When close drops below value in uptrend → flip to downtrend.
|
|
21
|
+
When close rises above value in downtrend → flip to uptrend.
|
|
22
|
+
4 buffers: TrendUp(0), TrendDown(1), SignUp(2), SignDown(3).
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
lines = ("trend_up", "trend_down", "sign_up", "sign_down")
|
|
26
|
+
params = (
|
|
27
|
+
("iperiod", 10),
|
|
28
|
+
("idig", 0),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
"""Initialize the NRTR period, trend state and trailing value buffers."""
|
|
33
|
+
self._period = int(self.p.iperiod)
|
|
34
|
+
self._idig = int(self.p.idig)
|
|
35
|
+
self._trend = 0
|
|
36
|
+
self._trend_prev = 0
|
|
37
|
+
self._price = 0.0
|
|
38
|
+
self._value = 0.0
|
|
39
|
+
self._first = True
|
|
40
|
+
self.addminperiod(self._period + 2)
|
|
41
|
+
|
|
42
|
+
def next(self):
|
|
43
|
+
"""Update the trailing value, detect trend flips, and emit buffers."""
|
|
44
|
+
period = self._period
|
|
45
|
+
|
|
46
|
+
if self._first:
|
|
47
|
+
self._trend_prev = 0
|
|
48
|
+
self._price = float(self.data.close[0])
|
|
49
|
+
self._value = self._price
|
|
50
|
+
self._first = False
|
|
51
|
+
|
|
52
|
+
self._trend = self._trend_prev
|
|
53
|
+
price = self._price
|
|
54
|
+
value = self._value
|
|
55
|
+
|
|
56
|
+
# Average range
|
|
57
|
+
avg_range = 0.0
|
|
58
|
+
for i in range(period):
|
|
59
|
+
avg_range += abs(float(self.data.high[-i]) - float(self.data.low[-i]))
|
|
60
|
+
avg_range /= period
|
|
61
|
+
|
|
62
|
+
# dK scaling (original uses EURUSD digits but we simplify)
|
|
63
|
+
digits_diff = 5 - self._idig # approximate
|
|
64
|
+
dK = avg_range / pow(10, digits_diff) if pow(10, digits_diff) != 0 else avg_range
|
|
65
|
+
|
|
66
|
+
cur_close = float(self.data.close[0])
|
|
67
|
+
|
|
68
|
+
if self._trend >= 0:
|
|
69
|
+
price = max(price, cur_close)
|
|
70
|
+
value = max(value, price * (1.0 - dK))
|
|
71
|
+
if cur_close < value:
|
|
72
|
+
price = cur_close
|
|
73
|
+
value = price * (1.0 + dK)
|
|
74
|
+
self._trend = -1
|
|
75
|
+
elif self._trend <= 0:
|
|
76
|
+
price = min(price, cur_close)
|
|
77
|
+
value = min(value, price * (1.0 + dK))
|
|
78
|
+
if cur_close > value:
|
|
79
|
+
price = cur_close
|
|
80
|
+
value = price * (1.0 - dK)
|
|
81
|
+
self._trend = 1
|
|
82
|
+
|
|
83
|
+
tu = value if self._trend > 0 else 0.0
|
|
84
|
+
td = value if self._trend < 0 else 0.0
|
|
85
|
+
su = tu if self._trend_prev < 0 and self._trend > 0 else 0.0
|
|
86
|
+
sd = td if self._trend_prev > 0 and self._trend < 0 else 0.0
|
|
87
|
+
|
|
88
|
+
self._trend_prev = self._trend
|
|
89
|
+
self._price = price
|
|
90
|
+
self._value = value
|
|
91
|
+
|
|
92
|
+
self.lines.trend_up[0] = tu
|
|
93
|
+
self.lines.trend_down[0] = td
|
|
94
|
+
self.lines.sign_up[0] = su
|
|
95
|
+
self.lines.sign_down[0] = sd
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"PChannelSystem",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class PChannelSystem(Indicator):
|
|
16
|
+
"""Indicator that classifies current bar position versus rolling channel bounds."""
|
|
17
|
+
|
|
18
|
+
lines = ("color",)
|
|
19
|
+
params = (
|
|
20
|
+
("period", 20),
|
|
21
|
+
("shift", 2),
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
"""Initialize warmup requirements for the configured rolling period."""
|
|
26
|
+
self.addminperiod(int(self.p.period) + int(self.p.shift) + 3)
|
|
27
|
+
|
|
28
|
+
def next(self):
|
|
29
|
+
"""Compute channel colors from rolling high/low and current candle body."""
|
|
30
|
+
shift = int(self.p.shift)
|
|
31
|
+
hh = max(float(self.data.high[-(shift + i)]) for i in range(int(self.p.period)))
|
|
32
|
+
ll = min(float(self.data.low[-(shift + i)]) for i in range(int(self.p.period)))
|
|
33
|
+
close = float(self.data.close[0])
|
|
34
|
+
open_ = float(self.data.open[0])
|
|
35
|
+
color = 2.0
|
|
36
|
+
if close > hh:
|
|
37
|
+
color = 4.0 if open_ <= close else 3.0
|
|
38
|
+
if close < ll:
|
|
39
|
+
color = 0.0 if open_ > close else 1.0
|
|
40
|
+
self.lines.color[0] = color
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
"PercentEnvelope",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class PercentEnvelope(Indicator):
|
|
19
|
+
"""Percent envelope built from a moving-average midpoint."""
|
|
20
|
+
|
|
21
|
+
lines = ("top", "bot")
|
|
22
|
+
params = (
|
|
23
|
+
("period", 14),
|
|
24
|
+
("perc", 1.0),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
"""Initialize MA and enforce minimum lookback warm-up."""
|
|
29
|
+
self.ma = SimpleMovingAverage(self.data, period=int(self.p.period))
|
|
30
|
+
self.addminperiod(int(self.p.period))
|
|
31
|
+
|
|
32
|
+
def next(self):
|
|
33
|
+
"""Update upper/lower envelope boundaries for the current bar."""
|
|
34
|
+
offset = float(self.p.perc) / 100.0
|
|
35
|
+
ma = float(self.ma[0])
|
|
36
|
+
self.lines.top[0] = ma * (1.0 + offset)
|
|
37
|
+
self.lines.bot[0] = ma * (1.0 - offset)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"PercentageCrossoverChannel",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class PercentageCrossoverChannel(Indicator):
|
|
16
|
+
"""Percent-based dynamic channel indicator.
|
|
17
|
+
|
|
18
|
+
The middle line is gradually adjusted toward current price with separate
|
|
19
|
+
upper/lower bands derived from the configured percentage distance.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
lines = ("upper", "middle", "lower")
|
|
23
|
+
params = (("percent", 50.0),)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Initialize percent offsets and minimum warm-up settings."""
|
|
27
|
+
self.addminperiod(2)
|
|
28
|
+
percent = max(self.p.percent, 0.001) / 100.0
|
|
29
|
+
self.plus_value = 1 + percent / 100.0
|
|
30
|
+
self.minus_value = 1 - percent / 100.0
|
|
31
|
+
|
|
32
|
+
def next(self):
|
|
33
|
+
"""Update middle, upper, and lower channel lines for the current bar."""
|
|
34
|
+
price = float(self.data.close[0])
|
|
35
|
+
if len(self.data) == 1 or self.lines.middle[-1] != self.lines.middle[-1]:
|
|
36
|
+
middle = price
|
|
37
|
+
else:
|
|
38
|
+
prev_middle = float(self.lines.middle[-1])
|
|
39
|
+
if price * self.minus_value > prev_middle:
|
|
40
|
+
middle = price * self.minus_value
|
|
41
|
+
elif price * self.plus_value < prev_middle:
|
|
42
|
+
middle = price * self.plus_value
|
|
43
|
+
else:
|
|
44
|
+
middle = prev_middle
|
|
45
|
+
self.lines.middle[0] = middle
|
|
46
|
+
self.lines.upper[0] = middle * self.plus_value
|
|
47
|
+
self.lines.lower[0] = middle * self.minus_value
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Functional-test indicators migrated to contrib.
|
|
3
|
+
|
|
4
|
+
Generated from a single functional strategy module to preserve file-local
|
|
5
|
+
helper functions and constants without cross-test name collisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .. import Indicator
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"PivotZigZagProxy",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class PivotZigZagProxy(Indicator):
|
|
16
|
+
"""Compact pivot and zigzag proxy indicator used by the strategy.
|
|
17
|
+
|
|
18
|
+
It tracks the nearest recent high/low pivot pairs over a configurable depth
|
|
19
|
+
and emits them as four separate output lines.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
lines = ("high0", "low0", "high1", "low1")
|
|
23
|
+
params = (("depth", 12),)
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
"""Initialize minimum required bars for pivot calculation."""
|
|
27
|
+
self.addminperiod(self.p.depth * 3)
|
|
28
|
+
|
|
29
|
+
def next(self):
|
|
30
|
+
"""Compute and expose the most recent two high and two low pivot levels."""
|
|
31
|
+
pivots = []
|
|
32
|
+
lookback = min(len(self.data) - 1, self.p.depth * 8)
|
|
33
|
+
for idx in range(2, lookback):
|
|
34
|
+
high = float(self.data.high[-idx])
|
|
35
|
+
low = float(self.data.low[-idx])
|
|
36
|
+
if high >= float(self.data.high[-idx - 1]) and high >= float(self.data.high[-idx + 1]):
|
|
37
|
+
pivots.append(("high", high, idx))
|
|
38
|
+
if low <= float(self.data.low[-idx - 1]) and low <= float(self.data.low[-idx + 1]):
|
|
39
|
+
pivots.append(("low", low, idx))
|
|
40
|
+
pivots.sort(key=lambda item: item[2])
|
|
41
|
+
pivots = pivots[:4]
|
|
42
|
+
highs = [value for kind, value, _ in pivots if kind == "high"]
|
|
43
|
+
lows = [value for kind, value, _ in pivots if kind == "low"]
|
|
44
|
+
self.lines.high0[0] = highs[0] if len(highs) > 0 else 0.0
|
|
45
|
+
self.lines.high1[0] = highs[1] if len(highs) > 1 else 0.0
|
|
46
|
+
self.lines.low0[0] = lows[0] if len(lows) > 0 else 0.0
|
|
47
|
+
self.lines.low1[0] = lows[1] if len(lows) > 1 else 0.0
|