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,96 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import Indicator
9
+
10
+ __all__ = [
11
+ "AroonHornSignIndicator",
12
+ ]
13
+
14
+
15
+ class AroonHornSignIndicator(Indicator):
16
+ """Reconstructs AroonHornSign indicator.
17
+
18
+ BULLS = 100 - (bars_since_highest_high + 0.5) * 100 / AroonPeriod
19
+ BEARS = 100 - (bars_since_lowest_low + 0.5) * 100 / AroonPeriod
20
+ trend = +1 if BULLS > BEARS and BULLS >= 50
21
+ trend = -1 if BULLS < BEARS and BEARS >= 50
22
+ BullsAroon (buy arrow) when trend flips from -1 to +1: low - ATR*3/8
23
+ BearsAroon (sell arrow) when trend flips from +1 to -1: high + ATR*3/8
24
+ Buffers: 0=BearsAroon(sell), 1=BullsAroon(buy).
25
+ """
26
+
27
+ lines = ("bears_aroon", "bulls_aroon")
28
+ params = (
29
+ ("aroon_period", 9),
30
+ ("atr_period", 10),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Initialize Aroon window, ATR window, and trend tracking state."""
35
+ self._ap = int(self.p.aroon_period)
36
+ self._atr_p = int(self.p.atr_period)
37
+ self._trend_prev = 0
38
+ self.addminperiod(max(self._ap, self._atr_p) + 3)
39
+
40
+ def _calc_atr(self):
41
+ period = self._atr_p
42
+ total = 0.0
43
+ for i in range(period):
44
+ h = float(self.data.high[-i])
45
+ low_price = float(self.data.low[-i])
46
+ if i + 1 < len(self.data):
47
+ pc = float(self.data.close[-(i + 1)])
48
+ tr = max(h - low_price, abs(h - pc), abs(low_price - pc))
49
+ else:
50
+ tr = h - low_price
51
+ total += tr
52
+ return total / period
53
+
54
+ def next(self):
55
+ """Compute bear/bull arrow levels based on trend flips and ATR displacement."""
56
+ ap = self._ap
57
+
58
+ # Find bars since highest high and lowest low within AroonPeriod
59
+ max_idx = 0
60
+ max_val = float(self.data.high[0])
61
+ min_idx = 0
62
+ min_val = float(self.data.low[0])
63
+ for i in range(ap):
64
+ h = float(self.data.high[-i])
65
+ low_price = float(self.data.low[-i])
66
+ if h > max_val:
67
+ max_val = h
68
+ max_idx = i
69
+ if low_price < min_val:
70
+ min_val = low_price
71
+ min_idx = i
72
+
73
+ bulls = 100.0 - (max_idx + 0.5) * 100.0 / ap
74
+ bears = 100.0 - (min_idx + 0.5) * 100.0 / ap
75
+
76
+ trend = self._trend_prev
77
+ if bulls > bears and bulls >= 50:
78
+ trend = 1
79
+ if bulls < bears and bears >= 50:
80
+ trend = -1
81
+
82
+ bu = 0.0
83
+ be = 0.0
84
+
85
+ if self._trend_prev < 0 and trend > 0:
86
+ atr = self._calc_atr()
87
+ bu = float(self.data.low[0]) - atr * 3.0 / 8.0
88
+
89
+ if self._trend_prev > 0 and trend < 0:
90
+ atr = self._calc_atr()
91
+ be = float(self.data.high[0]) + atr * 3.0 / 8.0
92
+
93
+ self._trend_prev = trend
94
+
95
+ self.lines.bears_aroon[0] = be
96
+ self.lines.bulls_aroon[0] = bu
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ATR,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "AroonOscillatorSignAlert",
15
+ ]
16
+
17
+
18
+ class AroonOscillatorSignAlert(Indicator):
19
+ """Aroon oscillator alert indicator with buy/sell level trigger lines."""
20
+
21
+ lines = ("sell", "buy", "osc")
22
+ params = (
23
+ ("atr_period", 14),
24
+ ("aroon_period", 9),
25
+ ("up_level", 50),
26
+ ("dn_level", -50),
27
+ )
28
+
29
+ def __init__(self):
30
+ """Initialize ATR/Aroon period constraints and ATR helper indicator."""
31
+ self.addminperiod(max(int(self.p.atr_period), int(self.p.aroon_period)) + 3)
32
+ self.atr = ATR(self.data, period=int(self.p.atr_period))
33
+
34
+ def next(self):
35
+ """Compute oscillator and emit trigger prices when levels are crossed."""
36
+ p = int(self.p.aroon_period)
37
+ highs = [float(self.data.high[-i]) for i in range(p)]
38
+ lows = [float(self.data.low[-i]) for i in range(p)]
39
+ highest = highs.index(max(highs))
40
+ lowest = lows.index(min(lows))
41
+ osc = 100.0 * (highest - lowest) / float(p)
42
+ prev = float(self.lines.osc[-1]) if len(self) > 1 else osc
43
+ self.lines.osc[0] = osc
44
+ self.lines.buy[0] = float("nan")
45
+ self.lines.sell[0] = float("nan")
46
+ atr = float(self.atr[0])
47
+ if osc > float(self.p.dn_level) and prev <= float(self.p.dn_level):
48
+ self.lines.buy[0] = float(self.data.low[0]) - atr * 3.0 / 8.0
49
+ if osc < float(self.p.up_level) and prev >= float(self.p.up_level):
50
+ self.lines.sell[0] = float(self.data.high[0]) + atr * 3.0 / 8.0
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import Indicator
9
+
10
+ __all__ = [
11
+ "ArrowsCurvesIndicator",
12
+ ]
13
+
14
+
15
+ class ArrowsCurvesIndicator(Indicator):
16
+ """Custom Arrows and Curves technical indicator.
17
+
18
+ Calculates channel boundaries (smax, smin, smax2, smin2) based on highest high and lowest low windows
19
+ and returns trade entry signals (buy, sell, buy_stop, sell_stop).
20
+ """
21
+
22
+ lines = ("sell", "buy", "sell_stop", "buy_stop", "smax", "smin", "smax2", "smin2")
23
+ params = (
24
+ ("ssp", 20),
25
+ ("channel", 0),
26
+ ("ch_stop", 30),
27
+ ("relay", 10),
28
+ )
29
+
30
+ def __init__(self):
31
+ """Initializes trends, state flags, and sets indicator minimum period requirement."""
32
+ self.addminperiod(self.p.ssp + self.p.relay + 2)
33
+ self._uptrend = False
34
+ self._old = False
35
+ self._uptrend2 = False
36
+ self._old2 = False
37
+
38
+ def next(self):
39
+ """Calculates channel lines and signals for each bar.
40
+
41
+ Generates buy/sell and buy_stop/sell_stop triggers based on price crossovers
42
+ and trend state switches.
43
+ """
44
+ if len(self.data) <= self.p.ssp + self.p.relay:
45
+ for line in self.lines:
46
+ line[0] = 0.0
47
+ return
48
+
49
+ high_window = [
50
+ float(self.data.high[-shift])
51
+ for shift in range(self.p.relay, self.p.relay + self.p.ssp)
52
+ ]
53
+ low_window = [
54
+ float(self.data.low[-shift]) for shift in range(self.p.relay, self.p.relay + self.p.ssp)
55
+ ]
56
+ close0 = float(self.data.close[0])
57
+ high_val = max(high_window)
58
+ low_val = min(low_window)
59
+ smax = high_val - (low_val - high_val) * self.p.channel / 100.0
60
+ smin = low_val + (high_val - low_val) * self.p.channel / 100.0
61
+ smax2 = high_val - (high_val - low_val) * (self.p.channel + self.p.ch_stop) / 100.0
62
+ smin2 = low_val + (high_val - low_val) * (self.p.channel + self.p.ch_stop) / 100.0
63
+
64
+ sell_signal = 0.0
65
+ buy_signal = 0.0
66
+ sell_stop = 0.0
67
+ buy_stop = 0.0
68
+
69
+ uptrend = self._uptrend
70
+ uptrend2 = self._uptrend2
71
+ old = self._old
72
+ old2 = self._old2
73
+
74
+ if close0 < smin and close0 < smax and uptrend2 is True:
75
+ uptrend = False
76
+ if close0 > smax and close0 > smin and uptrend2 is False:
77
+ uptrend = True
78
+ if (close0 > smax2 or close0 > smin2) and uptrend is False:
79
+ uptrend2 = False
80
+ if (close0 < smin2 or close0 < smax2) and uptrend is True:
81
+ uptrend2 = True
82
+
83
+ if close0 < smin and close0 < smax and uptrend2 is False:
84
+ sell_signal = low_val
85
+ uptrend2 = True
86
+ if close0 > smax and close0 > smin and uptrend2 is True:
87
+ buy_signal = high_val
88
+ uptrend2 = False
89
+
90
+ if uptrend != old and uptrend is False:
91
+ sell_signal = low_val
92
+ if uptrend != old and uptrend is True:
93
+ buy_signal = high_val
94
+
95
+ if uptrend2 != old2 and uptrend2 is True:
96
+ buy_stop = smax2
97
+ if uptrend2 != old2 and uptrend2 is False:
98
+ sell_stop = smin2
99
+
100
+ self.lines.sell[0] = sell_signal
101
+ self.lines.buy[0] = buy_signal
102
+ self.lines.sell_stop[0] = sell_stop
103
+ self.lines.buy_stop[0] = buy_stop
104
+ self.lines.smax[0] = smax
105
+ self.lines.smin[0] = smin
106
+ self.lines.smax2[0] = smax2
107
+ self.lines.smin2[0] = smin2
108
+
109
+ self._old = uptrend
110
+ self._old2 = uptrend2
111
+ self._uptrend = uptrend
112
+ self._uptrend2 = uptrend2
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import Indicator
9
+
10
+ __all__ = [
11
+ "ASCtrendIndicator",
12
+ ]
13
+
14
+
15
+ def _wpr(highs, lows, close, period):
16
+ """Return Williams %R for the last bar given arrays of length >= period."""
17
+ hh = max(highs[-period:])
18
+ ll = min(lows[-period:])
19
+ if hh == ll:
20
+ return 0.0
21
+ return -100.0 * (hh - close) / (hh - ll)
22
+
23
+
24
+ class ASCtrendIndicator(Indicator):
25
+ """Reconstructs ASCtrend from its MQ5 source.
26
+
27
+ Outputs:
28
+ - buy_arrow : non-zero price level when a buy arrow fires
29
+ - sell_arrow: non-zero price level when a sell arrow fires
30
+ """
31
+
32
+ lines = ("buy_arrow", "sell_arrow")
33
+ params = (("risk", 4),)
34
+
35
+ def __init__(self):
36
+ """Derive %R thresholds/periods from ``risk`` and reserve warm-up bars."""
37
+ self._x1 = 67 + int(self.p.risk)
38
+ self._x2 = 33 - int(self.p.risk)
39
+ self._wpr_periods = [3, 4, 3 + int(self.p.risk) * 2]
40
+ self._value10 = 2 # default WPR index
41
+ min_period = max(3 + int(self.p.risk) * 2, 4) + 1
42
+ # need enough history for ATR-style range calc (10 bars) + WPR look-back
43
+ self.addminperiod(max(min_period, 12))
44
+
45
+ # -- helpers operating on self.data (signal-timeframe feed) --
46
+ def _get_wpr_val(self, period_idx, ago):
47
+ """Compute WPR(period) at bar shifted by -ago from current."""
48
+ period = self._wpr_periods[period_idx]
49
+ n = len(self.data)
50
+ idx = n - 1 - ago
51
+ if idx < period:
52
+ return 0.0
53
+ highs = [float(self.data.high.array[i]) for i in range(idx - period + 1, idx + 1)]
54
+ lows = [float(self.data.low.array[i]) for i in range(idx - period + 1, idx + 1)]
55
+ close_val = float(self.data.close.array[idx])
56
+ return _wpr(highs, lows, close_val, period)
57
+
58
+ def next(self):
59
+ """Emit ASCtrend buy/sell arrows from the %R band transitions per bar."""
60
+ risk = int(self.p.risk)
61
+ x1 = self._x1
62
+ x2 = self._x2
63
+
64
+ # --- ATR-style average range (10 bars) ---
65
+ total_range = 0.0
66
+ for i in range(1, 11):
67
+ hi = float(self.data.high[-i])
68
+ lo = float(self.data.low[-i])
69
+ prev_close = float(self.data.close[-(i + 1)]) if len(self.data) > i + 1 else lo
70
+ true_range = max(hi - lo, abs(hi - prev_close), abs(prev_close - lo))
71
+ total_range += true_range
72
+ avg_range = total_range / 10.0
73
+ half_range = avg_range * 0.5
74
+
75
+ # --- MRO1 / MRO2: look back for WPR threshold breach ---
76
+ value10 = self._value10
77
+ value11 = value10
78
+
79
+ # MRO1: check if WPR(3) crossed > x1 recently
80
+ mro1 = -1
81
+ for k in range(1, risk * 2 + 1):
82
+ if len(self.data) <= k:
83
+ break
84
+ w = 100.0 - abs(self._get_wpr_val(0, k)) # WPR_Handle[0] period=3
85
+ if w > x1:
86
+ mro1 = k
87
+ break
88
+
89
+ # MRO2: check if WPR(4) crossed < x2 recently
90
+ mro2 = -1
91
+ for k in range(1, risk * 2 + 1):
92
+ if len(self.data) <= k:
93
+ break
94
+ w = 100.0 - abs(self._get_wpr_val(1, k)) # WPR_Handle[1] period=4
95
+ if w < x2:
96
+ mro2 = k
97
+ break
98
+
99
+ if mro1 > -1:
100
+ value11 = 0
101
+ else:
102
+ value11 = value10
103
+ if mro2 > -1:
104
+ value11 = 1
105
+ else:
106
+ value11 = value10
107
+
108
+ # Current WPR value with the selected period
109
+ wpr_raw = self._get_wpr_val(value11, 0)
110
+ value2 = 100.0 - abs(wpr_raw)
111
+
112
+ buy_val = 0.0
113
+ sell_val = 0.0
114
+ cur_high = float(self.data.high[0])
115
+ cur_low = float(self.data.low[0])
116
+
117
+ if value2 < x2:
118
+ # look back for transition from neutral zone to >x1
119
+ iii = 1
120
+ vel = 0.0
121
+ while len(self.data) > iii:
122
+ vel = 100.0 - abs(self._get_wpr_val(value11, iii))
123
+ if x2 <= vel <= x1:
124
+ iii += 1
125
+ else:
126
+ break
127
+ if vel > x1:
128
+ sell_val = cur_high + half_range
129
+
130
+ if value2 > x1:
131
+ iii = 1
132
+ vel = 0.0
133
+ while len(self.data) > iii:
134
+ vel = 100.0 - abs(self._get_wpr_val(value11, iii))
135
+ if x2 <= vel <= x1:
136
+ iii += 1
137
+ else:
138
+ break
139
+ if vel < x2:
140
+ buy_val = cur_low - half_range
141
+
142
+ self.lines.buy_arrow[0] = buy_val
143
+ self.lines.sell_arrow[0] = sell_val
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import Indicator
9
+
10
+ __all__ = [
11
+ "AsimmetricStochNRIndicator",
12
+ ]
13
+
14
+
15
+ class AsimmetricStochNRIndicator(Indicator):
16
+ """Asymmetric stochastic oscillator indicator with dynamic MA smoothing."""
17
+
18
+ lines = (
19
+ "stoch",
20
+ "signal",
21
+ )
22
+ params = (
23
+ ("kperiod_short", 5),
24
+ ("kperiod_long", 12),
25
+ ("dmethod", "sma"),
26
+ ("dperiod", 7),
27
+ ("dphase", 15),
28
+ ("slowing", 3),
29
+ ("price_field", "lowhigh"),
30
+ ("sens", 7),
31
+ ("overbought", 80),
32
+ ("oversold", 20),
33
+ )
34
+
35
+ def __init__(self):
36
+ """Initialize period state and minimum bar requirements."""
37
+ self._kperiod0 = int(self.p.kperiod_short)
38
+ self._kperiod1 = int(self.p.kperiod_short)
39
+ self.addminperiod(
40
+ max(self.p.kperiod_short, self.p.kperiod_long) + self.p.slowing + self.p.dperiod + 5
41
+ )
42
+
43
+ def _stoch_value(self, bar=0):
44
+ max_value = 0.0
45
+ min_value = 0.0
46
+ c_value = 0.0
47
+ for j in range(bar, bar + int(self.p.slowing)):
48
+ if str(self.p.price_field).lower() == "closeclose":
49
+ window_max = max(
50
+ float(self.data.close[-idx]) for idx in range(j, j + self._kperiod0)
51
+ )
52
+ window_min = min(
53
+ float(self.data.close[-idx]) for idx in range(j, j + self._kperiod1)
54
+ )
55
+ else:
56
+ window_max = max(
57
+ float(self.data.high[-idx]) for idx in range(j, j + self._kperiod0)
58
+ )
59
+ window_min = min(float(self.data.low[-idx]) for idx in range(j, j + self._kperiod1))
60
+ max_value += window_max
61
+ min_value += window_min
62
+ c_value += float(self.data.close[-j])
63
+ sens_total = float(self.p.sens) * int(self.p.slowing)
64
+ delta = max_value - min_value
65
+ diff = sens_total - delta
66
+ if diff > 0:
67
+ delta = sens_total
68
+ min_value -= diff / 2.0
69
+ if delta:
70
+ return 100.0 * (c_value - min_value) / delta
71
+ return -2.0
72
+
73
+ def next(self):
74
+ """Compute current `stoch` and `signal` values using the active periods."""
75
+ prev_signal = float(self.lines.signal[-1]) if len(self) > 1 else float("nan")
76
+ self.lines.stoch[0] = self._stoch_value(0)
77
+ values = [
78
+ float(self.lines.stoch[-idx])
79
+ for idx in range(min(len(self), int(self.p.dperiod)) - 1, -1, -1)
80
+ ]
81
+ self.lines.signal[0] = self._ma_window_value(values, str(self.p.dmethod), prev_signal)
82
+ if prev_signal > float(self.p.overbought):
83
+ self._kperiod0 = int(self.p.kperiod_short)
84
+ self._kperiod1 = int(self.p.kperiod_long)
85
+ if prev_signal < float(self.p.oversold):
86
+ self._kperiod0 = int(self.p.kperiod_long)
87
+ self._kperiod1 = int(self.p.kperiod_short)
88
+
89
+ def _ma_window_value(self, values, method, previous=None):
90
+ if not values:
91
+ return float("nan")
92
+ period = max(1, int(self.p.dperiod))
93
+ mode = str(method).lower()
94
+ value = float(values[-1])
95
+ if mode in {"ema", "mode_ema"}:
96
+ if previous is None or previous != previous:
97
+ return value
98
+ alpha = 2.0 / (period + 1.0)
99
+ return previous + alpha * (value - previous)
100
+ if mode in {"smma", "mode_smma"}:
101
+ if previous is None or previous != previous:
102
+ return value
103
+ return ((period - 1.0) * previous + value) / period
104
+ if mode in {"lwma", "wma", "mode_lwma", "jjma", "mode_jjma"}:
105
+ weights = list(range(1, len(values) + 1))
106
+ return sum(v * w for v, w in zip(values, weights)) / sum(weights)
107
+ return sum(values) / len(values)
108
+
109
+ def _stoch_value_at(self, i, high_array, low_array, close_array, kperiod0, kperiod1):
110
+ max_value = 0.0
111
+ min_value = 0.0
112
+ c_value = 0.0
113
+ slowing = int(self.p.slowing)
114
+ if i - slowing + 1 < 0:
115
+ return float("nan")
116
+ closeclose = str(self.p.price_field).lower() == "closeclose"
117
+ for j in range(slowing):
118
+ bar = i - j
119
+ if bar - max(kperiod0, kperiod1) + 1 < 0:
120
+ return float("nan")
121
+ if closeclose:
122
+ window_max = max(
123
+ float(close_array[idx]) for idx in range(bar - kperiod0 + 1, bar + 1)
124
+ )
125
+ window_min = min(
126
+ float(close_array[idx]) for idx in range(bar - kperiod1 + 1, bar + 1)
127
+ )
128
+ else:
129
+ window_max = max(
130
+ float(high_array[idx]) for idx in range(bar - kperiod0 + 1, bar + 1)
131
+ )
132
+ window_min = min(
133
+ float(low_array[idx]) for idx in range(bar - kperiod1 + 1, bar + 1)
134
+ )
135
+ max_value += window_max
136
+ min_value += window_min
137
+ c_value += float(close_array[bar])
138
+ sens_total = float(self.p.sens) * slowing
139
+ delta = max_value - min_value
140
+ diff = sens_total - delta
141
+ if diff > 0:
142
+ delta = sens_total
143
+ min_value -= diff / 2.0
144
+ if delta:
145
+ return 100.0 * (c_value - min_value) / delta
146
+ return -2.0
147
+
148
+ def _ma_value_at(self, values, i, previous):
149
+ period = max(1, int(self.p.dperiod))
150
+ mode = str(self.p.dmethod).lower()
151
+ float(values[i])
152
+ start = max(0, i - period + 1)
153
+ window = [float(values[idx]) for idx in range(start, i + 1)]
154
+ return self._ma_window_value(window, mode, previous)
155
+
156
+ def once(self, start, end):
157
+ """Batch compute indicator lines for historical range in one pass."""
158
+ high_array = self.data.high.array
159
+ low_array = self.data.low.array
160
+ close_array = self.data.close.array
161
+ stoch_line = self.lines.stoch.array
162
+ signal_line = self.lines.signal.array
163
+ for line in (stoch_line, signal_line):
164
+ while len(line) < end:
165
+ line.append(float("nan"))
166
+
167
+ kperiod0 = int(self.p.kperiod_short)
168
+ kperiod1 = int(self.p.kperiod_short)
169
+ previous_signal = None
170
+ actual_end = min(end, len(high_array), len(low_array), len(close_array))
171
+ for i in range(start, actual_end):
172
+ prev_signal_for_state = previous_signal
173
+ stoch = self._stoch_value_at(i, high_array, low_array, close_array, kperiod0, kperiod1)
174
+ stoch_line[i] = stoch
175
+ signal = self._ma_value_at(stoch_line, i, previous_signal)
176
+ signal_line[i] = signal
177
+ previous_signal = signal
178
+ if prev_signal_for_state is not None and prev_signal_for_state > float(
179
+ self.p.overbought
180
+ ):
181
+ kperiod0 = int(self.p.kperiod_short)
182
+ kperiod1 = int(self.p.kperiod_long)
183
+ if prev_signal_for_state is not None and prev_signal_for_state < float(self.p.oversold):
184
+ kperiod0 = int(self.p.kperiod_long)
185
+ kperiod1 = int(self.p.kperiod_short)
186
+ self._kperiod0 = kperiod0
187
+ self._kperiod1 = kperiod1