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/trade.py
ADDED
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Trade Module - Position and trade tracking.
|
|
3
|
+
|
|
4
|
+
This module provides the Trade class for tracking the lifecycle of trades
|
|
5
|
+
including size, price, commission, and profit/loss calculations.
|
|
6
|
+
|
|
7
|
+
Key Classes:
|
|
8
|
+
Trade: Tracks the life of a trade from opening to closing.
|
|
9
|
+
TradeHistory: Records status and event updates for each trade.
|
|
10
|
+
|
|
11
|
+
A trade starts at 0, can be increased (adding to position) or reduced
|
|
12
|
+
(closing part of position), and is considered closed when size returns to 0.
|
|
13
|
+
Trades can be long (positive size) or short (negative size).
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
Accessing trade information:
|
|
17
|
+
>>> trade.status # Created, Open, or Closed
|
|
18
|
+
>>> trade.pnl # Current profit/loss
|
|
19
|
+
>>> trade.pnlcomm # PnL minus commission
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import itertools
|
|
23
|
+
|
|
24
|
+
from .utils import AutoOrderedDict
|
|
25
|
+
from .utils.date import num2date
|
|
26
|
+
from .utils.log_message import get_logger
|
|
27
|
+
from .utils.py3 import range
|
|
28
|
+
|
|
29
|
+
logger = get_logger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Trade history
|
|
33
|
+
class TradeHistory(AutoOrderedDict):
|
|
34
|
+
"""Represents the status and update event for each update a Trade has
|
|
35
|
+
|
|
36
|
+
This object is a dictionary which allows '.' notation
|
|
37
|
+
# This class saves the status and event updates for each trade
|
|
38
|
+
Attributes:
|
|
39
|
+
- ``status`` (``dict`` with '.' notation): Holds the resulting status of
|
|
40
|
+
an update event and has the following sub-attributes
|
|
41
|
+
# Status, dict format, accessible via '.', used to save the status of an update event, with the following sub-attributes
|
|
42
|
+
- ``status`` (``int``): Trade status
|
|
43
|
+
# Trade status, integer format
|
|
44
|
+
- ``dt`` (``float``): float coded datetime
|
|
45
|
+
# Time, string format
|
|
46
|
+
- ``barlen`` (``int``): number of bars the trade has been active
|
|
47
|
+
# Number of bars when trade was generated
|
|
48
|
+
- ``size`` (``int``): current size of the Trade
|
|
49
|
+
# Current size of the trade, in integer format. In actual trading, non-integer trade sizes may be used
|
|
50
|
+
- ``price`` (``float``): current price of the Trade
|
|
51
|
+
# Current price of the trade
|
|
52
|
+
- ``value`` (``float``): current monetary value of the Trade
|
|
53
|
+
# Current monetary value of the trade
|
|
54
|
+
- ``pnl`` (``float``): current profit and loss of the Trade
|
|
55
|
+
# Current profit and loss of the trade
|
|
56
|
+
- ``pnlcomm`` (``float``): current profit and loss minus commission
|
|
57
|
+
# Current net profit and loss of the trade
|
|
58
|
+
- ``event`` (``dict`` with '.' notation): Holds the event update
|
|
59
|
+
- parameters
|
|
60
|
+
# Event attributes, saves event update parameters
|
|
61
|
+
- ``order`` (``object``): the order which initiated the``update``
|
|
62
|
+
# Order that generated the trade
|
|
63
|
+
- ``size`` (``int``): size of the update
|
|
64
|
+
# Size of the update
|
|
65
|
+
- ``price`` (``float``):price of the update
|
|
66
|
+
# Price of the update
|
|
67
|
+
- ``commission`` (``float``): price of the update
|
|
68
|
+
# Commission of the update
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
# Initialize
|
|
72
|
+
def __init__(self, status, dt, barlen, size, price, value, pnl, pnlcomm, tz, event=None):
|
|
73
|
+
"""Initializes the object to the current status of the Trade"""
|
|
74
|
+
super().__init__()
|
|
75
|
+
self.status.status = status
|
|
76
|
+
self.status.dt = dt
|
|
77
|
+
self.status.barlen = barlen
|
|
78
|
+
self.status.size = size
|
|
79
|
+
self.status.price = price
|
|
80
|
+
self.status.value = value
|
|
81
|
+
self.status.pnl = pnl
|
|
82
|
+
self.status.pnlcomm = pnlcomm
|
|
83
|
+
self.status.tz = tz
|
|
84
|
+
if event is not None:
|
|
85
|
+
self.event = event
|
|
86
|
+
|
|
87
|
+
def __reduce__(self):
|
|
88
|
+
return (
|
|
89
|
+
self.__class__,
|
|
90
|
+
(
|
|
91
|
+
self.status.status,
|
|
92
|
+
self.status.dt,
|
|
93
|
+
self.status.barlen,
|
|
94
|
+
self.status.size,
|
|
95
|
+
self.status.price,
|
|
96
|
+
self.status.value,
|
|
97
|
+
self.status.pnl,
|
|
98
|
+
self.status.pnlcomm,
|
|
99
|
+
self.status.tz,
|
|
100
|
+
self.get("event", None),
|
|
101
|
+
),
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Do event update
|
|
105
|
+
def doupdate(self, order, size, price, commission):
|
|
106
|
+
"""Used to fill the ``update`` part of the history entry"""
|
|
107
|
+
self.event.order = order
|
|
108
|
+
self.event.size = size
|
|
109
|
+
self.event.price = price
|
|
110
|
+
self.event.commission = commission
|
|
111
|
+
|
|
112
|
+
# Do not allow updates (avoids typing errors)
|
|
113
|
+
self._close()
|
|
114
|
+
|
|
115
|
+
def datetime(self, tz=None, naive=True):
|
|
116
|
+
"""Returns a datetime for the time the update event happened"""
|
|
117
|
+
return num2date(self.status.dt, tz or self.status.tz, naive)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# Trade class
|
|
121
|
+
class Trade:
|
|
122
|
+
"""Keeps track the life of an trade: size, price,
|
|
123
|
+
commission (and value?)
|
|
124
|
+
|
|
125
|
+
A trade starts at 0 can be increased and reduced and can
|
|
126
|
+
be considered closed if it goes back to 0.
|
|
127
|
+
|
|
128
|
+
The trade can be long (positive size) or short (negative size)
|
|
129
|
+
|
|
130
|
+
A trade is not meant to be reversed (no support in the logic for it)
|
|
131
|
+
# Track the life of a trade: size, price, commission (and value?)
|
|
132
|
+
# A trade starts at 0, can be increased and reduced, and is considered closed when it returns to 0
|
|
133
|
+
# A trade can be long (positive size) or short (negative size)
|
|
134
|
+
# A trade cannot reverse from long to short or short to long, such logic is not supported
|
|
135
|
+
|
|
136
|
+
Member Attributes:
|
|
137
|
+
|
|
138
|
+
- ``ref``: unique trade identifier
|
|
139
|
+
# Trade identifier
|
|
140
|
+
- ``status`` (``int``): one of Created, Open, Closed
|
|
141
|
+
# Trade status
|
|
142
|
+
- ``tradeid``: grouping tradeid passed to orders during creation
|
|
143
|
+
The default in orders is 0
|
|
144
|
+
# Trade id passed to orders during creation, default value in orders is 0
|
|
145
|
+
- ``size`` (``int``): current size of the trade
|
|
146
|
+
# Current size of the trade
|
|
147
|
+
- ``price`` (``float``): current price of the trade
|
|
148
|
+
# Current price of the trade
|
|
149
|
+
- ``value`` (``float``): current value of the trade
|
|
150
|
+
# Current market value of the trade
|
|
151
|
+
- ``commission`` (``float``): current accumulated commission
|
|
152
|
+
# Current accumulated commission
|
|
153
|
+
- ``pnl`` (``float``): current profit and loss of the trade (gross pnl)
|
|
154
|
+
# Current profit and loss
|
|
155
|
+
- ``pnlcomm`` (``float``): current profit and loss of the trade minus
|
|
156
|
+
commission (net pnl)
|
|
157
|
+
# Current net profit and loss after deducting commission
|
|
158
|
+
- ``isclosed`` (``bool``): records if the last update closed (set size to
|
|
159
|
+
null the trade
|
|
160
|
+
# Whether the last update event closed this trade, if closed, set size to null
|
|
161
|
+
- ``isopen`` (``bool``): records if any update has opened the trade
|
|
162
|
+
# Whether the trade has been opened
|
|
163
|
+
- ``justopened`` (``bool``): if the trade was just opened
|
|
164
|
+
# Whether the trade was just opened
|
|
165
|
+
- ``baropen`` (``int``): bar in which this trade was opened
|
|
166
|
+
# Record which bar opened the position
|
|
167
|
+
- ``dtopen`` (``float``): float coded datetime in which the trade was
|
|
168
|
+
opened
|
|
169
|
+
# Record the time when the trade was opened, can use open_datetime or num2date to get Python format time
|
|
170
|
+
- Use method ``open_datetime`` to get a Python datetime.datetime
|
|
171
|
+
or use the platform provided ``num2date`` method
|
|
172
|
+
- ``barclose`` (``int``): bar in which this trade was closed
|
|
173
|
+
# Which bar the trade ended on
|
|
174
|
+
- ``dtclose`` (``float``): float coded datetime in which the trade was
|
|
175
|
+
closed
|
|
176
|
+
- Use method ``close_datetime`` to get a Python datetime.datetime
|
|
177
|
+
or use the platform provided ``num2date`` method
|
|
178
|
+
# Record the time when the trade was closed, can use close_datetime or num2date to get Python format time
|
|
179
|
+
- ``barlen`` (``int``): number of bars this trade was open
|
|
180
|
+
# Number of bars when trade was open
|
|
181
|
+
- ``historyon`` (``bool``): whether history has to be recorded
|
|
182
|
+
# Whether to record historical trade update events
|
|
183
|
+
- ``history`` (``list``): holds a list updated with each "update" event
|
|
184
|
+
containing the resulting status and parameters used in the update
|
|
185
|
+
The first entry in the history is the Opening Event
|
|
186
|
+
The last entry in the history is the Closing Event
|
|
187
|
+
# Use a list to save past trade events and status, first is opening event, last is closing event
|
|
188
|
+
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
# Trade counter
|
|
192
|
+
refbasis = itertools.count(1)
|
|
193
|
+
# Trade status names
|
|
194
|
+
status_names = ["Created", "Open", "Closed"]
|
|
195
|
+
Created, Open, Closed = range(3)
|
|
196
|
+
|
|
197
|
+
# Print trade related information
|
|
198
|
+
def __str__(self):
|
|
199
|
+
toprint = (
|
|
200
|
+
"ref",
|
|
201
|
+
"data",
|
|
202
|
+
"tradeid",
|
|
203
|
+
"size",
|
|
204
|
+
"price",
|
|
205
|
+
"value",
|
|
206
|
+
"commission",
|
|
207
|
+
"pnl",
|
|
208
|
+
"pnlcomm",
|
|
209
|
+
"justopened",
|
|
210
|
+
"isopen",
|
|
211
|
+
"isclosed",
|
|
212
|
+
"baropen",
|
|
213
|
+
"dtopen",
|
|
214
|
+
"barclose",
|
|
215
|
+
"dtclose",
|
|
216
|
+
"barlen",
|
|
217
|
+
"historyon",
|
|
218
|
+
"history",
|
|
219
|
+
"status",
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
return "\n".join(":".join((x, str(getattr(self, x)))) for x in toprint)
|
|
223
|
+
|
|
224
|
+
# Initialize
|
|
225
|
+
def __init__(
|
|
226
|
+
self, data=None, tradeid=0, historyon=False, size=0, price=0.0, value=0.0, commission=0.0
|
|
227
|
+
):
|
|
228
|
+
"""Initialize a Trade object.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
data: Data source associated with this trade.
|
|
232
|
+
tradeid: Unique identifier for the trade.
|
|
233
|
+
historyon: Whether to record trade history.
|
|
234
|
+
size: Initial position size.
|
|
235
|
+
price: Initial price.
|
|
236
|
+
value: Initial value.
|
|
237
|
+
commission: Initial commission.
|
|
238
|
+
"""
|
|
239
|
+
self.long = None
|
|
240
|
+
self.ref = next(self.refbasis)
|
|
241
|
+
self.data = data
|
|
242
|
+
self.tradeid = tradeid
|
|
243
|
+
self.size = size
|
|
244
|
+
self.price = price
|
|
245
|
+
self.value = value
|
|
246
|
+
self.commission = commission
|
|
247
|
+
|
|
248
|
+
self.pnl = 0.0
|
|
249
|
+
self.pnlcomm = 0.0
|
|
250
|
+
|
|
251
|
+
self.justopened = False
|
|
252
|
+
self.isopen = False
|
|
253
|
+
self.isclosed = False
|
|
254
|
+
|
|
255
|
+
self.baropen = 0
|
|
256
|
+
self.dtopen = 0.0
|
|
257
|
+
self.barclose = 0
|
|
258
|
+
self.dtclose = 0.0
|
|
259
|
+
self.barlen = 0
|
|
260
|
+
|
|
261
|
+
self.historyon = historyon
|
|
262
|
+
self.history = []
|
|
263
|
+
|
|
264
|
+
self.status = self.Created
|
|
265
|
+
|
|
266
|
+
def __repr__(self):
|
|
267
|
+
try:
|
|
268
|
+
status_name = self.status_names[self.status]
|
|
269
|
+
except (IndexError, TypeError):
|
|
270
|
+
status_name = f"Unknown({self.status})"
|
|
271
|
+
return (
|
|
272
|
+
f"Trade(ref={self.ref}, size={self.size}, price={self.price}, "
|
|
273
|
+
f"pnl={self.pnl}, status={status_name})"
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
# Return absolute size of trade, seems slightly odd
|
|
277
|
+
def __len__(self):
|
|
278
|
+
"""Absolute size of the trade"""
|
|
279
|
+
return abs(self.size)
|
|
280
|
+
|
|
281
|
+
# Check if trade is 0, when trade size is 0, trade is closed, if not 0, trade is open
|
|
282
|
+
def __bool__(self):
|
|
283
|
+
"""Trade size is not 0"""
|
|
284
|
+
return self.size != 0
|
|
285
|
+
|
|
286
|
+
__nonzero__ = __bool__
|
|
287
|
+
|
|
288
|
+
# Return data name
|
|
289
|
+
def getdataname(self):
|
|
290
|
+
"""Shortcut to retrieve the name of the data this trade references"""
|
|
291
|
+
if self.data is None:
|
|
292
|
+
return ""
|
|
293
|
+
return getattr(self.data, "_name", "")
|
|
294
|
+
|
|
295
|
+
# Return opening time
|
|
296
|
+
def open_datetime(self, tz=None, naive=True):
|
|
297
|
+
"""Returns a datetime.datetime object with the datetime in which
|
|
298
|
+
the trade was opened
|
|
299
|
+
"""
|
|
300
|
+
if self.data is None:
|
|
301
|
+
return None
|
|
302
|
+
# data contains num2date method
|
|
303
|
+
return self.data.num2date(self.dtopen, tz=tz, naive=naive)
|
|
304
|
+
|
|
305
|
+
# Return closing time
|
|
306
|
+
def close_datetime(self, tz=None, naive=True):
|
|
307
|
+
"""Returns a datetime.datetime object with the datetime in which
|
|
308
|
+
the trade was closed
|
|
309
|
+
"""
|
|
310
|
+
if self.data is None:
|
|
311
|
+
return None
|
|
312
|
+
return self.data.num2date(self.dtclose, tz=tz, naive=naive)
|
|
313
|
+
|
|
314
|
+
# Update trade event
|
|
315
|
+
def update(self, order, size, price, value, commission, pnl, comminfo):
|
|
316
|
+
"""
|
|
317
|
+
Updates the current trade. The logic does not check if the
|
|
318
|
+
trade is reversed, which is not conceptually supported by the
|
|
319
|
+
object.
|
|
320
|
+
|
|
321
|
+
If an update sets the size attribute to 0, "closed" will be
|
|
322
|
+
set to true
|
|
323
|
+
|
|
324
|
+
Updates may be received twice for each order, once for the existing
|
|
325
|
+
size which has been closed (sell undoing a buy) and a second time for
|
|
326
|
+
the the opening part (sell reversing a buy)
|
|
327
|
+
# Update current trade. Logic doesn't check if trade is reversed, not conceptually supported
|
|
328
|
+
Args:
|
|
329
|
+
order: the order object which has (completely or partially)
|
|
330
|
+
generated this updatede
|
|
331
|
+
# Order that caused trade update
|
|
332
|
+
size (int): amount to update the order
|
|
333
|
+
if size has the same sign as the current trade a
|
|
334
|
+
position increase will happen
|
|
335
|
+
if size has the opposite sign as current op size a
|
|
336
|
+
reduction/close will happen
|
|
337
|
+
# Size to update trade, if size sign matches current trade, position increases; if size sign doesn't match current trade, causes position reduction or close
|
|
338
|
+
price (float): always be positive to ensure consistency
|
|
339
|
+
# Price, always positive to ensure consistency. Unknown what happens if negative
|
|
340
|
+
value (float): (unused) cost incurred in new size/price op
|
|
341
|
+
Not used because the value is calculated for the
|
|
342
|
+
trade
|
|
343
|
+
# Market value, not used because value is calculated through trade
|
|
344
|
+
commission (float): incurred commission in the new size/price op
|
|
345
|
+
# Commission generated by new trade
|
|
346
|
+
pnl (float): (unused) generated by the executed part
|
|
347
|
+
Not used because the trade has an independent pnl
|
|
348
|
+
# Profit/loss generated by executed part, not used because trade has independent profit/loss
|
|
349
|
+
comminfo: commission information
|
|
350
|
+
"""
|
|
351
|
+
# If update size is 0, return directly
|
|
352
|
+
if not size:
|
|
353
|
+
return # empty update, skip all other calculations
|
|
354
|
+
|
|
355
|
+
try:
|
|
356
|
+
data_len = len(self.data)
|
|
357
|
+
except Exception:
|
|
358
|
+
logger.warning("trade:354 fallback on Exception")
|
|
359
|
+
data_len = 0
|
|
360
|
+
|
|
361
|
+
try:
|
|
362
|
+
data_dt = self.data.datetime[0]
|
|
363
|
+
except Exception:
|
|
364
|
+
logger.warning("trade:359 fallback on Exception")
|
|
365
|
+
data_dt = 0.0
|
|
366
|
+
|
|
367
|
+
# Commission can only increase
|
|
368
|
+
# Commission keeps increasing
|
|
369
|
+
self.commission += commission
|
|
370
|
+
|
|
371
|
+
# Update size and keep a reference for logic a calculations
|
|
372
|
+
# Update trade size
|
|
373
|
+
oldsize = self.size
|
|
374
|
+
self.size += size # size will carry the opposite sign if reducing
|
|
375
|
+
|
|
376
|
+
# Check if it has been currently opened
|
|
377
|
+
# If original position was 0 but current position is not 0, this means position just opened
|
|
378
|
+
self.justopened = bool(not oldsize and size)
|
|
379
|
+
# If position just opened, update baropen, dtopen and long
|
|
380
|
+
if self.justopened:
|
|
381
|
+
self.baropen = data_len
|
|
382
|
+
self.dtopen = 0.0 if order.p.simulated else data_dt
|
|
383
|
+
self.long = self.size > 0
|
|
384
|
+
|
|
385
|
+
# Any size means the trade was opened
|
|
386
|
+
# Check if current trade is open
|
|
387
|
+
self.isopen = bool(self.size)
|
|
388
|
+
|
|
389
|
+
# Update current trade length
|
|
390
|
+
# Update current trade's holding bar count
|
|
391
|
+
self.barlen = data_len - self.baropen
|
|
392
|
+
|
|
393
|
+
# record if the position was closed (set to null)
|
|
394
|
+
# If original position was not 0 but current position is 0, trade has been closed
|
|
395
|
+
self.isclosed = bool(oldsize and not self.size)
|
|
396
|
+
|
|
397
|
+
# record last bar for the trade
|
|
398
|
+
# If already closed, update isopen, barclose, dtclose, status attributes
|
|
399
|
+
if self.isclosed:
|
|
400
|
+
self.isopen = False
|
|
401
|
+
self.barclose = data_len
|
|
402
|
+
self.dtclose = data_dt
|
|
403
|
+
|
|
404
|
+
self.status = self.Closed
|
|
405
|
+
# If currently open, update status
|
|
406
|
+
elif self.isopen:
|
|
407
|
+
self.status = self.Open
|
|
408
|
+
# If adding to position
|
|
409
|
+
if abs(self.size) > abs(oldsize):
|
|
410
|
+
# position increased (be it positive or negative)
|
|
411
|
+
# update the average price
|
|
412
|
+
self.price = (oldsize * self.price + size * price) / self.size
|
|
413
|
+
pnl = 0.0
|
|
414
|
+
# If closing part of position
|
|
415
|
+
else: # abs(self.size) < abs(oldsize)
|
|
416
|
+
# position reduced/closed
|
|
417
|
+
# Calculate profit/loss
|
|
418
|
+
pnl = comminfo.profitandloss(-size, self.price, price)
|
|
419
|
+
# Trade profit/loss
|
|
420
|
+
self.pnl += pnl
|
|
421
|
+
# Trade net profit/loss
|
|
422
|
+
self.pnlcomm = self.pnl - self.commission
|
|
423
|
+
# Update trade value
|
|
424
|
+
self.value = comminfo.getvaluesize(self.size, self.price)
|
|
425
|
+
|
|
426
|
+
# Update the history if needed
|
|
427
|
+
# If needed, add trade's history status, save to self.history
|
|
428
|
+
if self.historyon:
|
|
429
|
+
dt0 = data_dt if not order.p.simulated else 0.0
|
|
430
|
+
histentry = TradeHistory(
|
|
431
|
+
self.status,
|
|
432
|
+
dt0,
|
|
433
|
+
self.barlen,
|
|
434
|
+
self.size,
|
|
435
|
+
self.price,
|
|
436
|
+
self.value,
|
|
437
|
+
self.pnl,
|
|
438
|
+
self.pnlcomm,
|
|
439
|
+
getattr(self.data, "_tz", None),
|
|
440
|
+
)
|
|
441
|
+
histentry.doupdate(order, size, price, commission)
|
|
442
|
+
self.history.append(histentry)
|