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/signal.py
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Signal Module - Signal indicator for trading strategies.
|
|
3
|
+
|
|
4
|
+
This module provides the Signal indicator which wraps a data line
|
|
5
|
+
to provide trading signal values for strategy execution.
|
|
6
|
+
|
|
7
|
+
Constants:
|
|
8
|
+
SIGNAL_NONE: No signal.
|
|
9
|
+
SIGNAL_LONGSHORT: Both long and short signals.
|
|
10
|
+
SIGNAL_LONG: Long entry signal.
|
|
11
|
+
SIGNAL_LONG_INV: Inverted long signal.
|
|
12
|
+
SIGNAL_LONG_ANY: Any long signal variant.
|
|
13
|
+
SIGNAL_SHORT: Short entry signal.
|
|
14
|
+
SIGNAL_SHORT_INV: Inverted short signal.
|
|
15
|
+
SIGNAL_SHORT_ANY: Any short signal variant.
|
|
16
|
+
SIGNAL_LONGEXIT: Long exit signal.
|
|
17
|
+
SIGNAL_LONGEXIT_INV: Inverted long exit signal.
|
|
18
|
+
SIGNAL_LONGEXIT_ANY: Any long exit variant.
|
|
19
|
+
SIGNAL_SHORTEXIT: Short exit signal.
|
|
20
|
+
SIGNAL_SHORTEXIT_INV: Inverted short exit signal.
|
|
21
|
+
SIGNAL_SHORTEXIT_ANY: Any short exit variant.
|
|
22
|
+
|
|
23
|
+
Classes:
|
|
24
|
+
Signal: Indicator that wraps a data line as a trading signal.
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
>>> class MyStrategy(bt.Strategy):
|
|
28
|
+
... def __init__(self):
|
|
29
|
+
... # Create a signal indicator from a data line
|
|
30
|
+
... self.signal = bt.Signal(self.data.close)
|
|
31
|
+
... self.sma = bt.indicators.SMA(self.data.close, period=20)
|
|
32
|
+
...
|
|
33
|
+
... def next(self):
|
|
34
|
+
... if self.signal[0] > 0:
|
|
35
|
+
... self.buy()
|
|
36
|
+
... elif self.signal[0] < 0:
|
|
37
|
+
... self.sell()
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from .indicator import Indicator
|
|
41
|
+
|
|
42
|
+
# Create different SIGNAL types
|
|
43
|
+
(
|
|
44
|
+
SIGNAL_NONE,
|
|
45
|
+
SIGNAL_LONGSHORT,
|
|
46
|
+
SIGNAL_LONG,
|
|
47
|
+
SIGNAL_LONG_INV,
|
|
48
|
+
SIGNAL_LONG_ANY,
|
|
49
|
+
SIGNAL_SHORT,
|
|
50
|
+
SIGNAL_SHORT_INV,
|
|
51
|
+
SIGNAL_SHORT_ANY,
|
|
52
|
+
SIGNAL_LONGEXIT,
|
|
53
|
+
SIGNAL_LONGEXIT_INV,
|
|
54
|
+
SIGNAL_LONGEXIT_ANY,
|
|
55
|
+
SIGNAL_SHORTEXIT,
|
|
56
|
+
SIGNAL_SHORTEXIT_INV,
|
|
57
|
+
SIGNAL_SHORTEXIT_ANY,
|
|
58
|
+
) = range(14)
|
|
59
|
+
|
|
60
|
+
# Different signal types
|
|
61
|
+
SignalTypes = [
|
|
62
|
+
SIGNAL_NONE,
|
|
63
|
+
SIGNAL_LONGSHORT,
|
|
64
|
+
SIGNAL_LONG,
|
|
65
|
+
SIGNAL_LONG_INV,
|
|
66
|
+
SIGNAL_LONG_ANY,
|
|
67
|
+
SIGNAL_SHORT,
|
|
68
|
+
SIGNAL_SHORT_INV,
|
|
69
|
+
SIGNAL_SHORT_ANY,
|
|
70
|
+
SIGNAL_LONGEXIT,
|
|
71
|
+
SIGNAL_LONGEXIT_INV,
|
|
72
|
+
SIGNAL_LONGEXIT_ANY,
|
|
73
|
+
SIGNAL_SHORTEXIT,
|
|
74
|
+
SIGNAL_SHORTEXIT_INV,
|
|
75
|
+
SIGNAL_SHORTEXIT_ANY,
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# Inherit from Indicator, create a signal indicator
|
|
80
|
+
class Signal(Indicator):
|
|
81
|
+
"""Signal indicator for trading strategies.
|
|
82
|
+
|
|
83
|
+
The Signal class wraps a data line to provide trading signal values
|
|
84
|
+
for strategy execution. It inherits from Indicator and exposes a
|
|
85
|
+
single signal line that can be used to generate long/short signals.
|
|
86
|
+
|
|
87
|
+
Attributes:
|
|
88
|
+
SignalTypes: List of available signal type constants.
|
|
89
|
+
lines: Tuple containing the signal line name.
|
|
90
|
+
|
|
91
|
+
Example:
|
|
92
|
+
>>> class MyStrategy(bt.Strategy):
|
|
93
|
+
... def __init__(self):
|
|
94
|
+
... # Create a signal indicator from a data line
|
|
95
|
+
... self.signal = bt.Signal(self.data.close)
|
|
96
|
+
... self.sma = bt.indicators.SMA(self.data.close, period=20)
|
|
97
|
+
...
|
|
98
|
+
... def next(self):
|
|
99
|
+
... if self.signal[0] > 0:
|
|
100
|
+
... self.buy()
|
|
101
|
+
... elif self.signal[0] < 0:
|
|
102
|
+
... self.sell()
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
# Signal type
|
|
106
|
+
SignalTypes = SignalTypes
|
|
107
|
+
# Create a signal line
|
|
108
|
+
lines = ("signal",)
|
|
109
|
+
|
|
110
|
+
# Initialize
|
|
111
|
+
def __init__(self):
|
|
112
|
+
"""Initialize the Signal indicator.
|
|
113
|
+
|
|
114
|
+
Wraps the first data line from data0 as the signal line and sets
|
|
115
|
+
up plotting information to use data0's clock as the plot master.
|
|
116
|
+
"""
|
|
117
|
+
self.lines.signal = self.data0.lines[0]
|
|
118
|
+
self.plotinfo.plotmaster = getattr(self.data0, "_clock", self.data0)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Signal Strategy Module - Trading signal based strategies.
|
|
3
|
+
|
|
4
|
+
This module provides signal-based strategy implementations where trading
|
|
5
|
+
decisions are driven by external signal sources rather than internal
|
|
6
|
+
logic. Signals can be generated from indicators, machine learning models,
|
|
7
|
+
or external data sources.
|
|
8
|
+
|
|
9
|
+
Key Classes:
|
|
10
|
+
SignalStrategy: Base class for signal-based strategies.
|
|
11
|
+
|
|
12
|
+
Example:
|
|
13
|
+
Creating a signal-based strategy:
|
|
14
|
+
>>> class MySignalStrategy(bt.SignalStrategy):
|
|
15
|
+
... def __init__(self):
|
|
16
|
+
... self.signal_add(bt.SIGNAL_LONG, self.data.close)
|
|
17
|
+
"""
|
backtrader/sizer.py
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Position Sizer Module - Position size calculation.
|
|
3
|
+
|
|
4
|
+
This module provides the base class for position sizers, which determine
|
|
5
|
+
the size of orders to place based on available cash, risk parameters,
|
|
6
|
+
and other factors.
|
|
7
|
+
|
|
8
|
+
Classes:
|
|
9
|
+
Sizer: Base class for position sizers.
|
|
10
|
+
FixedSize: Sizer that uses a fixed size.
|
|
11
|
+
FixedReverser: Sizer that reverses positions with fixed size.
|
|
12
|
+
PercentSizer: Sizer that uses a percentage of available cash.
|
|
13
|
+
AllInSizer: Sizer that uses all available cash.
|
|
14
|
+
RiskReturnSizer: Sizer that sizes based on risk/reward ratio.
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
Creating a custom sizer:
|
|
18
|
+
>>> class MySizer(bt.Sizer):
|
|
19
|
+
... params = (('perc', 0.1),)
|
|
20
|
+
...
|
|
21
|
+
... def _getsizing(self, comminfo, cash, data, isbuy):
|
|
22
|
+
... return int(cash * self.p.perc / data.close[0])
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from .parameters import ParameterizedBase
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# Sizer class - Refactored to use new parameter system
|
|
29
|
+
class Sizer(ParameterizedBase):
|
|
30
|
+
"""Base class for position sizers.
|
|
31
|
+
|
|
32
|
+
This is the base class for sizers. Any sizer should subclass this
|
|
33
|
+
and override the ``_getsizing`` method to provide custom position
|
|
34
|
+
sizing logic.
|
|
35
|
+
|
|
36
|
+
Attributes:
|
|
37
|
+
strategy: The strategy using this sizer.
|
|
38
|
+
broker: The broker instance for portfolio information.
|
|
39
|
+
|
|
40
|
+
Methods:
|
|
41
|
+
getsizing(data, isbuy): Get the position size for an order.
|
|
42
|
+
_getsizing(comminfo, cash, data, isbuy): Override to implement sizing logic.
|
|
43
|
+
set(strategy, broker): Set the strategy and broker references.
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
>>> cerebro.addsizer(bt.sizers.FixedSize, stake=100)
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
strategy = None
|
|
50
|
+
broker = None
|
|
51
|
+
|
|
52
|
+
def __init__(self, **kwargs):
|
|
53
|
+
"""Initialize the Sizer with any provided parameters."""
|
|
54
|
+
super().__init__(**kwargs)
|
|
55
|
+
|
|
56
|
+
# Get the specific position size for order placement
|
|
57
|
+
def getsizing(self, data, isbuy):
|
|
58
|
+
"""Get the position size for an order.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
data: The target data for the order.
|
|
62
|
+
isbuy: True for buy operations, False for sell operations.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
int: The position size to use for the order, as determined
|
|
66
|
+
by the _getsizing method.
|
|
67
|
+
"""
|
|
68
|
+
comminfo = self.broker.getcommissioninfo(data)
|
|
69
|
+
return self._getsizing(comminfo, self.broker.getcash(), data, isbuy)
|
|
70
|
+
|
|
71
|
+
def _getsizing(self, comminfo, cash, data, isbuy):
|
|
72
|
+
"""This method has to be overriden by subclasses of Sizer to provide
|
|
73
|
+
the sizing functionality
|
|
74
|
+
|
|
75
|
+
Params:
|
|
76
|
+
- ``comminfo``: The CommissionInfo instance that contains
|
|
77
|
+
information about the commission for the data and allows
|
|
78
|
+
calculation of position value, operation cost, commission for the
|
|
79
|
+
operation
|
|
80
|
+
|
|
81
|
+
- ``cash``: current available cash in the *broker*
|
|
82
|
+
|
|
83
|
+
- ``data``: target of the operation
|
|
84
|
+
|
|
85
|
+
- ``isbuy``: will be ``True`` for *buy* operations and ``False``
|
|
86
|
+
for *sell* operations
|
|
87
|
+
|
|
88
|
+
The method has to return the actual size (an int) to be executed. If
|
|
89
|
+
`0` is returned, nothing will be executed.
|
|
90
|
+
|
|
91
|
+
The absolute value of the returned value will be used
|
|
92
|
+
# This method needs to be overridden when in use, takes four parameters:
|
|
93
|
+
# comminfo represents the commission instance, can be used to get commission etc.
|
|
94
|
+
# cash represents currently available cash
|
|
95
|
+
# data represents which data to trade on
|
|
96
|
+
# isbuy represents True for buy operations, False for sell operations
|
|
97
|
+
|
|
98
|
+
"""
|
|
99
|
+
raise NotImplementedError
|
|
100
|
+
|
|
101
|
+
# Set strategy and broker
|
|
102
|
+
def set(self, strategy, broker):
|
|
103
|
+
"""Set the strategy and broker references for this sizer.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
strategy: The strategy instance using this sizer.
|
|
107
|
+
broker: The broker instance for portfolio information.
|
|
108
|
+
"""
|
|
109
|
+
self.strategy = strategy
|
|
110
|
+
self.broker = broker
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# SizerBase class
|
|
114
|
+
SizerBase = Sizer
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Position Sizers Module - Order size calculation strategies.
|
|
3
|
+
|
|
4
|
+
This module provides position sizer implementations that determine
|
|
5
|
+
the size of orders based on various strategies like fixed size,
|
|
6
|
+
percentage of capital, risk/reward ratios, etc.
|
|
7
|
+
|
|
8
|
+
Available Sizers:
|
|
9
|
+
- FixedSize: Always uses a fixed size for orders.
|
|
10
|
+
- FixedReverser: Reverses positions with fixed size.
|
|
11
|
+
- PercentSizer: Uses a percentage of available cash.
|
|
12
|
+
- AllInSizer: Uses all available cash for each order.
|
|
13
|
+
- RiskReturnSizer: Sizes based on risk/reward ratio.
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
Using a sizer with cerebro:
|
|
17
|
+
>>> cerebro = bt.Cerebro()
|
|
18
|
+
>>> cerebro.addsizer(bt.sizers.FixedSize, stake=100)
|
|
19
|
+
>>> cerebro.addsizer(bt.sizers.PercentSizer, percents=10)
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
# The modules below should/must define __all__ with the objects wishes
|
|
23
|
+
# or prepend an "_" (underscore) to private classes/variables
|
|
24
|
+
|
|
25
|
+
from .fixedsize import *
|
|
26
|
+
from .percents_sizer import *
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Fixed Size Sizer Module - Fixed stake position sizing.
|
|
3
|
+
|
|
4
|
+
This module provides the FixedSize sizer for using a fixed stake
|
|
5
|
+
size in trading operations.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
FixedSize: Returns a fixed stake size for orders.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
>>> cerebro.addsizer(bt.sizers.FixedSize, stake=10)
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from ..parameters import Int, ParameterDescriptor
|
|
15
|
+
from ..sizer import Sizer
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class FixedSize(Sizer):
|
|
19
|
+
"""
|
|
20
|
+
This sizer simply returns a fixed size for any operation.
|
|
21
|
+
Size can be controlled by the number of tranches that a system
|
|
22
|
+
wishes to use to scale into trades by specifying the ``tranches``
|
|
23
|
+
parameter.
|
|
24
|
+
|
|
25
|
+
This class has been refactored from legacy params tuple to the new
|
|
26
|
+
ParameterDescriptor system for Day 36-38 of the metaprogramming removal project.
|
|
27
|
+
|
|
28
|
+
Params:
|
|
29
|
+
- ``stake`` (default: ``1``)
|
|
30
|
+
- ``tranches`` (default: ``1``)
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
# Use new parameter descriptor system to define parameters
|
|
34
|
+
stake = ParameterDescriptor(
|
|
35
|
+
default=1, type_=int, validator=Int(min_val=1), doc="Fixed stake size for operations"
|
|
36
|
+
)
|
|
37
|
+
tranches = ParameterDescriptor(
|
|
38
|
+
default=1,
|
|
39
|
+
type_=int,
|
|
40
|
+
validator=Int(min_val=1),
|
|
41
|
+
doc="Number of tranches to divide stake into",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def __init__(self, **kwargs):
|
|
45
|
+
"""Initialize the FixedSize sizer.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
**kwargs: Keyword arguments for sizer configuration including
|
|
49
|
+
stake and tranches parameters.
|
|
50
|
+
"""
|
|
51
|
+
super().__init__(**kwargs)
|
|
52
|
+
|
|
53
|
+
# Return specific stake size, if tranches > 1, will divide stake into tranches parts, otherwise return stake directly
|
|
54
|
+
def _getsizing(self, comminfo, cash, data, isbuy):
|
|
55
|
+
if self.get_param("tranches") > 1:
|
|
56
|
+
return abs(int(self.get_param("stake") / self.get_param("tranches")))
|
|
57
|
+
return self.get_param("stake")
|
|
58
|
+
|
|
59
|
+
# Set stake size
|
|
60
|
+
def setsizing(self, stake):
|
|
61
|
+
"""Set the fixed stake size for operations.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
stake (int): The stake size to set. If tranches > 1, this value
|
|
65
|
+
will be divided by tranches and stored as the internal stake.
|
|
66
|
+
"""
|
|
67
|
+
if self.get_param("tranches") > 1:
|
|
68
|
+
self.set_param("stake", abs(int(stake / self.get_param("tranches"))))
|
|
69
|
+
else:
|
|
70
|
+
self.set_param("stake", stake) # OLD METHOD FOR SAMPLE COMPATIBILITY
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# Another name for FixedSize
|
|
74
|
+
SizerFix = FixedSize
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
# If opening position, use stake, if reversing position, use double stake
|
|
78
|
+
class FixedReverser(Sizer):
|
|
79
|
+
"""This sizer returns the needes fixed size to reverse an open position or
|
|
80
|
+
the fixed size to open one
|
|
81
|
+
|
|
82
|
+
- To open a position: return the param ``stake``
|
|
83
|
+
|
|
84
|
+
- To reverse a position: return 2 * `stake`
|
|
85
|
+
|
|
86
|
+
Params:
|
|
87
|
+
- ``stake`` (default: ``1``)
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
stake = ParameterDescriptor(
|
|
91
|
+
default=1, type_=int, validator=Int(min_val=1), doc="Fixed stake size for operations"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def __init__(self, **kwargs):
|
|
95
|
+
"""Initialize the FixedReverser sizer.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
**kwargs: Keyword arguments for sizer configuration including
|
|
99
|
+
stake parameter.
|
|
100
|
+
"""
|
|
101
|
+
super().__init__(**kwargs)
|
|
102
|
+
|
|
103
|
+
def _getsizing(self, comminfo, cash, data, isbuy):
|
|
104
|
+
position = self.strategy.getposition(data)
|
|
105
|
+
size = self.get_param("stake") * (1 + (position.size != 0))
|
|
106
|
+
return size
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
# Fixed target stake size, if tranches > 1, first divide stake into tranches parts, then calculate current position and each part vs stake, choose smaller as order size
|
|
110
|
+
# If tranches <= 1, directly use stake size
|
|
111
|
+
class FixedSizeTarget(Sizer):
|
|
112
|
+
"""
|
|
113
|
+
This sizer simply returns a fixed target size, useful when coupled
|
|
114
|
+
with Target Orders and specifically ``cerebro.target_order_size()``.
|
|
115
|
+
Size can be controlled by the number of tranches that a system
|
|
116
|
+
wishes to use to scale into trades by specifying the ``tranches``
|
|
117
|
+
parameter.
|
|
118
|
+
|
|
119
|
+
Params:
|
|
120
|
+
- ``stake`` (default: ``1``)
|
|
121
|
+
- ``tranches`` (default: ``1``)
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
stake = ParameterDescriptor(
|
|
125
|
+
default=1, type_=int, validator=Int(min_val=1), doc="Fixed target stake size"
|
|
126
|
+
)
|
|
127
|
+
tranches = ParameterDescriptor(
|
|
128
|
+
default=1,
|
|
129
|
+
type_=int,
|
|
130
|
+
validator=Int(min_val=1),
|
|
131
|
+
doc="Number of tranches to divide stake into",
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
def __init__(self, **kwargs):
|
|
135
|
+
"""Initialize the FixedSizeTarget sizer.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
**kwargs: Keyword arguments for sizer configuration including
|
|
139
|
+
stake and tranches parameters.
|
|
140
|
+
"""
|
|
141
|
+
super().__init__(**kwargs)
|
|
142
|
+
|
|
143
|
+
def _getsizing(self, comminfo, cash, data, isbuy):
|
|
144
|
+
if self.get_param("tranches") > 1:
|
|
145
|
+
size = abs(int(self.get_param("stake") / self.get_param("tranches")))
|
|
146
|
+
return min((self.strategy.position.size + size), self.get_param("stake"))
|
|
147
|
+
return self.get_param("stake")
|
|
148
|
+
|
|
149
|
+
def setsizing(self, stake):
|
|
150
|
+
"""Set the fixed target stake size for operations.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
stake (int): The target stake size to set. If tranches > 1, this value
|
|
154
|
+
will be divided by tranches and adjusted based on current
|
|
155
|
+
position size to reach the target.
|
|
156
|
+
"""
|
|
157
|
+
if self.get_param("tranches") > 1:
|
|
158
|
+
size = abs(int(stake / self.get_param("tranches")))
|
|
159
|
+
self.set_param("stake", min((self.strategy.position.size + size), stake))
|
|
160
|
+
else:
|
|
161
|
+
self.set_param("stake", stake) # OLD METHOD FOR SAMPLE COMPATIBILITY
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Percent Sizer Module - Percentage-based position sizing.
|
|
3
|
+
|
|
4
|
+
This module provides sizers that calculate position size based on
|
|
5
|
+
a percentage of available cash.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
PercentSizer: Uses percentage of cash for sizing.
|
|
9
|
+
AllInSizer: Uses 100% of available cash.
|
|
10
|
+
PercentSizerInt: PercentSizer returning int values.
|
|
11
|
+
AllInSizerInt: AllInSizer returning int values.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
>>> cerebro.addsizer(bt.sizers.PercentSizer, percents=20)
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from ..parameters import Float, ParameterDescriptor
|
|
18
|
+
from ..sizer import Sizer
|
|
19
|
+
|
|
20
|
+
__all__ = ["PercentSizer", "AllInSizer", "PercentSizerInt", "AllInSizerInt"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class PercentSizer(Sizer):
|
|
24
|
+
"""This sizer return percentages of available cash
|
|
25
|
+
|
|
26
|
+
This class has been refactored from legacy params tuple to the new
|
|
27
|
+
ParameterDescriptor system for Day 36-38 of the metaprogramming removal project.
|
|
28
|
+
|
|
29
|
+
Params:
|
|
30
|
+
- ``percents`` (default: ``20``)
|
|
31
|
+
- ``retint`` (default: ``False``) return an int size or rather the float value
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
# Use new parameter descriptor system to define parameters
|
|
35
|
+
percents = ParameterDescriptor(
|
|
36
|
+
default=20,
|
|
37
|
+
type_=float,
|
|
38
|
+
validator=Float(min_val=0.0, max_val=100.0),
|
|
39
|
+
doc="Percentage of available cash to use",
|
|
40
|
+
)
|
|
41
|
+
retint = ParameterDescriptor(
|
|
42
|
+
default=False, type_=bool, doc="Return an int size or rather the float value"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def __init__(self, **kwargs):
|
|
46
|
+
"""Initialize the PercentSizer sizer.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
**kwargs: Keyword arguments for sizer configuration.
|
|
50
|
+
"""
|
|
51
|
+
super().__init__(**kwargs)
|
|
52
|
+
|
|
53
|
+
# If no current position, calculate orderable quantity based on cash percentage
|
|
54
|
+
# If current position exists, directly use position size as order stake
|
|
55
|
+
# If need to convert to int, then convert to int
|
|
56
|
+
def _getsizing(self, comminfo, cash, data, isbuy):
|
|
57
|
+
position = self.broker.getposition(data)
|
|
58
|
+
if not position:
|
|
59
|
+
close_price = data.close[0]
|
|
60
|
+
if not close_price or close_price != close_price:
|
|
61
|
+
return 0
|
|
62
|
+
size = cash / close_price * (self.get_param("percents") / 100)
|
|
63
|
+
else:
|
|
64
|
+
size = position.size
|
|
65
|
+
|
|
66
|
+
if self.get_param("retint"):
|
|
67
|
+
size = int(size)
|
|
68
|
+
|
|
69
|
+
return size
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# Use all available cash to place order
|
|
73
|
+
class AllInSizer(PercentSizer):
|
|
74
|
+
"""This sizer return all available cash of broker
|
|
75
|
+
|
|
76
|
+
Params:
|
|
77
|
+
- ``percents`` (default: ``100``)
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
# Redefine default value of percents parameter
|
|
81
|
+
percents = ParameterDescriptor(
|
|
82
|
+
default=100,
|
|
83
|
+
type_=float,
|
|
84
|
+
validator=Float(min_val=0.0, max_val=100.0),
|
|
85
|
+
doc="Percentage of available cash to use (100% for all-in)",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Calculate order stake by percentage, then round to integer
|
|
90
|
+
class PercentSizerInt(PercentSizer):
|
|
91
|
+
"""This sizer return percentages of available cash in the form of size truncated
|
|
92
|
+
to an int
|
|
93
|
+
|
|
94
|
+
Params:
|
|
95
|
+
- ``percents`` (default: ``20``)
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
# Redefine default value of retint parameter
|
|
99
|
+
retint = ParameterDescriptor(
|
|
100
|
+
default=True, type_=bool, doc="Return an int size or rather the float value (True for int)"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# Place order based on all available cash, stake must be rounded
|
|
105
|
+
class AllInSizerInt(PercentSizerInt):
|
|
106
|
+
"""This sizer returns all available cash of broker with the
|
|
107
|
+
size truncated to an int
|
|
108
|
+
|
|
109
|
+
Params:
|
|
110
|
+
- ``percents`` (default: ``100``)
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
# Redefine default value of percents parameter
|
|
114
|
+
percents = ParameterDescriptor(
|
|
115
|
+
default=100,
|
|
116
|
+
type_=float,
|
|
117
|
+
validator=Float(min_val=0.0, max_val=100.0),
|
|
118
|
+
doc="Percentage of available cash to use (100% for all-in)",
|
|
119
|
+
)
|