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,144 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""BuySell Observer Module - Buy/sell signal visualization.
|
|
3
|
+
|
|
4
|
+
This module provides the BuySell observer for visualizing buy and sell
|
|
5
|
+
orders on the chart.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
BuySell: Observer that plots buy/sell markers on the chart.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> cerebro = bt.Cerebro()
|
|
12
|
+
>>> cerebro.addobserver(bt.observers.BuySell)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import math
|
|
16
|
+
|
|
17
|
+
from ..observer import Observer
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Buy and sell point markers
|
|
21
|
+
class BuySell(Observer):
|
|
22
|
+
"""
|
|
23
|
+
This observer keeps track of the individual buy/sell orders (individual
|
|
24
|
+
executions) and will plot them on the chart along the data around the
|
|
25
|
+
execution price level
|
|
26
|
+
|
|
27
|
+
Params:
|
|
28
|
+
- ``barplot`` (default: ``False``) Plot buy signals below the minimum and
|
|
29
|
+
sell signals above the maximum.
|
|
30
|
+
|
|
31
|
+
If `False`, it will plot on the average price of executions during a
|
|
32
|
+
bar
|
|
33
|
+
|
|
34
|
+
- ``bardist`` (default: ``0.015`` 1.5%) Distance to max/min when
|
|
35
|
+
``barplot`` is ``True``
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
lines = (
|
|
39
|
+
"buy",
|
|
40
|
+
"sell",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
plotinfo = {"plot": True, "subplot": False, "plotlinelabels": True}
|
|
44
|
+
plotlines = {
|
|
45
|
+
"buy": {"marker": "^", "markersize": 8.0, "color": "lime", "fillstyle": "full", "ls": ""},
|
|
46
|
+
"sell": {"marker": "v", "markersize": 8.0, "color": "red", "fillstyle": "full", "ls": ""},
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
params = (
|
|
50
|
+
("barplot", False), # plot above/below max/min for clarity in bar plot
|
|
51
|
+
("bardist", 0.015), # distance to max/min in absolute perc
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def __init__(self):
|
|
55
|
+
"""Initialize the BuySell observer.
|
|
56
|
+
|
|
57
|
+
Sets up tracking for buy/sell order lengths.
|
|
58
|
+
"""
|
|
59
|
+
self.curbuylen = 0
|
|
60
|
+
self.curselllen = 0
|
|
61
|
+
self._lastbar = None
|
|
62
|
+
|
|
63
|
+
def next(self):
|
|
64
|
+
"""Update buy/sell markers based on executed orders.
|
|
65
|
+
|
|
66
|
+
Calculates average prices for buy and sell orders during the bar.
|
|
67
|
+
"""
|
|
68
|
+
try:
|
|
69
|
+
barref = self.data.datetime[0]
|
|
70
|
+
except (IndexError, AttributeError, TypeError):
|
|
71
|
+
barref = None
|
|
72
|
+
|
|
73
|
+
sentinel = object()
|
|
74
|
+
if getattr(self, "_lastbar", sentinel) != barref:
|
|
75
|
+
self.lines.buy[0] = float("nan")
|
|
76
|
+
self.lines.sell[0] = float("nan")
|
|
77
|
+
self.curbuylen = 0
|
|
78
|
+
self.curselllen = 0
|
|
79
|
+
self._lastbar = barref
|
|
80
|
+
|
|
81
|
+
buy = []
|
|
82
|
+
sell = []
|
|
83
|
+
# If there are pending orders
|
|
84
|
+
for order in self._owner._orderspending:
|
|
85
|
+
# If no data or size is 0, skip
|
|
86
|
+
if order.data is not self.data or not order.executed.size:
|
|
87
|
+
continue
|
|
88
|
+
# If it's a buy order, add price to buy, if it's a sell order, add price to sell
|
|
89
|
+
if order.isbuy():
|
|
90
|
+
buy.append(order.executed.price)
|
|
91
|
+
else:
|
|
92
|
+
sell.append(order.executed.price)
|
|
93
|
+
|
|
94
|
+
# Take into account replay ... something could already be in there
|
|
95
|
+
# Write down the average buy/sell price
|
|
96
|
+
|
|
97
|
+
# BUY
|
|
98
|
+
# Get buy price
|
|
99
|
+
curbuy = self.lines.buy[0]
|
|
100
|
+
# If NaN, curbuy equals 0, curbuylen=0, otherwise, curbuylen = self.curbuylen
|
|
101
|
+
if curbuy != curbuy: # NaN
|
|
102
|
+
curbuy = 0.0
|
|
103
|
+
self.curbuylen = curbuylen = 0
|
|
104
|
+
else:
|
|
105
|
+
curbuylen = self.curbuylen
|
|
106
|
+
# Current total price
|
|
107
|
+
buyops = curbuy + math.fsum(buy)
|
|
108
|
+
# Current total order count
|
|
109
|
+
buylen = curbuylen + len(buy)
|
|
110
|
+
# Calculate average price
|
|
111
|
+
value = buyops / float(buylen or "NaN")
|
|
112
|
+
# If not plotting, get average price, if plotting, get a percentage of lowest price for better display
|
|
113
|
+
if not self.p.barplot:
|
|
114
|
+
self.lines.buy[0] = value
|
|
115
|
+
elif value == value: # Not NaN
|
|
116
|
+
pbuy = self.data.low[0] * (1 - self.p.bardist)
|
|
117
|
+
self.lines.buy[0] = pbuy
|
|
118
|
+
|
|
119
|
+
# Update buylen values
|
|
120
|
+
curbuy = buyops
|
|
121
|
+
self.curbuylen = buylen
|
|
122
|
+
|
|
123
|
+
# For sell orders, similar logic
|
|
124
|
+
# SELL
|
|
125
|
+
cursell = self.lines.sell[0]
|
|
126
|
+
if cursell != cursell: # NaN
|
|
127
|
+
cursell = 0.0
|
|
128
|
+
self.curselllen = curselllen = 0
|
|
129
|
+
else:
|
|
130
|
+
curselllen = self.curselllen
|
|
131
|
+
|
|
132
|
+
sellops = cursell + math.fsum(sell)
|
|
133
|
+
selllen = curselllen + len(sell)
|
|
134
|
+
|
|
135
|
+
value = sellops / float(selllen or "NaN")
|
|
136
|
+
if not self.p.barplot:
|
|
137
|
+
self.lines.sell[0] = value
|
|
138
|
+
elif value == value: # Not NaN
|
|
139
|
+
psell = self.data.high[0] * (1 + self.p.bardist)
|
|
140
|
+
self.lines.sell[0] = psell
|
|
141
|
+
|
|
142
|
+
# Update selllen values
|
|
143
|
+
cursell = sellops
|
|
144
|
+
self.curselllen = selllen
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""DrawDown Observer Module - Drawdown tracking observer.
|
|
3
|
+
|
|
4
|
+
This module provides the DrawDown observer for tracking current and maximum
|
|
5
|
+
drawdown levels during backtesting.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
DrawDown: Observer that tracks drawdown and max drawdown levels.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> cerebro = bt.Cerebro()
|
|
12
|
+
>>> cerebro.addobserver(bt.observers.DrawDown)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from ..analyzers import DrawDown as DrawDownAnalyzer
|
|
16
|
+
from ..observer import Observer
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Drawdown
|
|
20
|
+
class DrawDown(Observer):
|
|
21
|
+
"""This observer keeps track of the current drawdown level (plotted) and
|
|
22
|
+
the maxdrawdown (not plotted) levels
|
|
23
|
+
|
|
24
|
+
Params:
|
|
25
|
+
|
|
26
|
+
- ``fund`` (default: ``None``)
|
|
27
|
+
|
|
28
|
+
If `None`, the actual mode of the broker (fundmode - True/False) will
|
|
29
|
+
be autodetected to decide if the returns are based on the total net
|
|
30
|
+
asset value or on the fund value. See ``set_fundmode`` in the broker
|
|
31
|
+
documentation
|
|
32
|
+
|
|
33
|
+
Set it to ``True`` or ``False`` for a specific behavior
|
|
34
|
+
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
_stclock = True
|
|
38
|
+
|
|
39
|
+
params = (("fund", None),)
|
|
40
|
+
|
|
41
|
+
lines = (
|
|
42
|
+
"drawdown",
|
|
43
|
+
"maxdrawdown",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
47
|
+
|
|
48
|
+
plotlines = {
|
|
49
|
+
"maxdrawdown": {
|
|
50
|
+
"_plotskip": True,
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
def __init__(self):
|
|
55
|
+
"""Initialize the DrawDown observer.
|
|
56
|
+
|
|
57
|
+
Adds DrawDown analyzer to track drawdown levels.
|
|
58
|
+
"""
|
|
59
|
+
kwargs = self.p._getkwargs()
|
|
60
|
+
self._dd = self._owner._addanalyzer_slave(DrawDownAnalyzer, **kwargs)
|
|
61
|
+
|
|
62
|
+
def next(self):
|
|
63
|
+
"""Update drawdown values for the current period.
|
|
64
|
+
|
|
65
|
+
Gets current and maximum drawdown from the analyzer.
|
|
66
|
+
"""
|
|
67
|
+
self.lines.drawdown[0] = self._dd.rets.drawdown # update drawdown
|
|
68
|
+
self.lines.maxdrawdown[0] = self._dd.rets.max.drawdown # update max
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# Drawdown length
|
|
72
|
+
class DrawDownLength(Observer):
|
|
73
|
+
"""This observer keeps track of the current drawdown length (plotted) and
|
|
74
|
+
the drawdown max length (not plotted)
|
|
75
|
+
|
|
76
|
+
Params: None
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
_stclock = True
|
|
80
|
+
|
|
81
|
+
lines = (
|
|
82
|
+
"len",
|
|
83
|
+
"maxlen",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
87
|
+
|
|
88
|
+
plotlines = {
|
|
89
|
+
"maxlen": {
|
|
90
|
+
"_plotskip": True,
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
def __init__(self):
|
|
95
|
+
"""Initialize the DrawDownLength observer.
|
|
96
|
+
|
|
97
|
+
Adds DrawDown analyzer to track drawdown length.
|
|
98
|
+
"""
|
|
99
|
+
self._dd = self._owner._addanalyzer_slave(DrawDownAnalyzer)
|
|
100
|
+
|
|
101
|
+
def next(self):
|
|
102
|
+
"""Update drawdown length values.
|
|
103
|
+
|
|
104
|
+
Gets current and maximum drawdown length from the analyzer.
|
|
105
|
+
"""
|
|
106
|
+
self.lines.len[0] = self._dd.rets.len # update drawdown length
|
|
107
|
+
self.lines.maxlen[0] = self._dd.rets.max.len # update max length
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# Old method for max drawdown, calculated within this class instead of calling DrawDown from analyzers
|
|
111
|
+
class DrawDownOld(Observer):
|
|
112
|
+
"""This observer keeps track of the current drawdown level (plotted) and
|
|
113
|
+
the maxdrawdown (not plotted) levels
|
|
114
|
+
|
|
115
|
+
Params: None
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
_stclock = True
|
|
119
|
+
|
|
120
|
+
lines = (
|
|
121
|
+
"drawdown",
|
|
122
|
+
"maxdrawdown",
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
126
|
+
|
|
127
|
+
plotlines = {
|
|
128
|
+
"maxdrawdown": {
|
|
129
|
+
"_plotskip": True,
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
def __init__(self):
|
|
134
|
+
"""Initialize the DrawDownOld observer.
|
|
135
|
+
|
|
136
|
+
Sets up peak and max drawdown tracking variables.
|
|
137
|
+
"""
|
|
138
|
+
super().__init__()
|
|
139
|
+
|
|
140
|
+
self.maxdd = 0.0
|
|
141
|
+
self.peak = float("-inf")
|
|
142
|
+
|
|
143
|
+
def next(self):
|
|
144
|
+
"""Calculate and update drawdown values.
|
|
145
|
+
|
|
146
|
+
Computes drawdown from peak value and updates maximum.
|
|
147
|
+
"""
|
|
148
|
+
value = self._owner.broker.getvalue()
|
|
149
|
+
|
|
150
|
+
# update the maximum seen peak
|
|
151
|
+
if value > self.peak:
|
|
152
|
+
self.peak = value
|
|
153
|
+
|
|
154
|
+
# calculate the current drawdown
|
|
155
|
+
if self.peak:
|
|
156
|
+
self.lines.drawdown[0] = dd = 100.0 * (self.peak - value) / self.peak
|
|
157
|
+
else:
|
|
158
|
+
self.lines.drawdown[0] = dd = 0.0
|
|
159
|
+
|
|
160
|
+
# update the maxdrawdown if needed
|
|
161
|
+
self.lines.maxdrawdown[0] = self.maxdd = max(self.maxdd, dd)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""LogReturns Observer Module - Log returns tracking.
|
|
3
|
+
|
|
4
|
+
This module provides observers for tracking log returns of the strategy
|
|
5
|
+
or a data feed.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
LogReturns: Observer that tracks log returns.
|
|
9
|
+
LogReturns2: Alternative log returns observer.
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
>>> cerebro = bt.Cerebro()
|
|
13
|
+
>>> cerebro.addobserver(bt.observers.LogReturns)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from ..analyzers import LogReturnsRolling
|
|
17
|
+
from ..dataseries import TimeFrame
|
|
18
|
+
from ..observer import Observer
|
|
19
|
+
|
|
20
|
+
__all__ = ["LogReturns", "LogReturns2"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Get log returns
|
|
24
|
+
class LogReturns(Observer):
|
|
25
|
+
"""This observer stores the *log returns* of the strategy or a
|
|
26
|
+
|
|
27
|
+
Params:
|
|
28
|
+
|
|
29
|
+
- ``timeframe`` (default: ``None``)
|
|
30
|
+
If ``None`` then the complete return over the entire backtested period
|
|
31
|
+
will be reported
|
|
32
|
+
|
|
33
|
+
Pass ``TimeFrame.NoTimeFrame`` to consider the entire dataset with no
|
|
34
|
+
time constraints
|
|
35
|
+
|
|
36
|
+
- ``compression`` (default: ``None``)
|
|
37
|
+
|
|
38
|
+
Only used for sub-day timeframes to, for example, work on an hourly
|
|
39
|
+
timeframe by specifying "TimeFrame.Minutes" and 60 as compression
|
|
40
|
+
|
|
41
|
+
- ``fund`` (default: ``None``)
|
|
42
|
+
|
|
43
|
+
If `None`, the actual mode of the broker (fundmode - True/False) will
|
|
44
|
+
be autodetected to decide if the returns are based on the total net
|
|
45
|
+
asset value or on the fund value. See ``set_fundmode`` in the broker
|
|
46
|
+
documentation
|
|
47
|
+
|
|
48
|
+
Set it to ``True`` or ``False`` for a specific behavior
|
|
49
|
+
|
|
50
|
+
Remember that at any moment of a `run` the current values can be checked
|
|
51
|
+
by looking at the *lines* by name at index ``0``.
|
|
52
|
+
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
_stclock = True
|
|
56
|
+
|
|
57
|
+
lines = ("logret1",)
|
|
58
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
59
|
+
|
|
60
|
+
params = (
|
|
61
|
+
("timeframe", None),
|
|
62
|
+
("compression", None),
|
|
63
|
+
("fund", None),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Plot labels
|
|
67
|
+
def _plotlabel(self):
|
|
68
|
+
return [
|
|
69
|
+
TimeFrame.getname(self.p.timeframe, self.p.compression),
|
|
70
|
+
str(self.p.compression or 1),
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
def __init__(self):
|
|
74
|
+
"""Initialize the LogReturns observer.
|
|
75
|
+
|
|
76
|
+
Adds LogReturnsRolling analyzer to track log returns.
|
|
77
|
+
"""
|
|
78
|
+
self.logret1 = self._owner._addanalyzer_slave(
|
|
79
|
+
LogReturnsRolling, data=self.data0, **self.p._getkwargs()
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
def next(self):
|
|
83
|
+
"""Update log return value for the current period.
|
|
84
|
+
|
|
85
|
+
Gets the log return from the analyzer.
|
|
86
|
+
"""
|
|
87
|
+
self.lines.logret1[0] = self.logret1.rets.get(self.logret1.dtkey, float("NaN"))
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# Show log returns for the second instrument
|
|
91
|
+
class LogReturns2(LogReturns):
|
|
92
|
+
"""Extends the observer LogReturns to show two instruments"""
|
|
93
|
+
|
|
94
|
+
lines = ("logret2",)
|
|
95
|
+
|
|
96
|
+
def __init__(self):
|
|
97
|
+
"""Initialize the LogReturns2 observer.
|
|
98
|
+
|
|
99
|
+
Adds analyzer for second data feed's log returns.
|
|
100
|
+
"""
|
|
101
|
+
super().__init__()
|
|
102
|
+
|
|
103
|
+
self.logret2 = self._owner._addanalyzer_slave(
|
|
104
|
+
LogReturnsRolling, data=self.data1, **self.p._getkwargs()
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def next(self):
|
|
108
|
+
"""Update log return values for both data feeds.
|
|
109
|
+
|
|
110
|
+
Updates logret1 from parent and logret2 for second feed.
|
|
111
|
+
"""
|
|
112
|
+
super().next()
|
|
113
|
+
self.lines.logret2[0] = self.logret2.rets.get(self.logret2.dtkey, float("NaN"))
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""TimeReturn Observer Module - Time-based returns tracking.
|
|
3
|
+
|
|
4
|
+
This module provides the TimeReturn observer for tracking strategy
|
|
5
|
+
returns over different time periods.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
TimeReturn: Observer that tracks returns over time periods.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> cerebro = bt.Cerebro()
|
|
12
|
+
>>> cerebro.addobserver(bt.observers.TimeReturn, timeframe=bt.TimeFrame.Days)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from ..analyzers.timereturn import TimeReturn as TimeReturnAnalyzer
|
|
16
|
+
from ..dataseries import TimeFrame
|
|
17
|
+
from ..observer import Observer
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Time return class
|
|
21
|
+
class TimeReturn(Observer):
|
|
22
|
+
"""This observer stores the *returns* of the strategy.
|
|
23
|
+
|
|
24
|
+
Params:
|
|
25
|
+
|
|
26
|
+
- ``timeframe`` (default: ``None``)
|
|
27
|
+
If ``None`` then the complete return over the entire backtested period
|
|
28
|
+
will be reported
|
|
29
|
+
|
|
30
|
+
Pass ``TimeFrame.NoTimeFrame`` to consider the entire dataset with no
|
|
31
|
+
time constraints
|
|
32
|
+
|
|
33
|
+
- ``compression`` (default: ``None``)
|
|
34
|
+
|
|
35
|
+
Only used for sub-day timeframes to, for example, work on an hourly
|
|
36
|
+
timeframe by specifying "TimeFrame.Minutes" and 60 as compression
|
|
37
|
+
|
|
38
|
+
- ``fund`` (default: ``None``)
|
|
39
|
+
|
|
40
|
+
If `None`, the actual mode of the broker (fundmode - True/False) will
|
|
41
|
+
be autodetected to decide if the returns are based on the total net
|
|
42
|
+
asset value or on the fund value. See ``set_fundmode`` in the broker
|
|
43
|
+
documentation
|
|
44
|
+
|
|
45
|
+
Set it to ``True`` or ``False`` for a specific behavior
|
|
46
|
+
|
|
47
|
+
Remember that at any moment of a `run` the current values can be checked
|
|
48
|
+
by looking at the *lines* by name at index ``0``.
|
|
49
|
+
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
_stclock = True
|
|
53
|
+
# Set lines
|
|
54
|
+
lines = ("timereturn",)
|
|
55
|
+
# Plot info
|
|
56
|
+
plotinfo = {"plot": True, "subplot": True}
|
|
57
|
+
# Set plotlines
|
|
58
|
+
plotlines = {"timereturn": {"_name": "Return"}}
|
|
59
|
+
# Parameters
|
|
60
|
+
params = (
|
|
61
|
+
("timeframe", None),
|
|
62
|
+
("compression", None),
|
|
63
|
+
("fund", None),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Plot labels
|
|
67
|
+
def _plotlabel(self):
|
|
68
|
+
return [
|
|
69
|
+
# Use the final tf/comp values calculated by the return analyzer
|
|
70
|
+
TimeFrame.getname(self.treturn.timeframe, self.treturn.compression),
|
|
71
|
+
str(self.treturn.compression),
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
def __init__(self):
|
|
75
|
+
"""Initialize the TimeReturn observer.
|
|
76
|
+
|
|
77
|
+
Adds TimeReturn analyzer to track returns over time.
|
|
78
|
+
"""
|
|
79
|
+
self.treturn = self._owner._addanalyzer_slave(TimeReturnAnalyzer, **self.p._getkwargs())
|
|
80
|
+
|
|
81
|
+
def next(self):
|
|
82
|
+
"""Update the time return value for the current period.
|
|
83
|
+
|
|
84
|
+
Gets the return value from the analyzer for the current time key.
|
|
85
|
+
"""
|
|
86
|
+
self.lines.timereturn[0] = self.treturn.rets.get(self.treturn.dtkey, float("NaN"))
|