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,121 @@
1
+ #!/usr/bin/env python
2
+ """Calendar Days Filter Module - Calendar day filling.
3
+
4
+ This module provides the CalendarDays filter for adding missing
5
+ calendar days to trading day data.
6
+
7
+ Classes:
8
+ CalendarDays: Fills missing calendar days.
9
+
10
+ Example:
11
+ >>> data = bt.feeds.GenericCSVData(dataname='data.csv')
12
+ >>> data.addfilter(bt.filters.CalendarDays())
13
+ >>> cerebro.adddata(data)
14
+ """
15
+
16
+ from datetime import date, datetime, timedelta
17
+
18
+ from ..parameters import ParameterizedBase
19
+
20
+
21
+ class CalendarDays(ParameterizedBase):
22
+ """
23
+ Bar Filler to add missing calendar days to trading days
24
+
25
+ Params:
26
+
27
+ - fill_price (def: None):
28
+
29
+ > 0: The given value to fill
30
+ 0 or None: Use the last known closing price
31
+ -1: Use the midpoint of the last bar (High-Low average)
32
+
33
+ - fill_vol (def: float('NaN')):
34
+
35
+ Value to use to fill the missing volume
36
+
37
+ - fill_oi (def: float('NaN')):
38
+
39
+ Value to use to fill the missing Open Interest
40
+ """
41
+
42
+ params = (
43
+ ("fill_price", None),
44
+ ("fill_vol", float("NaN")),
45
+ ("fill_oi", float("NaN")),
46
+ )
47
+
48
+ ONEDAY = timedelta(days=1)
49
+ lastdt = date.max
50
+
51
+ def __init__(self, data, **kwargs):
52
+ """Initialize the CalendarDays filter.
53
+
54
+ Args:
55
+ data: The data feed to apply the filter to.
56
+ **kwargs: Additional keyword arguments passed to parent class.
57
+ """
58
+ super().__init__(**kwargs)
59
+
60
+ def __call__(self, data):
61
+ """
62
+ If the data has a gap larger than 1 day amongst bars, the missing bars
63
+ are added to the stream.
64
+
65
+ Params:
66
+ - data: the data source to filter/process
67
+
68
+ Returns:
69
+ - False (always): this filter does not remove bars from the stream
70
+
71
+ """
72
+ dt = data.datetime.date()
73
+ if (dt - self.lastdt) > self.ONEDAY: # gap in place
74
+ self._fillbars(data, dt, self.lastdt)
75
+
76
+ self.lastdt = dt
77
+ return False # no bar has been removed from the stream
78
+
79
+ def _fillbars(self, data, dt, lastdt):
80
+ """
81
+ Fills one by one bars as needed from time_start to time_end
82
+
83
+ Invalidates the control dtime_prev if requested
84
+ """
85
+ tm = data.datetime.time(0) # get time part
86
+
87
+ # Same price for all bars
88
+ fp = self.p.fill_price
89
+ if fp is not None and fp > 0:
90
+ price = fp
91
+ elif fp == -1:
92
+ price = (data.high[-1] + data.low[-1]) / 2.0
93
+ else:
94
+ # None, 0, or any other falsy value → use last close
95
+ price = data.close[-1]
96
+
97
+ while lastdt < dt:
98
+ lastdt += self.ONEDAY
99
+
100
+ # Prepare an array of the necessary size
101
+ bar = [float("Nan")] * data.size()
102
+ # Fill the datetime
103
+ bar[data.DateTime] = data.date2num(datetime.combine(lastdt, tm))
104
+
105
+ # Fill price fields
106
+ for pricetype in [data.Open, data.High, data.Low, data.Close]:
107
+ bar[pricetype] = price
108
+
109
+ # Fill volume and open interest
110
+ bar[data.Volume] = self.p.fill_vol
111
+ bar[data.OpenInterest] = self.p.fill_oi
112
+
113
+ # Fill extra lines the data feed may have defined beyond DateTime
114
+ for i in range(data.DateTime + 1, data.size()):
115
+ bar[i] = data.lines[i][0]
116
+
117
+ # Add this constructed bar to the stack of the stream
118
+ data._add2stack(bar)
119
+
120
+ # Save to stack the bar that signaled the gap
121
+ data._save2stack(erase=True)
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env python
2
+ """Data Filler Filter Module - Gap filling for data feeds.
3
+
4
+ This module provides the DataFiller for filling gaps in data feeds
5
+ when bars are missing.
6
+
7
+ Classes:
8
+ DataFiller: Fills gaps in data with specified values.
9
+
10
+ Example:
11
+ >>> data = bt.feeds.GenericCSVData(dataname='data.csv')
12
+ >>> data.addfilter(bt.filters.DataFiller())
13
+ >>> cerebro.adddata(data)
14
+ """
15
+
16
+ import collections
17
+ from datetime import datetime, timedelta
18
+
19
+ from ..dataseries import TimeFrame
20
+ from ..feed import AbstractDataBase
21
+
22
+
23
+ class DataFiller(AbstractDataBase):
24
+ """This class will fill gaps in the source data using the following
25
+ information bits from the underlying data source
26
+
27
+ - timeframe and compression are to dimension the output bars
28
+
29
+ - sessionstart and sessionend
30
+
31
+ If a data feed has missing bars in between 10:31 and 10:34 and the
32
+ timeframe is minutes, the output will be filled with bars for minutes
33
+ 10:32 and 10:33 using the closing price of the last bar (10:31)
34
+
35
+ Bars can be missing amongst other things because
36
+
37
+ Params:
38
+ - ``fill_price`` (def: None): if None (or evaluates to False), the
39
+ closing price will be used, else the passed value (which can be
40
+ for example 'NaN' to have a missing bar in terms of evaluation but
41
+ present in terms of time
42
+
43
+ - ``fill_vol`` (def: NaN): used to fill the volume with missing bars
44
+
45
+ - ``fill_oi`` (def: NaN): used to fill the openinterest with missing bars
46
+ """
47
+
48
+ params = (
49
+ ("fill_price", None),
50
+ ("fill_vol", float("NaN")),
51
+ ("fill_oi", float("NaN")),
52
+ )
53
+
54
+ def __init__(self):
55
+ """Initialize the DataFiller.
56
+
57
+ Sets up internal state variables for tracking timeframe,
58
+ compression, data bars, and fill bars queue.
59
+ """
60
+ self._timeframe = None
61
+ self._compression = None
62
+ self._dbar = None
63
+ self._fillbars = None
64
+
65
+ def start(self):
66
+ """Start the data filler.
67
+
68
+ Initializes the fill bars queue and data bar flag.
69
+ This method is called when the data feed starts processing.
70
+ """
71
+ super().start()
72
+ self._fillbars = collections.deque()
73
+ self._dbar = False
74
+
75
+ def preload(self):
76
+ """Preload data from the underlying data source.
77
+
78
+ If the underlying data is not preloaded, loads it completely.
79
+ Copies timeframe and compression settings from the source data
80
+ after it has started (some sources do autodetection).
81
+
82
+ This method ensures all necessary data is available before processing.
83
+ """
84
+ if len(self.p.dataname) == self.p.dataname.buflen():
85
+ # if data is not preloaded … do it
86
+ self.p.dataname.start()
87
+ self.p.dataname.preload()
88
+ self.p.dataname.home()
89
+
90
+ # Copy timeframe from data after start (some sources do autodetection)
91
+ self.p.timeframe = self._timeframe = self.p.dataname._timeframe
92
+ self.p.compression = self._compression = self.p.dataname._compression
93
+
94
+ super().preload()
95
+
96
+ def _copyfromdata(self):
97
+ # Data is allowed - Copy size which is "number of lines"
98
+ for i in range(self.p.dataname.size()):
99
+ self.lines[i][0] = self.p.dataname.lines[i][0]
100
+
101
+ self._dbar = False # invalidate a flag for read bar
102
+
103
+ return True
104
+
105
+ def _frombars(self):
106
+ dtime, price = self._fillbars.popleft()
107
+
108
+ price = self.p.fill_price or price
109
+
110
+ self.lines.datetime[0] = self.p.dataname.date2num(dtime)
111
+ self.lines.open[0] = price
112
+ self.lines.high[0] = price
113
+ self.lines.low[0] = price
114
+ self.lines.close[0] = price
115
+ self.lines.volume[0] = self.p.fill_vol
116
+ self.lines.openinterest[0] = self.p.fill_oi
117
+
118
+ return True
119
+
120
+ # Minimum delta unit in between bars
121
+ _tdeltas = {
122
+ TimeFrame.Minutes: timedelta(seconds=60),
123
+ TimeFrame.Seconds: timedelta(seconds=1),
124
+ TimeFrame.MicroSeconds: timedelta(microseconds=1),
125
+ }
126
+
127
+ def _load(self):
128
+ if not len(self.p.dataname):
129
+ self.p.dataname.start() # start data if not done somewhere else
130
+
131
+ # Copy from underlying data
132
+ self._timeframe = self.p.dataname._timeframe
133
+ self._compression = self.p.dataname._compression
134
+
135
+ self.p.timeframe = self._timeframe
136
+ self.p.compression = self._compression
137
+
138
+ # Calculate and save timedelta for timeframe
139
+ self._tdunit = self._tdeltas[self._timeframe]
140
+ self._tdunit *= self._compression
141
+
142
+ if self._fillbars:
143
+ return self._frombars()
144
+
145
+ # use existing bar or fetch a bar
146
+ self._dbar = self._dbar or self.p.dataname.next()
147
+ if not self._dbar:
148
+ return False # no more data
149
+
150
+ if len(self) == 1:
151
+ # Cannot yet look backwards - deliver data as is
152
+ return self._copyfromdata()
153
+
154
+ # previous (delivered) close
155
+ pclose = self.lines.close[-1]
156
+ # Get time of previous (already delivered) bar
157
+ dtime_prev = self.lines.datetime.datetime(-1)
158
+ # Get time of current (from a data source) bar
159
+ dtime_cur = self.p.dataname.datetime.datetime(0)
160
+
161
+ # Calculate the session end for previous bar
162
+ send = datetime.combine(dtime_prev.date(), self.p.dataname.sessionend)
163
+
164
+ if dtime_cur > send: # if jumped boundary
165
+ # 1. check for missing bars until boundary (end)
166
+ dtime_prev += self._tdunit
167
+ while dtime_prev < send:
168
+ self._fillbars.append((dtime_prev, pclose))
169
+ dtime_prev += self._tdunit
170
+
171
+ # Calculate session start for new bar
172
+ sstart = datetime.combine(dtime_cur.date(), self.p.dataname.sessionstart)
173
+
174
+ # 2. check for missing bars from new boundary (start)
175
+ # check a gap from new sessionstart
176
+ while sstart < dtime_cur:
177
+ self._fillbars.append((sstart, pclose))
178
+ sstart += self._tdunit
179
+ else:
180
+ # no boundary jumped - check the gap until current time
181
+ dtime_prev += self._tdunit
182
+ while dtime_prev < dtime_cur:
183
+ self._fillbars.append((dtime_prev, pclose))
184
+ dtime_prev += self._tdunit
185
+
186
+ if self._fillbars:
187
+ self._dbar = True # flag a pending data bar is available
188
+
189
+ # return an accumulated bar in the current cycle
190
+ return self._frombars()
191
+
192
+ return self._copyfromdata()
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env python
2
+ """Data Filter Module - Generic data filtering.
3
+
4
+ This module provides the DataFilter for filtering bars from a
5
+ data source based on a callable function.
6
+
7
+ Classes:
8
+ DataFilter: Filters bars based on a filter function.
9
+
10
+ Example:
11
+ >>> data = bt.feeds.GenericCSVData(dataname='data.csv')
12
+ >>> data.addfilter(bt.filters.DataFilter(funcfilter=my_filter_func))
13
+ >>> cerebro.adddata(data)
14
+ """
15
+
16
+ from ..feed import AbstractDataBase
17
+
18
+
19
+ class DataFilter(AbstractDataBase):
20
+ """
21
+ This class filters out bars from a given data source. In addition to the
22
+ standard parameters of a DataBase, it takes a ``funcfilter`` parameter which
23
+ can be any callable
24
+
25
+ Logic:
26
+
27
+ - ``funcfilter`` will be called with the underlying data source
28
+
29
+ It can be any callable
30
+
31
+ - Return value ``True``: current data source bar values will be used
32
+ - Return value ``False``: current data source bar values will discard
33
+ """
34
+
35
+ params = (("funcfilter", None),)
36
+
37
+ def preload(self):
38
+ """Preload data from the underlying data source.
39
+
40
+ If the underlying data is not preloaded, loads it completely.
41
+ Copies timeframe and compression settings from the source data
42
+ after it has started (some sources do autodetection).
43
+
44
+ This method ensures all necessary data is available before processing.
45
+ """
46
+ if len(self.p.dataname) == self.p.dataname.buflen():
47
+ # if data is not preloaded … do it
48
+ self.p.dataname.start()
49
+ self.p.dataname.preload()
50
+ self.p.dataname.home()
51
+
52
+ # Copy timeframe from data after start (some sources do autodetection)
53
+ self.p.timeframe = self._timeframe = self.p.dataname._timeframe
54
+ self.p.compression = self._compression = self.p.dataname._compression
55
+
56
+ super().preload()
57
+
58
+ def _load(self):
59
+ if not len(self.p.dataname):
60
+ self.p.dataname.start() # start data if not done somewhere else
61
+
62
+ # Tell the underlying source to get next data
63
+ while self.p.dataname.next():
64
+ # Try to load the data from the underlying source
65
+ if not self.p.funcfilter(self.p.dataname):
66
+ continue
67
+
68
+ # Data is allowed - Copy size which is "number of lines"
69
+ for i in range(self.p.dataname.size()):
70
+ self.lines[i][0] = self.p.dataname.lines[i][0]
71
+
72
+ return True
73
+
74
+ return False # no more data from an underlying source
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env python
2
+ """Day Steps Filter Module - Bar replay simulation.
3
+
4
+ This module provides the BarReplayerOpen filter for splitting bars
5
+ to simulate replay behavior.
6
+
7
+ Classes:
8
+ BarReplayerOpen: Splits bars into open and OHLC parts.
9
+
10
+ Example:
11
+ >>> data = bt.feeds.GenericCSVData(dataname='data.csv')
12
+ >>> data.addfilter(bt.filters.BarReplayerOpen())
13
+ >>> cerebro.adddata(data)
14
+ """
15
+
16
+
17
+ class BarReplayerOpen:
18
+ """
19
+ This filters splits a bar in two parts:
20
+
21
+ - ``Open``: the opening price of the bar will be used to deliver an
22
+ initial price bar in which the four components (OHLC) are equal
23
+
24
+ The volume/openinterest fields are zero for this initial bar
25
+
26
+ - ``OHLC``: the original bar is delivered complete with the original
27
+ ``volume``/``openinterest``
28
+
29
+ The split simulates a replay without the need to use the *replay* filter.
30
+ """
31
+
32
+ def __init__(self, data):
33
+ """Initialize the BarReplayerOpen filter.
34
+
35
+ Args:
36
+ data: The data feed to apply the filter to.
37
+ The filter sets resampling=1 and replaying=True on the data.
38
+ """
39
+ self.pendingbar = None
40
+ data.resampling = 1
41
+ data.replaying = True
42
+
43
+ def __call__(self, data):
44
+ """Process the data feed to split bars into open and OHLC parts.
45
+
46
+ This method is called for each bar in the data feed. It splits the bar
47
+ into two parts - an initial bar with only the open price (OHLC=Open)
48
+ and the original OHLC bar. This simulates intraday replay behavior.
49
+
50
+ Args:
51
+ data: The data feed containing the bar to process.
52
+
53
+ Returns:
54
+ bool: True if the length of the stream was changed,
55
+ False if it remained unchanged.
56
+ """
57
+ ret = True
58
+
59
+ # Make a copy of the new bar and remove it from stream
60
+ newbar = [data.lines[i][0] for i in range(data.size())]
61
+ data.backwards() # remove the copied bar from stream
62
+
63
+ openbar = newbar[:] # Make an open only bar
64
+ o = newbar[data.Open]
65
+ for field_idx in [data.High, data.Low, data.Close]:
66
+ openbar[field_idx] = o
67
+
68
+ # Nullify Volume/OpenInteres at the open
69
+ openbar[data.Volume] = 0.0
70
+ openbar[data.OpenInterest] = 0.0
71
+
72
+ # Overwrite the new data bar with our pending data - except start point
73
+ if self.pendingbar is not None:
74
+ data._updatebar(self.pendingbar)
75
+ ret = False
76
+
77
+ self.pendingbar = newbar # update the pending bar to the new bar
78
+ data._add2stack(openbar) # Add the openbar to the stack for processing
79
+
80
+ return ret # the length of the stream was not changed
81
+
82
+ def last(self, data):
83
+ """Called when the data is no longer producing bars
84
+ Can be called multiple times. It has the chance to (for example)
85
+ produce extra bars"""
86
+ if self.pendingbar is not None:
87
+ data.backwards() # remove delivered open bar
88
+ data._add2stack(self.pendingbar) # add remaining
89
+ self.pendingbar = None # No further action
90
+ return True # something delivered
91
+
92
+ return False # nothing delivered here
93
+
94
+
95
+ # Alias
96
+ DayStepsFilter = BarReplayerOpen
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env python
2
+ """Heikin Ashi Filter Module - Heikin Ashi candlestick filter.
3
+
4
+ This module provides the HeikinAshi filter for remodeling price
5
+ data into Heikin Ashi candlesticks.
6
+
7
+ Classes:
8
+ HeikinAshi: Creates Heikin Ashi candlesticks.
9
+
10
+ Example:
11
+ >>> data = bt.feeds.GenericCSVData(dataname='data.csv')
12
+ >>> data.addfilter(bt.filters.HeikinAshi())
13
+ >>> cerebro.adddata(data)
14
+ """
15
+
16
+ __all__ = ["HeikinAshi"]
17
+
18
+
19
+ class HeikinAshi:
20
+ """
21
+ The filter remodels the open, high, low, close to make HeikinAshi
22
+ candlesticks
23
+
24
+ See:
25
+ - https://en.wikipedia.org/wiki/Candlestick_chart#Heikin_Ashi_candlesticks
26
+ - http://stockcharts.com/school/doku.php?id=chart_school:chart_analysis:heikin_ashi
27
+
28
+ """
29
+
30
+ def __init__(self, data):
31
+ """Initialize the HeikinAshi filter.
32
+
33
+ Args:
34
+ data: The data feed to apply the filter to.
35
+ No specific parameters are required.
36
+ """
37
+
38
+ def __call__(self, data):
39
+ """Convert standard OHLC data to Heikin Ashi candlesticks.
40
+
41
+ This method transforms the OHLC data into Heikin Ashi format, which
42
+ uses the average of open, high, low, and close for the close price,
43
+ and averages the previous close and open for the current open price.
44
+
45
+ Args:
46
+ data: The data feed containing OHLC values to convert.
47
+
48
+ Returns:
49
+ bool: False (the length of data stream is unaltered).
50
+ """
51
+ o, h, low, c = data.open[0], data.high[0], data.low[0], data.close[0]
52
+
53
+ data.close[0] = ha_close0 = (o + h + low + c) / 4.0
54
+
55
+ if len(data) > 1:
56
+ data.open[0] = ha_open0 = (data.open[-1] + data.close[-1]) / 2.0
57
+ data.high[0] = max(ha_open0, ha_close0, h)
58
+ data.low[0] = min(ha_open0, ha_close0, low)
59
+
60
+ else: # len is 1, no lookback is possible
61
+ data.open[0] = ha_open0 = (o + c) / 2.0
62
+
63
+ return False # length of data stream is unaltered