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,121 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Calendar Days Filter Module - Calendar day filling.
|
|
3
|
+
|
|
4
|
+
This module provides the CalendarDays filter for adding missing
|
|
5
|
+
calendar days to trading day data.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
CalendarDays: Fills missing calendar days.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> data = bt.feeds.GenericCSVData(dataname='data.csv')
|
|
12
|
+
>>> data.addfilter(bt.filters.CalendarDays())
|
|
13
|
+
>>> cerebro.adddata(data)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from datetime import date, datetime, timedelta
|
|
17
|
+
|
|
18
|
+
from ..parameters import ParameterizedBase
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class CalendarDays(ParameterizedBase):
|
|
22
|
+
"""
|
|
23
|
+
Bar Filler to add missing calendar days to trading days
|
|
24
|
+
|
|
25
|
+
Params:
|
|
26
|
+
|
|
27
|
+
- fill_price (def: None):
|
|
28
|
+
|
|
29
|
+
> 0: The given value to fill
|
|
30
|
+
0 or None: Use the last known closing price
|
|
31
|
+
-1: Use the midpoint of the last bar (High-Low average)
|
|
32
|
+
|
|
33
|
+
- fill_vol (def: float('NaN')):
|
|
34
|
+
|
|
35
|
+
Value to use to fill the missing volume
|
|
36
|
+
|
|
37
|
+
- fill_oi (def: float('NaN')):
|
|
38
|
+
|
|
39
|
+
Value to use to fill the missing Open Interest
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
params = (
|
|
43
|
+
("fill_price", None),
|
|
44
|
+
("fill_vol", float("NaN")),
|
|
45
|
+
("fill_oi", float("NaN")),
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
ONEDAY = timedelta(days=1)
|
|
49
|
+
lastdt = date.max
|
|
50
|
+
|
|
51
|
+
def __init__(self, data, **kwargs):
|
|
52
|
+
"""Initialize the CalendarDays filter.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
data: The data feed to apply the filter to.
|
|
56
|
+
**kwargs: Additional keyword arguments passed to parent class.
|
|
57
|
+
"""
|
|
58
|
+
super().__init__(**kwargs)
|
|
59
|
+
|
|
60
|
+
def __call__(self, data):
|
|
61
|
+
"""
|
|
62
|
+
If the data has a gap larger than 1 day amongst bars, the missing bars
|
|
63
|
+
are added to the stream.
|
|
64
|
+
|
|
65
|
+
Params:
|
|
66
|
+
- data: the data source to filter/process
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
- False (always): this filter does not remove bars from the stream
|
|
70
|
+
|
|
71
|
+
"""
|
|
72
|
+
dt = data.datetime.date()
|
|
73
|
+
if (dt - self.lastdt) > self.ONEDAY: # gap in place
|
|
74
|
+
self._fillbars(data, dt, self.lastdt)
|
|
75
|
+
|
|
76
|
+
self.lastdt = dt
|
|
77
|
+
return False # no bar has been removed from the stream
|
|
78
|
+
|
|
79
|
+
def _fillbars(self, data, dt, lastdt):
|
|
80
|
+
"""
|
|
81
|
+
Fills one by one bars as needed from time_start to time_end
|
|
82
|
+
|
|
83
|
+
Invalidates the control dtime_prev if requested
|
|
84
|
+
"""
|
|
85
|
+
tm = data.datetime.time(0) # get time part
|
|
86
|
+
|
|
87
|
+
# Same price for all bars
|
|
88
|
+
fp = self.p.fill_price
|
|
89
|
+
if fp is not None and fp > 0:
|
|
90
|
+
price = fp
|
|
91
|
+
elif fp == -1:
|
|
92
|
+
price = (data.high[-1] + data.low[-1]) / 2.0
|
|
93
|
+
else:
|
|
94
|
+
# None, 0, or any other falsy value → use last close
|
|
95
|
+
price = data.close[-1]
|
|
96
|
+
|
|
97
|
+
while lastdt < dt:
|
|
98
|
+
lastdt += self.ONEDAY
|
|
99
|
+
|
|
100
|
+
# Prepare an array of the necessary size
|
|
101
|
+
bar = [float("Nan")] * data.size()
|
|
102
|
+
# Fill the datetime
|
|
103
|
+
bar[data.DateTime] = data.date2num(datetime.combine(lastdt, tm))
|
|
104
|
+
|
|
105
|
+
# Fill price fields
|
|
106
|
+
for pricetype in [data.Open, data.High, data.Low, data.Close]:
|
|
107
|
+
bar[pricetype] = price
|
|
108
|
+
|
|
109
|
+
# Fill volume and open interest
|
|
110
|
+
bar[data.Volume] = self.p.fill_vol
|
|
111
|
+
bar[data.OpenInterest] = self.p.fill_oi
|
|
112
|
+
|
|
113
|
+
# Fill extra lines the data feed may have defined beyond DateTime
|
|
114
|
+
for i in range(data.DateTime + 1, data.size()):
|
|
115
|
+
bar[i] = data.lines[i][0]
|
|
116
|
+
|
|
117
|
+
# Add this constructed bar to the stack of the stream
|
|
118
|
+
data._add2stack(bar)
|
|
119
|
+
|
|
120
|
+
# Save to stack the bar that signaled the gap
|
|
121
|
+
data._save2stack(erase=True)
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Data Filler Filter Module - Gap filling for data feeds.
|
|
3
|
+
|
|
4
|
+
This module provides the DataFiller for filling gaps in data feeds
|
|
5
|
+
when bars are missing.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
DataFiller: Fills gaps in data with specified values.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> data = bt.feeds.GenericCSVData(dataname='data.csv')
|
|
12
|
+
>>> data.addfilter(bt.filters.DataFiller())
|
|
13
|
+
>>> cerebro.adddata(data)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import collections
|
|
17
|
+
from datetime import datetime, timedelta
|
|
18
|
+
|
|
19
|
+
from ..dataseries import TimeFrame
|
|
20
|
+
from ..feed import AbstractDataBase
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class DataFiller(AbstractDataBase):
|
|
24
|
+
"""This class will fill gaps in the source data using the following
|
|
25
|
+
information bits from the underlying data source
|
|
26
|
+
|
|
27
|
+
- timeframe and compression are to dimension the output bars
|
|
28
|
+
|
|
29
|
+
- sessionstart and sessionend
|
|
30
|
+
|
|
31
|
+
If a data feed has missing bars in between 10:31 and 10:34 and the
|
|
32
|
+
timeframe is minutes, the output will be filled with bars for minutes
|
|
33
|
+
10:32 and 10:33 using the closing price of the last bar (10:31)
|
|
34
|
+
|
|
35
|
+
Bars can be missing amongst other things because
|
|
36
|
+
|
|
37
|
+
Params:
|
|
38
|
+
- ``fill_price`` (def: None): if None (or evaluates to False), the
|
|
39
|
+
closing price will be used, else the passed value (which can be
|
|
40
|
+
for example 'NaN' to have a missing bar in terms of evaluation but
|
|
41
|
+
present in terms of time
|
|
42
|
+
|
|
43
|
+
- ``fill_vol`` (def: NaN): used to fill the volume with missing bars
|
|
44
|
+
|
|
45
|
+
- ``fill_oi`` (def: NaN): used to fill the openinterest with missing bars
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
params = (
|
|
49
|
+
("fill_price", None),
|
|
50
|
+
("fill_vol", float("NaN")),
|
|
51
|
+
("fill_oi", float("NaN")),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def __init__(self):
|
|
55
|
+
"""Initialize the DataFiller.
|
|
56
|
+
|
|
57
|
+
Sets up internal state variables for tracking timeframe,
|
|
58
|
+
compression, data bars, and fill bars queue.
|
|
59
|
+
"""
|
|
60
|
+
self._timeframe = None
|
|
61
|
+
self._compression = None
|
|
62
|
+
self._dbar = None
|
|
63
|
+
self._fillbars = None
|
|
64
|
+
|
|
65
|
+
def start(self):
|
|
66
|
+
"""Start the data filler.
|
|
67
|
+
|
|
68
|
+
Initializes the fill bars queue and data bar flag.
|
|
69
|
+
This method is called when the data feed starts processing.
|
|
70
|
+
"""
|
|
71
|
+
super().start()
|
|
72
|
+
self._fillbars = collections.deque()
|
|
73
|
+
self._dbar = False
|
|
74
|
+
|
|
75
|
+
def preload(self):
|
|
76
|
+
"""Preload data from the underlying data source.
|
|
77
|
+
|
|
78
|
+
If the underlying data is not preloaded, loads it completely.
|
|
79
|
+
Copies timeframe and compression settings from the source data
|
|
80
|
+
after it has started (some sources do autodetection).
|
|
81
|
+
|
|
82
|
+
This method ensures all necessary data is available before processing.
|
|
83
|
+
"""
|
|
84
|
+
if len(self.p.dataname) == self.p.dataname.buflen():
|
|
85
|
+
# if data is not preloaded … do it
|
|
86
|
+
self.p.dataname.start()
|
|
87
|
+
self.p.dataname.preload()
|
|
88
|
+
self.p.dataname.home()
|
|
89
|
+
|
|
90
|
+
# Copy timeframe from data after start (some sources do autodetection)
|
|
91
|
+
self.p.timeframe = self._timeframe = self.p.dataname._timeframe
|
|
92
|
+
self.p.compression = self._compression = self.p.dataname._compression
|
|
93
|
+
|
|
94
|
+
super().preload()
|
|
95
|
+
|
|
96
|
+
def _copyfromdata(self):
|
|
97
|
+
# Data is allowed - Copy size which is "number of lines"
|
|
98
|
+
for i in range(self.p.dataname.size()):
|
|
99
|
+
self.lines[i][0] = self.p.dataname.lines[i][0]
|
|
100
|
+
|
|
101
|
+
self._dbar = False # invalidate a flag for read bar
|
|
102
|
+
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
def _frombars(self):
|
|
106
|
+
dtime, price = self._fillbars.popleft()
|
|
107
|
+
|
|
108
|
+
price = self.p.fill_price or price
|
|
109
|
+
|
|
110
|
+
self.lines.datetime[0] = self.p.dataname.date2num(dtime)
|
|
111
|
+
self.lines.open[0] = price
|
|
112
|
+
self.lines.high[0] = price
|
|
113
|
+
self.lines.low[0] = price
|
|
114
|
+
self.lines.close[0] = price
|
|
115
|
+
self.lines.volume[0] = self.p.fill_vol
|
|
116
|
+
self.lines.openinterest[0] = self.p.fill_oi
|
|
117
|
+
|
|
118
|
+
return True
|
|
119
|
+
|
|
120
|
+
# Minimum delta unit in between bars
|
|
121
|
+
_tdeltas = {
|
|
122
|
+
TimeFrame.Minutes: timedelta(seconds=60),
|
|
123
|
+
TimeFrame.Seconds: timedelta(seconds=1),
|
|
124
|
+
TimeFrame.MicroSeconds: timedelta(microseconds=1),
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
def _load(self):
|
|
128
|
+
if not len(self.p.dataname):
|
|
129
|
+
self.p.dataname.start() # start data if not done somewhere else
|
|
130
|
+
|
|
131
|
+
# Copy from underlying data
|
|
132
|
+
self._timeframe = self.p.dataname._timeframe
|
|
133
|
+
self._compression = self.p.dataname._compression
|
|
134
|
+
|
|
135
|
+
self.p.timeframe = self._timeframe
|
|
136
|
+
self.p.compression = self._compression
|
|
137
|
+
|
|
138
|
+
# Calculate and save timedelta for timeframe
|
|
139
|
+
self._tdunit = self._tdeltas[self._timeframe]
|
|
140
|
+
self._tdunit *= self._compression
|
|
141
|
+
|
|
142
|
+
if self._fillbars:
|
|
143
|
+
return self._frombars()
|
|
144
|
+
|
|
145
|
+
# use existing bar or fetch a bar
|
|
146
|
+
self._dbar = self._dbar or self.p.dataname.next()
|
|
147
|
+
if not self._dbar:
|
|
148
|
+
return False # no more data
|
|
149
|
+
|
|
150
|
+
if len(self) == 1:
|
|
151
|
+
# Cannot yet look backwards - deliver data as is
|
|
152
|
+
return self._copyfromdata()
|
|
153
|
+
|
|
154
|
+
# previous (delivered) close
|
|
155
|
+
pclose = self.lines.close[-1]
|
|
156
|
+
# Get time of previous (already delivered) bar
|
|
157
|
+
dtime_prev = self.lines.datetime.datetime(-1)
|
|
158
|
+
# Get time of current (from a data source) bar
|
|
159
|
+
dtime_cur = self.p.dataname.datetime.datetime(0)
|
|
160
|
+
|
|
161
|
+
# Calculate the session end for previous bar
|
|
162
|
+
send = datetime.combine(dtime_prev.date(), self.p.dataname.sessionend)
|
|
163
|
+
|
|
164
|
+
if dtime_cur > send: # if jumped boundary
|
|
165
|
+
# 1. check for missing bars until boundary (end)
|
|
166
|
+
dtime_prev += self._tdunit
|
|
167
|
+
while dtime_prev < send:
|
|
168
|
+
self._fillbars.append((dtime_prev, pclose))
|
|
169
|
+
dtime_prev += self._tdunit
|
|
170
|
+
|
|
171
|
+
# Calculate session start for new bar
|
|
172
|
+
sstart = datetime.combine(dtime_cur.date(), self.p.dataname.sessionstart)
|
|
173
|
+
|
|
174
|
+
# 2. check for missing bars from new boundary (start)
|
|
175
|
+
# check a gap from new sessionstart
|
|
176
|
+
while sstart < dtime_cur:
|
|
177
|
+
self._fillbars.append((sstart, pclose))
|
|
178
|
+
sstart += self._tdunit
|
|
179
|
+
else:
|
|
180
|
+
# no boundary jumped - check the gap until current time
|
|
181
|
+
dtime_prev += self._tdunit
|
|
182
|
+
while dtime_prev < dtime_cur:
|
|
183
|
+
self._fillbars.append((dtime_prev, pclose))
|
|
184
|
+
dtime_prev += self._tdunit
|
|
185
|
+
|
|
186
|
+
if self._fillbars:
|
|
187
|
+
self._dbar = True # flag a pending data bar is available
|
|
188
|
+
|
|
189
|
+
# return an accumulated bar in the current cycle
|
|
190
|
+
return self._frombars()
|
|
191
|
+
|
|
192
|
+
return self._copyfromdata()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Data Filter Module - Generic data filtering.
|
|
3
|
+
|
|
4
|
+
This module provides the DataFilter for filtering bars from a
|
|
5
|
+
data source based on a callable function.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
DataFilter: Filters bars based on a filter function.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> data = bt.feeds.GenericCSVData(dataname='data.csv')
|
|
12
|
+
>>> data.addfilter(bt.filters.DataFilter(funcfilter=my_filter_func))
|
|
13
|
+
>>> cerebro.adddata(data)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from ..feed import AbstractDataBase
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class DataFilter(AbstractDataBase):
|
|
20
|
+
"""
|
|
21
|
+
This class filters out bars from a given data source. In addition to the
|
|
22
|
+
standard parameters of a DataBase, it takes a ``funcfilter`` parameter which
|
|
23
|
+
can be any callable
|
|
24
|
+
|
|
25
|
+
Logic:
|
|
26
|
+
|
|
27
|
+
- ``funcfilter`` will be called with the underlying data source
|
|
28
|
+
|
|
29
|
+
It can be any callable
|
|
30
|
+
|
|
31
|
+
- Return value ``True``: current data source bar values will be used
|
|
32
|
+
- Return value ``False``: current data source bar values will discard
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
params = (("funcfilter", None),)
|
|
36
|
+
|
|
37
|
+
def preload(self):
|
|
38
|
+
"""Preload data from the underlying data source.
|
|
39
|
+
|
|
40
|
+
If the underlying data is not preloaded, loads it completely.
|
|
41
|
+
Copies timeframe and compression settings from the source data
|
|
42
|
+
after it has started (some sources do autodetection).
|
|
43
|
+
|
|
44
|
+
This method ensures all necessary data is available before processing.
|
|
45
|
+
"""
|
|
46
|
+
if len(self.p.dataname) == self.p.dataname.buflen():
|
|
47
|
+
# if data is not preloaded … do it
|
|
48
|
+
self.p.dataname.start()
|
|
49
|
+
self.p.dataname.preload()
|
|
50
|
+
self.p.dataname.home()
|
|
51
|
+
|
|
52
|
+
# Copy timeframe from data after start (some sources do autodetection)
|
|
53
|
+
self.p.timeframe = self._timeframe = self.p.dataname._timeframe
|
|
54
|
+
self.p.compression = self._compression = self.p.dataname._compression
|
|
55
|
+
|
|
56
|
+
super().preload()
|
|
57
|
+
|
|
58
|
+
def _load(self):
|
|
59
|
+
if not len(self.p.dataname):
|
|
60
|
+
self.p.dataname.start() # start data if not done somewhere else
|
|
61
|
+
|
|
62
|
+
# Tell the underlying source to get next data
|
|
63
|
+
while self.p.dataname.next():
|
|
64
|
+
# Try to load the data from the underlying source
|
|
65
|
+
if not self.p.funcfilter(self.p.dataname):
|
|
66
|
+
continue
|
|
67
|
+
|
|
68
|
+
# Data is allowed - Copy size which is "number of lines"
|
|
69
|
+
for i in range(self.p.dataname.size()):
|
|
70
|
+
self.lines[i][0] = self.p.dataname.lines[i][0]
|
|
71
|
+
|
|
72
|
+
return True
|
|
73
|
+
|
|
74
|
+
return False # no more data from an underlying source
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Day Steps Filter Module - Bar replay simulation.
|
|
3
|
+
|
|
4
|
+
This module provides the BarReplayerOpen filter for splitting bars
|
|
5
|
+
to simulate replay behavior.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
BarReplayerOpen: Splits bars into open and OHLC parts.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> data = bt.feeds.GenericCSVData(dataname='data.csv')
|
|
12
|
+
>>> data.addfilter(bt.filters.BarReplayerOpen())
|
|
13
|
+
>>> cerebro.adddata(data)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BarReplayerOpen:
|
|
18
|
+
"""
|
|
19
|
+
This filters splits a bar in two parts:
|
|
20
|
+
|
|
21
|
+
- ``Open``: the opening price of the bar will be used to deliver an
|
|
22
|
+
initial price bar in which the four components (OHLC) are equal
|
|
23
|
+
|
|
24
|
+
The volume/openinterest fields are zero for this initial bar
|
|
25
|
+
|
|
26
|
+
- ``OHLC``: the original bar is delivered complete with the original
|
|
27
|
+
``volume``/``openinterest``
|
|
28
|
+
|
|
29
|
+
The split simulates a replay without the need to use the *replay* filter.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self, data):
|
|
33
|
+
"""Initialize the BarReplayerOpen filter.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
data: The data feed to apply the filter to.
|
|
37
|
+
The filter sets resampling=1 and replaying=True on the data.
|
|
38
|
+
"""
|
|
39
|
+
self.pendingbar = None
|
|
40
|
+
data.resampling = 1
|
|
41
|
+
data.replaying = True
|
|
42
|
+
|
|
43
|
+
def __call__(self, data):
|
|
44
|
+
"""Process the data feed to split bars into open and OHLC parts.
|
|
45
|
+
|
|
46
|
+
This method is called for each bar in the data feed. It splits the bar
|
|
47
|
+
into two parts - an initial bar with only the open price (OHLC=Open)
|
|
48
|
+
and the original OHLC bar. This simulates intraday replay behavior.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
data: The data feed containing the bar to process.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
bool: True if the length of the stream was changed,
|
|
55
|
+
False if it remained unchanged.
|
|
56
|
+
"""
|
|
57
|
+
ret = True
|
|
58
|
+
|
|
59
|
+
# Make a copy of the new bar and remove it from stream
|
|
60
|
+
newbar = [data.lines[i][0] for i in range(data.size())]
|
|
61
|
+
data.backwards() # remove the copied bar from stream
|
|
62
|
+
|
|
63
|
+
openbar = newbar[:] # Make an open only bar
|
|
64
|
+
o = newbar[data.Open]
|
|
65
|
+
for field_idx in [data.High, data.Low, data.Close]:
|
|
66
|
+
openbar[field_idx] = o
|
|
67
|
+
|
|
68
|
+
# Nullify Volume/OpenInteres at the open
|
|
69
|
+
openbar[data.Volume] = 0.0
|
|
70
|
+
openbar[data.OpenInterest] = 0.0
|
|
71
|
+
|
|
72
|
+
# Overwrite the new data bar with our pending data - except start point
|
|
73
|
+
if self.pendingbar is not None:
|
|
74
|
+
data._updatebar(self.pendingbar)
|
|
75
|
+
ret = False
|
|
76
|
+
|
|
77
|
+
self.pendingbar = newbar # update the pending bar to the new bar
|
|
78
|
+
data._add2stack(openbar) # Add the openbar to the stack for processing
|
|
79
|
+
|
|
80
|
+
return ret # the length of the stream was not changed
|
|
81
|
+
|
|
82
|
+
def last(self, data):
|
|
83
|
+
"""Called when the data is no longer producing bars
|
|
84
|
+
Can be called multiple times. It has the chance to (for example)
|
|
85
|
+
produce extra bars"""
|
|
86
|
+
if self.pendingbar is not None:
|
|
87
|
+
data.backwards() # remove delivered open bar
|
|
88
|
+
data._add2stack(self.pendingbar) # add remaining
|
|
89
|
+
self.pendingbar = None # No further action
|
|
90
|
+
return True # something delivered
|
|
91
|
+
|
|
92
|
+
return False # nothing delivered here
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# Alias
|
|
96
|
+
DayStepsFilter = BarReplayerOpen
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Heikin Ashi Filter Module - Heikin Ashi candlestick filter.
|
|
3
|
+
|
|
4
|
+
This module provides the HeikinAshi filter for remodeling price
|
|
5
|
+
data into Heikin Ashi candlesticks.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
HeikinAshi: Creates Heikin Ashi candlesticks.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> data = bt.feeds.GenericCSVData(dataname='data.csv')
|
|
12
|
+
>>> data.addfilter(bt.filters.HeikinAshi())
|
|
13
|
+
>>> cerebro.adddata(data)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
__all__ = ["HeikinAshi"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class HeikinAshi:
|
|
20
|
+
"""
|
|
21
|
+
The filter remodels the open, high, low, close to make HeikinAshi
|
|
22
|
+
candlesticks
|
|
23
|
+
|
|
24
|
+
See:
|
|
25
|
+
- https://en.wikipedia.org/wiki/Candlestick_chart#Heikin_Ashi_candlesticks
|
|
26
|
+
- http://stockcharts.com/school/doku.php?id=chart_school:chart_analysis:heikin_ashi
|
|
27
|
+
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, data):
|
|
31
|
+
"""Initialize the HeikinAshi filter.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
data: The data feed to apply the filter to.
|
|
35
|
+
No specific parameters are required.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __call__(self, data):
|
|
39
|
+
"""Convert standard OHLC data to Heikin Ashi candlesticks.
|
|
40
|
+
|
|
41
|
+
This method transforms the OHLC data into Heikin Ashi format, which
|
|
42
|
+
uses the average of open, high, low, and close for the close price,
|
|
43
|
+
and averages the previous close and open for the current open price.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
data: The data feed containing OHLC values to convert.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
bool: False (the length of data stream is unaltered).
|
|
50
|
+
"""
|
|
51
|
+
o, h, low, c = data.open[0], data.high[0], data.low[0], data.close[0]
|
|
52
|
+
|
|
53
|
+
data.close[0] = ha_close0 = (o + h + low + c) / 4.0
|
|
54
|
+
|
|
55
|
+
if len(data) > 1:
|
|
56
|
+
data.open[0] = ha_open0 = (data.open[-1] + data.close[-1]) / 2.0
|
|
57
|
+
data.high[0] = max(ha_open0, ha_close0, h)
|
|
58
|
+
data.low[0] = min(ha_open0, ha_close0, low)
|
|
59
|
+
|
|
60
|
+
else: # len is 1, no lookback is possible
|
|
61
|
+
data.open[0] = ha_open0 = (o + c) / 2.0
|
|
62
|
+
|
|
63
|
+
return False # length of data stream is unaltered
|