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
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env python
2
+ """Bokeh plotter adapter for Cerebro plotter contract."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import bisect
7
+ import datetime
8
+ import sys
9
+
10
+ from .. import date2num
11
+ from ..utils.log_message import get_logger
12
+ from .app import BOKEH_AVAILABLE, PANDAS_AVAILABLE, BacktraderBokeh
13
+
14
+ try:
15
+ from bokeh.io import output_file, output_notebook, save
16
+ from bokeh.io import show as bokeh_show
17
+ except ImportError: # pragma: no cover - covered by feature flag above
18
+ output_notebook = None
19
+ output_file = None
20
+ save = None
21
+ bokeh_show = None
22
+
23
+ logger = get_logger(__name__)
24
+
25
+ _KNOWN_PLOTTER_KWARGS = {"style", "scheme", "use_default_tabs", "filter", "filename"}
26
+
27
+
28
+ class BokehPlot:
29
+ """Adapter class exposing cerebro-compatible plotter contract.
30
+
31
+ It keeps `BacktraderBokeh` API unchanged and maps the existing `cerebro.plot()`
32
+ contract to a Plot/Plotly-compatible adapter interface:
33
+ ``plot -> show -> savefig``.
34
+ """
35
+
36
+ def __init__(self, **kwargs):
37
+ if not BOKEH_AVAILABLE:
38
+ raise ImportError("bokeh is required for backend='bokeh'; pip install bokeh")
39
+ if not PANDAS_AVAILABLE:
40
+ raise ImportError("pandas is required for backend='bokeh'; pip install pandas")
41
+
42
+ self._notebook_notified = False
43
+ self._iplot = True
44
+ self._filename = None
45
+ self._models = []
46
+ self._app_kwargs = {}
47
+
48
+ unknown_kwargs = [k for k in kwargs if k not in _KNOWN_PLOTTER_KWARGS]
49
+ if unknown_kwargs:
50
+ logger.warning(
51
+ "Ignoring unsupported BacktraderBokeh kwargs for adapter: %s",
52
+ ", ".join(sorted(unknown_kwargs)),
53
+ )
54
+
55
+ for key, value in kwargs.items():
56
+ if key == "filename":
57
+ self._filename = value
58
+ elif key in _KNOWN_PLOTTER_KWARGS:
59
+ self._app_kwargs[key] = value
60
+
61
+ self._app = BacktraderBokeh(**self._app_kwargs)
62
+
63
+ def plot(
64
+ self,
65
+ strategy,
66
+ figid=0,
67
+ numfigs=1,
68
+ iplot=True,
69
+ start=None,
70
+ end=None,
71
+ use=None,
72
+ **kwargs,
73
+ ):
74
+ """Collect a strategy figure for deferred rendering.
75
+
76
+ Args:
77
+ strategy: Strategy instance
78
+ figid: Unused in adapter, kept for compatibility.
79
+ numfigs: Reserved for compatibility.
80
+ iplot: Notebook display preference.
81
+ start: Start index or datetime for slicing.
82
+ end: End index or datetime for slicing.
83
+ use: Unused, matplotlib-only option kept for compatibility.
84
+
85
+ Returns:
86
+ Empty list, reserved for plotter contract consistency.
87
+ """
88
+ self._iplot = iplot
89
+
90
+ if use is not None:
91
+ logger.warning("bokeh backend ignores use parameter from cerebro.plot()")
92
+ if numfigs is not None and numfigs != 1:
93
+ logger.warning(
94
+ "bokeh backend uses one tab chart stack; numfigs=%s will be ignored",
95
+ numfigs,
96
+ )
97
+
98
+ if kwargs:
99
+ logger.warning("Unsupported plot() kwargs ignored: %s", ", ".join(sorted(kwargs)))
100
+
101
+ _ = iplot # keep signature compatibility; actual display is deferred to show()
102
+
103
+ if strategy is None:
104
+ return []
105
+
106
+ start_i, end_i = self._resolve_range(strategy, start, end)
107
+ self._app.create_figurepage(strategy, filldata=True, start=start_i, end=end_i)
108
+ return []
109
+
110
+ def show(self):
111
+ """Build deferred models and render them.
112
+
113
+ Returns:
114
+ List of bokeh models.
115
+ """
116
+ # build_full_model (not build_model) so the extra tabs
117
+ # (Performance/Analyzer/Metadata/Config/Log/Source) are included,
118
+ # matching BacktraderBokeh.plot() - this is bokeh's value-add over a
119
+ # bare charts panel.
120
+ model = self._app.build_full_model()
121
+ if model is None:
122
+ return []
123
+
124
+ if self._iplot and self._should_use_notebook_output():
125
+ output_notebook()
126
+
127
+ if bokeh_show is not None and self._iplot:
128
+ bokeh_show(model)
129
+
130
+ if self._filename is not None:
131
+ self.savefig(model, self._filename)
132
+
133
+ self._models.append(model)
134
+ return [model]
135
+
136
+ def savefig(self, fig, filename, **kwargs):
137
+ """Save a bokeh model to disk.
138
+
139
+ Args:
140
+ fig: Bokeh model
141
+ filename: HTML file path
142
+ **kwargs: Unused compatibility args
143
+ """
144
+ if output_file is None or save is None:
145
+ raise ImportError("bokeh is required for backend='bokeh'; pip install bokeh")
146
+
147
+ output_file(filename)
148
+ save(fig)
149
+
150
+ def _should_use_notebook_output(self):
151
+ if self._notebook_notified:
152
+ return False
153
+
154
+ if "ipykernel" not in sys.modules:
155
+ return False
156
+
157
+ self._notebook_notified = True
158
+ return output_notebook is not None
159
+
160
+ def _resolve_range(self, strategy, start, end):
161
+ if strategy is None:
162
+ return 0, None
163
+
164
+ dtime = strategy.lines.datetime.plot()
165
+ total = len(dtime)
166
+ if total == 0:
167
+ return 0, 0
168
+
169
+ start_i = self._resolve_index(dtime, start, 0)
170
+ end_i = self._resolve_index(dtime, end, total, is_end=True)
171
+ return start_i, end_i
172
+
173
+ def _resolve_index(self, dtline, value, default, is_end=False):
174
+ if value is None:
175
+ return default
176
+
177
+ if isinstance(value, (datetime.date, datetime.datetime)):
178
+ return (
179
+ bisect.bisect_right(dtline, date2num(value))
180
+ if is_end
181
+ else bisect.bisect_left(dtline, date2num(value))
182
+ )
183
+
184
+ if isinstance(value, (int, float)):
185
+ value = int(value)
186
+ if value < 0:
187
+ value = len(dtline) + value
188
+ if is_end and value < 0:
189
+ value = len(dtline) + 1 + value
190
+ return max(0, value)
191
+
192
+ try:
193
+ return bisect.bisect_left(dtline, value)
194
+ except TypeError:
195
+ if is_end:
196
+ try:
197
+ return bisect.bisect_right(dtline, value)
198
+ except TypeError:
199
+ return default
200
+ return bisect.bisect_left(dtline, value)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Bokeh theme system.
4
+
5
+ Provides multiple theme configurations:
6
+ - Blackly: Dark theme
7
+ - Tradimo: Light theme
8
+ """
9
+
10
+ from .blackly import Blackly
11
+ from .scheme import Scheme
12
+ from .tradimo import Tradimo
13
+
14
+ __all__ = ["Scheme", "Blackly", "Tradimo"]
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Blackly dark theme.
4
+
5
+ Plotting theme suitable for dark backgrounds.
6
+ """
7
+
8
+ from .scheme import Scheme
9
+
10
+
11
+ class Blackly(Scheme):
12
+ """Dark theme.
13
+
14
+ Dark background with light text, suitable for night use or dark interfaces.
15
+ """
16
+
17
+ def _set_params(self):
18
+ super()._set_params()
19
+
20
+ # ========== Candlestick color configuration ==========
21
+ self.barup = "#ff9896" # Up candle color (light red)
22
+ self.bardown = "#98df8a" # Down candle color (light green)
23
+ self.barup_wick = self.barup
24
+ self.bardown_wick = self.bardown
25
+ self.barup_outline = self.barup
26
+ self.bardown_outline = self.bardown
27
+
28
+ # ========== Volume color configuration ==========
29
+ self.volup = "#ff9896"
30
+ self.voldown = "#98df8a"
31
+
32
+ # ========== Background configuration ==========
33
+ self.background_fill = "#222222" # Dark chart background
34
+ self.body_background_color = "#2B2B2B" # Dark page background
35
+ self.border_fill = "#3C3F41" # Dark border
36
+
37
+ # ========== Grid configuration ==========
38
+ self.grid_line_color = "#444444"
39
+
40
+ # ========== Axis configuration ==========
41
+ self.axis_line_color = "darkgrey"
42
+ self.tick_line_color = "darkgrey"
43
+ self.axis_text_color = "lightgrey"
44
+ self.axis_label_text_color = "darkgrey"
45
+
46
+ # ========== Title configuration ==========
47
+ self.plot_title_text_color = "darkgrey"
48
+
49
+ # ========== Legend configuration ==========
50
+ self.legend_background_color = "#3C3F41"
51
+ self.legend_text_color = "lightgrey"
52
+ self.legend_click = "hide"
53
+
54
+ # ========== Crosshair configuration ==========
55
+ self.crosshair_line_color = "#999999"
56
+
57
+ # ========== Tab configuration ==========
58
+ self.tab_active_background_color = "#666666"
59
+ self.tab_active_color = "#bbbbbb"
60
+
61
+ # ========== Table configuration ==========
62
+ self.table_color_even = "#404040"
63
+ self.table_color_odd = "#333333"
64
+ self.table_header_color = "#707070"
65
+
66
+ # ========== Tooltip configuration ==========
67
+ self.tooltip_background_color = "#4C4F51"
68
+ self.tooltip_text_label_color = "#848EFF"
69
+ self.tooltip_text_value_color = "#aaaaaa"
70
+
71
+ # ========== Code highlighting configuration ==========
72
+ self.tag_pre_background_color = "#222222"
73
+ self.tag_pre_text_color = "lightgrey"
74
+
75
+ # ========== Text configuration ==========
76
+ self.text_color = "lightgrey"
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env python
2
+ """Bokeh theme base class.
3
+
4
+ Defines all plotting-related style parameters.
5
+ """
6
+
7
+
8
+ class Scheme:
9
+ """Bokeh plotting theme base class.
10
+
11
+ Defines all plotting-related style parameters. Subclasses can customize
12
+ styles by overriding the _set_params method.
13
+
14
+ Attribute categories:
15
+ - Color configuration: barup, bardown, volup, voldown, etc.
16
+ - Background configuration: background_fill, body_background_color, etc.
17
+ - Grid configuration: grid_line_color, etc.
18
+ - Text configuration: axis_text_color, etc.
19
+ - Crosshair: crosshair_line_color, etc.
20
+ - Chart configuration: plot_sizing_mode, plot_height, etc.
21
+ """
22
+
23
+ def __init__(self):
24
+ """Initialize the scheme with default parameters."""
25
+ self._set_params()
26
+
27
+ def _set_params(self):
28
+ """Set default parameters.
29
+
30
+ Subclasses should call super()._set_params() first, then override specific parameters.
31
+ """
32
+ # ========== Candlestick color configuration ==========
33
+ self.barup = "#26a69a" # Up candle color
34
+ self.bardown = "#ef5350" # Down candle color
35
+ self.barup_wick = "#26a69a" # Up candle wick color
36
+ self.bardown_wick = "#ef5350" # Down candle wick color
37
+ self.barup_outline = "#26a69a" # Up candle outline color
38
+ self.bardown_outline = "#ef5350" # Down candle outline color
39
+
40
+ # ========== Volume color configuration ==========
41
+ self.volup = "#26a69a" # Up volume color
42
+ self.voldown = "#ef5350" # Down volume color
43
+
44
+ # ========== Background configuration ==========
45
+ self.background_fill = "#fafafa" # Chart background color
46
+ self.body_background_color = "#ffffff" # Page background color
47
+ self.border_fill = "#ffffff" # Border fill color
48
+
49
+ # ========== Grid configuration ==========
50
+ self.grid_line_color = "#e0e0e0" # Grid line color
51
+
52
+ # ========== Axis configuration ==========
53
+ self.axis_line_color = "#666666" # Axis line color
54
+ self.tick_line_color = "#666666" # Tick line color
55
+ self.axis_text_color = "#666666" # Axis text color
56
+ self.axis_label_text_color = "#666666" # Axis label color
57
+
58
+ # ========== Title configuration ==========
59
+ self.plot_title_text_color = "#333333" # Chart title color
60
+
61
+ # ========== Legend configuration ==========
62
+ self.legend_background_color = "#ffffff" # Legend background color
63
+ self.legend_text_color = "#333333" # Legend text color
64
+ self.legend_click = "hide" # Legend click behavior: 'hide' or 'mute'
65
+
66
+ # ========== Crosshair configuration ==========
67
+ self.crosshair_line_color = "#999999" # Crosshair line color
68
+
69
+ # ========== Tab configuration ==========
70
+ self.tab_active_background_color = "#e0e0e0" # Active tab background color
71
+ self.tab_active_color = "#333333" # Active tab text color
72
+
73
+ # ========== Table configuration ==========
74
+ self.table_color_even = "#ffffff" # Table even row color
75
+ self.table_color_odd = "#f5f5f5" # Table odd row color
76
+ self.table_header_color = "#e0e0e0" # Table header color
77
+
78
+ # ========== Tooltip configuration ==========
79
+ self.tooltip_background_color = "#ffffff" # Tooltip background color
80
+ self.tooltip_text_label_color = "#666666" # Tooltip label color
81
+ self.tooltip_text_value_color = "#333333" # Tooltip value color
82
+
83
+ # ========== Code highlight configuration ==========
84
+ self.tag_pre_background_color = "#f5f5f5" # Code block background color
85
+ self.tag_pre_text_color = "#333333" # Code block text color
86
+
87
+ # ========== Text configuration ==========
88
+ self.text_color = "#333333" # General text color
89
+
90
+ # ========== Chart layout configuration ==========
91
+ self.plot_sizing_mode = "stretch_width" # Chart sizing mode
92
+ self.plot_height = 400 # Default chart height
93
+ self.plot_height_volume = 150 # Volume chart height
94
+ self.plot_height_indicator = 200 # Indicator chart height
95
+
96
+ # ========== Toolbar configuration ==========
97
+ self.toolbar_location = "right" # Toolbar location
98
+
99
+ # ========== Line style configuration ==========
100
+ self.line_width = 1.5 # Default line width
101
+ self.line_alpha = 1.0 # Default line alpha
102
+
103
+ # ========== Marker configuration ==========
104
+ self.marker_size = 8 # Marker size
105
+ self.marker_buy_color = "#26a69a" # Buy marker color
106
+ self.marker_sell_color = "#ef5350" # Sell marker color
107
+
108
+ # ========== Data label configuration ==========
109
+ self.data_label_font_size = "10pt" # Data label font size
110
+
111
+ # ========== Date format configuration ==========
112
+ self.date_format = "%Y-%m-%d" # Date format
113
+ self.datetime_format = "%Y-%m-%d %H:%M" # Datetime format
114
+
115
+ # ========== Axis format configuration ==========
116
+ self.xaxis_formatter = None # X-axis formatter
117
+ self.yaxis_formatter = None # Y-axis formatter
118
+
119
+ def get_color(self, name, default=None):
120
+ """Get color configuration.
121
+
122
+ Args:
123
+ name: Color name
124
+ default: Default value
125
+
126
+ Returns:
127
+ Color value
128
+ """
129
+ return getattr(self, name, default)
130
+
131
+ def set_color(self, name, value):
132
+ """Set color configuration.
133
+
134
+ Args:
135
+ name: Color name
136
+ value: Color value
137
+ """
138
+ setattr(self, name, value)
139
+
140
+ def copy(self):
141
+ """Create a copy of the theme.
142
+
143
+ Returns:
144
+ New theme instance
145
+ """
146
+ new_scheme = self.__class__()
147
+ for attr in dir(self):
148
+ if not attr.startswith("_") and not callable(getattr(self, attr)):
149
+ setattr(new_scheme, attr, getattr(self, attr))
150
+ return new_scheme
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Tradimo light theme.
4
+
5
+ Plotting theme suitable for light backgrounds.
6
+ """
7
+
8
+ from .blackly import Blackly
9
+
10
+
11
+ class Tradimo(Blackly):
12
+ """Light theme.
13
+
14
+ Light background with dark text, suitable for daytime use or light interfaces.
15
+ Inherits from Blackly to maintain consistent parameter structure.
16
+ """
17
+
18
+ def _set_params(self):
19
+ super()._set_params()
20
+
21
+ dark_text = "#333333"
22
+
23
+ # ========== Candlestick color configuration ==========
24
+ self.barup = "#e6550d" # Up candle color (orange)
25
+ self.bardown = "#31a354" # Down candle color (green)
26
+ self.barup_wick = self.barup
27
+ self.bardown_wick = self.bardown
28
+ self.barup_outline = self.barup
29
+ self.bardown_outline = self.bardown
30
+
31
+ # ========== Volume color configuration ==========
32
+ self.volup = "#ff9896"
33
+ self.voldown = "#98df8a"
34
+
35
+ # ========== Background configuration ==========
36
+ self.background_fill = "white"
37
+ self.body_background_color = "white"
38
+ self.border_fill = "white"
39
+
40
+ # ========== Grid configuration ==========
41
+ self.grid_line_color = "#eeeeee"
42
+
43
+ # ========== Axis configuration ==========
44
+ self.axis_line_color = "#222222"
45
+ self.tick_line_color = "#222222"
46
+ self.axis_text_color = dark_text
47
+ self.axis_label_text_color = dark_text
48
+
49
+ # ========== Title configuration ==========
50
+ self.plot_title_text_color = dark_text
51
+
52
+ # ========== Legend configuration ==========
53
+ self.legend_background_color = "#f5f5f5"
54
+ self.legend_text_color = dark_text
55
+ self.legend_click = "hide"
56
+
57
+ # ========== Crosshair configuration ==========
58
+ self.crosshair_line_color = "#000000"
59
+
60
+ # ========== Tab configuration ==========
61
+ self.tab_active_background_color = "#dddddd"
62
+ self.tab_active_color = "#111111"
63
+
64
+ # ========== Table configuration ==========
65
+ self.table_color_even = "#fefefe"
66
+ self.table_color_odd = "#eeeeee"
67
+ self.table_header_color = "#cccccc"
68
+
69
+ # ========== Tooltip configuration ==========
70
+ self.tooltip_background_color = "#f5f5f5"
71
+ self.tooltip_text_label_color = "#848EFF"
72
+ self.tooltip_text_value_color = "#5c5c5c"
73
+
74
+ # ========== Code highlighting configuration ==========
75
+ self.tag_pre_background_color = "#f5f5f5"
76
+ self.tag_pre_text_color = dark_text
77
+
78
+ # ========== Text configuration ==========
79
+ self.text_color = "#222222"
80
+
81
+ # ========== Special configuration ==========
82
+ self.loc = "#265371" # Location line color
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Tab base class.
4
+
5
+ Provides extensible tab architecture for creating custom tabs.
6
+ """
7
+
8
+ from typing import Any
9
+
10
+ Panel: Any = None
11
+ BOKEH_AVAILABLE = False
12
+
13
+ try:
14
+ # Bokeh 3.x
15
+ from bokeh.models import TabPanel as _Panel
16
+
17
+ Panel = _Panel
18
+ BOKEH_AVAILABLE = True
19
+ except ImportError:
20
+ try:
21
+ # Bokeh 2.x
22
+ from bokeh.models.widgets import Panel as _Panel
23
+
24
+ Panel = _Panel
25
+ BOKEH_AVAILABLE = True
26
+ except ImportError:
27
+ try:
28
+ from bokeh.models import Panel as _Panel
29
+
30
+ Panel = _Panel
31
+ BOKEH_AVAILABLE = True
32
+ except ImportError:
33
+ # Bokeh not installed (optional dependency); BOKEH_AVAILABLE stays False.
34
+ pass
35
+
36
+
37
+ class BokehTab:
38
+ """Tab base class.
39
+
40
+ Abstract base class for creating custom tabs.
41
+ Subclasses must implement _is_useable and _get_panel methods.
42
+
43
+ Attributes:
44
+ _app: BacktraderBokeh application instance
45
+ _figurepage: Figure page instance
46
+ _client: Client instance (optional, for live mode)
47
+ _panel: Bokeh Panel instance
48
+
49
+ Example:
50
+ class MyCustomTab(BokehTab):
51
+ def _is_useable(self):
52
+ return True
53
+
54
+ def _get_panel(self):
55
+ from bokeh.models import Div
56
+ div = Div(text='<h1>My Content</h1>')
57
+ return div, 'My Tab'
58
+ """
59
+
60
+ def __init__(self, app, figurepage, client=None):
61
+ """Initialize tab.
62
+
63
+ Args:
64
+ app: BacktraderBokeh application instance
65
+ figurepage: Figure page instance
66
+ client: Client instance (optional)
67
+ """
68
+ self._app = app
69
+ self._figurepage = figurepage
70
+ self._client = client
71
+ self._panel = None
72
+
73
+ def _is_useable(self):
74
+ """Check if tab is useable.
75
+
76
+ Subclasses must implement this method.
77
+
78
+ Returns:
79
+ bool: Whether tab is useable
80
+ """
81
+ raise NotImplementedError("_is_useable needs to be implemented.")
82
+
83
+ def _get_panel(self):
84
+ """Get tab content.
85
+
86
+ Subclasses must implement this method.
87
+
88
+ Returns:
89
+ tuple: (child_widget, title) - Child widget and title
90
+ """
91
+ raise NotImplementedError("_get_panel needs to be implemented.")
92
+
93
+ def is_useable(self):
94
+ """Public interface: Check if tab is useable.
95
+
96
+ Returns:
97
+ bool: Whether tab is useable
98
+ """
99
+ return self._is_useable()
100
+
101
+ def get_panel(self):
102
+ """Public interface: Get Bokeh Panel.
103
+
104
+ Returns:
105
+ Panel: Bokeh Panel instance
106
+ """
107
+ if not BOKEH_AVAILABLE or Panel is None:
108
+ return None
109
+ child, title = self._get_panel()
110
+ self._panel = Panel(child=child, title=title)
111
+ return self._panel
112
+
113
+ @property
114
+ def strategy(self):
115
+ """Get strategy instance."""
116
+ if self._figurepage is not None:
117
+ return getattr(self._figurepage, "strategy", None)
118
+ return None
119
+
120
+ @property
121
+ def scheme(self):
122
+ """Get theme instance."""
123
+ if self._app is not None:
124
+ return getattr(self._app, "scheme", None)
125
+ return None
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Built-in tabs module.
4
+
5
+ Provides the following built-in tabs:
6
+ - AnalyzerTab: Analyzer results display
7
+ - ConfigTab: Configuration info display
8
+ - LogTab: Log display
9
+ - MetadataTab: Metadata display
10
+ - SourceTab: Source code display
11
+ - LiveTab: Live configuration tab
12
+ """
13
+
14
+ from .analyzer import AnalyzerTab
15
+ from .config import ConfigTab
16
+ from .live import LiveTab
17
+ from .log import LogTab
18
+ from .metadata import MetadataTab
19
+ from .performance import PerformanceTab
20
+ from .source import SourceTab
21
+
22
+ __all__ = [
23
+ "AnalyzerTab",
24
+ "ConfigTab",
25
+ "LogTab",
26
+ "MetadataTab",
27
+ "SourceTab",
28
+ "LiveTab",
29
+ "PerformanceTab",
30
+ ]