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,193 @@
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
+ EMA,
10
+ SMA,
11
+ Indicator,
12
+ SmoothedMovingAverage,
13
+ WeightedMovingAverage,
14
+ )
15
+
16
+ __all__ = [
17
+ "ColorStepXCCXIndicator",
18
+ ]
19
+
20
+
21
+ def resolve_ma_class(name):
22
+ """Resolve a moving-average mode name to a Backtrader MA class."""
23
+ mode = str(name).lower()
24
+ if mode in {"sma", "mode_sma"}:
25
+ return SMA
26
+ if mode in {"ema", "mode_ema"}:
27
+ return EMA
28
+ if mode in {"smma", "mode_smma"}:
29
+ return SmoothedMovingAverage
30
+ return WeightedMovingAverage
31
+
32
+
33
+ def resolve_price_line(data, mode):
34
+ """Return the selected price series from data for indicator calculations.
35
+
36
+ Args:
37
+ data: Backtrader data feed.
38
+ mode: Price selector token from strategy configuration.
39
+
40
+ Returns:
41
+ A Backtrader data line used as input to indicators.
42
+ """
43
+ price_mode = str(mode).lower()
44
+ if price_mode in {"price_open", "open"}:
45
+ return data.open
46
+ if price_mode in {"price_high", "high"}:
47
+ return data.high
48
+ if price_mode in {"price_low", "low"}:
49
+ return data.low
50
+ if price_mode in {"price_median", "median"}:
51
+ return (data.high + data.low) / 2.0
52
+ if price_mode in {"price_typical", "typical"}:
53
+ return (data.high + data.low + data.close) / 3.0
54
+ if price_mode in {"price_weighted", "weighted"}:
55
+ return (data.high + data.low + data.close + data.close) / 4.0
56
+ return data.close
57
+
58
+
59
+ class ColorStepXCCXIndicator(Indicator):
60
+ """Compute fast/slow XCCX channel lines for directional step signals."""
61
+
62
+ lines = (
63
+ "mplus",
64
+ "mminus",
65
+ )
66
+ params = (
67
+ ("dsmooth_method", "jjma"),
68
+ ("dperiod", 30),
69
+ ("dphase", 100),
70
+ ("msmooth_method", "t3"),
71
+ ("mperiod", 7),
72
+ ("mphase", 15),
73
+ ("ipc", "price_typical"),
74
+ ("step_size_fast", 5),
75
+ ("step_size_slow", 30),
76
+ )
77
+
78
+ def __init__(self):
79
+ """Initialize smoothed base/offset series and running channel states."""
80
+ price_line = resolve_price_line(self.data, self.p.ipc)
81
+ self._base = resolve_ma_class(self.p.dsmooth_method)(price_line, period=self.p.dperiod)
82
+ self._up = resolve_ma_class(self.p.msmooth_method)(
83
+ price_line - self._base, period=self.p.mperiod
84
+ )
85
+ self._dn = resolve_ma_class(self.p.msmooth_method)(
86
+ abs(price_line - self._base), period=self.p.mperiod
87
+ )
88
+ self._fmin1 = 999999.0
89
+ self._fmax1 = -999999.0
90
+ self._smin1 = 999999.0
91
+ self._smax1 = -999999.0
92
+ self._ftrend = 0
93
+ self._strend = 0
94
+ self.addminperiod(self.p.dperiod + self.p.mperiod + 5)
95
+
96
+ def next(self):
97
+ """Update fast and slow channel lines on the next bar."""
98
+ xupccx = float(self._up[0])
99
+ xdnccx = float(self._dn[0])
100
+ xccx = 100.0 * xupccx / xdnccx if xupccx != 0.0 and xdnccx != 0.0 else 0.0
101
+ fmax0 = xccx + 2 * float(self.p.step_size_fast)
102
+ fmin0 = xccx - 2 * float(self.p.step_size_fast)
103
+ if xccx > self._fmax1:
104
+ self._ftrend = 1
105
+ if xccx < self._fmin1:
106
+ self._ftrend = -1
107
+ if self._ftrend > 0 and fmin0 < self._fmin1:
108
+ fmin0 = self._fmin1
109
+ if self._ftrend < 0 and fmax0 > self._fmax1:
110
+ fmax0 = self._fmax1
111
+ smax0 = xccx + 2 * float(self.p.step_size_slow)
112
+ smin0 = xccx - 2 * float(self.p.step_size_slow)
113
+ if xccx > self._smax1:
114
+ self._strend = 1
115
+ if xccx < self._smin1:
116
+ self._strend = -1
117
+ if self._strend > 0 and smin0 < self._smin1:
118
+ smin0 = self._smin1
119
+ if self._strend < 0 and smax0 > self._smax1:
120
+ smax0 = self._smax1
121
+ self.lines.mplus[0] = (
122
+ fmin0 + float(self.p.step_size_fast)
123
+ if self._ftrend > 0
124
+ else fmax0 - float(self.p.step_size_fast)
125
+ )
126
+ self.lines.mminus[0] = (
127
+ smin0 + float(self.p.step_size_slow)
128
+ if self._strend > 0
129
+ else smax0 - float(self.p.step_size_slow)
130
+ )
131
+ self._fmin1 = fmin0
132
+ self._fmax1 = fmax0
133
+ self._smin1 = smin0
134
+ self._smax1 = smax0
135
+
136
+ def once(self, start, end):
137
+ """Compute channel lines for vectorized/cached bars from `start` to `end`."""
138
+ up_array = self._up.array
139
+ dn_array = self._dn.array
140
+ mplus_line = self.lines.mplus.array
141
+ mminus_line = self.lines.mminus.array
142
+ for line in (mplus_line, mminus_line):
143
+ while len(line) < end:
144
+ line.append(float("nan"))
145
+
146
+ fmin1 = 999999.0
147
+ fmax1 = -999999.0
148
+ smin1 = 999999.0
149
+ smax1 = -999999.0
150
+ ftrend = 0
151
+ strend = 0
152
+ fast_step = float(self.p.step_size_fast)
153
+ slow_step = float(self.p.step_size_slow)
154
+ actual_end = min(end, len(up_array), len(dn_array))
155
+ for i in range(start, actual_end):
156
+ xupccx = float(up_array[i])
157
+ xdnccx = float(dn_array[i])
158
+ xccx = 100.0 * xupccx / xdnccx if xupccx != 0.0 and xdnccx != 0.0 else 0.0
159
+ fmax0 = xccx + 2.0 * fast_step
160
+ fmin0 = xccx - 2.0 * fast_step
161
+ if xccx > fmax1:
162
+ ftrend = 1
163
+ if xccx < fmin1:
164
+ ftrend = -1
165
+ if ftrend > 0 and fmin0 < fmin1:
166
+ fmin0 = fmin1
167
+ if ftrend < 0 and fmax0 > fmax1:
168
+ fmax0 = fmax1
169
+
170
+ smax0 = xccx + 2.0 * slow_step
171
+ smin0 = xccx - 2.0 * slow_step
172
+ if xccx > smax1:
173
+ strend = 1
174
+ if xccx < smin1:
175
+ strend = -1
176
+ if strend > 0 and smin0 < smin1:
177
+ smin0 = smin1
178
+ if strend < 0 and smax0 > smax1:
179
+ smax0 = smax1
180
+
181
+ mplus_line[i] = fmin0 + fast_step if ftrend > 0 else fmax0 - fast_step
182
+ mminus_line[i] = smin0 + slow_step if strend > 0 else smax0 - slow_step
183
+ fmin1 = fmin0
184
+ fmax1 = fmax0
185
+ smin1 = smin0
186
+ smax1 = smax0
187
+
188
+ self._fmin1 = fmin1
189
+ self._fmax1 = fmax1
190
+ self._smin1 = smin1
191
+ self._smax1 = smax1
192
+ self._ftrend = ftrend
193
+ self._strend = strend
@@ -0,0 +1,49 @@
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
+ Indicator,
12
+ SimpleMovingAverage,
13
+ )
14
+
15
+ __all__ = [
16
+ "ColorX2MA",
17
+ ]
18
+
19
+
20
+ class ColorX2MA(Indicator):
21
+ """Indicator that outputs smoothed MA value and directional color index."""
22
+
23
+ lines = ("value", "color_idx")
24
+ params = (
25
+ ("length1", 12),
26
+ ("length2", 5),
27
+ )
28
+
29
+ def __init__(self):
30
+ """Initialize MA stacks and minimum period."""
31
+ ma1 = SimpleMovingAverage(self.data.close, period=max(2, self.p.length1))
32
+ ma2 = SimpleMovingAverage(ma1, period=max(2, self.p.length2))
33
+ self.lines.value = ma2
34
+ self.addminperiod(self.p.length1 + self.p.length2 + 2)
35
+
36
+ def next(self):
37
+ """Update color index based on value momentum."""
38
+ current = float(self.lines.value[0])
39
+ prev = (
40
+ float(self.lines.value[-1])
41
+ if len(self) > 1 and math.isfinite(float(self.lines.value[-1]))
42
+ else current
43
+ )
44
+ color = 0.0
45
+ if prev < current:
46
+ color = 1.0
47
+ elif prev > current:
48
+ color = 2.0
49
+ self.lines.color_idx[0] = color
@@ -0,0 +1,63 @@
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
+ "ColorXDerivative",
12
+ ]
13
+
14
+
15
+ class ColorXDerivative(Indicator):
16
+ """Smoothed price-derivative indicator with a momentum color state.
17
+
18
+ Computes the average rate of change of a weighted price over ``i_slowing``
19
+ bars, smoothed across ``xlength`` windows, and classifies it into a color
20
+ index: rising/falling while positive (0/1) or negative (3/4), with 2 as a
21
+ neutral state.
22
+ """
23
+
24
+ lines = ("value", "color_idx")
25
+ params = (
26
+ ("i_slowing", 34),
27
+ ("xlength", 15),
28
+ )
29
+
30
+ def __init__(self):
31
+ """Set the minimum period to cover the slowing and smoothing windows."""
32
+ self.addminperiod(max(self.p.i_slowing + 2, self.p.xlength + 2))
33
+
34
+ def _price(self, ago=0):
35
+ return (
36
+ float(self.data.high[ago])
37
+ + float(self.data.low[ago])
38
+ + 2.0 * float(self.data.close[ago])
39
+ ) / 4.0
40
+
41
+ def next(self):
42
+ """Compute the smoothed derivative value and its color state.
43
+
44
+ Stores the smoothed derivative on the ``value`` line and a color index on
45
+ ``color_idx`` reflecting whether the value is rising or falling above or
46
+ below zero relative to the previous bar.
47
+ """
48
+ der = 100.0 * (self._price(0) - self._price(-self.p.i_slowing)) / float(self.p.i_slowing)
49
+ window = [
50
+ 100.0
51
+ * (self._price(-i) - self._price(-(i + self.p.i_slowing)))
52
+ / float(self.p.i_slowing)
53
+ for i in range(self.p.xlength)
54
+ ]
55
+ smooth = sum(window) / float(len(window)) if window else der
56
+ self.lines.value[0] = smooth
57
+ prev = float(self.lines.value[-1]) if len(self) > 1 else smooth
58
+ color = 2.0
59
+ if smooth > 0:
60
+ color = 0.0 if prev <= smooth else 1.0
61
+ elif smooth < 0:
62
+ color = 4.0 if prev >= smooth else 3.0
63
+ self.lines.color_idx[0] = color
@@ -0,0 +1,84 @@
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
+ DeMarkerRollingIndicator,
12
+ Indicator,
13
+ )
14
+
15
+ __all__ = [
16
+ "ColorZerolagDeMarker",
17
+ ]
18
+
19
+
20
+ class ColorZerolagDeMarker(Indicator):
21
+ """Blend five weighted DeMarker oscillators into fast and slow trend lines."""
22
+
23
+ lines = ("fast", "slow")
24
+ params = (
25
+ ("smoothing", 15),
26
+ ("factor1", 0.05),
27
+ ("demarker_period1", 8),
28
+ ("factor2", 0.1),
29
+ ("demarker_period2", 21),
30
+ ("factor3", 0.16),
31
+ ("demarker_period3", 34),
32
+ ("factor4", 0.26),
33
+ ("demarker_period4", 55),
34
+ ("factor5", 0.43),
35
+ ("demarker_period5", 89),
36
+ )
37
+
38
+ def __init__(self):
39
+ """Build the five DeMarker sub-indicators and smoothing constants."""
40
+ periods = [
41
+ int(self.p.demarker_period1),
42
+ int(self.p.demarker_period2),
43
+ int(self.p.demarker_period3),
44
+ int(self.p.demarker_period4),
45
+ int(self.p.demarker_period5),
46
+ ]
47
+ self.addminperiod(3 * max(periods) + 5)
48
+ self.dem1 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period1))
49
+ self.dem2 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period2))
50
+ self.dem3 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period3))
51
+ self.dem4 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period4))
52
+ self.dem5 = DeMarkerRollingIndicator(self.data, period=int(self.p.demarker_period5))
53
+ self.smooth_const = (float(self.p.smoothing) - 1.0) / float(self.p.smoothing)
54
+ self._initialized = False
55
+
56
+ def next(self):
57
+ """Weight DeMarker values into a fast trend and smoothed slow trend."""
58
+ values = [
59
+ float(self.dem1[0]),
60
+ float(self.dem2[0]),
61
+ float(self.dem3[0]),
62
+ float(self.dem4[0]),
63
+ float(self.dem5[0]),
64
+ ]
65
+ if any(not math.isfinite(value) for value in values):
66
+ self.lines.fast[0] = float("nan")
67
+ self.lines.slow[0] = float("nan")
68
+ return
69
+ osc1 = float(self.p.factor1) * values[0]
70
+ osc2 = float(self.p.factor2) * values[1]
71
+ osc3 = float(self.p.factor3) * values[2]
72
+ osc4 = float(self.p.factor4) * values[3]
73
+ osc5 = float(self.p.factor5) * values[4]
74
+ fast_trend = osc1 + osc2 + osc3 + osc4 + osc5
75
+ if not self._initialized:
76
+ slow_trend = fast_trend / float(self.p.smoothing)
77
+ self._initialized = True
78
+ else:
79
+ slow_trend = (
80
+ fast_trend / float(self.p.smoothing)
81
+ + float(self.lines.slow[-1]) * self.smooth_const
82
+ )
83
+ self.lines.fast[0] = fast_trend
84
+ self.lines.slow[0] = slow_trend
@@ -0,0 +1,127 @@
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
+ SimpleMovingAverage,
12
+ SmoothedMovingAverage,
13
+ StandardDeviation,
14
+ WeightedMovingAverage,
15
+ )
16
+
17
+ __all__ = [
18
+ "CorrectedAverageIndicator",
19
+ ]
20
+
21
+
22
+ def resolve_ma_class(name):
23
+ """Return the backtrader moving-average class for a method name.
24
+
25
+ Args:
26
+ name: MA method name (sma, ema, smma, or a weighted fallback).
27
+
28
+ Returns:
29
+ The corresponding backtrader moving-average indicator class.
30
+ """
31
+ mode = str(name).lower()
32
+ if mode in {"sma", "mode_sma"}:
33
+ return SimpleMovingAverage
34
+ if mode in {"ema", "mode_ema"}:
35
+ return ExponentialMovingAverage
36
+ if mode in {"smma", "mode_smma"}:
37
+ return SmoothedMovingAverage
38
+ return WeightedMovingAverage
39
+
40
+
41
+ def resolve_price_line(data, mode):
42
+ """Return the price line selected by an MT5 applied-price mode.
43
+
44
+ Args:
45
+ data: The data feed providing OHLC lines.
46
+ mode: Applied-price mode name (e.g. ``price_close``, ``price_median``).
47
+
48
+ Returns:
49
+ The line or line expression for the requested applied price; defaults
50
+ to the close line for unrecognized modes.
51
+ """
52
+ price_mode = str(mode).lower()
53
+ if price_mode in {"price_open", "open"}:
54
+ return data.open
55
+ if price_mode in {"price_high", "high"}:
56
+ return data.high
57
+ if price_mode in {"price_low", "low"}:
58
+ return data.low
59
+ if price_mode in {"price_median", "median"}:
60
+ return (data.high + data.low) / 2.0
61
+ if price_mode in {"price_typical", "typical"}:
62
+ return (data.high + data.low + data.close) / 3.0
63
+ if price_mode in {"price_weighted", "weighted"}:
64
+ return (data.high + data.low + data.close + data.close) / 4.0
65
+ return data.close
66
+
67
+
68
+ class CorrectedAverageIndicator(Indicator):
69
+ """Ehlers-style adaptive Corrected Average with event and vectorized modes."""
70
+
71
+ lines = ("corrected",)
72
+ params = (
73
+ ("ma_method", "sma"),
74
+ ("length", 12),
75
+ ("applied_price", "price_close"),
76
+ )
77
+
78
+ def __init__(self):
79
+ """Build the base MA and standard deviation and set the min period."""
80
+ price_line = resolve_price_line(self.data, self.p.applied_price)
81
+ self._ma = resolve_ma_class(self.p.ma_method)(price_line, period=self.p.length)
82
+ self._std = StandardDeviation(price_line, period=self.p.length)
83
+ self.addminperiod(int(self.p.length) + 3)
84
+
85
+ def next(self):
86
+ """Compute the corrected average for the current bar."""
87
+ ma = float(self._ma[0])
88
+ std = float(self._std[0])
89
+ prev = float(self.lines.corrected[-1]) if len(self) > 0 else ma
90
+ if prev != prev:
91
+ prev = ma
92
+ v1 = std**2
93
+ v2 = (prev - ma) ** 2
94
+ if v2 < v1 or v2 == 0:
95
+ k = 0.0
96
+ else:
97
+ k = 1.0 - v1 / v2
98
+ self.lines.corrected[0] = prev + k * (ma - prev)
99
+
100
+ def once(self, start, end):
101
+ """Vectorized corrected-average computation over the array index range.
102
+
103
+ Args:
104
+ start: Start index (inclusive) of the range to compute.
105
+ end: End index (exclusive) of the range to compute.
106
+ """
107
+ ma_array = self._ma.array
108
+ std_array = self._std.array
109
+ corrected_line = self.lines.corrected.array
110
+ while len(corrected_line) < end:
111
+ corrected_line.append(float("nan"))
112
+
113
+ prev = None
114
+ actual_end = min(end, len(ma_array), len(std_array))
115
+ for i in range(start, actual_end):
116
+ ma = float(ma_array[i])
117
+ std = float(std_array[i])
118
+ previous = ma if prev is None else prev
119
+ v1 = std**2
120
+ v2 = (previous - ma) ** 2
121
+ if v2 < v1 or v2 == 0:
122
+ k = 0.0
123
+ else:
124
+ k = 1.0 - v1 / v2
125
+ value = previous + k * (ma - previous)
126
+ corrected_line[i] = value
127
+ prev = value
@@ -0,0 +1,73 @@
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
+ "DarvasBoxesSystem",
12
+ ]
13
+
14
+
15
+ class DarvasBoxesSystem(Indicator):
16
+ """Indicator that emits Darvas box color states from high/low progression."""
17
+
18
+ lines = ("color",)
19
+ params = (
20
+ ("symmetry", True),
21
+ ("shift", 2),
22
+ )
23
+
24
+ def __init__(self):
25
+ """Initialize the indicator state and ensure required warmup bars."""
26
+ self.addminperiod(int(self.p.shift) + 8)
27
+ self.state = 0
28
+ self.box_top = None
29
+ self.box_bottom = None
30
+
31
+ def next(self):
32
+ """Update the running Darvas box and emit the discrete color signal."""
33
+ if self.box_top is None:
34
+ self.box_top = float(self.data.high[-1])
35
+ self.box_bottom = float(self.data.low[-1])
36
+ self.state = 1
37
+ bar_high = float(self.data.high[0])
38
+ bar_low = float(self.data.low[0])
39
+ if self.state == 1:
40
+ self.box_top = bar_high
41
+ if self.p.symmetry:
42
+ self.box_bottom = bar_low
43
+ elif self.state == 2:
44
+ if self.box_top <= bar_high:
45
+ self.box_top = bar_high
46
+ elif self.state == 3:
47
+ if self.box_top > bar_high:
48
+ self.box_bottom = bar_low
49
+ else:
50
+ self.box_top = bar_high
51
+ elif self.state == 4:
52
+ if self.box_top > bar_high:
53
+ if self.box_bottom >= bar_low:
54
+ self.box_bottom = bar_low
55
+ else:
56
+ self.box_top = bar_high
57
+ elif self.state == 5:
58
+ if self.box_top > bar_high:
59
+ if self.box_bottom >= bar_low:
60
+ self.box_bottom = bar_low
61
+ else:
62
+ self.box_top = bar_high
63
+ self.state = 0
64
+ self.state += 1
65
+ shift = int(self.p.shift)
66
+ close = float(self.data.close[0])
67
+ open_ = float(self.data.open[0])
68
+ color = 2.0
69
+ if len(self.data) > shift and close > self.box_top:
70
+ color = 4.0 if open_ < close else 3.0
71
+ if len(self.data) > shift and close < self.box_bottom:
72
+ color = 0.0 if open_ > close else 1.0
73
+ self.lines.color[0] = color
@@ -0,0 +1,42 @@
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
+ DoubleExponentialMovingAverage,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "DemaRangeChannelColor",
15
+ ]
16
+
17
+
18
+ class DemaRangeChannelColor(Indicator):
19
+ """Indicator computing DEMA-based upper/lower range channels with a color index for breakout direction."""
20
+
21
+ lines = ("color_idx", "upper", "lower")
22
+ params = (("period", 14),)
23
+
24
+ def __init__(self):
25
+ """Initialize DEMA channels from high/low inputs."""
26
+ self.upper_dema = DoubleExponentialMovingAverage(self.data.high, period=self.p.period)
27
+ self.lower_dema = DoubleExponentialMovingAverage(self.data.low, period=self.p.period)
28
+
29
+ def next(self):
30
+ """Set the upper, lower, and color_idx line values based on close position relative to DEMA band."""
31
+ upper = float(self.upper_dema[0])
32
+ lower = float(self.lower_dema[0])
33
+ close = float(self.data.close[0])
34
+ open_ = float(self.data.open[0])
35
+ self.lines.upper[0] = upper
36
+ self.lines.lower[0] = lower
37
+ color = 4.0
38
+ if close > upper:
39
+ color = 3.0 if close >= open_ else 2.0
40
+ elif close < lower:
41
+ color = 0.0 if close <= open_ else 1.0
42
+ self.lines.color_idx[0] = color