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,21 @@
1
+ #!/usr/bin/env python
2
+
3
+ """Backtrader mixins module.
4
+
5
+ This module provides mixin classes that can be used to add functionality
6
+ to other classes without using metaclasses. These mixins are part of the
7
+ effort to remove metaprogramming from backtrader while maintaining
8
+ backward compatibility.
9
+ """
10
+
11
+ from .singleton import (
12
+ ParameterizedSingletonMixin,
13
+ SingletonMixin,
14
+ StoreBase,
15
+ )
16
+
17
+ __all__ = [
18
+ "SingletonMixin",
19
+ "ParameterizedSingletonMixin",
20
+ "StoreBase",
21
+ ]
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env python
2
+ """Singleton Mixin Module - Singleton pattern implementation.
3
+
4
+ This module provides the SingletonMixin class for implementing the
5
+ singleton pattern without using metaclasses. This is part of the
6
+ metaprogramming removal effort in backtrader.
7
+
8
+ Classes:
9
+ SingletonMixin: Mixin class that implements the singleton pattern.
10
+ ParameterizedSingletonMixin: Singleton mixin with parameter support.
11
+ StoreBase: Base class for store singletons.
12
+
13
+ Example:
14
+ Creating a singleton class:
15
+ >>> class MyClass(SingletonMixin):
16
+ ... pass
17
+ >>> a = MyClass()
18
+ >>> b = MyClass()
19
+ >>> assert a is b # True - same instance
20
+ """
21
+
22
+ import threading
23
+ import weakref
24
+ from typing import Any, Dict, Optional
25
+
26
+
27
+ class SingletonMixin:
28
+ """Mixin class to implement singleton pattern using __new__ method.
29
+
30
+ This replaces the MetaSingleton metaclass pattern, providing the same
31
+ functionality without using metaclasses. Each class that inherits from
32
+ this mixin will maintain exactly one instance per class.
33
+
34
+ Thread-safe implementation using threading.Lock.
35
+
36
+ Features:
37
+ - Thread-safe singleton creation
38
+ - Per-class singleton instances (subclasses get their own instances)
39
+ - Automatic cleanup when instances are garbage collected
40
+ - Maintains compatibility with existing parameter systems
41
+ """
42
+
43
+ # Class-level storage for singleton instances
44
+ # Using WeakValueDictionary for automatic cleanup
45
+ _instances: Dict[type, Any] = weakref.WeakValueDictionary()
46
+ _lock = threading.Lock()
47
+
48
+ def __new__(cls, *args, **kwargs):
49
+ """Create or return existing singleton instance for the class."""
50
+
51
+ # Check if instance already exists (fast path, no lock)
52
+ if cls in cls._instances:
53
+ return cls._instances[cls]
54
+
55
+ # Acquire lock for thread-safe creation
56
+ with cls._lock:
57
+ # Double-check pattern: instance might have been created
58
+ # by another thread while waiting for lock
59
+ if cls in cls._instances:
60
+ return cls._instances[cls]
61
+
62
+ # Create new instance using object.__new__ directly
63
+ # This avoids recursion issues with mixin inheritance
64
+ instance = object.__new__(cls)
65
+
66
+ # Store instance before calling __init__ to handle potential
67
+ # recursive calls during initialization
68
+ cls._instances[cls] = instance
69
+
70
+ return instance
71
+
72
+ @classmethod
73
+ def _reset_instance(cls):
74
+ """Reset the singleton instance for this class.
75
+
76
+ This is mainly for testing purposes and should be used with caution
77
+ in production code.
78
+ """
79
+ with cls._lock:
80
+ if cls in cls._instances:
81
+ del cls._instances[cls]
82
+
83
+ @classmethod
84
+ def _get_instance(cls) -> Optional[Any]:
85
+ """Get the current singleton instance if it exists.
86
+
87
+ Returns:
88
+ The singleton instance if it exists, None otherwise.
89
+ """
90
+ return cls._instances.get(cls)
91
+
92
+ @classmethod
93
+ def _has_instance(cls) -> bool:
94
+ """Check if a singleton instance exists for this class.
95
+
96
+ Returns:
97
+ True if instance exists, False otherwise.
98
+ """
99
+ return cls in cls._instances
100
+
101
+
102
+ class ParameterizedSingletonMixin(SingletonMixin):
103
+ """Enhanced singleton mixin that integrates with parameter systems.
104
+
105
+ This version is specifically designed to work with backtrader's
106
+ parameter system, maintaining compatibility with MetaParams functionality.
107
+ """
108
+
109
+ def __init__(self, *args, **kwargs):
110
+ """Initialize singleton instance only once."""
111
+ if getattr(self, "_singleton_initialized", False):
112
+ return
113
+
114
+ self._singleton_initialized = True
115
+
116
+
117
+ # Backward compatibility alias
118
+ StoreBase = ParameterizedSingletonMixin
backtrader/observer.py ADDED
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python
2
+ """Observer Module - Strategy monitoring and data collection.
3
+
4
+ This module provides the Observer base class for monitoring strategy
5
+ execution and collecting data during backtesting. Observers track metrics
6
+ like cash, value, drawdown, and trade statistics.
7
+
8
+ Observers are similar to indicators but are used primarily for monitoring
9
+ and recording strategy state rather than generating trading signals.
10
+
11
+ Key Classes:
12
+ Observer: Base class for all observers.
13
+
14
+ Observers receive the same notifications as strategies:
15
+ - prenext/nextstart/next: Called during each bar
16
+ - start/stop: Called at the beginning and end of backtesting
17
+
18
+ Example:
19
+ Creating a custom observer:
20
+ >>> class MyObserver(Observer):
21
+ ... lines = ('custom_metric',)
22
+ ...
23
+ ... def next(self):
24
+ ... self.lines.custom_metric[0] = self.data.close[0] * 2
25
+ """
26
+
27
+ from .lineiterator import LineIterator, ObserverBase, StrategyBase
28
+
29
+
30
+ # Observer class - refactored to not use metaclass
31
+ class Observer(ObserverBase):
32
+ """Base class for monitoring strategy execution.
33
+
34
+ Observers track and record strategy state during backtesting.
35
+ They can track metrics like cash, value, drawdown, positions, etc.
36
+
37
+ Attributes:
38
+ csv: Whether to save observer data to CSV (default: True).
39
+ plotinfo: Plotting configuration dictionary.
40
+
41
+ Example:
42
+ >>> observer = MyObserver()
43
+ >>> cerebro.addobserver(observer)
44
+ """
45
+
46
+ # Set _stclock to False
47
+ _stclock = False
48
+ # Owned instance
49
+ _OwnerCls = StrategyBase
50
+ # Line type
51
+ _ltype = LineIterator.ObsType
52
+ # Whether to save to csv and other files
53
+ csv = True
54
+ # Plot settings options
55
+ plotinfo = {"plot": False, "subplot": True}
56
+
57
+ def __init__(self, *args, **kwargs):
58
+ """
59
+ Initialize Observer with functionality previously in MetaObserver.dopreinit.
60
+
61
+ Note: __new__ removed - _analyzers initialization moved here.
62
+ """
63
+ # Initialize _analyzers list (moved from __new__)
64
+ self._analyzers = [] # keep children analyzers
65
+
66
+ # Initialize parent first
67
+ super().__init__(*args, **kwargs)
68
+
69
+ # Handle _stclock functionality (previously in MetaObserver.dopreinit)
70
+ if self._stclock: # Change the clock if strategy wide observer
71
+ self._clock = self._owner
72
+
73
+ # An Observer is ideally always observing and that' why prenext calls next.
74
+ # The behavior can be overriden by subclasses
75
+ def prenext(self):
76
+ """Process bars before minimum period is reached.
77
+
78
+ By default, observers always process every bar by calling next()
79
+ even during the prenext phase. Subclasses can override this behavior.
80
+
81
+ Note:
82
+ This default implementation calls next() to ensure observers
83
+ track all bars from the beginning.
84
+ """
85
+ self.next()
86
+
87
+ # Register analyzer
88
+ def _register_analyzer(self, analyzer):
89
+ self._analyzers.append(analyzer)
90
+
91
+ def _start(self):
92
+ # PERFORMANCE FIX: Ensure _owner is set before calling start()
93
+ # This is a fallback for cases where findowner didn't find the strategy during __init__
94
+ if not hasattr(self, "_owner") or self._owner is None:
95
+ # Try to get owner from _parent (set by strategy when adding observer)
96
+ if hasattr(self, "_parent") and self._parent is not None:
97
+ self._owner = self._parent
98
+
99
+ self.start()
100
+
101
+ def start(self):
102
+ """Called at the start of the backtesting run.
103
+
104
+ This method can be overridden by subclasses to perform
105
+ initialization at the start of strategy execution.
106
+ """
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env python
2
+ """Observers Module - Strategy monitoring observers.
3
+
4
+ This module provides observers for monitoring and recording strategy
5
+ execution. Observers track metrics like cash, value, drawdown, trades,
6
+ and benchmark data during backtesting.
7
+
8
+ Available Observers:
9
+ - Benchmark: Benchmark data (price) for comparison
10
+ - Broker: Cash and value tracking
11
+ - BuySell: Buy/sell signal visualization
12
+ - DrawDown: Drawdown tracking and visualization
13
+ - LogReturns: Log returns tracking
14
+ - TimeReturn: Returns by time period
15
+ - Trades: Trade tracking
16
+ - TradeLogger: Comprehensive logging (orders, trades, positions, indicators, signals)
17
+
18
+ Example:
19
+ Adding observers to a strategy:
20
+ >>> cerebro.addobserver(bt.observers.DrawDown)
21
+ >>> cerebro.addobserver(bt.observers.Trades)
22
+ >>> cerebro.addobserver(bt.observers.TradeLogger, log_dir='./logs')
23
+ """
24
+
25
+ import os as _os
26
+
27
+ # The modules below should/must define __all__ with the Indicator objects
28
+ # of prepend an "_" (underscore) to private classes/variables
29
+
30
+ if _os.environ.get("BACKTRADER_LIGHT_IMPORT", "").strip().lower() in {
31
+ "1",
32
+ "true",
33
+ "yes",
34
+ "on",
35
+ }:
36
+ from .trade_logger import TradeLogger as TradeLogger
37
+ else:
38
+ from .benchmark import *
39
+ from .broker import *
40
+ from .buysell import *
41
+ from .drawdown import *
42
+ from .logreturns import *
43
+ from .timereturn import *
44
+ from .trade_logger import TradeLogger as TradeLogger
45
+ from .trades import *
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/env python
2
+ """Benchmark Observer Module - Strategy vs benchmark comparison.
3
+
4
+ This module provides the Benchmark observer for tracking strategy returns
5
+ against a reference asset (benchmark).
6
+
7
+ Classes:
8
+ Benchmark: Observer that compares strategy performance to a benchmark.
9
+
10
+ Example:
11
+ >>> cerebro = bt.Cerebro()
12
+ >>> data = bt.feeds.GenericCSVData(dataname='benchmark.csv')
13
+ >>> cerebro.adddata(data)
14
+ >>> cerebro.addobserver(bt.observers.Benchmark, data=data)
15
+ """
16
+
17
+ from ..analyzers.timereturn import TimeReturn as TimeReturnAnalyzer
18
+ from .timereturn import TimeReturn
19
+
20
+
21
+ # Benchmark
22
+ class Benchmark(TimeReturn):
23
+ """This observer stores the *returns* of the strategy and the *return* of a
24
+ reference asset which is one of the datas passed to the system.
25
+
26
+ Params:
27
+
28
+ - ``timeframe`` (default: ``None``)
29
+ If ``None`` then the complete return over the entire backtested period
30
+ will be reported
31
+
32
+ - ``compression`` (default: ``None``)
33
+
34
+ Only used for sub-day timeframes to, for example, work on an hourly
35
+ timeframe by specifying "TimeFrame.Minutes" and 60 as compression
36
+
37
+ - ``data`` (default: ``None``)
38
+
39
+ Reference asset to track to allow for comparison.
40
+
41
+ :note:: this data must have been added to a ``cerebro`` instance with
42
+ ``addata``, ``resampledata`` or ``replaydata``.
43
+
44
+
45
+ - ``_doprenext`` (default: ``False``)
46
+
47
+ Benchmarking will take place from the point at which the strategy kicks
48
+ in (i.e.: when the minimum period of the strategy has been met).
49
+
50
+ Setting this to ``True`` will record benchmarking values from the
51
+ starting point of the data feeds
52
+
53
+ - ``firstopen`` (default: ``False``)
54
+
55
+ Keepint it as ``False`` ensures that the 1st comparison point between
56
+ the value and the benchmark starts at 0%, because the benchmark will
57
+ not use its opening price.
58
+
59
+ See the ``TimeReturn`` analyzer reference for a full explanation of the
60
+ meaning of the parameter
61
+
62
+ - ``fund`` (default: ``None``)
63
+
64
+ If `None`, the actual mode of the broker (fundmode - True/False) will
65
+ be autodetected to decide if the returns are based on the total net
66
+ asset value or on the fund value. See ``set_fundmode`` in the broker
67
+ documentation
68
+
69
+ Set it to ``True`` or ``False`` for a specific behavior
70
+
71
+ Remember that at any moment of a `run` the current values can be checked
72
+ by looking at the *lines* by name at index ``0``.
73
+
74
+ """
75
+
76
+ _stclock = True
77
+
78
+ lines = ("benchmark",)
79
+ plotlines = {"benchmark": {"_name": "Benchmark"}}
80
+
81
+ params = (
82
+ ("data", None),
83
+ ("_doprenext", False),
84
+ # Set to False, to ensure the asset is measured at 0% in the 1st tick
85
+ ("firstopen", False),
86
+ ("fund", None),
87
+ )
88
+
89
+ def _plotlabel(self):
90
+ labels = super()._plotlabel()
91
+ labels.append(self.p.data._name)
92
+ return labels
93
+
94
+ def __init__(self):
95
+ """Initialize the Benchmark observer.
96
+
97
+ Sets up data reference and benchmark analyzer.
98
+ """
99
+ if self.p.data is None: # use the 1st data in the system if none given
100
+ self.p.data = self.data0
101
+
102
+ super().__init__() # treturn including data parameter
103
+ # Create a time return object without the data
104
+ kwargs = self.p._getkwargs()
105
+ kwargs.update(data=None) # to create a return for the strategy
106
+ # Get return rate
107
+ t = self._owner._addanalyzer_slave(TimeReturnAnalyzer, **kwargs)
108
+
109
+ # swap for consistency
110
+ self.treturn, self.tbench = t, self.treturn
111
+
112
+ def next(self):
113
+ """Update benchmark value for the current period.
114
+
115
+ Gets the benchmark return from the analyzer.
116
+ """
117
+ super().next()
118
+ self.lines.benchmark[0] = self.tbench.rets.get(self.tbench.dtkey, float("NaN"))
119
+
120
+ def prenext(self):
121
+ """Process bars before minimum period is reached.
122
+
123
+ Handles prenext phase for time tracking.
124
+ """
125
+ if self.p._doprenext:
126
+ super(TimeReturn, self).prenext()
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env python
2
+ """Broker Observer Module - Cash and value tracking.
3
+
4
+ This module provides observers for tracking broker cash and portfolio value.
5
+
6
+ Classes:
7
+ Cash: Observer that tracks current cash level.
8
+ Value: Observer that tracks portfolio value.
9
+
10
+ Example:
11
+ >>> cerebro = bt.Cerebro()
12
+ >>> cerebro.addobserver(bt.observers.Broker)
13
+ """
14
+
15
+ from ..observer import Observer
16
+
17
+
18
+ # Get cash
19
+ class Cash(Observer):
20
+ """This observer keeps track the current amount of cash in the broker
21
+
22
+ Params: None
23
+ """
24
+
25
+ _stclock = True
26
+
27
+ lines = ("cash",)
28
+
29
+ plotinfo = {"plot": True, "subplot": True}
30
+
31
+ def next(self):
32
+ """Update the cash value for the current period.
33
+
34
+ Gets current cash amount from the broker.
35
+ """
36
+ self.lines[0][0] = self._owner.broker.getcash()
37
+
38
+
39
+ # Get value
40
+ class Value(Observer):
41
+ """This observer keeps track of the current portfolio value in the broker
42
+ including the cash
43
+
44
+ Params:
45
+
46
+ - ``fund`` (default: ``None``)
47
+
48
+ If `None`, the actual mode of the broker (fundmode - True/False) will
49
+ be autodetected to decide if the returns are based on the total net
50
+ asset value or on the fund value. See ``set_fundmode`` in the broker
51
+ documentation
52
+
53
+ Set it to ``True`` or ``False`` for a specific behavior
54
+
55
+ """
56
+
57
+ _stclock = True
58
+
59
+ params = (("fund", None),)
60
+
61
+ lines = ("value",)
62
+
63
+ plotinfo = {"plot": True, "subplot": True}
64
+
65
+ def __init__(self):
66
+ """Initialize the Value observer.
67
+
68
+ Sets up fund mode tracking variable.
69
+ """
70
+ self._fundmode = None
71
+
72
+ def start(self):
73
+ """Start the Value observer and determine fund mode.
74
+
75
+ Detects or sets fund mode for value calculation.
76
+ """
77
+ if self.p.fund is None:
78
+ self._fundmode = self._owner.broker.fundmode
79
+ else:
80
+ self._fundmode = self.p.fund
81
+
82
+ def next(self):
83
+ """Update the portfolio value for the current period.
84
+
85
+ Gets value from broker based on fund mode setting.
86
+ """
87
+ if not self._fundmode:
88
+ self.lines[0][0] = self._owner.broker.getvalue()
89
+ else:
90
+ self.lines[0][0] = self._owner.broker.fundvalue
91
+
92
+
93
+ # Get both cash and value
94
+ class Broker(Observer):
95
+ """This observer keeps track of the current cash amount and portfolio value in
96
+ the broker (including the cash)
97
+
98
+ Params: None
99
+ """
100
+
101
+ _stclock = True
102
+
103
+ params = (("fund", None),)
104
+
105
+ alias = ("CashValue",)
106
+ lines = ("cash", "value")
107
+
108
+ plotinfo = {"plot": True, "subplot": True}
109
+
110
+ def __init__(self):
111
+ """Initialize the Broker observer.
112
+
113
+ Sets up fund mode tracking variable.
114
+ """
115
+ self._fundmode = None
116
+
117
+ def start(self):
118
+ """Start the Broker observer and configure plotting.
119
+
120
+ Determines fund mode and configures plot settings.
121
+ """
122
+ if self.p.fund is None:
123
+ self._fundmode = self._owner.broker.fundmode
124
+ else:
125
+ self._fundmode = self.p.fund
126
+
127
+ if self._fundmode:
128
+ self.plotlines.cash._plotskip = True
129
+ self.plotlines.value._name = "FundValue"
130
+
131
+ def next(self):
132
+ """Update cash and value for the current period.
133
+
134
+ Gets current cash and portfolio value from the broker.
135
+ """
136
+ if not self._fundmode:
137
+ self.lines.value[0] = self._owner.broker.getvalue()
138
+ self.lines.cash[0] = self._owner.broker.getcash()
139
+ else:
140
+ self.lines.value[0] = self._owner.broker.fundvalue
141
+ self.lines.cash[0] = self._owner.broker.getcash()
142
+
143
+
144
+ # fundvalue
145
+ class FundValue(Observer):
146
+ """This observer keeps track of the current fund-like value
147
+
148
+ Params: None
149
+ """
150
+
151
+ _stclock = True
152
+
153
+ alias = ("FundShareValue", "FundVal")
154
+ lines = ("fundval",)
155
+
156
+ plotinfo = {"plot": True, "subplot": True}
157
+
158
+ def next(self):
159
+ """Update the fund value for the current period.
160
+
161
+ Gets current fund value from the broker.
162
+ """
163
+ self.lines.fundval[0] = self._owner.broker.fundvalue
164
+
165
+
166
+ # Fund shares
167
+ class FundShares(Observer):
168
+ """This observer keeps track of the current fund-like shares
169
+
170
+ Params: None
171
+ """
172
+
173
+ _stclock = True
174
+
175
+ lines = ("fundshares",)
176
+
177
+ plotinfo = {"plot": True, "subplot": True}
178
+
179
+ def next(self):
180
+ """Update the fund shares for the current period.
181
+
182
+ Gets current fund shares from the broker.
183
+ """
184
+ self.lines.fundshares[0] = self._owner.broker.fundshares