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,70 @@
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
+ WeightedMovingAverage,
13
+ )
14
+
15
+ __all__ = [
16
+ "CenterOfGravityIndicator",
17
+ ]
18
+
19
+
20
+ class CenterOfGravityIndicator(Indicator):
21
+ """Center of Gravity indicator composed of price selection and smoothed center line."""
22
+
23
+ lines = (
24
+ "center",
25
+ "signal",
26
+ "state",
27
+ )
28
+ params = (
29
+ ("period", 10),
30
+ ("smooth_period", 3),
31
+ ("ma_method", "sma"),
32
+ ("applied_price", "close"),
33
+ ("point", 0.01),
34
+ )
35
+
36
+ def __init__(self):
37
+ """Initialize base MAs and derived center/signal/state lines."""
38
+ ma_cls = SMA if str(self.p.ma_method).lower() == "sma" else EMA
39
+ price = self._price_line()
40
+ sma = SMA(price, period=self.p.period)
41
+ lwma = WeightedMovingAverage(price, period=self.p.period)
42
+ self.lines.center = (sma * lwma) / self.p.point
43
+ self.lines.signal = ma_cls(self.lines.center, period=self.p.smooth_period)
44
+ self.addminperiod(self.p.period + self.p.smooth_period + 5)
45
+
46
+ def _price_line(self):
47
+ mode = str(self.p.applied_price).lower()
48
+ if mode == "open":
49
+ return self.data.open
50
+ if mode == "high":
51
+ return self.data.high
52
+ if mode == "low":
53
+ return self.data.low
54
+ if mode == "median":
55
+ return (self.data.high + self.data.low) / 2.0
56
+ if mode == "typical":
57
+ return (self.data.high + self.data.low + self.data.close) / 3.0
58
+ if mode == "weighted":
59
+ return (self.data.high + self.data.low + self.data.close + self.data.close) / 4.0
60
+ if mode == "simpl":
61
+ return (self.data.open + self.data.close) / 2.0
62
+ if mode == "quarter":
63
+ return (self.data.high + self.data.low + self.data.open + self.data.close) / 4.0
64
+ return self.data.close
65
+
66
+ def next(self):
67
+ """Compute the state classification for the current bar."""
68
+ self.lines.state[0] = (
69
+ 2.0 if float(self.lines.center[0]) < float(self.lines.signal[0]) else 1.0
70
+ )
@@ -0,0 +1,40 @@
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
+ "CGOscillator",
12
+ ]
13
+
14
+
15
+ class CGOscillator(Indicator):
16
+ """Center of Gravity (CG) oscillator with a one-bar-lagged signal line.
17
+
18
+ The main line is a length-weighted ratio of recent median prices, shifted
19
+ to centre around zero. The signal line is the previous bar's main value.
20
+ """
21
+
22
+ lines = ("main", "signal")
23
+ params = (("length", 10),)
24
+
25
+ def __init__(self):
26
+ """Set the minimum period and precompute the CG centring shift."""
27
+ self.addminperiod(int(self.p.length) + 1)
28
+ self.cgshift = (float(self.p.length) + 1.0) / 2.0
29
+
30
+ def next(self):
31
+ """Compute the CG main and lagged signal value for the current bar."""
32
+ num = 0.0
33
+ denom = 0.0
34
+ length = int(self.p.length)
35
+ for count in range(length):
36
+ price = (float(self.data.high[-count]) + float(self.data.low[-count])) / 2.0
37
+ num += (1.0 + count) * price
38
+ denom += price
39
+ self.lines.main[0] = (-num / denom + self.cgshift) if denom else 0.0
40
+ self.lines.signal[0] = self.lines.main[-1] if len(self) > 1 else 0.0
@@ -0,0 +1,38 @@
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
+ Indicator,
10
+ MeanDev,
11
+ MovAv,
12
+ )
13
+
14
+ __all__ = [
15
+ "CloseLineCCI",
16
+ ]
17
+
18
+
19
+ class CloseLineCCI(Indicator):
20
+ """Custom CCI indicator designed to evaluate simple single close lines instead of HLC.
21
+
22
+ Lines:
23
+ cci (Line): Output Commodity Channel Index line.
24
+ """
25
+
26
+ lines = ("cci",)
27
+ params = (
28
+ ("period", 20),
29
+ ("factor", 0.015),
30
+ ("movav", MovAv.Simple),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Initialize and calculate close-based CCI indicator components."""
35
+ tp = self.data
36
+ tpmean = self.p.movav(tp, period=self.p.period)
37
+ meandev = MeanDev(tp, tpmean, period=self.p.period)
38
+ self.lines.cci = (tp - tpmean) / (self.p.factor * meandev)
@@ -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 Indicator
9
+
10
+ __all__ = [
11
+ "ClosePriceFractals",
12
+ ]
13
+
14
+
15
+ class ClosePriceFractals(Indicator):
16
+ """Custom 5-period Fractal indicator calculated solely on closing prices.
17
+
18
+ Lines:
19
+ upper: Contains fractal peak closing price if upper fractal is formed.
20
+ lower: Contains fractal valley closing price if lower fractal is formed.
21
+ """
22
+
23
+ lines = ("upper", "lower")
24
+
25
+ def __init__(self):
26
+ """Initialize the indicator with a minimum period of 5 bars."""
27
+ self.addminperiod(5)
28
+
29
+ def next(self):
30
+ """Determine if a peak or valley fractal forms on bar -2 based on close prices."""
31
+ self.lines.upper[0] = float("nan")
32
+ self.lines.lower[0] = float("nan")
33
+ candidate = float(self.data.close[-2])
34
+ if (
35
+ candidate > float(self.data.close[-3])
36
+ and candidate > float(self.data.close[-4])
37
+ and candidate >= float(self.data.close[-1])
38
+ and candidate >= float(self.data.close[0])
39
+ ):
40
+ self.lines.upper[0] = candidate
41
+ if (
42
+ candidate < float(self.data.close[-3])
43
+ and candidate < float(self.data.close[-4])
44
+ and candidate <= float(self.data.close[-1])
45
+ and candidate <= float(self.data.close[0])
46
+ ):
47
+ self.lines.lower[0] = candidate
@@ -0,0 +1,122 @@
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
+ If,
11
+ Indicator,
12
+ SimpleMovingAverage,
13
+ SmoothedMovingAverage,
14
+ WeightedMovingAverage,
15
+ )
16
+
17
+ __all__ = [
18
+ "Color3rdGenXMAIndicator",
19
+ ]
20
+
21
+
22
+ def resolve_ma_class(name):
23
+ """Map a moving-average name to its backtrader indicator class.
24
+
25
+ Args:
26
+ name: MA type name (e.g. ``sma``, ``ema``, ``smma`` or MT5-style
27
+ ``mode_*`` variants); several smoothing variants map to EMA.
28
+
29
+ Returns:
30
+ The matching backtrader moving-average indicator class, defaulting to
31
+ the weighted moving average for unrecognized names.
32
+ """
33
+ mode = str(name).lower()
34
+ if mode in {"mode_sma", "sma"}:
35
+ return SimpleMovingAverage
36
+ if mode in {
37
+ "mode_ema",
38
+ "ema",
39
+ "mode_jjma",
40
+ "jjma",
41
+ "mode_jurx",
42
+ "jurx",
43
+ "mode_parma",
44
+ "parma",
45
+ "mode_t3",
46
+ "t3",
47
+ "mode_vidya",
48
+ "vidya",
49
+ "mode_ama",
50
+ "ama",
51
+ }:
52
+ return ExponentialMovingAverage
53
+ if mode in {"mode_smma", "smma"}:
54
+ return SmoothedMovingAverage
55
+ return WeightedMovingAverage
56
+
57
+
58
+ def resolve_price_line(data, mode):
59
+ """Return the applied-price line for a data feed given a price mode.
60
+
61
+ Args:
62
+ data: The data feed providing OHLC lines.
63
+ mode: Applied-price selector (e.g. ``price_close``, ``price_typical``,
64
+ ``price_weighted`` or their short forms).
65
+
66
+ Returns:
67
+ A line expression for the selected applied price, defaulting to the
68
+ typical price for unrecognized modes.
69
+ """
70
+ price_mode = str(mode).lower()
71
+ if price_mode in {"price_close", "close"}:
72
+ return data.close
73
+ if price_mode in {"price_open", "open"}:
74
+ return data.open
75
+ if price_mode in {"price_high", "high"}:
76
+ return data.high
77
+ if price_mode in {"price_low", "low"}:
78
+ return data.low
79
+ if price_mode in {"price_median", "median"}:
80
+ return (data.high + data.low) / 2.0
81
+ if price_mode in {"price_typical", "typical"}:
82
+ return (data.high + data.low + data.close) / 3.0
83
+ if price_mode in {"price_weighted", "weighted"}:
84
+ return (2.0 * data.close + data.high + data.low) / 4.0
85
+ if price_mode in {"price_simpl", "simpl"}:
86
+ return (data.open + data.close) / 2.0
87
+ if price_mode in {"price_quarter", "quarter"}:
88
+ return (data.high + data.low + data.open + data.close) / 4.0
89
+ return (data.high + data.low + data.close) / 3.0
90
+
91
+
92
+ class Color3rdGenXMAIndicator(Indicator):
93
+ """Third-generation (reduced-lag) moving average with a slope color.
94
+
95
+ Combines a base moving average with a re-smoothed version using a
96
+ lambda-derived alpha to cut lag, exposing the resulting line on ``value`` and
97
+ a ``color`` line marking whether it is rising (2), falling (0) or flat (1).
98
+ """
99
+
100
+ lines = ("value", "color")
101
+ params = (
102
+ ("xma_method", "ema"),
103
+ ("xlength", 50),
104
+ ("xphase", 15),
105
+ ("ipc", "price_typical"),
106
+ ("price_shift", 0),
107
+ )
108
+
109
+ def __init__(self):
110
+ """Build the two-stage moving average and the value/color lines."""
111
+ price = resolve_price_line(self.data, self.p.ipc)
112
+ ma_cls = resolve_ma_class(self.p.xma_method)
113
+ slength = max(1, int(self.p.xlength) * 2)
114
+ self._x1 = ma_cls(price, period=slength)
115
+ self._x2 = ma_cls(self._x1, period=max(1, int(self.p.xlength)))
116
+ lam = float(slength) / max(1.0, float(self.p.xlength))
117
+ self._alpha = lam * (slength - 1.0) / max(1e-9, (slength - lam))
118
+ self._dprice_shift = float(self.p.price_shift) * 0.00001
119
+ value = (self._alpha + 1.0) * self._x1 - self._alpha * self._x2 + self._dprice_shift
120
+ self.lines.value = value
121
+ self.lines.color = If(value > value(-1), 2.0, If(value < value(-1), 0.0, 1.0))
122
+ self.addminperiod(slength + int(self.p.xlength) + 5)
@@ -0,0 +1,108 @@
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
+ StandardDeviation,
13
+ )
14
+
15
+ __all__ = [
16
+ "ColorBBCandlesIndicator",
17
+ ]
18
+
19
+
20
+ class ColorBBCandlesIndicator(Indicator):
21
+ """Color BBCandles indicator producing zone states from volatility envelopes.
22
+
23
+ The indicator computes a moving-average center line and standard deviation
24
+ bands with multiple deviation levels, then emits a discrete state 0..10.
25
+ """
26
+
27
+ lines = (
28
+ "state",
29
+ "price_line",
30
+ "mid",
31
+ )
32
+ params = (
33
+ ("period", 100),
34
+ ("deviation1", 1.0),
35
+ ("deviation2", 1.5),
36
+ ("deviation3", 2.0),
37
+ ("deviation4", 2.5),
38
+ ("deviation5", 3.0),
39
+ ("ma_method", "ema"),
40
+ ("applied_price", "close"),
41
+ )
42
+
43
+ def __init__(self):
44
+ """Prepare price line selector and required indicator buffers."""
45
+ ma_cls = EMA if str(self.p.ma_method).lower() == "ema" else SMA
46
+ self.price = self._price_line()
47
+ self.lines.price_line = self.price
48
+ self.lines.mid = ma_cls(self.price, period=self.p.period)
49
+ self.stddev = StandardDeviation(self.price, period=self.p.period)
50
+ self.addminperiod(self.p.period + 5)
51
+
52
+ def _price_line(self):
53
+ mode = str(self.p.applied_price).lower()
54
+ if mode == "open":
55
+ return self.data.open
56
+ if mode == "high":
57
+ return self.data.high
58
+ if mode == "low":
59
+ return self.data.low
60
+ if mode == "median":
61
+ return (self.data.high + self.data.low) / 2.0
62
+ if mode == "typical":
63
+ return (self.data.high + self.data.low + self.data.close) / 3.0
64
+ if mode == "weighted":
65
+ return (self.data.high + self.data.low + self.data.close + self.data.close) / 4.0
66
+ if mode == "simpl":
67
+ return (self.data.open + self.data.close) / 2.0
68
+ if mode == "quarter":
69
+ return (self.data.high + self.data.low + self.data.open + self.data.close) / 4.0
70
+ return self.data.close
71
+
72
+ def next(self):
73
+ """Evaluate the current bar and emit the normalized volatility state."""
74
+ price = float(self.price[0])
75
+ mid = float(self.lines.mid[0])
76
+ stdev = float(self.stddev[0])
77
+ up1 = mid + stdev * self.p.deviation1
78
+ up2 = mid + stdev * self.p.deviation2
79
+ up3 = mid + stdev * self.p.deviation3
80
+ up4 = mid + stdev * self.p.deviation4
81
+ up5 = mid + stdev * self.p.deviation5
82
+ dn1 = mid - stdev * self.p.deviation1
83
+ dn2 = mid - stdev * self.p.deviation2
84
+ dn3 = mid - stdev * self.p.deviation3
85
+ dn4 = mid - stdev * self.p.deviation4
86
+ dn5 = mid - stdev * self.p.deviation5
87
+ state = 5.0
88
+ if price > up5:
89
+ state = 10.0
90
+ elif price > up4:
91
+ state = 9.0
92
+ elif price > up3:
93
+ state = 8.0
94
+ elif price > up2:
95
+ state = 7.0
96
+ elif price > up1:
97
+ state = 6.0
98
+ elif price < dn5:
99
+ state = 0.0
100
+ elif price < dn4:
101
+ state = 1.0
102
+ elif price < dn3:
103
+ state = 2.0
104
+ elif price < dn2:
105
+ state = 3.0
106
+ elif price < dn1:
107
+ state = 4.0
108
+ self.lines.state[0] = state
@@ -0,0 +1,157 @@
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
+ WeightedMovingAverage,
14
+ )
15
+
16
+ __all__ = [
17
+ "ColorCoppockIndicator",
18
+ ]
19
+
20
+
21
+ def resolve_ma_class(name):
22
+ """Map configured MA mode strings to Backtrader MA classes.
23
+
24
+ Args:
25
+ name: MA mode token from configuration.
26
+
27
+ Returns:
28
+ MA indicator class.
29
+ """
30
+ mode = str(name).lower()
31
+ if mode in {"mode_sma", "sma"}:
32
+ return SimpleMovingAverage
33
+ if mode in {
34
+ "mode_ema",
35
+ "ema",
36
+ "mode_jjma",
37
+ "jjma",
38
+ "mode_jurx",
39
+ "jurx",
40
+ "mode_parma",
41
+ "parma",
42
+ "mode_t3",
43
+ "t3",
44
+ "mode_vidya",
45
+ "vidya",
46
+ "mode_ama",
47
+ "ama",
48
+ }:
49
+ return ExponentialMovingAverage
50
+ if mode in {"mode_smma", "smma"}:
51
+ return SmoothedMovingAverage
52
+ return WeightedMovingAverage
53
+
54
+
55
+ def resolve_price_line(data, mode):
56
+ """Resolve a price selector key to a data line for indicator input.
57
+
58
+ Args:
59
+ data: Backtrader data feed.
60
+ mode: Price selector token.
61
+
62
+ Returns:
63
+ Price series corresponding to the requested selector.
64
+ """
65
+ price_mode = str(mode).lower()
66
+ if price_mode in {"price_open", "open"}:
67
+ return data.open
68
+ if price_mode in {"price_high", "high"}:
69
+ return data.high
70
+ if price_mode in {"price_low", "low"}:
71
+ return data.low
72
+ if price_mode in {"price_median", "median"}:
73
+ return (data.high + data.low) / 2.0
74
+ if price_mode in {"price_typical", "typical"}:
75
+ return (data.high + data.low + data.close) / 3.0
76
+ if price_mode in {"price_weighted", "weighted"}:
77
+ return (2.0 * data.close + data.high + data.low) / 4.0
78
+ if price_mode in {"price_simpl", "simpl"}:
79
+ return (data.open + data.close) / 2.0
80
+ if price_mode in {"price_quarter", "quarter"}:
81
+ return (data.high + data.low + data.open + data.close) / 4.0
82
+ return data.close
83
+
84
+
85
+ class ColorCoppockIndicator(Indicator):
86
+ """Compute Coppock oscillator value and its directional color state."""
87
+
88
+ lines = ("value", "color")
89
+ params = (
90
+ ("roc1_period", 14),
91
+ ("roc2_period", 10),
92
+ ("xma_method", "lwma"),
93
+ ("xma_period", 12),
94
+ ("xma_phase", 100),
95
+ ("applied_price", "price_close"),
96
+ )
97
+
98
+ def __init__(self):
99
+ """Initialize ROC sum and the final smoothing moving average."""
100
+ price_line = resolve_price_line(self.data, self.p.applied_price)
101
+ roc1 = (price_line - price_line(-int(self.p.roc1_period))) / price_line(
102
+ -int(self.p.roc1_period)
103
+ )
104
+ roc2 = (price_line - price_line(-int(self.p.roc2_period))) / price_line(
105
+ -int(self.p.roc2_period)
106
+ )
107
+ self._roc_sum = roc1 + roc2
108
+ ma_cls = resolve_ma_class(self.p.xma_method)
109
+ self._smooth = ma_cls(self._roc_sum, period=max(1, int(self.p.xma_period)))
110
+ self.addminperiod(
111
+ max(int(self.p.roc1_period), int(self.p.roc2_period)) + int(self.p.xma_period) + 3
112
+ )
113
+
114
+ def next(self):
115
+ """Update value and color for the current bar."""
116
+ value = float(self._smooth[0])
117
+ prev = float(self._smooth[-1])
118
+ self.lines.value[0] = value
119
+ color = 2
120
+ if value > 0:
121
+ if value > prev:
122
+ color = 4
123
+ elif value < prev:
124
+ color = 3
125
+ if value < 0:
126
+ if value < prev:
127
+ color = 0
128
+ elif value > prev:
129
+ color = 1
130
+ self.lines.color[0] = color
131
+
132
+ def once(self, start, end):
133
+ """Fill value/color lines for preloaded bars in a batch run."""
134
+ smooth = self._smooth.array
135
+ value_line = self.lines.value.array
136
+ color_line = self.lines.color.array
137
+ for line in (value_line, color_line):
138
+ while len(line) < end:
139
+ line.append(float("nan"))
140
+
141
+ actual_end = min(end, len(smooth))
142
+ for i in range(start, actual_end):
143
+ value = float(smooth[i])
144
+ prev = float(smooth[i - 1]) if i > 0 else value
145
+ color = 2
146
+ if value > 0:
147
+ if value > prev:
148
+ color = 4
149
+ elif value < prev:
150
+ color = 3
151
+ if value < 0:
152
+ if value < prev:
153
+ color = 0
154
+ elif value > prev:
155
+ color = 1
156
+ value_line[i] = value
157
+ color_line[i] = color
@@ -0,0 +1,71 @@
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
+ "ColorHMA",
14
+ ]
15
+
16
+
17
+ def _weighted_ma(values):
18
+ weights = list(range(1, len(values) + 1))
19
+ denominator = float(sum(weights))
20
+ return sum(value * weight for value, weight in zip(values, weights)) / denominator
21
+
22
+
23
+ class ColorHMA(Indicator):
24
+ """Hull Moving Average line plus its slope-direction ("color") line."""
25
+
26
+ lines = ("hma", "direction")
27
+ params = (("period", 13),)
28
+
29
+ def __init__(self):
30
+ """Derive the half, full, and sqrt periods and set the warmup window."""
31
+ self.period = max(int(self.p.period), 2)
32
+ self.half_period = max(int(math.floor(self.period / 2.0)), 1)
33
+ self.sqrt_period = max(int(math.floor(math.sqrt(self.period))), 1)
34
+ self._dma_history = []
35
+ self.addminperiod(self.period + self.sqrt_period + 2)
36
+
37
+ def _window(self, length):
38
+ return [float(self.data[-idx]) for idx in range(length - 1, -1, -1)]
39
+
40
+ def next(self):
41
+ """Compute the HMA value for this bar and update its slope direction."""
42
+ if len(self.data) < self.period:
43
+ current = (
44
+ float(self.data.close[0]) if hasattr(self.data, "close") else float(self.data[0])
45
+ )
46
+ self._dma_history.append(current)
47
+ self.l.hma[0] = current
48
+ self.l.direction[0] = 0.0
49
+ return
50
+
51
+ half_values = self._window(self.half_period)
52
+ full_values = self._window(self.period)
53
+ lwma_half = _weighted_ma(half_values)
54
+ lwma_full = _weighted_ma(full_values)
55
+ dma = 2.0 * lwma_half - lwma_full
56
+ self._dma_history.append(dma)
57
+
58
+ if len(self._dma_history) >= self.sqrt_period:
59
+ hma = _weighted_ma(self._dma_history[-self.sqrt_period :])
60
+ else:
61
+ hma = dma
62
+
63
+ self.l.hma[0] = hma
64
+ if len(self) < 2:
65
+ self.l.direction[0] = 0.0
66
+ elif self.l.hma[-1] < self.l.hma[0]:
67
+ self.l.direction[0] = 1.0
68
+ elif self.l.hma[-1] > self.l.hma[0]:
69
+ self.l.direction[0] = -1.0
70
+ else:
71
+ self.l.direction[0] = self.l.direction[-1]