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/broker.py
ADDED
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Backtrader Broker Module.
|
|
3
|
+
|
|
4
|
+
This module provides the broker system for order execution and portfolio
|
|
5
|
+
management. It handles order creation, position tracking, cash management,
|
|
6
|
+
and commission calculation.
|
|
7
|
+
|
|
8
|
+
Key Classes:
|
|
9
|
+
BrokerBase: Base class for broker implementations.
|
|
10
|
+
BrokerAliasMixin: Mixin providing method aliases.
|
|
11
|
+
|
|
12
|
+
The broker system supports:
|
|
13
|
+
- Order execution (buy, sell, cancel)
|
|
14
|
+
- Position management
|
|
15
|
+
- Cash and value tracking
|
|
16
|
+
- Commission schemes
|
|
17
|
+
- Order history
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from .comminfo import CommInfoBase
|
|
21
|
+
from .parameters import ParameterDescriptor, ParameterizedBase
|
|
22
|
+
from .utils.log_message import get_logger
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
# from . import fillers as fillers
|
|
27
|
+
# from . import fillers as filler
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Create a mixin to handle aliases without using metaclasses
|
|
31
|
+
class BrokerAliasMixin:
|
|
32
|
+
"""Mixin to provide method aliases without using metaclasses.
|
|
33
|
+
|
|
34
|
+
This mixin creates method aliases for compatibility with different
|
|
35
|
+
naming conventions (e.g., get_cash/getcash, get_value/getvalue).
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, *args, **kwargs):
|
|
39
|
+
"""Initialize the broker alias mixin.
|
|
40
|
+
|
|
41
|
+
Creates method aliases for compatibility:
|
|
42
|
+
- get_cash -> getcash
|
|
43
|
+
- get_value -> getvalue
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
*args: Positional arguments passed to parent.
|
|
47
|
+
**kwargs: Keyword arguments passed to parent.
|
|
48
|
+
"""
|
|
49
|
+
super().__init__(*args, **kwargs)
|
|
50
|
+
# Create aliases if they don't exist
|
|
51
|
+
if not hasattr(self, "get_cash"):
|
|
52
|
+
self.get_cash = self.getcash
|
|
53
|
+
if not hasattr(self, "get_value"):
|
|
54
|
+
self.get_value = self.getvalue
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# broker base class - using new parameter system
|
|
58
|
+
class BrokerBase(BrokerAliasMixin, ParameterizedBase):
|
|
59
|
+
"""Base class for broker implementations.
|
|
60
|
+
|
|
61
|
+
The broker handles order execution, position tracking, and cash management.
|
|
62
|
+
It supports commission schemes, margin requirements, and order history.
|
|
63
|
+
|
|
64
|
+
Attributes:
|
|
65
|
+
commission: Default commission scheme for all assets.
|
|
66
|
+
comminfo: Dictionary mapping asset names to commission info objects.
|
|
67
|
+
|
|
68
|
+
Params:
|
|
69
|
+
commission: Default commission scheme (CommInfoBase instance).
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
# Use new parameter descriptor
|
|
73
|
+
commission = ParameterDescriptor(
|
|
74
|
+
default=CommInfoBase(percabs=True), doc="Default commission scheme for all assets"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
# Initialize
|
|
78
|
+
def __init__(self, **kwargs):
|
|
79
|
+
"""Initialize the broker instance.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
**kwargs: Keyword arguments passed to parent class.
|
|
83
|
+
"""
|
|
84
|
+
super().__init__(**kwargs)
|
|
85
|
+
self.comminfo = {}
|
|
86
|
+
self.init()
|
|
87
|
+
|
|
88
|
+
# This init uses None as key, commission as value
|
|
89
|
+
def init(self):
|
|
90
|
+
"""Initialize the commission info dictionary.
|
|
91
|
+
|
|
92
|
+
Sets up the default commission scheme if not already present.
|
|
93
|
+
Called from both __init__ and start methods.
|
|
94
|
+
"""
|
|
95
|
+
# called from init and from start
|
|
96
|
+
if None not in self.comminfo:
|
|
97
|
+
self.comminfo = {None: self.get_param("commission")}
|
|
98
|
+
|
|
99
|
+
# Start
|
|
100
|
+
def start(self):
|
|
101
|
+
"""Start the broker. Re-initializes commission info."""
|
|
102
|
+
self.init()
|
|
103
|
+
|
|
104
|
+
# Stop
|
|
105
|
+
def stop(self):
|
|
106
|
+
"""Stop the broker.
|
|
107
|
+
|
|
108
|
+
Override this method in subclasses for cleanup operations.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
# Add order history
|
|
112
|
+
def add_order_history(self, orders, notify=False):
|
|
113
|
+
"""Add order history to the broker.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
orders: Orders to add to history.
|
|
117
|
+
notify: Whether to notify about these orders.
|
|
118
|
+
|
|
119
|
+
Raises:
|
|
120
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
121
|
+
"""
|
|
122
|
+
# Add order history. See cerebro for details
|
|
123
|
+
raise NotImplementedError
|
|
124
|
+
|
|
125
|
+
# Set fund history
|
|
126
|
+
def set_fund_history(self, fund):
|
|
127
|
+
"""Set fund history for the broker.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
fund: Fund history data.
|
|
131
|
+
|
|
132
|
+
Raises:
|
|
133
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
134
|
+
"""
|
|
135
|
+
# Add fund history. See cerebro for details
|
|
136
|
+
raise NotImplementedError
|
|
137
|
+
|
|
138
|
+
@staticmethod
|
|
139
|
+
def _commission_lookup_keys(data):
|
|
140
|
+
"""Return stable symbol/name candidates for commission lookup."""
|
|
141
|
+
keys = []
|
|
142
|
+
seen = set()
|
|
143
|
+
for attr in ("name", "_name", "_dataname", "symbol"):
|
|
144
|
+
value = getattr(data, attr, None)
|
|
145
|
+
if value is None:
|
|
146
|
+
continue
|
|
147
|
+
if isinstance(value, str) and value == "":
|
|
148
|
+
continue
|
|
149
|
+
try:
|
|
150
|
+
hash(value)
|
|
151
|
+
except TypeError:
|
|
152
|
+
logger.debug("broker:151 ignored TypeError")
|
|
153
|
+
continue
|
|
154
|
+
text = str(value)
|
|
155
|
+
for key in (value, text, text.upper(), text.lower()):
|
|
156
|
+
try:
|
|
157
|
+
marker = ("hashable", key)
|
|
158
|
+
if marker in seen:
|
|
159
|
+
continue
|
|
160
|
+
seen.add(marker)
|
|
161
|
+
except TypeError:
|
|
162
|
+
marker = ("repr", repr(key))
|
|
163
|
+
if marker in seen:
|
|
164
|
+
continue
|
|
165
|
+
seen.add(marker)
|
|
166
|
+
keys.append(key)
|
|
167
|
+
return keys
|
|
168
|
+
|
|
169
|
+
# Get commission info, if data name is in commission info dict, get corresponding value, otherwise use default self.p.commission
|
|
170
|
+
def getcommissioninfo(self, data):
|
|
171
|
+
"""Get the commission info for a given data.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
data: Data feed to get commission info for.
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
CommInfoBase: The commission info for the data, or the default.
|
|
178
|
+
"""
|
|
179
|
+
# PERFORMANCE OPTIMIZATION: Use getattr instead of hasattr+access
|
|
180
|
+
# Called 2.1M+ times, avoid double attribute lookup
|
|
181
|
+
comminfo = self.comminfo
|
|
182
|
+
for name in self._commission_lookup_keys(data):
|
|
183
|
+
if name in comminfo:
|
|
184
|
+
return comminfo[name]
|
|
185
|
+
|
|
186
|
+
return comminfo[None]
|
|
187
|
+
|
|
188
|
+
# Set commission
|
|
189
|
+
def setcommission(
|
|
190
|
+
self,
|
|
191
|
+
commission=0.0,
|
|
192
|
+
maker_commission=None,
|
|
193
|
+
taker_commission=None,
|
|
194
|
+
open_commission=None,
|
|
195
|
+
close_commission=None,
|
|
196
|
+
close_today_commission=None,
|
|
197
|
+
close_yesterday_commission=None,
|
|
198
|
+
margin=None,
|
|
199
|
+
mult=1.0,
|
|
200
|
+
commtype=None,
|
|
201
|
+
percabs=True,
|
|
202
|
+
stocklike=False,
|
|
203
|
+
interest=0.0,
|
|
204
|
+
interest_long=False,
|
|
205
|
+
leverage=1.0,
|
|
206
|
+
automargin=False,
|
|
207
|
+
name=None,
|
|
208
|
+
):
|
|
209
|
+
"""This method sets a `` CommissionInfo`` object for assets managed in
|
|
210
|
+
the broker with the parameters. Consult the reference for
|
|
211
|
+
``CommInfoBase``
|
|
212
|
+
|
|
213
|
+
If name is `None`, this will be the default for assets for which no
|
|
214
|
+
other ``CommissionInfo`` scheme can be found
|
|
215
|
+
"""
|
|
216
|
+
|
|
217
|
+
comm = CommInfoBase(
|
|
218
|
+
commission=commission,
|
|
219
|
+
maker_commission=maker_commission,
|
|
220
|
+
taker_commission=taker_commission,
|
|
221
|
+
open_commission=open_commission,
|
|
222
|
+
close_commission=close_commission,
|
|
223
|
+
close_today_commission=close_today_commission,
|
|
224
|
+
close_yesterday_commission=close_yesterday_commission,
|
|
225
|
+
margin=margin,
|
|
226
|
+
mult=mult,
|
|
227
|
+
commtype=commtype,
|
|
228
|
+
stocklike=stocklike,
|
|
229
|
+
percabs=percabs,
|
|
230
|
+
interest=interest,
|
|
231
|
+
interest_long=interest_long,
|
|
232
|
+
leverage=leverage,
|
|
233
|
+
automargin=automargin,
|
|
234
|
+
)
|
|
235
|
+
self.comminfo[name] = comm
|
|
236
|
+
|
|
237
|
+
# Add commission info
|
|
238
|
+
def addcommissioninfo(self, comminfo, name=None):
|
|
239
|
+
"""Add a CommissionInfo object for an asset.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
comminfo: The CommissionInfo object to add.
|
|
243
|
+
name: Asset name. If None, sets as default for all assets.
|
|
244
|
+
"""
|
|
245
|
+
# Adds a ``CommissionInfo`` object that will be the default for all assets if ``name`` is ``None``
|
|
246
|
+
self.comminfo[name] = comminfo
|
|
247
|
+
|
|
248
|
+
# Get cash
|
|
249
|
+
def getcash(self):
|
|
250
|
+
"""Get the current available cash.
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
float: Current cash amount.
|
|
254
|
+
|
|
255
|
+
Raises:
|
|
256
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
257
|
+
"""
|
|
258
|
+
raise NotImplementedError
|
|
259
|
+
|
|
260
|
+
# Get value
|
|
261
|
+
def getvalue(self, datas=None):
|
|
262
|
+
"""Get the current portfolio value.
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
datas: Data feeds to calculate value for (optional).
|
|
266
|
+
|
|
267
|
+
Returns:
|
|
268
|
+
float: Current portfolio value.
|
|
269
|
+
|
|
270
|
+
Raises:
|
|
271
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
272
|
+
"""
|
|
273
|
+
raise NotImplementedError
|
|
274
|
+
|
|
275
|
+
def get_cached_report_state(self):
|
|
276
|
+
"""Return a local-only state view for runtime observers.
|
|
277
|
+
|
|
278
|
+
Implementations must not perform network, disk, or provider queries in
|
|
279
|
+
this method. It is deliberately separate from :meth:`getcash`,
|
|
280
|
+
:meth:`getvalue`, and :meth:`getposition`, because live brokers may
|
|
281
|
+
refresh those values synchronously. A caller may receive ``None``
|
|
282
|
+
when a broker does not expose a local report cache.
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
dict | None: A mapping with optional ``cash``, ``value``, and
|
|
286
|
+
``positions`` entries, plus an optional ``position_legs`` mapping
|
|
287
|
+
for dual-side brokers, or ``None`` if no read-only cache exists.
|
|
288
|
+
"""
|
|
289
|
+
|
|
290
|
+
def get_cached_mark_price(self, data):
|
|
291
|
+
"""Return a local-only mark for ``data`` when the broker has one.
|
|
292
|
+
|
|
293
|
+
Runtime reports may use this optional hook only when the data object
|
|
294
|
+
has no current close line, such as channel-only strategies. An
|
|
295
|
+
implementation must read an already-held tick/order-book/cache value;
|
|
296
|
+
it must not make a network, disk, or provider request. ``None``
|
|
297
|
+
means that no cached mark is available.
|
|
298
|
+
"""
|
|
299
|
+
|
|
300
|
+
# Get fund shares
|
|
301
|
+
def get_fundshares(self):
|
|
302
|
+
"""Get the current number of shares in fund-like mode.
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
float: Number of shares (1.0 for abstract mode).
|
|
306
|
+
"""
|
|
307
|
+
# Returns the current number of shares in the fund-like mode
|
|
308
|
+
return 1.0 # the abstract mode has only 1 share
|
|
309
|
+
|
|
310
|
+
fundshares = property(get_fundshares)
|
|
311
|
+
|
|
312
|
+
# Get fund value
|
|
313
|
+
def get_fundvalue(self):
|
|
314
|
+
"""Get the current fund value.
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
float: Current fund value.
|
|
318
|
+
"""
|
|
319
|
+
return self.getvalue()
|
|
320
|
+
|
|
321
|
+
fundvalue = property(get_fundvalue)
|
|
322
|
+
|
|
323
|
+
# Set fund mode
|
|
324
|
+
def set_fundmode(self, fundmode, fundstartval=None):
|
|
325
|
+
"""Set the fund mode for the broker.
|
|
326
|
+
|
|
327
|
+
Args:
|
|
328
|
+
fundmode: True to enable fund mode, False otherwise.
|
|
329
|
+
fundstartval: Initial fund value (optional).
|
|
330
|
+
|
|
331
|
+
Note:
|
|
332
|
+
Not all brokers support fund mode.
|
|
333
|
+
"""
|
|
334
|
+
# do nothing, not all brokers can support this
|
|
335
|
+
|
|
336
|
+
# Get fund mode
|
|
337
|
+
def get_fundmode(self):
|
|
338
|
+
"""Get the current fund mode status.
|
|
339
|
+
|
|
340
|
+
Returns:
|
|
341
|
+
bool: True if fund mode is enabled, False otherwise.
|
|
342
|
+
"""
|
|
343
|
+
# Returns the actual fundmode (True or False)
|
|
344
|
+
return False
|
|
345
|
+
|
|
346
|
+
fundmode = property(get_fundmode, set_fundmode)
|
|
347
|
+
|
|
348
|
+
# Get position
|
|
349
|
+
def getposition(self, data, side=None):
|
|
350
|
+
"""Get the current position for a data feed.
|
|
351
|
+
|
|
352
|
+
Args:
|
|
353
|
+
data: Data feed to get position for.
|
|
354
|
+
side: Optional side selector used by brokers that support
|
|
355
|
+
dual-side position books.
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
Position: Current position for the data feed.
|
|
359
|
+
|
|
360
|
+
Raises:
|
|
361
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
362
|
+
"""
|
|
363
|
+
raise NotImplementedError
|
|
364
|
+
|
|
365
|
+
# Submit
|
|
366
|
+
def submit(self, order):
|
|
367
|
+
"""Submit an order to the broker.
|
|
368
|
+
|
|
369
|
+
Args:
|
|
370
|
+
order: Order object to submit.
|
|
371
|
+
|
|
372
|
+
Raises:
|
|
373
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
374
|
+
"""
|
|
375
|
+
raise NotImplementedError
|
|
376
|
+
|
|
377
|
+
# Cancel
|
|
378
|
+
def cancel(self, order):
|
|
379
|
+
"""Cancel a pending order.
|
|
380
|
+
|
|
381
|
+
Args:
|
|
382
|
+
order: Order object to cancel.
|
|
383
|
+
|
|
384
|
+
Raises:
|
|
385
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
386
|
+
"""
|
|
387
|
+
raise NotImplementedError
|
|
388
|
+
|
|
389
|
+
# Buy order
|
|
390
|
+
def buy(
|
|
391
|
+
self,
|
|
392
|
+
owner,
|
|
393
|
+
data,
|
|
394
|
+
size,
|
|
395
|
+
price=None,
|
|
396
|
+
plimit=None,
|
|
397
|
+
exectype=None,
|
|
398
|
+
valid=None,
|
|
399
|
+
tradeid=0,
|
|
400
|
+
oco=None,
|
|
401
|
+
trailamount=None,
|
|
402
|
+
trailpercent=None,
|
|
403
|
+
**kwargs,
|
|
404
|
+
):
|
|
405
|
+
"""Create a buy order.
|
|
406
|
+
|
|
407
|
+
Args:
|
|
408
|
+
owner: Strategy/owner creating the order.
|
|
409
|
+
data: Data feed for the order.
|
|
410
|
+
size: Size of the order (positive for buy).
|
|
411
|
+
price: Limit price (optional).
|
|
412
|
+
plimit: Profit limit price (optional).
|
|
413
|
+
exectype: Execution type (Market, Limit, Stop, etc.).
|
|
414
|
+
valid: Validity period for the order.
|
|
415
|
+
tradeid: Trade identifier.
|
|
416
|
+
oco: One-cancels-other order reference.
|
|
417
|
+
trailamount: Trailing amount for stop orders.
|
|
418
|
+
trailpercent: Trailing percent for stop orders.
|
|
419
|
+
**kwargs: Additional keyword arguments.
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
Order: The created order object.
|
|
423
|
+
|
|
424
|
+
Raises:
|
|
425
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
426
|
+
"""
|
|
427
|
+
raise NotImplementedError
|
|
428
|
+
|
|
429
|
+
# Sell order
|
|
430
|
+
def sell(
|
|
431
|
+
self,
|
|
432
|
+
owner,
|
|
433
|
+
data,
|
|
434
|
+
size,
|
|
435
|
+
price=None,
|
|
436
|
+
plimit=None,
|
|
437
|
+
exectype=None,
|
|
438
|
+
valid=None,
|
|
439
|
+
tradeid=0,
|
|
440
|
+
oco=None,
|
|
441
|
+
trailamount=None,
|
|
442
|
+
trailpercent=None,
|
|
443
|
+
**kwargs,
|
|
444
|
+
):
|
|
445
|
+
"""Create a sell order.
|
|
446
|
+
|
|
447
|
+
Args:
|
|
448
|
+
owner: Strategy/owner creating the order.
|
|
449
|
+
data: Data feed for the order.
|
|
450
|
+
size: Size of the order (positive for sell).
|
|
451
|
+
price: Limit price (optional).
|
|
452
|
+
plimit: Profit limit price (optional).
|
|
453
|
+
exectype: Execution type (Market, Limit, Stop, etc.).
|
|
454
|
+
valid: Validity period for the order.
|
|
455
|
+
tradeid: Trade identifier.
|
|
456
|
+
oco: One-cancels-other order reference.
|
|
457
|
+
trailamount: Trailing amount for stop orders.
|
|
458
|
+
trailpercent: Trailing percent for stop orders.
|
|
459
|
+
**kwargs: Additional keyword arguments.
|
|
460
|
+
|
|
461
|
+
Returns:
|
|
462
|
+
Order: The created order object.
|
|
463
|
+
|
|
464
|
+
Raises:
|
|
465
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
466
|
+
"""
|
|
467
|
+
raise NotImplementedError
|
|
468
|
+
|
|
469
|
+
# Next bar
|
|
470
|
+
def next(self):
|
|
471
|
+
"""Process the next bar in the backtest.
|
|
472
|
+
|
|
473
|
+
Called by the cerebro engine for each iteration.
|
|
474
|
+
Override in subclasses to perform per-bar operations.
|
|
475
|
+
"""
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
# __all__ = ['BrokerBase', 'fillers', 'filler']
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Brokers Module - Order execution and portfolio management.
|
|
3
|
+
|
|
4
|
+
This module provides broker implementations for order execution and
|
|
5
|
+
portfolio management. Brokers handle order routing, position tracking,
|
|
6
|
+
cash management, and trade history.
|
|
7
|
+
|
|
8
|
+
Available Brokers:
|
|
9
|
+
- BackBroker: Built-in backtesting broker.
|
|
10
|
+
- TickBroker: Tick and order book matching backtesting broker.
|
|
11
|
+
- BtApiBroker: Unified bt_api_py live trading broker.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
Setting the broker in cerebro:
|
|
15
|
+
>>> cerebro = bt.Cerebro()
|
|
16
|
+
>>> cerebro.setbroker(bt.brokers.BackBroker())
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import os as _os
|
|
20
|
+
|
|
21
|
+
from backtrader.brokers.bbroker import BackBroker as BackBroker
|
|
22
|
+
from backtrader.brokers.bbroker import BrokerBack as BrokerBack
|
|
23
|
+
|
|
24
|
+
# The modules below should/must define __all__ with the objects wishes
|
|
25
|
+
# or prepend an "_" (underscore) to private classes/variables
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
if _os.environ.get("BACKTRADER_LIGHT_IMPORT", "").strip().lower() not in {
|
|
29
|
+
"1",
|
|
30
|
+
"true",
|
|
31
|
+
"yes",
|
|
32
|
+
"on",
|
|
33
|
+
}:
|
|
34
|
+
from backtrader.brokers.btapibroker import BtApiBroker as BtApiBroker
|
|
35
|
+
from backtrader.brokers.mixbroker import MixBroker as MixBroker
|
|
36
|
+
from backtrader.brokers.tickbroker import TickBroker as TickBroker
|