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,202 @@
1
+ #!/usr/bin/env python
2
+ """TRIX Indicator Module - Triple exponential moving average slope.
3
+
4
+ This module provides the TRIX indicator developed by Jack Hutson in the
5
+ 1980s to show the rate of change of a triple smoothed moving average.
6
+
7
+ Classes:
8
+ Trix: TRIX indicator (alias: TRIX).
9
+ TrixSignal: TRIX with signal line.
10
+
11
+ Example:
12
+ class MyStrategy(bt.Strategy):
13
+ def __init__(self):
14
+ self.trix = bt.indicators.TRIX(self.data.close, period=15)
15
+
16
+ def next(self):
17
+ if self.trix[0] > 0:
18
+ self.buy()
19
+ """
20
+
21
+ import math
22
+
23
+ from . import Indicator
24
+ from .ema import EMA
25
+
26
+
27
+ class Trix(Indicator):
28
+ """
29
+ Defined by Jack Hutson in the 80s and shows the Rate of Change (%) or slope
30
+ of a triple exponentially smoothed moving average
31
+
32
+ Formula:
33
+ - ema1 = EMA(data, period)
34
+ - ema2 = EMA(ema1, period)
35
+ - ema3 = EMA(ema2, period)
36
+ - trix = 100 * (ema3 - ema3(-1)) / ema3(-1)
37
+
38
+ The final formula can be simplified to: 100 * (ema3 / ema3(-1) - 1)
39
+
40
+ The moving average used is the one originally defined by Wilder,
41
+ the SmoothedMovingAverage
42
+
43
+ See:
44
+ - https://en.wikipedia.org/wiki/Trix_(technical_analysis)
45
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:trix
46
+ """
47
+
48
+ alias = ("TRIX",)
49
+ lines = ("trix",)
50
+ params = (
51
+ ("period", 15),
52
+ ("_rocperiod", 1),
53
+ ("_movav", EMA),
54
+ )
55
+
56
+ plotinfo = {"plothlines": [0.0]}
57
+
58
+ def _plotlabel(self):
59
+ plabels = [self.p.period]
60
+ plabels += [self.p._rocperiod] * self.p.notdefault("_rocperiod")
61
+ plabels += [self.p._movav] * self.p.notdefault("_movav")
62
+ return plabels
63
+
64
+ def __init__(self):
65
+ """Initialize the TRIX indicator.
66
+
67
+ Creates triple EMA structure for TRIX calculation.
68
+ """
69
+ super().__init__()
70
+ self.ema1 = self.p._movav(self.data, period=self.p.period)
71
+ self.ema2 = self.p._movav(self.ema1, period=self.p.period)
72
+ self.ema3 = self.p._movav(self.ema2, period=self.p.period)
73
+ # minperiod = 3 * period + rocperiod
74
+ self._minperiod = max(self._minperiod, 3 * self.p.period + self.p._rocperiod - 2)
75
+
76
+ def next(self):
77
+ """Calculate TRIX for the current bar.
78
+
79
+ Formula: TRIX = 100 * (ema3 / ema3_rocperiod_ago - 1.0)
80
+ """
81
+ rocperiod = self.p._rocperiod
82
+ ema3_curr = self.ema3[0]
83
+ ema3_prev = self.ema3[-rocperiod]
84
+ if ema3_prev != 0:
85
+ self.lines.trix[0] = 100.0 * (ema3_curr / ema3_prev - 1.0)
86
+ else:
87
+ self.lines.trix[0] = 0.0
88
+
89
+ def once(self, start, end):
90
+ """Calculate TRIX in runonce mode.
91
+
92
+ Computes triple EMA rate of change percentage across all bars.
93
+ """
94
+ ema3_array = self.ema3.lines[0].array
95
+ larray = self.lines.trix.array
96
+ rocperiod = self.p._rocperiod
97
+ minperiod = 3 * self.p.period + rocperiod - 2
98
+
99
+ while len(larray) < end:
100
+ larray.append(float("nan"))
101
+
102
+ for i in range(min(minperiod, len(ema3_array))):
103
+ if i < len(larray):
104
+ larray[i] = float("nan")
105
+
106
+ for i in range(minperiod, min(end, len(ema3_array))):
107
+ ema3_curr = ema3_array[i] if i < len(ema3_array) else 0.0
108
+ ema3_prev = (
109
+ ema3_array[i - rocperiod]
110
+ if i >= rocperiod and i - rocperiod < len(ema3_array)
111
+ else 0.0
112
+ )
113
+
114
+ if (
115
+ isinstance(ema3_curr, float)
116
+ and math.isnan(ema3_curr)
117
+ or isinstance(ema3_prev, float)
118
+ and math.isnan(ema3_prev)
119
+ ):
120
+ larray[i] = float("nan")
121
+ elif ema3_prev != 0:
122
+ larray[i] = 100.0 * (ema3_curr / ema3_prev - 1.0)
123
+ else:
124
+ larray[i] = 0.0
125
+
126
+
127
+ class TrixSignal(Trix):
128
+ """
129
+ Extension of Trix with a signal line (ala MACD)
130
+
131
+ Formula:
132
+ - trix = Trix(data, period)
133
+ - signal = EMA(trix, sigperiod)
134
+
135
+ See:
136
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:trix
137
+ """
138
+
139
+ lines = ("signal",)
140
+ params = (("sigperiod", 9),)
141
+
142
+ def __init__(self):
143
+ """Initialize the TRIX Signal indicator.
144
+
145
+ Sets up signal line EMA smoothing parameters.
146
+ """
147
+ super().__init__()
148
+ self.signal_alpha = 2.0 / (1.0 + self.p.sigperiod)
149
+ self.signal_alpha1 = 1.0 - self.signal_alpha
150
+
151
+ def nextstart(self):
152
+ """Seed TRIX Signal calculation on first valid bar.
153
+
154
+ Initializes signal line with TRIX value.
155
+ """
156
+ super().next()
157
+ self.lines.signal[0] = self.lines.trix[0]
158
+
159
+ def next(self):
160
+ """Calculate TRIX and signal line for current bar.
161
+
162
+ Signal line is EMA of TRIX values.
163
+ """
164
+ super().next()
165
+ self.lines.signal[0] = (
166
+ self.lines.signal[-1] * self.signal_alpha1 + self.lines.trix[0] * self.signal_alpha
167
+ )
168
+
169
+ def once(self, start, end):
170
+ """Calculate TRIX Signal in runonce mode.
171
+
172
+ Computes signal line as EMA of TRIX values across all bars.
173
+ """
174
+ super().once(start, end)
175
+ trix_array = self.lines.trix.array
176
+ signal_array = self.lines.signal.array
177
+ signal_alpha = self.signal_alpha
178
+ signal_alpha1 = self.signal_alpha1
179
+
180
+ while len(signal_array) < end:
181
+ signal_array.append(float("nan"))
182
+
183
+ # Find first valid trix value for seed
184
+ seed_idx = -1
185
+ for i in range(len(trix_array)):
186
+ if i < len(trix_array):
187
+ val = trix_array[i]
188
+ if not (isinstance(val, float) and math.isnan(val)):
189
+ seed_idx = i
190
+ break
191
+
192
+ if seed_idx >= 0 and seed_idx < len(signal_array):
193
+ prev_signal = trix_array[seed_idx]
194
+ signal_array[seed_idx] = prev_signal
195
+
196
+ for i in range(seed_idx + 1, min(end, len(trix_array))):
197
+ trix_val = trix_array[i] if i < len(trix_array) else 0.0
198
+ if isinstance(trix_val, float) and math.isnan(trix_val):
199
+ signal_array[i] = float("nan")
200
+ else:
201
+ prev_signal = prev_signal * signal_alpha1 + trix_val * signal_alpha
202
+ signal_array[i] = prev_signal
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env python
2
+ """TSI Indicator Module - True Strength Index.
3
+
4
+ This module provides the TSI (True Strength Index) indicator developed
5
+ by William Blau for measuring momentum with double smoothing.
6
+
7
+ Classes:
8
+ TrueStrengthIndicator: TSI indicator (alias: TSI).
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.tsi = bt.indicators.TSI(self.data.close, period1=25, period2=13)
14
+
15
+ def next(self):
16
+ if self.tsi[0] > 0:
17
+ self.buy()
18
+ """
19
+
20
+ from . import Indicator
21
+ from .ema import ExponentialMovingAverage
22
+
23
+
24
+ class TrueStrengthIndicator(Indicator):
25
+ """
26
+ The True Strength Indicators was first introduced in Stocks & Commodities
27
+ Magazine by its author William Blau. It measures momentum with a double
28
+ exponential (default) of the prices.
29
+
30
+ It shows divergence if the extremes keep on growign but closing prices
31
+ do not in the same manner (distance to the extremes grows)
32
+
33
+ Formula:
34
+ - price_change = close - close(pchange periods ago)
35
+ - sm1_simple = EMA(price_close_change, period1)
36
+ - sm1_double = EMA(sm1_simple, period2)
37
+ - sm2_simple = EMA(abs(price_close_change), period1)
38
+ - sm2_double = EMA(sm2_simple, period2)
39
+ - tsi = 100.0 * sm1_double / sm2_double
40
+
41
+ See:
42
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:true_strength_index
43
+
44
+ Params
45
+
46
+ - ``period1``: the period for the first smoothing
47
+ - ``period2``: the period for the second smoothing
48
+ - ``pchange``: the lookback period for the price change
49
+ - ``_movav``: the moving average to apply for the smoothing
50
+ """
51
+
52
+ alias = ("TSI",)
53
+ params = (
54
+ ("period1", 25),
55
+ ("period2", 13),
56
+ ("pchange", 1),
57
+ ("_movav", ExponentialMovingAverage),
58
+ )
59
+ lines = ("tsi",)
60
+
61
+ def __init__(self):
62
+ """Initialize the TSI indicator.
63
+
64
+ Calculates alpha values for double smoothing and sets
65
+ minimum period based on pchange + period1 + period2.
66
+ """
67
+ super().__init__()
68
+ # Store sub-indicators for direct calculation
69
+ self.alpha1 = 2.0 / (1.0 + self.p.period1)
70
+ self.alpha1_1 = 1.0 - self.alpha1
71
+ self.alpha2 = 2.0 / (1.0 + self.p.period2)
72
+ self.alpha2_1 = 1.0 - self.alpha2
73
+
74
+ self._sm1 = 0.0
75
+ self._sm12 = 0.0
76
+ self._sm2 = 0.0
77
+ self._sm22 = 0.0
78
+
79
+ self.addminperiod(self.p.pchange + self.p.period1 + self.p.period2)
80
+
81
+ def nextstart(self):
82
+ """Seed TSI calculation on first valid bar.
83
+
84
+ Initializes smoothed momentum values with first price change.
85
+ """
86
+ pc = self.data[0] - self.data[-self.p.pchange]
87
+ self._sm1 = pc
88
+ self._sm12 = pc
89
+ self._sm2 = abs(pc)
90
+ self._sm22 = abs(pc)
91
+
92
+ if self._sm22 != 0:
93
+ self.lines.tsi[0] = 100.0 * self._sm12 / self._sm22
94
+ else:
95
+ self.lines.tsi[0] = 0.0
96
+
97
+ def next(self):
98
+ """Calculate TSI for the current bar.
99
+
100
+ Applies double smoothing to price change and absolute price change,
101
+ then computes the ratio as a percentage.
102
+ """
103
+ pc = self.data[0] - self.data[-self.p.pchange]
104
+
105
+ self._sm1 = self._sm1 * self.alpha1_1 + pc * self.alpha1
106
+ self._sm12 = self._sm12 * self.alpha2_1 + self._sm1 * self.alpha2
107
+
108
+ self._sm2 = self._sm2 * self.alpha1_1 + abs(pc) * self.alpha1
109
+ self._sm22 = self._sm22 * self.alpha2_1 + self._sm2 * self.alpha2
110
+
111
+ if self._sm22 != 0:
112
+ self.lines.tsi[0] = 100.0 * self._sm12 / self._sm22
113
+ else:
114
+ self.lines.tsi[0] = 0.0
115
+
116
+ def once(self, start, end):
117
+ """Calculate TSI in runonce mode.
118
+
119
+ Computes double-smoothed momentum values and TSI ratio
120
+ across all bars.
121
+ """
122
+ darray = self.data.array
123
+ larray = self.lines.tsi.array
124
+ pchange = self.p.pchange
125
+ alpha1 = self.alpha1
126
+ alpha1_1 = self.alpha1_1
127
+ alpha2 = self.alpha2
128
+ alpha2_1 = self.alpha2_1
129
+ minperiod = pchange + self.p.period1 + self.p.period2
130
+
131
+ while len(larray) < end:
132
+ larray.append(float("nan"))
133
+
134
+ for i in range(min(minperiod - 1, len(darray))):
135
+ if i < len(larray):
136
+ larray[i] = float("nan")
137
+
138
+ sm1 = 0.0
139
+ sm12 = 0.0
140
+ sm2 = 0.0
141
+ sm22 = 0.0
142
+
143
+ for i in range(pchange, min(end, len(darray))):
144
+ pc = darray[i] - darray[i - pchange]
145
+
146
+ sm1 = sm1 * alpha1_1 + pc * alpha1
147
+ sm12 = sm12 * alpha2_1 + sm1 * alpha2
148
+ sm2 = sm2 * alpha1_1 + abs(pc) * alpha1
149
+ sm22 = sm22 * alpha2_1 + sm2 * alpha2
150
+
151
+ if i >= minperiod - 1:
152
+ if sm22 != 0:
153
+ larray[i] = 100.0 * sm12 / sm22
154
+ else:
155
+ larray[i] = 0.0
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env python
2
+ """Ultimate Oscillator Module - Ultimate Oscillator indicator.
3
+
4
+ This module provides the Ultimate Oscillator indicator which combines
5
+ multiple timeframes to reduce false signals.
6
+
7
+ Classes:
8
+ UltimateOscillator: Ultimate Oscillator indicator.
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.uo = bt.indicators.UltimateOscillator(self.data)
14
+
15
+ def next(self):
16
+ if self.uo[0] > 70:
17
+ self.sell()
18
+ """
19
+
20
+ from . import Indicator, TrueLow, TrueRange
21
+
22
+
23
+ class UltimateOscillator(Indicator):
24
+ """
25
+ Formula:
26
+ # Buying Pressure = Close - TrueLow
27
+ BP = Close - Minimum (Low or Prior Close)
28
+
29
+ # TrueRange = TrueHigh - TrueLow
30
+ TR = Maximum (High or Prior Close) - Minimum (Low or Prior Close)
31
+
32
+ Average7 = (7-period BP Sum) / (7-period TR Sum)
33
+ Average14 = (14-period BP Sum) / (14-period TR Sum)
34
+ Average28 = (28-period BP Sum) / (28-period TR Sum)
35
+
36
+ UO = 100 x [(4 x Average7)+(2 x Average14)+Average28]/(4+2+1)
37
+
38
+ See:
39
+
40
+ - https://en.wikipedia.org/wiki/Ultimate_oscillator
41
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ultimate_oscillator
42
+ """
43
+
44
+ lines = ("uo",)
45
+
46
+ params = (
47
+ ("p1", 7),
48
+ ("p2", 14),
49
+ ("p3", 28),
50
+ ("upperband", 70.0),
51
+ ("lowerband", 30.0),
52
+ )
53
+
54
+ def _plotinit(self):
55
+ baseticks = [10.0, 50.0, 90.0]
56
+ hlines = [self.p.upperband, self.p.lowerband]
57
+
58
+ # Plot lines at 0 & 100 to make the scale complete + upper/lower/bands
59
+ self.plotinfo.plotyhlines = hlines
60
+ # Plot ticks at "baseticks" + the user specified upper/lower bands
61
+ self.plotinfo.plotyticks = baseticks + hlines
62
+
63
+ def __init__(self):
64
+ """Initialize the Ultimate Oscillator indicator.
65
+
66
+ Creates TrueLow and TrueRange indicators for BP/TR calculations.
67
+ """
68
+ super().__init__()
69
+ self.truelow = TrueLow(self.data)
70
+ self.truerange = TrueRange(self.data)
71
+ # TrueRange/TrueLow already contribute minperiod=2 (they need close[-1]).
72
+ # We need a total minperiod of p3 + 1 because we read close[-i]/truelow[-i]/
73
+ # truerange[-i] for i in [0, p3-1], so we need p3 historical bars plus the
74
+ # current one. addminperiod(p3 + 1) accumulates correctly under the new
75
+ # max-path semantics in LineMultiple.addminperiod.
76
+ self.addminperiod(self.p.p3 + 1)
77
+
78
+ def next(self):
79
+ """Calculate Ultimate Oscillator for the current bar.
80
+
81
+ Combines 3 timeframes (p1, p2, p3) to reduce false signals.
82
+ """
83
+ p1, p2, p3 = self.p.p1, self.p.p2, self.p.p3
84
+
85
+ # Calculate BP and TR sums for each period
86
+ bp_sum1 = tr_sum1 = 0.0
87
+ bp_sum2 = tr_sum2 = 0.0
88
+ bp_sum3 = tr_sum3 = 0.0
89
+
90
+ for i in range(p3):
91
+ bp = self.data.close[-i] - self.truelow[-i]
92
+ tr = self.truerange[-i]
93
+
94
+ if i < p1:
95
+ bp_sum1 += bp
96
+ tr_sum1 += tr
97
+ if i < p2:
98
+ bp_sum2 += bp
99
+ tr_sum2 += tr
100
+ bp_sum3 += bp
101
+ tr_sum3 += tr
102
+
103
+ av7 = bp_sum1 / tr_sum1 if tr_sum1 != 0 else 0.0
104
+ av14 = bp_sum2 / tr_sum2 if tr_sum2 != 0 else 0.0
105
+ av28 = bp_sum3 / tr_sum3 if tr_sum3 != 0 else 0.0
106
+
107
+ factor = 100.0 / 7.0
108
+ self.lines.uo[0] = (4.0 * factor) * av7 + (2.0 * factor) * av14 + factor * av28
109
+
110
+ def once(self, start, end):
111
+ """Calculate Ultimate Oscillator in runonce mode.
112
+
113
+ Combines BP/TR sums across 3 timeframes for all bars.
114
+ """
115
+ close_array = self.data.close.array
116
+ tl_array = self.truelow.lines[0].array
117
+ tr_array = self.truerange.lines[0].array
118
+ larray = self.lines.uo.array
119
+ p1, p2, p3 = self.p.p1, self.p.p2, self.p.p3
120
+
121
+ while len(larray) < end:
122
+ larray.append(float("nan"))
123
+
124
+ for i in range(min(p3 - 1, len(close_array))):
125
+ if i < len(larray):
126
+ larray[i] = float("nan")
127
+
128
+ for i in range(p3 - 1, min(end, len(close_array), len(tl_array), len(tr_array))):
129
+ bp_sum1 = tr_sum1 = 0.0
130
+ bp_sum2 = tr_sum2 = 0.0
131
+ bp_sum3 = tr_sum3 = 0.0
132
+
133
+ for j in range(p3):
134
+ idx = i - j
135
+ if (
136
+ idx >= 0
137
+ and idx < len(close_array)
138
+ and idx < len(tl_array)
139
+ and idx < len(tr_array)
140
+ ):
141
+ bp = close_array[idx] - tl_array[idx]
142
+ tr = tr_array[idx]
143
+
144
+ if j < p1:
145
+ bp_sum1 += bp
146
+ tr_sum1 += tr
147
+ if j < p2:
148
+ bp_sum2 += bp
149
+ tr_sum2 += tr
150
+ bp_sum3 += bp
151
+ tr_sum3 += tr
152
+
153
+ av7 = bp_sum1 / tr_sum1 if tr_sum1 != 0 else 0.0
154
+ av14 = bp_sum2 / tr_sum2 if tr_sum2 != 0 else 0.0
155
+ av28 = bp_sum3 / tr_sum3 if tr_sum3 != 0 else 0.0
156
+
157
+ factor = 100.0 / 7.0
158
+ larray[i] = (4.0 * factor) * av7 + (2.0 * factor) * av14 + factor * av28
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env python
2
+ """Vortex Indicator Module - Vortex trend indicator.
3
+
4
+ This module provides the Vortex indicator for identifying trend
5
+ direction and strength.
6
+
7
+ Classes:
8
+ Vortex: Vortex indicator with VI+ and VI- lines.
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.vortex = bt.indicators.Vortex(self.data, period=14)
14
+
15
+ def next(self):
16
+ # VI+ crossing above VI- indicates uptrend
17
+ if self.vortex.vi_plus[0] > self.vortex.vi_minus[0]:
18
+ self.buy()
19
+ # VI- crossing above VI+ indicates downtrend
20
+ elif self.vortex.vi_minus[0] > self.vortex.vi_plus[0]:
21
+ self.sell()
22
+ """
23
+
24
+ from . import Indicator, Max, SumN
25
+
26
+
27
+ class Vortex(Indicator):
28
+ """
29
+ See:
30
+ - http://www.vortexindicator.com/VFX_VORTEX.PDF
31
+
32
+ """
33
+
34
+ lines = (
35
+ "vi_plus",
36
+ "vi_minus",
37
+ )
38
+
39
+ params = (("period", 14),)
40
+
41
+ plotlines = {"vi_plus": {"_name": "+VI"}, "vi_minus": {"_name": "-VI"}}
42
+
43
+ def __init__(self):
44
+ """Initialize the Vortex indicator.
45
+
46
+ Sets up VI+ and VI- calculations based on True Range and
47
+ directional movement.
48
+ """
49
+ h0l1 = abs(self.data.high(0) - self.data.low(-1))
50
+ vm_plus = SumN(h0l1, period=self.p.period)
51
+
52
+ l0h1 = abs(self.data.low(0) - self.data.high(-1))
53
+ vm_minus = SumN(l0h1, period=self.p.period)
54
+
55
+ h0c1 = abs(self.data.high(0) - self.data.close(-1))
56
+ l0c1 = abs(self.data.low(0) - self.data.close(-1))
57
+ h0l0 = abs(self.data.high(0) - self.data.low(0))
58
+
59
+ tr = SumN(Max(h0l0, h0c1, l0c1), period=self.p.period)
60
+
61
+ self.l.vi_plus = vm_plus / tr
62
+ self.l.vi_minus = vm_minus / tr