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
backtrader/timer.py
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Timer Module - Time-based event scheduling.
|
|
3
|
+
|
|
4
|
+
This module provides the Timer class for scheduling time-based notifications
|
|
5
|
+
during backtesting. Timers can trigger at specific times, session start/end,
|
|
6
|
+
or at repeating intervals.
|
|
7
|
+
|
|
8
|
+
Constants:
|
|
9
|
+
SESSION_TIME: Timer triggers at a specific time.
|
|
10
|
+
SESSION_START: Timer triggers at session start.
|
|
11
|
+
SESSION_END: Timer triggers at session end.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
Creating a timer that triggers at session start:
|
|
15
|
+
>>> timer = bt.Timer(when=bt.Timer.SESSION_START, weekdays=[0, 1, 2, 3, 4])
|
|
16
|
+
>>> cerebro.add_timer(timer)
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import bisect
|
|
20
|
+
import collections
|
|
21
|
+
from datetime import date, datetime, timedelta
|
|
22
|
+
|
|
23
|
+
from .feed import AbstractDataBase
|
|
24
|
+
from .parameters import ParameterDescriptor, ParameterizedBase
|
|
25
|
+
from .utils import TIME_MAX, date2num, num2date
|
|
26
|
+
from .utils.py3 import integer_types, range
|
|
27
|
+
|
|
28
|
+
# from timer import * can only import these constants and classes
|
|
29
|
+
__all__ = ["SESSION_TIME", "SESSION_START", "SESSION_END", "Timer"]
|
|
30
|
+
|
|
31
|
+
# Values of these three constants
|
|
32
|
+
SESSION_TIME, SESSION_START, SESSION_END = range(3)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# Timer class - refactored to use new parameter system
|
|
36
|
+
class Timer(ParameterizedBase):
|
|
37
|
+
"""Timer class for scheduling time-based notifications in backtrader.
|
|
38
|
+
|
|
39
|
+
Timers can trigger at specific times of day, session boundaries, or at
|
|
40
|
+
repeating intervals. They can filter by weekdays and monthdays.
|
|
41
|
+
|
|
42
|
+
Params:
|
|
43
|
+
tid: Timer ID for identification.
|
|
44
|
+
owner: Owner object of the timer.
|
|
45
|
+
strats: Whether to notify strategies (default: False).
|
|
46
|
+
when: When to trigger (time, SESSION_START, or SESSION_END).
|
|
47
|
+
offset: Time offset for the trigger.
|
|
48
|
+
repeat: Repeat interval for recurring timers.
|
|
49
|
+
weekdays: List of weekdays when timer is active (0=Monday, 6=Sunday).
|
|
50
|
+
weekcarry: Whether to carry over to next weekday if missed.
|
|
51
|
+
monthdays: List of month days when timer is active.
|
|
52
|
+
monthcarry: Whether to carry over to next month day if missed.
|
|
53
|
+
allow: Callback function to allow/disallow timer on specific dates.
|
|
54
|
+
tzdata: Timezone data for the timer.
|
|
55
|
+
cheat: Whether timer can execute before broker.
|
|
56
|
+
|
|
57
|
+
Example:
|
|
58
|
+
>>> timer = bt.Timer(when=datetime.time(9, 30), weekdays=[0, 1, 2, 3, 4])
|
|
59
|
+
>>> cerebro.add_timer(timer)
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
# Use new parameter descriptor system to define parameters
|
|
63
|
+
tid = ParameterDescriptor(default=None, doc="Timer ID")
|
|
64
|
+
owner = ParameterDescriptor(default=None, doc="Owner object of the timer")
|
|
65
|
+
strats = ParameterDescriptor(default=False, type_=bool, doc="Whether to notify strategies")
|
|
66
|
+
when = ParameterDescriptor(
|
|
67
|
+
default=None, doc="When to trigger the timer (time, SESSION_START, or SESSION_END)"
|
|
68
|
+
)
|
|
69
|
+
offset = ParameterDescriptor(
|
|
70
|
+
default=timedelta(), type_=timedelta, doc="Time offset for the timer"
|
|
71
|
+
)
|
|
72
|
+
repeat = ParameterDescriptor(
|
|
73
|
+
default=timedelta(), type_=timedelta, doc="Repeat interval for the timer"
|
|
74
|
+
)
|
|
75
|
+
weekdays = ParameterDescriptor(
|
|
76
|
+
default=None, type_=(list, type(None)), doc="List of weekdays when timer is active"
|
|
77
|
+
)
|
|
78
|
+
weekcarry = ParameterDescriptor(
|
|
79
|
+
default=False, type_=bool, doc="Whether to carry over to next weekday if missed"
|
|
80
|
+
)
|
|
81
|
+
monthdays = ParameterDescriptor(
|
|
82
|
+
default=None, type_=(list, type(None)), doc="List of month days when timer is active"
|
|
83
|
+
)
|
|
84
|
+
monthcarry = ParameterDescriptor(
|
|
85
|
+
default=True, type_=bool, doc="Whether to carry over to next month day if missed"
|
|
86
|
+
)
|
|
87
|
+
allow = ParameterDescriptor(
|
|
88
|
+
default=None, doc="Callback function to allow/disallow timer on specific dates"
|
|
89
|
+
)
|
|
90
|
+
tzdata = ParameterDescriptor(default=None, doc="Timezone data for the timer")
|
|
91
|
+
cheat = ParameterDescriptor(
|
|
92
|
+
default=False, type_=bool, doc="Whether timer can cheat (execute before broker)"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# Values of these three constants
|
|
96
|
+
SESSION_TIME, SESSION_START, SESSION_END = range(3)
|
|
97
|
+
|
|
98
|
+
# Initialize
|
|
99
|
+
def __init__(self, *args, **kwargs):
|
|
100
|
+
"""Initialize the Timer instance.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
*args: Positional arguments.
|
|
104
|
+
**kwargs: Keyword arguments for timer parameters.
|
|
105
|
+
"""
|
|
106
|
+
# Save passed parameters
|
|
107
|
+
self.args = args
|
|
108
|
+
self.kwargs = kwargs
|
|
109
|
+
|
|
110
|
+
# Call parent class initialization
|
|
111
|
+
super().__init__(**kwargs)
|
|
112
|
+
|
|
113
|
+
# Initialize internal state variables
|
|
114
|
+
self._weekmask: collections.deque = collections.deque()
|
|
115
|
+
self._dwhen = None
|
|
116
|
+
self._dtwhen = None
|
|
117
|
+
self.lastwhen = None
|
|
118
|
+
self._curweek = None
|
|
119
|
+
self._monthmask: collections.deque = collections.deque()
|
|
120
|
+
self._curmonth = None
|
|
121
|
+
self._curdate = None
|
|
122
|
+
self._nexteos = None
|
|
123
|
+
self._isdata = None
|
|
124
|
+
self._rstwhen = None
|
|
125
|
+
self._tzdata = None
|
|
126
|
+
|
|
127
|
+
# Start
|
|
128
|
+
def start(self, data):
|
|
129
|
+
"""Initialize the timer with the associated data source.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
data: Data source for time reference and session information.
|
|
133
|
+
"""
|
|
134
|
+
# write down the 'reset when' value
|
|
135
|
+
# If parameter when is not an integer
|
|
136
|
+
if not isinstance(self.get_param("when"), integer_types): # expect time/datetime
|
|
137
|
+
# Reset when and set timezone data
|
|
138
|
+
self._rstwhen = self.get_param("when")
|
|
139
|
+
self._tzdata = self.get_param("tzdata")
|
|
140
|
+
# If parameter when is an integer
|
|
141
|
+
else:
|
|
142
|
+
# If timezone data is None, timezone data equals data, otherwise timezone data is tzdata
|
|
143
|
+
self._tzdata = data if self.get_param("tzdata") is None else self.get_param("tzdata")
|
|
144
|
+
# If when equals session start time, reset time to session start time
|
|
145
|
+
if self.get_param("when") == SESSION_START:
|
|
146
|
+
self._rstwhen = self._tzdata.p.sessionstart
|
|
147
|
+
# If when equals session end time, reset time to session end time
|
|
148
|
+
elif self.get_param("when") == SESSION_END:
|
|
149
|
+
self._rstwhen = self._tzdata.p.sessionend
|
|
150
|
+
# Check if timezone data is data
|
|
151
|
+
self._isdata = isinstance(self._tzdata, AbstractDataBase)
|
|
152
|
+
# Reset when
|
|
153
|
+
self._reset_when()
|
|
154
|
+
# End time of this trading session
|
|
155
|
+
self._nexteos = datetime.min
|
|
156
|
+
# Current time
|
|
157
|
+
self._curdate = date.min
|
|
158
|
+
# Current month
|
|
159
|
+
self._curmonth = -1 # non-existent month
|
|
160
|
+
# Month mask
|
|
161
|
+
self._monthmask = collections.deque()
|
|
162
|
+
# Current week
|
|
163
|
+
self._curweek = -1 # non-existent week
|
|
164
|
+
# Week mask
|
|
165
|
+
self._weekmask = collections.deque()
|
|
166
|
+
|
|
167
|
+
# Reset when, set _when, _dtwhen, _dwhen, _lastcall
|
|
168
|
+
def _reset_when(self, ddate=datetime.min):
|
|
169
|
+
self._when = self._rstwhen
|
|
170
|
+
self._dtwhen = self._dwhen = None
|
|
171
|
+
self._lastcall = ddate
|
|
172
|
+
|
|
173
|
+
# Check month
|
|
174
|
+
def _check_month(self, ddate):
|
|
175
|
+
# If no activation on specific day of month, return True
|
|
176
|
+
if not self.get_param("monthdays"):
|
|
177
|
+
return True
|
|
178
|
+
# Month mask
|
|
179
|
+
mask = self._monthmask
|
|
180
|
+
# If it's a holiday, whether to carry over to next trading day
|
|
181
|
+
daycarry = False
|
|
182
|
+
# Month of date
|
|
183
|
+
dmonth = ddate.month
|
|
184
|
+
# If date's month is not equal to current month
|
|
185
|
+
if dmonth != self._curmonth:
|
|
186
|
+
# Current month equals passed date's month
|
|
187
|
+
self._curmonth = dmonth # write down new month
|
|
188
|
+
# When parameter monthcarry is True and mask is True, carry over to next trading day. Otherwise, don't carry over
|
|
189
|
+
daycarry = self.get_param("monthcarry") and bool(mask)
|
|
190
|
+
# Month mask equals days activated each month
|
|
191
|
+
self._monthmask = mask = collections.deque(self.get_param("monthdays") or [])
|
|
192
|
+
# Day of month for date
|
|
193
|
+
dday = ddate.day
|
|
194
|
+
# Insert index in activation dates, elements left of index are less than dday, elements right of index are greater than or equal to dday
|
|
195
|
+
dc = bisect.bisect_left(mask, dday) # "left" for days before dday
|
|
196
|
+
# Whether daycarry is True, if originally daycarry is True, or month date carry over and dc > 0, daycarry value is True, otherwise False
|
|
197
|
+
daycarry = daycarry or (self.get_param("monthcarry") and dc > 0)
|
|
198
|
+
# If dc is less than length of activation date list
|
|
199
|
+
if dc < len(mask):
|
|
200
|
+
# If new index is still greater than 0, increment dc by 1, otherwise curday is False
|
|
201
|
+
curday = bisect.bisect_right(mask, dday, lo=dc) > 0 # check dday
|
|
202
|
+
dc += curday
|
|
203
|
+
else:
|
|
204
|
+
curday = False
|
|
205
|
+
# When dc > 0, delete one data from leftmost each time, dc decrements by 1
|
|
206
|
+
while dc:
|
|
207
|
+
mask.popleft()
|
|
208
|
+
dc -= 1
|
|
209
|
+
# Return specific daycarry value or curday value
|
|
210
|
+
return daycarry or curday
|
|
211
|
+
|
|
212
|
+
# Check week
|
|
213
|
+
def _check_week(self, ddate=date.min):
|
|
214
|
+
# If timer not activated on specific weekday, return True
|
|
215
|
+
if not self.get_param("weekdays"):
|
|
216
|
+
return True
|
|
217
|
+
# Calculate current time's year, week number, weekday
|
|
218
|
+
_, dweek, dwkday = ddate.isocalendar()
|
|
219
|
+
# Week mask
|
|
220
|
+
mask = self._weekmask
|
|
221
|
+
# Don't carry over to next trading day
|
|
222
|
+
daycarry = False
|
|
223
|
+
# If time's week number is not equal to current week number
|
|
224
|
+
if dweek != self._curweek:
|
|
225
|
+
# Current week number equals passed time's week number
|
|
226
|
+
self._curweek = dweek # write down new month
|
|
227
|
+
# When parameter weekcarry is True and mask is True, carry over to next trading day. Otherwise, don't carry over
|
|
228
|
+
daycarry = self.get_param("weekcarry") and bool(mask)
|
|
229
|
+
# Set _weekmask to weekly timer activation time
|
|
230
|
+
self._weekmask = mask = collections.deque(self.get_param("weekdays") or [])
|
|
231
|
+
# Get index of current weekday in activation date list, making numbers left of list less than current number, numbers right of list greater than or equal to current number
|
|
232
|
+
dc = bisect.bisect_left(mask, dwkday) # "left" for days before dday
|
|
233
|
+
# Condition for daycarry to be True: daycarry is True, or both holiday carry over is True and dc > 0
|
|
234
|
+
daycarry = daycarry or (self.get_param("weekcarry") and dc > 0)
|
|
235
|
+
# If dc value is less than length of activation date sequence
|
|
236
|
+
if dc < len(mask):
|
|
237
|
+
# Get specific index, if index > 0, curday equals True
|
|
238
|
+
curday = bisect.bisect_right(mask, dwkday, lo=dc) > 0 # check dday
|
|
239
|
+
# Increment dc
|
|
240
|
+
dc += curday
|
|
241
|
+
else:
|
|
242
|
+
curday = False
|
|
243
|
+
# When dc > 0, delete one data from leftmost each time, dc decrements by 1
|
|
244
|
+
while dc:
|
|
245
|
+
mask.popleft()
|
|
246
|
+
dc -= 1
|
|
247
|
+
# Return specific daycarry value or curday value, return True if one is True, return False if both are False
|
|
248
|
+
return daycarry or curday
|
|
249
|
+
|
|
250
|
+
# Check time
|
|
251
|
+
def check(self, dt):
|
|
252
|
+
"""Check if the timer should trigger at the given time.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
dt: Numeric datetime to check.
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
bool: True if timer should trigger, False otherwise.
|
|
259
|
+
"""
|
|
260
|
+
# Current date and time
|
|
261
|
+
d = num2date(dt)
|
|
262
|
+
# Current date
|
|
263
|
+
ddate = d.date()
|
|
264
|
+
# If last timer call equals current date, return False
|
|
265
|
+
if self._lastcall == ddate: # not repeating, awaiting date change
|
|
266
|
+
return False
|
|
267
|
+
# If current time is greater than this trading session's end time
|
|
268
|
+
if d > self._nexteos:
|
|
269
|
+
# If _tzdata is timezone data, call _getnexteos() to return specific time, otherwise use latest time of this trading session as end time
|
|
270
|
+
if self._isdata: # eos provided by data
|
|
271
|
+
nexteos, _ = self._tzdata._getnexteos()
|
|
272
|
+
# If _tzdata is timezone, compose current trading session's maximum time
|
|
273
|
+
else: # generic eos
|
|
274
|
+
nexteos = datetime.combine(ddate, TIME_MAX)
|
|
275
|
+
# End time of current day
|
|
276
|
+
self._nexteos = nexteos
|
|
277
|
+
# Reset timer
|
|
278
|
+
self._reset_when()
|
|
279
|
+
# If date's passed time is greater than current time, set current time to date's passed time
|
|
280
|
+
if ddate > self._curdate: # day change
|
|
281
|
+
self._curdate = ddate
|
|
282
|
+
# Check month date, if month date check returns True, check week date; if month date check is True,
|
|
283
|
+
# and allow is not None, call allow(ddate) to calculate ret
|
|
284
|
+
ret = self._check_month(ddate)
|
|
285
|
+
if ret:
|
|
286
|
+
ret = self._check_week(ddate)
|
|
287
|
+
if ret and self.get_param("allow") is not None:
|
|
288
|
+
ret = self.get_param("allow")(ddate)
|
|
289
|
+
# If ret is False, need to reset when, return False
|
|
290
|
+
if not ret:
|
|
291
|
+
self._reset_when(ddate) # this day won't make it
|
|
292
|
+
return False # timer target isn't met
|
|
293
|
+
|
|
294
|
+
# no day change or passed month, week and allow filters on date change
|
|
295
|
+
dwhen = self._dwhen
|
|
296
|
+
dtwhen = self._dtwhen
|
|
297
|
+
# If dtwhen is None
|
|
298
|
+
if dtwhen is None:
|
|
299
|
+
# dwhen represents minimum time of current day
|
|
300
|
+
# _when is the timer's time-of-day (a datetime.time from params).
|
|
301
|
+
dwhen = datetime.combine(ddate, self._when)
|
|
302
|
+
# If there is time offset, dwhen is minimum time of current day plus time offset
|
|
303
|
+
if self.get_param("offset"):
|
|
304
|
+
dwhen += self.get_param("offset")
|
|
305
|
+
# Set _dwhen
|
|
306
|
+
self._dwhen = dwhen
|
|
307
|
+
# If _tzdata is data, set dwhen to dtwhen
|
|
308
|
+
if self._isdata:
|
|
309
|
+
self._dtwhen = dtwhen = self._tzdata.date2num(dwhen)
|
|
310
|
+
# Otherwise, need to use timezone when converting to time
|
|
311
|
+
else:
|
|
312
|
+
self._dtwhen = dtwhen = date2num(dwhen, tz=self._tzdata)
|
|
313
|
+
# If time is less than dtwhen, return False, timer target not met
|
|
314
|
+
if dt < dtwhen:
|
|
315
|
+
return False # timer target isn't met
|
|
316
|
+
# Record last time when occurred
|
|
317
|
+
self.lastwhen = dwhen
|
|
318
|
+
|
|
319
|
+
# If not repeating, reset when
|
|
320
|
+
if not self.get_param("repeat"): # cannot repeat
|
|
321
|
+
self._reset_when(ddate) # reset and mark as called on ddate
|
|
322
|
+
# If need to repeat
|
|
323
|
+
else:
|
|
324
|
+
# If date's time is greater than current trading session's last time
|
|
325
|
+
if d > self._nexteos:
|
|
326
|
+
# If tzdata is data, get current trading session's last time
|
|
327
|
+
if self._isdata: # eos provided by data
|
|
328
|
+
nexteos, _ = self._tzdata._getnexteos()
|
|
329
|
+
# If _tzdata is timezone, compose current trading session's maximum time
|
|
330
|
+
else: # generic eos
|
|
331
|
+
nexteos = datetime.combine(ddate, TIME_MAX)
|
|
332
|
+
# Current trading session's last time
|
|
333
|
+
self._nexteos = nexteos
|
|
334
|
+
# If date time hasn't exceeded current trading day's last time, still within same trading day
|
|
335
|
+
else:
|
|
336
|
+
nexteos = self._nexteos
|
|
337
|
+
# while loop
|
|
338
|
+
while True:
|
|
339
|
+
# Next when start time
|
|
340
|
+
dwhen += self.get_param("repeat")
|
|
341
|
+
# If dwhen exceeds current trading session's last time, reset when, exit while loop
|
|
342
|
+
if dwhen > nexteos: # if new schedule is beyond session
|
|
343
|
+
self._reset_when(ddate) # reset to original point
|
|
344
|
+
break
|
|
345
|
+
# If dwhen is greater than current time
|
|
346
|
+
if dwhen > d: # gone over current datetime
|
|
347
|
+
# Convert next timer's time to timestamp
|
|
348
|
+
self._dtwhen = dtwhen = date2num(dwhen) # float timestamp
|
|
349
|
+
# Get the localized expected next time
|
|
350
|
+
# If _tzdata is data, calculate next timer arrival time; if _tzdata is timezone, calculate next timer arrival time considering timezone
|
|
351
|
+
if self._isdata:
|
|
352
|
+
self._dwhen = self._tzdata.num2date(dtwhen)
|
|
353
|
+
else: # assume pytz compatible or None
|
|
354
|
+
self._dwhen = num2date(dtwhen, tz=self._tzdata)
|
|
355
|
+
|
|
356
|
+
break
|
|
357
|
+
|
|
358
|
+
return True # timer target was met
|