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.
Files changed (465) hide show
  1. back_trader_python-1.4.0.dist-info/METADATA +1491 -0
  2. back_trader_python-1.4.0.dist-info/RECORD +465 -0
  3. back_trader_python-1.4.0.dist-info/WHEEL +5 -0
  4. back_trader_python-1.4.0.dist-info/licenses/LICENSE +674 -0
  5. back_trader_python-1.4.0.dist-info/top_level.txt +1 -0
  6. backtrader/__init__.py +148 -0
  7. backtrader/_cerebro/__init__.py +5 -0
  8. backtrader/_cerebro/channel.py +382 -0
  9. backtrader/_cerebro/execution.py +377 -0
  10. backtrader/_cerebro/lifecycle.py +143 -0
  11. backtrader/_cerebro/notifications.py +150 -0
  12. backtrader/_cerebro/presentation.py +230 -0
  13. backtrader/_cerebro/registry.py +593 -0
  14. backtrader/_cerebro/runnext.py +551 -0
  15. backtrader/_cerebro/runonce.py +142 -0
  16. backtrader/analyzer.py +594 -0
  17. backtrader/analyzers/__init__.py +50 -0
  18. backtrader/analyzers/annualreturn.py +226 -0
  19. backtrader/analyzers/calmar.py +165 -0
  20. backtrader/analyzers/drawdown.py +287 -0
  21. backtrader/analyzers/leverage.py +112 -0
  22. backtrader/analyzers/logreturnsrolling.py +190 -0
  23. backtrader/analyzers/periodstats.py +153 -0
  24. backtrader/analyzers/positions.py +119 -0
  25. backtrader/analyzers/pyfolio.py +470 -0
  26. backtrader/analyzers/returns.py +192 -0
  27. backtrader/analyzers/sharpe.py +307 -0
  28. backtrader/analyzers/sharpe_ratio_stats.py +534 -0
  29. backtrader/analyzers/sqn.py +112 -0
  30. backtrader/analyzers/timereturn.py +192 -0
  31. backtrader/analyzers/total_value.py +75 -0
  32. backtrader/analyzers/tradeanalyzer.py +278 -0
  33. backtrader/analyzers/transactions.py +141 -0
  34. backtrader/analyzers/vwr.py +245 -0
  35. backtrader/bokeh/__init__.py +155 -0
  36. backtrader/bokeh/analyzers/__init__.py +13 -0
  37. backtrader/bokeh/analyzers/plot.py +192 -0
  38. backtrader/bokeh/analyzers/recorder.py +181 -0
  39. backtrader/bokeh/app.py +1094 -0
  40. backtrader/bokeh/live/__init__.py +11 -0
  41. backtrader/bokeh/live/client.py +352 -0
  42. backtrader/bokeh/live/datahandler.py +346 -0
  43. backtrader/bokeh/plot_adapter.py +200 -0
  44. backtrader/bokeh/schemes/__init__.py +14 -0
  45. backtrader/bokeh/schemes/blackly.py +76 -0
  46. backtrader/bokeh/schemes/scheme.py +150 -0
  47. backtrader/bokeh/schemes/tradimo.py +82 -0
  48. backtrader/bokeh/tab.py +125 -0
  49. backtrader/bokeh/tabs/__init__.py +30 -0
  50. backtrader/bokeh/tabs/analyzer.py +120 -0
  51. backtrader/bokeh/tabs/config.py +154 -0
  52. backtrader/bokeh/tabs/live.py +109 -0
  53. backtrader/bokeh/tabs/log.py +185 -0
  54. backtrader/bokeh/tabs/metadata.py +182 -0
  55. backtrader/bokeh/tabs/performance.py +359 -0
  56. backtrader/bokeh/tabs/source.py +70 -0
  57. backtrader/bokeh/utils/__init__.py +8 -0
  58. backtrader/bokeh/utils/helpers.py +167 -0
  59. backtrader/bokeh/webapp.py +164 -0
  60. backtrader/broker.py +478 -0
  61. backtrader/brokers/__init__.py +36 -0
  62. backtrader/brokers/bbroker.py +2576 -0
  63. backtrader/brokers/btapibroker.py +8227 -0
  64. backtrader/brokers/hft/__init__.py +89 -0
  65. backtrader/brokers/hft/binance_bbo.py +625 -0
  66. backtrader/brokers/hft/binance_bbo_compare.py +1398 -0
  67. backtrader/brokers/hft/examples.py +1228 -0
  68. backtrader/brokers/hft/exchange.py +380 -0
  69. backtrader/brokers/hft/latency.py +309 -0
  70. backtrader/brokers/hft/matching_core.py +572 -0
  71. backtrader/brokers/hft/queue.py +238 -0
  72. backtrader/brokers/hft/recorder.py +88 -0
  73. backtrader/brokers/hft/state.py +138 -0
  74. backtrader/brokers/impact_models.py +118 -0
  75. backtrader/brokers/mixbroker.py +895 -0
  76. backtrader/brokers/tickbroker.py +1991 -0
  77. backtrader/btrun/__init__.py +12 -0
  78. backtrader/btrun/btrun.py +1218 -0
  79. backtrader/cerebro.py +828 -0
  80. backtrader/channel.py +682 -0
  81. backtrader/channels/__init__.py +23 -0
  82. backtrader/channels/bridge.py +186 -0
  83. backtrader/channels/funding.py +248 -0
  84. backtrader/channels/live_queue.py +216 -0
  85. backtrader/channels/live_validator.py +294 -0
  86. backtrader/channels/orderbook.py +257 -0
  87. backtrader/channels/tick.py +202 -0
  88. backtrader/comminfo.py +665 -0
  89. backtrader/commissions/__init__.py +106 -0
  90. backtrader/commissions/ctpoption.py +993 -0
  91. backtrader/configs/account_config_example.yaml +8 -0
  92. backtrader/dataseries.py +379 -0
  93. backtrader/errors.py +106 -0
  94. backtrader/events.py +980 -0
  95. backtrader/feed.py +1523 -0
  96. backtrader/feeds/__init__.py +75 -0
  97. backtrader/feeds/barrier.py +2006 -0
  98. backtrader/feeds/blaze.py +118 -0
  99. backtrader/feeds/btapifeed.py +1538 -0
  100. backtrader/feeds/btcsv.py +203 -0
  101. backtrader/feeds/chainer.py +114 -0
  102. backtrader/feeds/cryptohftdata.py +164 -0
  103. backtrader/feeds/csvgeneric.py +1205 -0
  104. backtrader/feeds/ctpcohort.py +1051 -0
  105. backtrader/feeds/influxfeed.py +158 -0
  106. backtrader/feeds/livefeed.py +71 -0
  107. backtrader/feeds/mixed_channel.py +108 -0
  108. backtrader/feeds/mt4csv.py +42 -0
  109. backtrader/feeds/pandafeed.py +381 -0
  110. backtrader/feeds/quandl.py +256 -0
  111. backtrader/feeds/rollover.py +229 -0
  112. backtrader/feeds/sierrachart.py +30 -0
  113. backtrader/feeds/vchart.py +162 -0
  114. backtrader/feeds/vchartcsv.py +84 -0
  115. backtrader/feeds/vchartfile.py +153 -0
  116. backtrader/feeds/yahoo.py +399 -0
  117. backtrader/fillers.py +148 -0
  118. backtrader/filters/__init__.py +34 -0
  119. backtrader/filters/bsplitter.py +127 -0
  120. backtrader/filters/calendardays.py +121 -0
  121. backtrader/filters/datafiller.py +192 -0
  122. backtrader/filters/datafilter.py +74 -0
  123. backtrader/filters/daysteps.py +96 -0
  124. backtrader/filters/heikinashi.py +63 -0
  125. backtrader/filters/renko.py +164 -0
  126. backtrader/filters/session.py +289 -0
  127. backtrader/flt.py +80 -0
  128. backtrader/functions.py +960 -0
  129. backtrader/indicator.py +449 -0
  130. backtrader/indicators/__init__.py +148 -0
  131. backtrader/indicators/accdecoscillator.py +110 -0
  132. backtrader/indicators/aroon.py +300 -0
  133. backtrader/indicators/atr.py +315 -0
  134. backtrader/indicators/awesomeoscillator.py +122 -0
  135. backtrader/indicators/basicops.py +834 -0
  136. backtrader/indicators/bollinger.py +223 -0
  137. backtrader/indicators/cci.py +89 -0
  138. backtrader/indicators/channels_ext.py +83 -0
  139. backtrader/indicators/contrib/__init__.py +228 -0
  140. backtrader/indicators/contrib/absolutely_no_lag_lwma.py +28 -0
  141. backtrader/indicators/contrib/absolutely_no_lag_lwma_color.py +44 -0
  142. backtrader/indicators/contrib/accumulation_distribution_line.py +92 -0
  143. backtrader/indicators/contrib/adx_cross_hull_style_indicator.py +249 -0
  144. backtrader/indicators/contrib/adxdmi.py +34 -0
  145. backtrader/indicators/contrib/ai_acceleration_deceleration_oscillator.py +34 -0
  146. backtrader/indicators/contrib/altr_trend_signal_v22.py +85 -0
  147. backtrader/indicators/contrib/anchored_momentum_line.py +115 -0
  148. backtrader/indicators/contrib/any_range_cld_tail_indicator.py +82 -0
  149. backtrader/indicators/contrib/aroon_horn_sign_indicator.py +96 -0
  150. backtrader/indicators/contrib/aroon_oscillator_sign_alert.py +50 -0
  151. backtrader/indicators/contrib/arrows_curves_indicator.py +112 -0
  152. backtrader/indicators/contrib/as_ctrend_indicator.py +143 -0
  153. backtrader/indicators/contrib/asimmetric_stoch_nr_indicator.py +187 -0
  154. backtrader/indicators/contrib/atr_normalize_histogram.py +118 -0
  155. backtrader/indicators/contrib/average_change_candle.py +165 -0
  156. backtrader/indicators/contrib/bb_squeeze_indicator.py +60 -0
  157. backtrader/indicators/contrib/bezier_st_dev_indicator.py +135 -0
  158. backtrader/indicators/contrib/binary_wave_indicator.py +233 -0
  159. backtrader/indicators/contrib/blau_c_momentum_indicator.py +123 -0
  160. backtrader/indicators/contrib/blau_cmi_indicator.py +141 -0
  161. backtrader/indicators/contrib/blau_csi.py +76 -0
  162. backtrader/indicators/contrib/blau_ergodic.py +53 -0
  163. backtrader/indicators/contrib/blau_t_stoch_i.py +72 -0
  164. backtrader/indicators/contrib/blau_ts_stochastic.py +85 -0
  165. backtrader/indicators/contrib/blau_tvi.py +55 -0
  166. backtrader/indicators/contrib/brain_trend2_indicator.py +128 -0
  167. backtrader/indicators/contrib/brain_trend_signal_proxy.py +47 -0
  168. backtrader/indicators/contrib/brake_parb_indicator.py +85 -0
  169. backtrader/indicators/contrib/breakout_bars_trend_v2.py +121 -0
  170. backtrader/indicators/contrib/bsi_indicator.py +87 -0
  171. backtrader/indicators/contrib/bulls_bears_eyes.py +67 -0
  172. backtrader/indicators/contrib/bulls_power.py +56 -0
  173. backtrader/indicators/contrib/bw_wise_man1_signal.py +102 -0
  174. backtrader/indicators/contrib/bykov_trend_indicator.py +85 -0
  175. backtrader/indicators/contrib/candle_stop_color.py +46 -0
  176. backtrader/indicators/contrib/candles_x_smoothed_indicator.py +69 -0
  177. backtrader/indicators/contrib/candlesticks_bw.py +45 -0
  178. backtrader/indicators/contrib/caudate_x_period_candle_color.py +56 -0
  179. backtrader/indicators/contrib/cci_histogram_indicator.py +53 -0
  180. backtrader/indicators/contrib/cci_woodies_indicator.py +80 -0
  181. backtrader/indicators/contrib/center_of_gravity_candle_indicator.py +83 -0
  182. backtrader/indicators/contrib/center_of_gravity_indicator.py +70 -0
  183. backtrader/indicators/contrib/cg_oscillator.py +40 -0
  184. backtrader/indicators/contrib/close_line_cci.py +38 -0
  185. backtrader/indicators/contrib/close_price_fractals.py +47 -0
  186. backtrader/indicators/contrib/color3rd_gen_xma_indicator.py +122 -0
  187. backtrader/indicators/contrib/color_bb_candles_indicator.py +108 -0
  188. backtrader/indicators/contrib/color_coppock_indicator.py +157 -0
  189. backtrader/indicators/contrib/color_hma.py +71 -0
  190. backtrader/indicators/contrib/color_j_variation_indicator.py +53 -0
  191. backtrader/indicators/contrib/color_metro_de_marker_indicator.py +78 -0
  192. backtrader/indicators/contrib/color_metro_stochastic_indicator.py +93 -0
  193. backtrader/indicators/contrib/color_metro_wpr_indicator.py +85 -0
  194. backtrader/indicators/contrib/color_schaff_de_marker_trend_cycle.py +92 -0
  195. backtrader/indicators/contrib/color_schaff_trend_cycle_indicator.py +203 -0
  196. backtrader/indicators/contrib/color_step_xccx_indicator.py +193 -0
  197. backtrader/indicators/contrib/color_x2_ma.py +49 -0
  198. backtrader/indicators/contrib/color_x_derivative.py +63 -0
  199. backtrader/indicators/contrib/color_zerolag_de_marker.py +84 -0
  200. backtrader/indicators/contrib/corrected_average_indicator.py +127 -0
  201. backtrader/indicators/contrib/darvas_boxes_system.py +73 -0
  202. backtrader/indicators/contrib/dema_range_channel_color.py +42 -0
  203. backtrader/indicators/contrib/derivative_indicator.py +95 -0
  204. backtrader/indicators/contrib/digital_ft01_indicator.py +112 -0
  205. backtrader/indicators/contrib/digital_macd.py +200 -0
  206. backtrader/indicators/contrib/donchian_channels_system.py +45 -0
  207. backtrader/indicators/contrib/dots_indicator.py +93 -0
  208. backtrader/indicators/contrib/ef_distance_indicator.py +82 -0
  209. backtrader/indicators/contrib/ema_rsi_va.py +80 -0
  210. backtrader/indicators/contrib/envelopes_jp_alonso.py +32 -0
  211. backtrader/indicators/contrib/f2a_ao_indicator.py +120 -0
  212. backtrader/indicators/contrib/fatl_filter.py +179 -0
  213. backtrader/indicators/contrib/fibo_candles_indicator.py +78 -0
  214. backtrader/indicators/contrib/fine_tuning_ma.py +100 -0
  215. backtrader/indicators/contrib/fisher_org_v1.py +102 -0
  216. backtrader/indicators/contrib/fisher_org_v1_sign.py +118 -0
  217. backtrader/indicators/contrib/force_index_ema.py +96 -0
  218. backtrader/indicators/contrib/force_index_ema_2.py +27 -0
  219. backtrader/indicators/contrib/forecast_oscilator.py +145 -0
  220. backtrader/indicators/contrib/fractal_amambk.py +81 -0
  221. backtrader/indicators/contrib/frama_series.py +84 -0
  222. backtrader/indicators/contrib/frasm_av2_indicator.py +104 -0
  223. backtrader/indicators/contrib/go_indicator.py +93 -0
  224. backtrader/indicators/contrib/hlr_indicator.py +95 -0
  225. backtrader/indicators/contrib/hma.py +50 -0
  226. backtrader/indicators/contrib/i4_drfv2.py +34 -0
  227. backtrader/indicators/contrib/i4_drfv3.py +38 -0
  228. backtrader/indicators/contrib/i_anch_mom_indicator.py +72 -0
  229. backtrader/indicators/contrib/i_de_marker_sign_indicator.py +64 -0
  230. backtrader/indicators/contrib/i_gap_indicator.py +45 -0
  231. backtrader/indicators/contrib/i_stoch_komposter_indicator.py +77 -0
  232. backtrader/indicators/contrib/i_trend_indicator.py +125 -0
  233. backtrader/indicators/contrib/iamma_indicator.py +39 -0
  234. backtrader/indicators/contrib/indexed_moving_average.py +33 -0
  235. backtrader/indicators/contrib/instantaneous_trend_filter_indicator.py +51 -0
  236. backtrader/indicators/contrib/inverse_reaction_indicator.py +41 -0
  237. backtrader/indicators/contrib/irsi_sign_indicator.py +95 -0
  238. backtrader/indicators/contrib/iwpr_sign_indicator.py +59 -0
  239. backtrader/indicators/contrib/j_brain_trend1_sig_indicator.py +233 -0
  240. backtrader/indicators/contrib/j_tpo_proxy.py +32 -0
  241. backtrader/indicators/contrib/jma_slope_indicator.py +73 -0
  242. backtrader/indicators/contrib/kalman_filter_indicator.py +119 -0
  243. backtrader/indicators/contrib/kalman_filter_line.py +127 -0
  244. backtrader/indicators/contrib/kama_indicator.py +150 -0
  245. backtrader/indicators/contrib/karacatica_indicator.py +99 -0
  246. backtrader/indicators/contrib/kdj_indicator.py +59 -0
  247. backtrader/indicators/contrib/kwan_ccc_indicator.py +195 -0
  248. backtrader/indicators/contrib/kwan_nrp_indicator.py +113 -0
  249. backtrader/indicators/contrib/kwan_rdp_indicator.py +192 -0
  250. backtrader/indicators/contrib/laguerre_adx_indicator.py +85 -0
  251. backtrader/indicators/contrib/laguerre_filter_indicator.py +66 -0
  252. backtrader/indicators/contrib/laguerre_plus_di_proxy.py +57 -0
  253. backtrader/indicators/contrib/laguerre_roc_indicator.py +81 -0
  254. backtrader/indicators/contrib/le_man_signal_indicator.py +63 -0
  255. backtrader/indicators/contrib/linear_reg_slope_v2_indicator.py +136 -0
  256. backtrader/indicators/contrib/loco_indicator.py +88 -0
  257. backtrader/indicators/contrib/lrma_indicator.py +185 -0
  258. backtrader/indicators/contrib/lsma_angle_indicator.py +106 -0
  259. backtrader/indicators/contrib/ma_rounding_channel_indicator.py +149 -0
  260. backtrader/indicators/contrib/macd2_indicator.py +61 -0
  261. backtrader/indicators/contrib/macd_candle_indicator.py +80 -0
  262. backtrader/indicators/contrib/malr_indicator.py +77 -0
  263. backtrader/indicators/contrib/momentum_candle_sign_indicator.py +51 -0
  264. backtrader/indicators/contrib/moving_average_fn_indicator.py +139 -0
  265. backtrader/indicators/contrib/mt5_stochastic_close_close.py +57 -0
  266. backtrader/indicators/contrib/muv_nor_diff_cloud_indicator.py +107 -0
  267. backtrader/indicators/contrib/non_lag_dot_indicator.py +124 -0
  268. backtrader/indicators/contrib/nrtr_extr_indicator.py +95 -0
  269. backtrader/indicators/contrib/nrtr_indicator.py +95 -0
  270. backtrader/indicators/contrib/p_channel_system.py +40 -0
  271. backtrader/indicators/contrib/percent_envelope.py +37 -0
  272. backtrader/indicators/contrib/percentage_crossover_channel.py +47 -0
  273. backtrader/indicators/contrib/pivot_zig_zag_proxy.py +47 -0
  274. backtrader/indicators/contrib/price_channel_stop_indicator.py +104 -0
  275. backtrader/indicators/contrib/price_extreme_channel.py +35 -0
  276. backtrader/indicators/contrib/qqe_cloud_indicator.py +129 -0
  277. backtrader/indicators/contrib/ravi_indicator.py +40 -0
  278. backtrader/indicators/contrib/raw_close_close_stochastic.py +74 -0
  279. backtrader/indicators/contrib/rd_trend_trigger_indicator.py +51 -0
  280. backtrader/indicators/contrib/renko_level.py +85 -0
  281. backtrader/indicators/contrib/renko_line_break.py +91 -0
  282. backtrader/indicators/contrib/rftl_indicator.py +41 -0
  283. backtrader/indicators/contrib/rkd_indicator.py +53 -0
  284. backtrader/indicators/contrib/roc2_vg_indicator.py +68 -0
  285. backtrader/indicators/contrib/rsi_histogram_indicator.py +43 -0
  286. backtrader/indicators/contrib/rsi_slowdown.py +57 -0
  287. backtrader/indicators/contrib/rsioma_v2.py +41 -0
  288. backtrader/indicators/contrib/rvi_histogram_indicator.py +107 -0
  289. backtrader/indicators/contrib/safe_adx.py +89 -0
  290. backtrader/indicators/contrib/shared_strategy_indicators.py +1651 -0
  291. backtrader/indicators/contrib/sidus_indicator.py +105 -0
  292. backtrader/indicators/contrib/silver_trend_indicator.py +79 -0
  293. backtrader/indicators/contrib/sliding_range_color.py +56 -0
  294. backtrader/indicators/contrib/slow_stoch.py +42 -0
  295. backtrader/indicators/contrib/smoothed_adx_indicator.py +86 -0
  296. backtrader/indicators/contrib/smoothed_rsi.py +31 -0
  297. backtrader/indicators/contrib/spearman_rank_correlation_histogram.py +60 -0
  298. backtrader/indicators/contrib/stalin_indicator.py +152 -0
  299. backtrader/indicators/contrib/starter_laguerre_filter.py +62 -0
  300. backtrader/indicators/contrib/step_manrtr_indicator.py +137 -0
  301. backtrader/indicators/contrib/stochastic_histogram_indicator.py +143 -0
  302. backtrader/indicators/contrib/t3_alarm_indicator.py +125 -0
  303. backtrader/indicators/contrib/t3_average.py +76 -0
  304. backtrader/indicators/contrib/t3_indicator.py +40 -0
  305. backtrader/indicators/contrib/the20s_v020_signal.py +93 -0
  306. backtrader/indicators/contrib/three_candles_indicator.py +70 -0
  307. backtrader/indicators/contrib/three_line_break_indicator.py +64 -0
  308. backtrader/indicators/contrib/time_line.py +57 -0
  309. backtrader/indicators/contrib/trading_channel_index_proxy.py +48 -0
  310. backtrader/indicators/contrib/trend_arrows_indicator.py +109 -0
  311. backtrader/indicators/contrib/trend_continuation_indicator.py +127 -0
  312. backtrader/indicators/contrib/trend_intensity_index_proxy.py +51 -0
  313. backtrader/indicators/contrib/trend_manager_indicator.py +39 -0
  314. backtrader/indicators/contrib/tri_x_candle_indicator.py +51 -0
  315. backtrader/indicators/contrib/trigger_line.py +66 -0
  316. backtrader/indicators/contrib/triple_ema_rate.py +34 -0
  317. backtrader/indicators/contrib/trvi_indicator.py +194 -0
  318. backtrader/indicators/contrib/two_pb_ideal_xosma_indicator.py +127 -0
  319. backtrader/indicators/contrib/ultra_absolutely_no_lag_lwma_color.py +92 -0
  320. backtrader/indicators/contrib/ultra_wpr_indicator.py +173 -0
  321. backtrader/indicators/contrib/up_down_candle_strength.py +68 -0
  322. backtrader/indicators/contrib/vinin_i_trend_indicator.py +139 -0
  323. backtrader/indicators/contrib/volume_weighted_ma_indicator.py +78 -0
  324. backtrader/indicators/contrib/volume_weighted_ma_st_dev_indicator.py +111 -0
  325. backtrader/indicators/contrib/vwap_close_indicator.py +65 -0
  326. backtrader/indicators/contrib/vwma_candle.py +57 -0
  327. backtrader/indicators/contrib/vwma_digit_system.py +70 -0
  328. backtrader/indicators/contrib/wami.py +43 -0
  329. backtrader/indicators/contrib/wprsi_signal_indicator.py +105 -0
  330. backtrader/indicators/contrib/x_de_marker_histogram_vol_direct_indicator.py +145 -0
  331. backtrader/indicators/contrib/x_fisher_indicator.py +64 -0
  332. backtrader/indicators/contrib/xcci_histogram_vol_direct_indicator.py +56 -0
  333. backtrader/indicators/contrib/xcci_histogram_vol_indicator.py +85 -0
  334. backtrader/indicators/contrib/xma_ichimoku.py +163 -0
  335. backtrader/indicators/contrib/xma_ishimoku_channel_indicator.py +65 -0
  336. backtrader/indicators/contrib/xma_ishimoku_line.py +68 -0
  337. backtrader/indicators/contrib/xma_range_bands_indicator.py +107 -0
  338. backtrader/indicators/contrib/xmacd_indicator.py +70 -0
  339. backtrader/indicators/contrib/xrsi_de_marker_histogram.py +67 -0
  340. backtrader/indicators/contrib/xrsi_histogram_vol_direct_indicator.py +52 -0
  341. backtrader/indicators/contrib/xrsi_histogram_vol_indicator.py +81 -0
  342. backtrader/indicators/contrib/xrvi_indicator.py +130 -0
  343. backtrader/indicators/contrib/zero_lag_macd.py +36 -0
  344. backtrader/indicators/contrib/zig_zag_recent_pivot_signal.py +90 -0
  345. backtrader/indicators/contrib/zpf_indicator.py +115 -0
  346. backtrader/indicators/crossover.py +337 -0
  347. backtrader/indicators/dema.py +175 -0
  348. backtrader/indicators/demarker.py +270 -0
  349. backtrader/indicators/deviation.py +284 -0
  350. backtrader/indicators/directionalmove.py +1071 -0
  351. backtrader/indicators/dma.py +112 -0
  352. backtrader/indicators/dpo.py +96 -0
  353. backtrader/indicators/dv2.py +56 -0
  354. backtrader/indicators/ema.py +145 -0
  355. backtrader/indicators/envelope.py +475 -0
  356. backtrader/indicators/hadelta.py +198 -0
  357. backtrader/indicators/heikinashi.py +153 -0
  358. backtrader/indicators/hma.py +153 -0
  359. backtrader/indicators/hurst.py +151 -0
  360. backtrader/indicators/ichimoku.py +267 -0
  361. backtrader/indicators/kama.py +181 -0
  362. backtrader/indicators/kst.py +159 -0
  363. backtrader/indicators/lrsi.py +125 -0
  364. backtrader/indicators/mabase.py +147 -0
  365. backtrader/indicators/macd.py +322 -0
  366. backtrader/indicators/momentum.py +267 -0
  367. backtrader/indicators/moneyflow.py +237 -0
  368. backtrader/indicators/mt5atr.py +124 -0
  369. backtrader/indicators/myind.py +179 -0
  370. backtrader/indicators/obv.py +94 -0
  371. backtrader/indicators/ols.py +265 -0
  372. backtrader/indicators/oscillator.py +161 -0
  373. backtrader/indicators/percentchange.py +83 -0
  374. backtrader/indicators/percentrank.py +46 -0
  375. backtrader/indicators/pivotpoint.py +469 -0
  376. backtrader/indicators/prettygoodoscillator.py +113 -0
  377. backtrader/indicators/priceops_ext.py +123 -0
  378. backtrader/indicators/priceoscillator.py +262 -0
  379. backtrader/indicators/psar.py +212 -0
  380. backtrader/indicators/rmi.py +69 -0
  381. backtrader/indicators/rsi.py +440 -0
  382. backtrader/indicators/sma.py +141 -0
  383. backtrader/indicators/smma.py +116 -0
  384. backtrader/indicators/spread.py +54 -0
  385. backtrader/indicators/stochastic.py +263 -0
  386. backtrader/indicators/supertrend.py +436 -0
  387. backtrader/indicators/trend_ext.py +105 -0
  388. backtrader/indicators/trix.py +202 -0
  389. backtrader/indicators/tsi.py +155 -0
  390. backtrader/indicators/ultimateoscillator.py +158 -0
  391. backtrader/indicators/vortex.py +62 -0
  392. backtrader/indicators/williams.py +194 -0
  393. backtrader/indicators/wma.py +103 -0
  394. backtrader/indicators/zlema.py +135 -0
  395. backtrader/indicators/zlind.py +104 -0
  396. backtrader/linebuffer.py +3155 -0
  397. backtrader/lineiterator.py +2911 -0
  398. backtrader/lineroot.py +1106 -0
  399. backtrader/lineseries.py +2559 -0
  400. backtrader/live_trading/__init__.py +31 -0
  401. backtrader/live_trading/interface.py +404 -0
  402. backtrader/mathsupport.py +94 -0
  403. backtrader/metabase.py +1804 -0
  404. backtrader/mixins/__init__.py +21 -0
  405. backtrader/mixins/singleton.py +118 -0
  406. backtrader/observer.py +106 -0
  407. backtrader/observers/__init__.py +45 -0
  408. backtrader/observers/benchmark.py +126 -0
  409. backtrader/observers/broker.py +184 -0
  410. backtrader/observers/buysell.py +144 -0
  411. backtrader/observers/drawdown.py +161 -0
  412. backtrader/observers/logreturns.py +113 -0
  413. backtrader/observers/timereturn.py +86 -0
  414. backtrader/observers/trade_logger.py +2972 -0
  415. backtrader/observers/tradelogger.py +6 -0
  416. backtrader/observers/trades.py +258 -0
  417. backtrader/order.py +1114 -0
  418. backtrader/parameters.py +2345 -0
  419. backtrader/plot/__init__.py +54 -0
  420. backtrader/plot/finance.py +1022 -0
  421. backtrader/plot/formatters.py +200 -0
  422. backtrader/plot/locator.py +353 -0
  423. backtrader/plot/multicursor.py +495 -0
  424. backtrader/plot/plot.py +2500 -0
  425. backtrader/plot/plot_plotly.py +1351 -0
  426. backtrader/plot/scheme.py +253 -0
  427. backtrader/plot/utils.py +104 -0
  428. backtrader/position.py +290 -0
  429. backtrader/position_modes.py +132 -0
  430. backtrader/profiles.py +254 -0
  431. backtrader/reports/__init__.py +39 -0
  432. backtrader/reports/charts.py +371 -0
  433. backtrader/reports/performance.py +620 -0
  434. backtrader/reports/reporter.py +660 -0
  435. backtrader/resamplerfilter.py +1001 -0
  436. backtrader/signal.py +118 -0
  437. backtrader/signals/__init__.py +17 -0
  438. backtrader/sizer.py +114 -0
  439. backtrader/sizers/__init__.py +26 -0
  440. backtrader/sizers/fixedsize.py +161 -0
  441. backtrader/sizers/percents_sizer.py +119 -0
  442. backtrader/store.py +221 -0
  443. backtrader/stores/__init__.py +33 -0
  444. backtrader/stores/btapistore.py +15506 -0
  445. backtrader/stores/livestore.py +137 -0
  446. backtrader/stores/vchartfile.py +96 -0
  447. backtrader/strategy.py +3655 -0
  448. backtrader/talib.py +280 -0
  449. backtrader/test_helpers.py +96 -0
  450. backtrader/timer.py +358 -0
  451. backtrader/trade.py +442 -0
  452. backtrader/tradingcal.py +361 -0
  453. backtrader/utils/__init__.py +68 -0
  454. backtrader/utils/autodict.py +251 -0
  455. backtrader/utils/date.py +71 -0
  456. backtrader/utils/dateintern.py +509 -0
  457. backtrader/utils/flushfile.py +94 -0
  458. backtrader/utils/fractal.py +101 -0
  459. backtrader/utils/get_metrics.py +101 -0
  460. backtrader/utils/load_data.py +209 -0
  461. backtrader/utils/log_message.py +998 -0
  462. backtrader/utils/ordereddefaultdict.py +75 -0
  463. backtrader/utils/py3.py +296 -0
  464. backtrader/version.py +21 -0
  465. 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)