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,85 @@
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
+ import backtrader.functions as btfunc
9
+
10
+ from .. import (
11
+ EMA,
12
+ Highest,
13
+ Indicator,
14
+ Lowest,
15
+ )
16
+
17
+ __all__ = [
18
+ "BlauTSStochastic",
19
+ ]
20
+
21
+
22
+ def _price_series(data, mode):
23
+ key = str(mode).lower()
24
+ if key in ("1", "close", "price_close"):
25
+ return data.close
26
+ if key in ("2", "open", "price_open"):
27
+ return data.open
28
+ if key in ("3", "high", "price_high"):
29
+ return data.high
30
+ if key in ("4", "low", "price_low"):
31
+ return data.low
32
+ if key in ("5", "median", "price_median"):
33
+ return (data.high + data.low) / 2.0
34
+ if key in ("6", "typical", "price_typical"):
35
+ return (data.high + data.low + data.close) / 3.0
36
+ if key in ("7", "weighted", "price_weighted"):
37
+ return (data.high + data.low + data.close + data.close) / 4.0
38
+ if key in ("8", "simple", "price_simpl"):
39
+ return (data.open + data.close) / 2.0
40
+ if key in ("9", "quarter", "price_quarter"):
41
+ return (data.high + data.low + data.open + data.close) / 4.0
42
+ return data.close
43
+
44
+
45
+ class BlauTSStochastic(Indicator):
46
+ """Blau TS Stochastic: triple-smoothed stochastic momentum oscillator.
47
+
48
+ A stochastic numerator (price minus lowest low) and its range (highest high
49
+ minus lowest low) are each triple-smoothed with EMAs; the histogram is
50
+ 200 times their ratio minus 100 (guarded against division by zero), and an
51
+ EMA of the histogram forms the signal line exposed on the down line.
52
+ """
53
+
54
+ lines = ("up", "down", "hist")
55
+ params = (
56
+ ("xlength", 5),
57
+ ("xlength1", 20),
58
+ ("xlength2", 5),
59
+ ("xlength3", 3),
60
+ ("xlength4", 3),
61
+ ("ipc", "close"),
62
+ )
63
+
64
+ def __init__(self):
65
+ """Build the triple-EMA stochastic chain for the hist/up/down lines."""
66
+ price = _price_series(self.data, self.p.ipc)
67
+ hh = Highest(self.data.high, period=int(self.p.xlength))
68
+ ll = Lowest(self.data.low, period=int(self.p.xlength))
69
+ stoch = price - ll
70
+ range_line = hh - ll
71
+
72
+ xstoch = EMA(stoch, period=int(self.p.xlength1))
73
+ xxstoch = EMA(xstoch, period=int(self.p.xlength2))
74
+ xxxstoch = EMA(xxstoch, period=int(self.p.xlength3))
75
+
76
+ xrange = EMA(range_line, period=int(self.p.xlength1))
77
+ xxrange = EMA(xrange, period=int(self.p.xlength2))
78
+ xxxrange = EMA(xxrange, period=int(self.p.xlength3))
79
+
80
+ hist = btfunc.DivByZero(200.0 * xxxstoch, xxxrange, zero=0.0) - 100.0
81
+ signal = EMA(hist, period=int(self.p.xlength4))
82
+
83
+ self.l.hist = hist
84
+ self.l.up = hist
85
+ self.l.down = signal
@@ -0,0 +1,55 @@
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
+ import math
9
+
10
+ from .. import (
11
+ ExponentialMovingAverage,
12
+ Indicator,
13
+ )
14
+
15
+ __all__ = [
16
+ "BlauTVI",
17
+ ]
18
+
19
+
20
+ class BlauTVI(Indicator):
21
+ """Blau Tick Volume Indicator: a triple-EMA-smoothed up/down tick oscillator."""
22
+
23
+ lines = ("value", "color_idx")
24
+ params = (
25
+ ("xlength1", 12),
26
+ ("xlength2", 12),
27
+ ("xlength3", 12),
28
+ )
29
+
30
+ def __init__(self):
31
+ """Build the up/down tick EMAs and the smoothed oscillator value line."""
32
+ up_ticks = (self.data.volume + (self.data.close - self.data.open) / 0.01) / 2.0
33
+ dn_ticks = (self.data.volume - (self.data.close - self.data.open) / 0.01) / 2.0
34
+ up_1 = ExponentialMovingAverage(up_ticks, period=self.p.xlength1)
35
+ dn_1 = ExponentialMovingAverage(dn_ticks, period=self.p.xlength1)
36
+ up_2 = ExponentialMovingAverage(up_1, period=self.p.xlength2)
37
+ dn_2 = ExponentialMovingAverage(dn_1, period=self.p.xlength2)
38
+ raw = 100.0 * (up_2 - dn_2) / (up_2 + dn_2 + 1e-12)
39
+ self.lines.value = ExponentialMovingAverage(raw, period=self.p.xlength3)
40
+ self.addminperiod(self.p.xlength1 + self.p.xlength2 + self.p.xlength3 + 2)
41
+
42
+ def next(self):
43
+ """Assign a color index based on the value's sign and direction of change."""
44
+ current = float(self.lines.value[0])
45
+ prev = (
46
+ float(self.lines.value[-1])
47
+ if len(self) > 1 and math.isfinite(float(self.lines.value[-1]))
48
+ else current
49
+ )
50
+ color = 2.0
51
+ if current > 0:
52
+ color = 4.0 if current > prev else 3.0
53
+ elif current < 0:
54
+ color = 0.0 if current < prev else 1.0
55
+ self.lines.color_idx[0] = color
@@ -0,0 +1,128 @@
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
+ import math
9
+ from collections import deque
10
+
11
+ from .. import Indicator
12
+
13
+ __all__ = [
14
+ "BrainTrend2Indicator",
15
+ "AbsolutelyNoLagLwmaIndicator",
16
+ ]
17
+
18
+
19
+ class BrainTrend2Indicator(Indicator):
20
+ """ATR-derived trend-state indicator producing a four-state color signal."""
21
+
22
+ lines = ("color_state",)
23
+ params = (
24
+ ("atr_period", 7),
25
+ ("point_size", 0.01),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Initialize transition state and adaptive ATR window."""
30
+ self._period = max(1, int(self.p.atr_period))
31
+ self._cecf = 0.7
32
+ self._trs = deque(maxlen=self._period)
33
+ self._river = None
34
+ self._emaxtra = None
35
+ self.addminperiod(self._period + 2)
36
+
37
+ @staticmethod
38
+ def _finite(value):
39
+ return value is not None and math.isfinite(value)
40
+
41
+ def next(self):
42
+ """Update trend river state and emit a color code."""
43
+ prev_close = float(self.data.close[-1]) if len(self.data) > 1 else float(self.data.close[0])
44
+ spread = (
45
+ float(getattr(self.data, "spread")[0]) * self.p.point_size
46
+ if hasattr(self.data, "spread")
47
+ else 0.0
48
+ )
49
+ high = float(self.data.high[0])
50
+ low = float(self.data.low[0])
51
+ open_ = float(self.data.open[0])
52
+ close = float(self.data.close[0])
53
+ tr = spread + high - low
54
+ tr = max(tr, abs(spread + high - prev_close), abs(low - prev_close))
55
+ self._trs.append(tr)
56
+ if len(self._trs) < self._period:
57
+ self.lines.color_state[0] = float("nan")
58
+ return
59
+ weights = list(range(self._period, 0, -1))
60
+ atr = (
61
+ 2.0
62
+ * sum(w * v for w, v in zip(weights, reversed(self._trs)))
63
+ / (self._period * (self._period + 1.0))
64
+ )
65
+ widcha = self._cecf * atr
66
+ if self._river is None:
67
+ prev2_close = float(self.data.close[-2]) if len(self.data) > 2 else prev_close
68
+ self._river = prev2_close > prev_close
69
+ self._emaxtra = prev_close
70
+ if self._river and low < self._emaxtra - widcha:
71
+ self._river = False
72
+ self._emaxtra = spread + high
73
+ if (not self._river) and spread + high > self._emaxtra + widcha:
74
+ self._river = True
75
+ self._emaxtra = low
76
+ if self._river and low > self._emaxtra:
77
+ self._emaxtra = low
78
+ if (not self._river) and spread + high < self._emaxtra:
79
+ self._emaxtra = spread + high
80
+ if self._river:
81
+ color = 0.0 if open_ <= close else 1.0
82
+ else:
83
+ color = 4.0 if open_ >= close else 3.0
84
+ self.lines.color_state[0] = color
85
+
86
+
87
+ class AbsolutelyNoLagLwmaIndicator(Indicator):
88
+ """No-lag LWMA indicator with color state transitions."""
89
+
90
+ lines = ("line_value", "color_state")
91
+ params = (("length", 7),)
92
+
93
+ def __init__(self):
94
+ """Prepare rolling windows for dual-weighted moving average updates."""
95
+ self._length = max(1, int(self.p.length))
96
+ self._price_window = deque(maxlen=self._length)
97
+ self._lwma_window = deque(maxlen=self._length)
98
+ self.addminperiod(self._length * 2)
99
+
100
+ def _weighted_ma(self, values):
101
+ weights = list(range(len(values), 0, -1))
102
+ total = sum(weights)
103
+ return sum(w * v for w, v in zip(weights, reversed(values))) / total
104
+
105
+ def next(self):
106
+ """Compute smoothed LWMA and directional color for each bar."""
107
+ price = float(self.data.close[0])
108
+ self._price_window.append(price)
109
+ if len(self._price_window) < self._length:
110
+ self.lines.line_value[0] = float("nan")
111
+ self.lines.color_state[0] = float("nan")
112
+ return
113
+ lwma1 = self._weighted_ma(self._price_window)
114
+ self._lwma_window.append(lwma1)
115
+ if len(self._lwma_window) < self._length:
116
+ self.lines.line_value[0] = float("nan")
117
+ self.lines.color_state[0] = float("nan")
118
+ return
119
+ lwma2 = self._weighted_ma(self._lwma_window)
120
+ color = 1.0
121
+ prev = self.lines.line_value[-1] if len(self) > 0 else float("nan")
122
+ if prev == prev:
123
+ if prev < lwma2:
124
+ color = 2.0
125
+ elif prev > lwma2:
126
+ color = 0.0
127
+ self.lines.line_value[0] = lwma2
128
+ self.lines.color_state[0] = color
@@ -0,0 +1,47 @@
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
+ AverageTrueRange,
10
+ Indicator,
11
+ Stochastic,
12
+ )
13
+
14
+ __all__ = [
15
+ "BrainTrendSignalProxy",
16
+ ]
17
+
18
+
19
+ class BrainTrendSignalProxy(Indicator):
20
+ """Signal proxy that combines ATR and stochastic cross conditions."""
21
+
22
+ lines = ("buy_signal", "sell_signal")
23
+ params = (
24
+ ("atr_period", 14),
25
+ ("sto_period", 12),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Initialize indicators and required warm-up bars."""
30
+ self.atr = AverageTrueRange(self.data, period=self.p.atr_period)
31
+ self.stoch = Stochastic(self.data, period=self.p.sto_period)
32
+ self.addminperiod(max(self.p.atr_period, self.p.sto_period) + 3)
33
+
34
+ def next(self):
35
+ """Emit buy and sell trigger levels for the latest bar."""
36
+ buy_signal = 0.0
37
+ sell_signal = 0.0
38
+ close0 = float(self.data.close[0])
39
+ atr0 = float(self.atr[0])
40
+ k0 = float(self.stoch.percK[0])
41
+ k1 = float(self.stoch.percK[-1])
42
+ if k1 <= 20.0 and k0 > 20.0 and close0 > float(self.data.close[-1]) + atr0 * 0.1:
43
+ buy_signal = close0
44
+ elif k1 >= 80.0 and k0 < 80.0 and close0 < float(self.data.close[-1]) - atr0 * 0.1:
45
+ sell_signal = close0
46
+ self.lines.buy_signal[0] = buy_signal
47
+ self.lines.sell_signal[0] = sell_signal
@@ -0,0 +1,85 @@
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
+ import math
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "BrakeParbIndicator",
14
+ ]
15
+
16
+
17
+ class BrakeParbIndicator(Indicator):
18
+ """Parabolic-style trailing-stop indicator with flip arrows.
19
+
20
+ Maintains a power-curve stop that rises while long (and falls while short)
21
+ from a begin price; when price breaks the stop the direction flips. Exposes
22
+ the active stop on ``up``/``down`` lines and direction-flip cues on
23
+ ``buy``/``sell`` lines.
24
+ """
25
+
26
+ lines = ("buy", "sell", "up", "down")
27
+ params = (
28
+ ("a", 1.5),
29
+ ("b", 1.0),
30
+ ("bigin_shift", 10.0),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Set the minimum period and initialize the parabolic-stop state."""
35
+ self.addminperiod(5)
36
+ self._is_long = True
37
+ self._max_price = float("-inf")
38
+ self._min_price = float("inf")
39
+ self._begin_bar = 0
40
+ self._begin_price = None
41
+
42
+ def next(self):
43
+ """Advance the parabolic stop and emit up/down stop and flip lines.
44
+
45
+ Extends the stop along the power curve, flips direction (resetting the
46
+ begin price and extremes) when price breaks the stop, and sets the
47
+ ``up``/``down`` stop lines plus ``buy``/``sell`` flip cues for the bar.
48
+ """
49
+ if self._begin_price is None:
50
+ self._begin_price = float(self.data.low[0])
51
+ self._max_price = max(self._max_price, float(self.data.high[0]))
52
+ self._min_price = min(self._min_price, float(self.data.low[0]))
53
+ bars_since_begin = max(0, len(self.data) - 1 - self._begin_bar)
54
+ b = float(self.p.b) * 0.00001 * 15.0
55
+ bigin_shift = float(self.p.bigin_shift) * 0.00001
56
+ parab = math.pow(max(0.0, float(bars_since_begin)), float(self.p.a)) * b
57
+ value = self._begin_price + parab if self._is_long else self._begin_price - parab
58
+ if self._is_long and value > float(self.data.low[0]):
59
+ self._is_long = False
60
+ self._begin_price = self._max_price + bigin_shift
61
+ self._begin_bar = len(self.data) - 1
62
+ value = self._begin_price
63
+ self._max_price = float("-inf")
64
+ self._min_price = float("inf")
65
+ elif (not self._is_long) and value < float(self.data.high[0]):
66
+ self._is_long = True
67
+ self._begin_price = self._min_price - bigin_shift
68
+ self._begin_bar = len(self.data) - 1
69
+ value = self._begin_price
70
+ self._max_price = float("-inf")
71
+ self._min_price = float("inf")
72
+ prev_up = float(self.lines.up[-1]) if len(self) > 0 else 0.0
73
+ prev_dn = float(self.lines.down[-1]) if len(self) > 0 else 0.0
74
+ if self._is_long:
75
+ self.lines.up[0] = value
76
+ self.lines.down[0] = 0.0
77
+ else:
78
+ self.lines.up[0] = 0.0
79
+ self.lines.down[0] = value
80
+ self.lines.buy[0] = (
81
+ self.lines.down[0] if prev_up > 0.0 and float(self.lines.down[0]) > 0.0 else 0.0
82
+ )
83
+ self.lines.sell[0] = (
84
+ self.lines.up[0] if prev_dn > 0.0 and float(self.lines.up[0]) > 0.0 else 0.0
85
+ )
@@ -0,0 +1,121 @@
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
+ "BreakoutBarsTrendV2",
12
+ ]
13
+
14
+
15
+ class BreakoutBarsTrendV2(Indicator):
16
+ """Custom trend-breakout indicator calculating dynamic trend boundaries and reversals.
17
+
18
+ Lines:
19
+ value: Trend state value (1.0 or positive series count for uptrend, -1.0 or negative series count for downtrend).
20
+ """
21
+
22
+ lines = ("value",)
23
+ params = (
24
+ ("reversal_mode", "PERCENT"),
25
+ ("delta", 1.0),
26
+ ("point", 0.01),
27
+ )
28
+
29
+ def __init__(self):
30
+ """Initialize the indicator parameters, trend tracking states, and seed prices."""
31
+ self._mode = str(self.p.reversal_mode).upper()
32
+ self._delta = float(self.p.delta)
33
+ if self._mode == "PIPS":
34
+ if self._delta < 30.0:
35
+ self._delta = 1000.0
36
+ else:
37
+ if self._delta < 0.03 or self._delta > 30.0:
38
+ self._delta = 1.0
39
+ self._seed_close = None
40
+ self._seed_high = None
41
+ self._seed_low = None
42
+ self._initialized = False
43
+ self._uptrend = None
44
+ self._min_price = None
45
+ self._max_price = None
46
+ self.addminperiod(1)
47
+
48
+ def _reversal_distance(self, price):
49
+ """Calculate the absolute price pullback distance threshold required for a trend reversal.
50
+
51
+ Args:
52
+ price (float): Extreme reference price.
53
+
54
+ Returns:
55
+ float: Symmetrical price pullback distance.
56
+ """
57
+ if self._mode == "PIPS":
58
+ return float(self._delta) * float(self.p.point)
59
+ return (float(price) / 100.0) * float(self._delta)
60
+
61
+ def next(self):
62
+ """Determine if a trend reversal has occurred, and update trend extremes."""
63
+ close = float(self.data.close[0])
64
+ high = float(self.data.high[0])
65
+ low = float(self.data.low[0])
66
+
67
+ if self._seed_close is None:
68
+ self._seed_close = close
69
+ self._seed_high = high
70
+ self._seed_low = low
71
+ self.lines.value[0] = 0.0
72
+ return
73
+
74
+ if not self._initialized:
75
+ reversal = self._reversal_distance(self._seed_close)
76
+ if abs(close - self._seed_close) - reversal <= 0.00001:
77
+ self.lines.value[0] = 0.0
78
+ return
79
+ if close > self._seed_close:
80
+ self._initialized = True
81
+ self._uptrend = True
82
+ self._min_price = self._seed_low
83
+ self._max_price = high
84
+ self.lines.value[0] = 1.0
85
+ else:
86
+ self._initialized = True
87
+ self._uptrend = False
88
+ self._min_price = low
89
+ self._max_price = self._seed_high
90
+ self.lines.value[0] = -1.0
91
+ return
92
+
93
+ prev_value = float(self.lines.value[-1])
94
+ prev_high = float(self.data.high[-1])
95
+ prev_low = float(self.data.low[-1])
96
+
97
+ self._min_price = min(float(self._min_price), prev_low)
98
+ self._max_price = max(float(self._max_price), prev_high)
99
+
100
+ if self._uptrend:
101
+ reversal = self._reversal_distance(self._max_price)
102
+ if close > float(self._max_price):
103
+ self.lines.value[0] = prev_value + 1.0
104
+ elif close < max(float(self._max_price), high) - reversal and close < prev_low:
105
+ self._uptrend = False
106
+ self.lines.value[0] = -1.0
107
+ self._max_price = high
108
+ self._min_price = low
109
+ else:
110
+ self.lines.value[0] = prev_value
111
+ else:
112
+ reversal = self._reversal_distance(self._min_price)
113
+ if close < float(self._min_price):
114
+ self.lines.value[0] = prev_value - 1.0
115
+ elif close > min(float(self._min_price), low) + reversal and close > prev_high:
116
+ self._uptrend = True
117
+ self.lines.value[0] = 1.0
118
+ self._min_price = low
119
+ self._max_price = high
120
+ else:
121
+ self.lines.value[0] = prev_value
@@ -0,0 +1,87 @@
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
+ "BSIIndicator",
12
+ ]
13
+
14
+
15
+ class BSIIndicator(Indicator):
16
+ """Balance of power-style indicator returning BSI value and trend color."""
17
+
18
+ lines = ("bsi", "color")
19
+ params = (
20
+ ("range_period", 20),
21
+ ("slowing", 3),
22
+ ("avg_period", 3),
23
+ ("volume_mode", "TICK"),
24
+ )
25
+
26
+ def __init__(self):
27
+ """Set minimum period and initialize smoothing configuration."""
28
+ self.addminperiod(
29
+ int(self.p.range_period) + int(self.p.slowing) + int(self.p.avg_period) + 3
30
+ )
31
+
32
+ def _component(self, ago):
33
+ sumpos = 0.0
34
+ sumneg = 0.0
35
+ sumhigh = 0.0
36
+ for k in range(int(self.p.slowing)):
37
+ idx = ago + k
38
+ highs = [float(self.data.high[-(idx + j)]) for j in range(int(self.p.range_period))]
39
+ lows = [float(self.data.low[-(idx + j)]) for j in range(int(self.p.range_period))]
40
+ hh = max(highs)
41
+ ll = min(lows)
42
+ rng = max(hh - ll, 1e-12)
43
+ bark_close = float(self.data.close[-idx])
44
+ bark_prev_close = float(self.data.close[-(idx + 1)])
45
+ bark_high = float(self.data.high[-idx])
46
+ bark_low = float(self.data.low[-idx])
47
+ sp = bark_high - bark_low
48
+ if self.p.volume_mode == "NONE":
49
+ vol = 1.0
50
+ elif self.p.volume_mode == "VOLUME":
51
+ vmax = max(
52
+ float(self.data.openinterest[-(idx + j)])
53
+ for j in range(int(self.p.range_period))
54
+ )
55
+ vol = float(self.data.openinterest[-idx]) / vmax if vmax else 0.0
56
+ else:
57
+ vmax = max(
58
+ float(self.data.volume[-(idx + j)]) for j in range(int(self.p.range_period))
59
+ )
60
+ vol = float(self.data.volume[-idx]) / vmax if vmax else 0.0
61
+ ratio = 0.0
62
+ if not (bark_prev_close - sp * 0.2 > bark_close):
63
+ ratio = 1.0 if bark_low == ll else (hh - bark_low) / rng
64
+ sumpos += (bark_close - bark_low) * ratio * vol
65
+ if not (bark_prev_close + sp * 0.2 < bark_close):
66
+ ratio = 1.0 if bark_high == hh else (bark_high - ll) / rng
67
+ sumneg += (bark_high - bark_close) * ratio * vol * -1.0
68
+ sumhigh += rng
69
+ if not sumhigh:
70
+ return 0.0
71
+ return (sumpos / sumhigh * 100.0) + (sumneg / sumhigh * 100.0)
72
+
73
+ def next(self):
74
+ """Compute BSI and derive color from directional BSI movement."""
75
+ vals = [self._component(i) for i in range(int(self.p.avg_period))]
76
+ bsi = sum(vals) / float(int(self.p.avg_period))
77
+ self.lines.bsi[0] = bsi
78
+ if len(self) < 2:
79
+ self.lines.color[0] = 1.0
80
+ return
81
+ prev = float(self.lines.bsi[-1])
82
+ color = 1.0
83
+ if prev > bsi:
84
+ color = 0.0
85
+ if prev < bsi:
86
+ color = 2.0
87
+ self.lines.color[0] = color
@@ -0,0 +1,67 @@
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
+ ExponentialMovingAverage,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "BullsBearsEyes",
15
+ ]
16
+
17
+
18
+ class BullsBearsEyes(Indicator):
19
+ """Rebuild a signal oscillator from recursive smoothed directional momentum."""
20
+
21
+ lines = ("value",)
22
+ params = (
23
+ ("period", 13),
24
+ ("gamma", 0.6),
25
+ )
26
+
27
+ def __init__(self):
28
+ """Initialize EMA and recursive helper state used by the indicator."""
29
+ self.ema = ExponentialMovingAverage(self.data.close, period=int(self.p.period))
30
+ self.addminperiod(int(self.p.period) + 5)
31
+ self._l0 = 0.0
32
+ self._l1 = 0.0
33
+ self._l2 = 0.0
34
+ self._l3 = 0.0
35
+
36
+ def next(self):
37
+ """Compute the next recursive signal value and write it to ``lines.value``."""
38
+ bulls = float(self.data.high[0] - self.ema[0])
39
+ bears = float(self.data.low[0] - self.ema[0])
40
+ gamma = float(self.p.gamma)
41
+ l0a = self._l0
42
+ l1a = self._l1
43
+ l2a = self._l2
44
+ l3a = self._l3
45
+ l0 = (1.0 - gamma) * (bears + bulls) + gamma * l0a
46
+ l1 = -gamma * l0 + l0a + gamma * l1a
47
+ l2 = -gamma * l1 + l1a + gamma * l2a
48
+ l3 = -gamma * l2 + l2a + gamma * l3a
49
+ cu = 0.0
50
+ cd = 0.0
51
+ if l0 >= l1:
52
+ cu += l0 - l1
53
+ else:
54
+ cd += l1 - l0
55
+ if l1 >= l2:
56
+ cu += l1 - l2
57
+ else:
58
+ cd += l2 - l1
59
+ if l2 >= l3:
60
+ cu += l2 - l3
61
+ else:
62
+ cd += l3 - l2
63
+ self.lines.value[0] = cu / (cu + cd) if (cu + cd) != 0.0 else 0.0
64
+ self._l0 = l0
65
+ self._l1 = l1
66
+ self._l2 = l2
67
+ self._l3 = l3