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,95 @@
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
+ "DerivativeIndicator",
12
+ ]
13
+
14
+
15
+ APPLIED_PRICE_MAP = {
16
+ "PRICE_CLOSE": 0,
17
+ "PRICE_OPEN": 1,
18
+ "PRICE_HIGH": 2,
19
+ "PRICE_LOW": 3,
20
+ "PRICE_MEDIAN": 4,
21
+ "PRICE_TYPICAL": 5,
22
+ "PRICE_WEIGHTED": 6,
23
+ "PRICE_OPEN_CLOSE": 8,
24
+ "PRICE_OHLC_AVERAGE": 9,
25
+ "PRICE_DEMARK": 10,
26
+ "PRICE_AVERAGE_DEMARK": 11,
27
+ }
28
+
29
+
30
+ class DerivativeIndicator(Indicator):
31
+ """Derivative indicator derived from a selected applied price.
32
+
33
+ The computed `value` line is a momentum-like slope:
34
+ ``100 * (price[0] - price[-i_slowing]) / i_slowing``.
35
+ """
36
+
37
+ lines = ("value",)
38
+ params = (
39
+ ("i_slowing", 34),
40
+ ("applied_price", "PRICE_WEIGHTED"),
41
+ )
42
+
43
+ def __init__(self):
44
+ """Require at least ``i_slowing + 1`` bars before emitting values."""
45
+ self.addminperiod(int(self.p.i_slowing) + 1)
46
+
47
+ def _mode_value(self, value, default_value):
48
+ if isinstance(value, str):
49
+ return APPLIED_PRICE_MAP.get(value, default_value)
50
+ return int(value)
51
+
52
+ def _price(self, ago=0):
53
+ mode = self._mode_value(self.p.applied_price, 0)
54
+ open_ = float(self.data.open[ago])
55
+ high = float(self.data.high[ago])
56
+ low = float(self.data.low[ago])
57
+ close = float(self.data.close[ago])
58
+ if mode == 0:
59
+ return close
60
+ if mode == 1:
61
+ return open_
62
+ if mode == 2:
63
+ return high
64
+ if mode == 3:
65
+ return low
66
+ if mode == 4:
67
+ return (high + low) / 2.0
68
+ if mode == 5:
69
+ return (close + high + low) / 3.0
70
+ if mode == 6:
71
+ return (2.0 * close + high + low) / 4.0
72
+ if mode == 8:
73
+ return (open_ + close) / 2.0
74
+ if mode == 9:
75
+ return (open_ + close + high + low) / 4.0
76
+ if mode == 10:
77
+ if close > open_:
78
+ return high
79
+ if close < open_:
80
+ return low
81
+ return close
82
+ if mode == 11:
83
+ if close > open_:
84
+ return (high + close) / 2.0
85
+ if close < open_:
86
+ return (low + close) / 2.0
87
+ return close
88
+ return close
89
+
90
+ def next(self):
91
+ """Update the derivative value for the current bar."""
92
+ lag = int(self.p.i_slowing)
93
+ current = self._price(0)
94
+ past = self._price(-lag)
95
+ self.lines.value[0] = 100.0 * (current - past) / float(lag)
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from backtrader.utils.dateintern import num2date
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "DigitalFT01Indicator",
14
+ ]
15
+
16
+
17
+ DIGITAL_WEIGHTS = [
18
+ 0.24470985659780,
19
+ 0.23139774006970,
20
+ 0.20613796947320,
21
+ 0.17166230340640,
22
+ 0.13146907903600,
23
+ 0.08950387549560,
24
+ 0.04960091651250,
25
+ 0.01502270569607,
26
+ -0.01188033734430,
27
+ -0.02989873856137,
28
+ -0.03898967104900,
29
+ -0.04014113626390,
30
+ -0.03511968085800,
31
+ -0.02611613850342,
32
+ -0.01539056955666,
33
+ -0.00495353651394,
34
+ 0.00368588764825,
35
+ 0.00963614049782,
36
+ 0.01265138888314,
37
+ 0.01307496106868,
38
+ 0.01169702291063,
39
+ 0.00974841844086,
40
+ 0.00898900012545,
41
+ -0.00649745721156,
42
+ ]
43
+
44
+
45
+ class DigitalFT01Indicator(Indicator):
46
+ """Fixed-weight digital filter with a channel trigger for crossover signals."""
47
+
48
+ lines = ("digital", "trigger")
49
+ params = (
50
+ ("halfchannel", 25),
51
+ ("applied_price_code", 1),
52
+ ("point", 0.01),
53
+ ("signal_period_minutes", 180),
54
+ )
55
+
56
+ def __init__(self):
57
+ """Set the minimum period to cover the digital-filter kernel length."""
58
+ self.addminperiod(len(DIGITAL_WEIGHTS) + 10)
59
+
60
+ def _price_value(self, shift):
61
+ o = float(self.data.open[-shift] if shift else self.data.open[0])
62
+ h = float(self.data.high[-shift] if shift else self.data.high[0])
63
+ low_price = float(self.data.low[-shift] if shift else self.data.low[0])
64
+ c = float(self.data.close[-shift] if shift else self.data.close[0])
65
+ code = int(self.p.applied_price_code)
66
+ if code == 1:
67
+ return c
68
+ if code == 2:
69
+ return o
70
+ if code == 3:
71
+ return h
72
+ if code == 4:
73
+ return low_price
74
+ if code == 5:
75
+ return (h + low_price) / 2.0
76
+ if code == 6:
77
+ return (h + low_price + c) / 3.0
78
+ if code == 7:
79
+ return (h + low_price + c + c) / 4.0
80
+ if code == 8:
81
+ return (o + h + low_price + c) / 4.0
82
+ if code == 12:
83
+ base = h + low_price + c
84
+ if c < o:
85
+ return (base + low_price) / 4.0
86
+ if c > o:
87
+ return (base + h) / 4.0
88
+ return (base + c) / 4.0
89
+ return c
90
+
91
+ def next(self):
92
+ """Compute the digital-filter value and channel trigger for this bar.
93
+
94
+ Convolves the fixed DIGITAL_WEIGHTS kernel with the applied price, then
95
+ sets the trigger to a reference close plus/minus the half-channel
96
+ depending on whether the filtered value is above or below that close.
97
+ """
98
+ if len(self.data) < len(DIGITAL_WEIGHTS):
99
+ return
100
+ digital = 0.0
101
+ for shift, weight in enumerate(DIGITAL_WEIGHTS):
102
+ digital += weight * self._price_value(shift)
103
+ dt = num2date(self.data.datetime[0])
104
+ period_minutes = max(int(self.p.signal_period_minutes), 1)
105
+ bars_from_day_start = int(round((dt.hour * 60 + dt.minute) / float(period_minutes)) + 1)
106
+ if len(self.data) <= bars_from_day_start:
107
+ return
108
+ ref_close = float(self.data.close[-bars_from_day_start])
109
+ halfchannel = float(self.p.halfchannel) * float(self.p.point)
110
+ trigger = ref_close + halfchannel if digital >= ref_close else ref_close - halfchannel
111
+ self.lines.digital[0] = digital
112
+ self.lines.trigger[0] = trigger
@@ -0,0 +1,200 @@
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 collections import deque
9
+
10
+ from .. import (
11
+ Indicator,
12
+ SimpleMovingAverage,
13
+ )
14
+
15
+ __all__ = [
16
+ "DigitalMacd",
17
+ ]
18
+
19
+
20
+ class DigitalMacd(Indicator):
21
+ """Digital MACD indicator built from fixed FIR fast/slow filter banks."""
22
+
23
+ lines = ("macd", "signal")
24
+ params = (
25
+ ("signal_period", 5),
26
+ ("point", 0.01),
27
+ )
28
+
29
+ FAST_COEFFS = [
30
+ 0.2149840610,
31
+ 0.2065763732,
32
+ 0.1903728890,
33
+ 0.1675422436,
34
+ 0.1397053150,
35
+ 0.1087951881,
36
+ 0.0768869405,
37
+ 0.0460244906,
38
+ 0.0180517395,
39
+ -0.0055294579,
40
+ -0.0236660212,
41
+ -0.0358140055,
42
+ -0.0419497760,
43
+ -0.0425331450,
44
+ -0.0384279507,
45
+ -0.0307917433,
46
+ -0.0209443384,
47
+ -0.0102335925,
48
+ 0.0000932767,
49
+ 0.0089950015,
50
+ 0.0157131144,
51
+ 0.0198149331,
52
+ 0.0211989019,
53
+ 0.0200639819,
54
+ 0.0168532934,
55
+ 0.0121825067,
56
+ 0.0067474241,
57
+ 0.0012444305,
58
+ -0.0037087682,
59
+ -0.0076300416,
60
+ -0.0102110543,
61
+ -0.0113306266,
62
+ -0.0110462105,
63
+ -0.0095662166,
64
+ -0.0072080453,
65
+ -0.0043494435,
66
+ -0.0013771970,
67
+ 0.0013575268,
68
+ 0.0035760416,
69
+ 0.0050946166,
70
+ 0.0058339574,
71
+ 0.0058160431,
72
+ 0.0051486631,
73
+ 0.0039984014,
74
+ 0.0025619380,
75
+ 0.0010531475,
76
+ -0.0003481453,
77
+ -0.0014937154,
78
+ -0.0022905986,
79
+ -0.0027000514,
80
+ -0.0027359080,
81
+ -0.0024543322,
82
+ -0.0019409837,
83
+ -0.0012957482,
84
+ -0.0006179734,
85
+ 0.0000057542,
86
+ 0.0005111297,
87
+ 0.0008605279,
88
+ 0.0010441921,
89
+ 0.0010775684,
90
+ 0.0009966494,
91
+ 0.0008537300,
92
+ 0.0007142855,
93
+ 0.0006599146,
94
+ -0.0008151017,
95
+ ]
96
+
97
+ SLOW_COEFFS = [
98
+ 0.0825641231,
99
+ 0.0822783080,
100
+ 0.0814249974,
101
+ 0.0800166909,
102
+ 0.0780735197,
103
+ 0.0756232268,
104
+ 0.0727009740,
105
+ 0.0693478349,
106
+ 0.0656105823,
107
+ 0.0615409157,
108
+ 0.0571939540,
109
+ 0.0526285643,
110
+ 0.0479025123,
111
+ 0.0430785482,
112
+ 0.0382152880,
113
+ 0.0333706133,
114
+ 0.0286021160,
115
+ 0.0239614376,
116
+ 0.0194972056,
117
+ 0.0152532583,
118
+ 0.0112682658,
119
+ 0.0075745482,
120
+ 0.0041980052,
121
+ 0.0011588603,
122
+ -0.0015292889,
123
+ -0.0038593393,
124
+ -0.0058303888,
125
+ -0.0074473108,
126
+ -0.0087203043,
127
+ -0.0096645874,
128
+ -0.0102995666,
129
+ -0.0106483424,
130
+ -0.0107374524,
131
+ -0.0105952115,
132
+ -0.0102516944,
133
+ -0.0097377645,
134
+ -0.0090838346,
135
+ -0.0083237046,
136
+ -0.0074804382,
137
+ -0.0065902734,
138
+ -0.0056742995,
139
+ -0.0047554314,
140
+ -0.0038574209,
141
+ -0.0029983549,
142
+ -0.0021924972,
143
+ -0.0014513858,
144
+ -0.0007848072,
145
+ -0.0001995891,
146
+ 0.0003009728,
147
+ 0.0007162164,
148
+ 0.0010478905,
149
+ 0.0012994016,
150
+ 0.0014755433,
151
+ 0.0015824007,
152
+ 0.0016272598,
153
+ 0.0016185271,
154
+ 0.0015648336,
155
+ 0.0014747659,
156
+ 0.0013569946,
157
+ 0.0012193896,
158
+ 0.0010695971,
159
+ 0.0009140878,
160
+ 0.0007591540,
161
+ 0.0016019033,
162
+ ]
163
+
164
+ def __init__(self):
165
+ """Cache FIR coefficients, set warmup, and build the signal SMA.
166
+
167
+ Side effects:
168
+ Stores the fast/slow coefficient tuples, allocates the rolling close
169
+ buffer, sets the minimum warmup period, and wires ``signal`` as an
170
+ SMA of the ``macd`` line.
171
+ """
172
+ self._fast_coeffs = tuple(float(v) for v in self.FAST_COEFFS)
173
+ self._slow_coeffs = tuple(float(v) for v in self.SLOW_COEFFS)
174
+ self._max_lookback = max(len(self._fast_coeffs), len(self._slow_coeffs))
175
+ self._closes = deque(maxlen=self._max_lookback)
176
+ self.addminperiod(self._max_lookback + max(int(self.p.signal_period), 1))
177
+ self._point = float(self.p.point) if float(self.p.point) else 1.0
178
+ self.l.signal = SimpleMovingAverage(self.l.macd, period=max(int(self.p.signal_period), 1))
179
+
180
+ def next(self):
181
+ """Convolve the rolling close window with the FIR banks to set ``macd``.
182
+
183
+ Emits NaN until the buffer is full, then writes the point-scaled
184
+ difference of the fast and slow digital filter outputs to ``macd``.
185
+ """
186
+ self._closes.append(float(self.data.close[0]))
187
+ if len(self._closes) < self._max_lookback:
188
+ self.l.macd[0] = float("nan")
189
+ return
190
+
191
+ closes = tuple(self._closes)
192
+ fast_dma = 0.0
193
+ for idx, coeff in enumerate(self._fast_coeffs):
194
+ fast_dma += coeff * closes[-(idx + 1)]
195
+
196
+ slow_dma = 0.0
197
+ for idx, coeff in enumerate(self._slow_coeffs):
198
+ slow_dma += coeff * closes[-(idx + 1)]
199
+
200
+ self.l.macd[0] = (fast_dma - slow_dma) / self._point
@@ -0,0 +1,45 @@
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
+ "DonchianChannelsSystem",
12
+ ]
13
+
14
+
15
+ class DonchianChannelsSystem(Indicator):
16
+ """Donchian-channel indicator emitting breakout-oriented color states."""
17
+
18
+ lines = ("color",)
19
+ params = (
20
+ ("period", 20),
21
+ ("shift", 2),
22
+ ("margins", -2),
23
+ )
24
+
25
+ def __init__(self):
26
+ """Initialize warmup period based on configured Donchian window."""
27
+ self.addminperiod(int(self.p.period) + int(self.p.shift) + 3)
28
+
29
+ def next(self):
30
+ """Update rolling channel bounds and write the current breakout color."""
31
+ shift = int(self.p.shift)
32
+ highs = [float(self.data.high[-(shift + i)]) for i in range(int(self.p.period))]
33
+ lows = [float(self.data.low[-(shift + i)]) for i in range(int(self.p.period))]
34
+ hh = max(highs)
35
+ ll = min(lows)
36
+ smin = ll + (hh - ll) * float(self.p.margins) / 100.0
37
+ smax = hh - (hh - ll) * float(self.p.margins) / 100.0
38
+ close = float(self.data.close[0])
39
+ open_ = float(self.data.open[0])
40
+ color = 2.0
41
+ if close > smax:
42
+ color = 4.0 if open_ <= close else 3.0
43
+ if close < smin:
44
+ color = 0.0 if open_ > close else 1.0
45
+ self.lines.color[0] = color
@@ -0,0 +1,93 @@
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
+ "DotsIndicator",
14
+ ]
15
+
16
+
17
+ class DotsIndicator(Indicator):
18
+ """Compute a multi-cycle Dots value and color-change state.
19
+
20
+ Attributes:
21
+ lines: Custom lines ``dots`` and ``color``.
22
+ params: Indicator parameters used in strategy logic.
23
+ """
24
+
25
+ lines = ("dots", "color")
26
+ params = (
27
+ ("length", 10),
28
+ ("filter_points", 0.0),
29
+ ("price_code", 1),
30
+ ("point", 0.01),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Initialize internal caches and indicator warmup state."""
35
+ self.addminperiod(int(self.p.length) * 4 + int(self.p.length) + 5)
36
+ self.res1 = 1.0 / max(float(self.p.length), 1.0)
37
+ self.phase = max(int(self.p.length) - 1, 0)
38
+ self.cycle = 4
39
+ self.filter_distance = float(self.p.filter_points) * float(self.p.point)
40
+
41
+ def _price_value(self, shift):
42
+ o = float(self.data.open[-shift] if shift else self.data.open[0])
43
+ h = float(self.data.high[-shift] if shift else self.data.high[0])
44
+ low_price = float(self.data.low[-shift] if shift else self.data.low[0])
45
+ c = float(self.data.close[-shift] if shift else self.data.close[0])
46
+ code = int(self.p.price_code)
47
+ if code == 1:
48
+ return c
49
+ if code == 2:
50
+ return o
51
+ if code == 3:
52
+ return h
53
+ if code == 4:
54
+ return low_price
55
+ if code == 5:
56
+ return (h + low_price) / 2.0
57
+ if code == 6:
58
+ return (h + low_price + c) / 3.0
59
+ if code == 7:
60
+ return (h + low_price + c + c) / 4.0
61
+ if code == 8:
62
+ return (o + h + low_price + c) / 4.0
63
+ return c
64
+
65
+ def next(self):
66
+ """Update smoothed value and color state for the current bar."""
67
+ total_len = self.phase + int(self.p.length) * self.cycle
68
+ if len(self.data) <= total_len:
69
+ return
70
+ t = 0.0
71
+ total = 0.0
72
+ weight = 0.0
73
+ for iii in range(total_len):
74
+ if t <= 0.5:
75
+ g = 1.0
76
+ else:
77
+ g = 1.0 / (self.phase + 1.0)
78
+ beta = math.cos(math.pi * t)
79
+ alpha = g * beta
80
+ price = self._price_value(iii)
81
+ total += alpha * price
82
+ weight += alpha
83
+ if t < 1.0:
84
+ t += self.res1
85
+ ma = total / weight if weight else self.data.close[0]
86
+ prev_ma = float(self.lines.dots[-1]) if len(self.data) > 1 else ma
87
+ color = float(self.lines.color[-1]) if len(self.data) > 1 else 0.0
88
+ if ma - prev_ma > self.filter_distance:
89
+ color = 0.0
90
+ elif prev_ma - ma > self.filter_distance:
91
+ color = 1.0
92
+ self.lines.dots[0] = ma
93
+ self.lines.color[0] = color
@@ -0,0 +1,82 @@
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
+ "EFDistanceIndicator",
12
+ ]
13
+
14
+
15
+ def resolve_price_line(data, mode):
16
+ """Build an applied-price line from a data feed per MT5 price modes.
17
+
18
+ Args:
19
+ data: The backtrader data feed providing OHLC lines.
20
+ mode: MT5 applied-price mode (e.g. ``'price_close'``, ``'price_typical'``).
21
+
22
+ Returns:
23
+ A backtrader line expression for the selected applied price, defaulting
24
+ to the close line.
25
+ """
26
+ price_mode = str(mode).lower()
27
+ if price_mode in {"price_open", "open"}:
28
+ return data.open
29
+ if price_mode in {"price_high", "high"}:
30
+ return data.high
31
+ if price_mode in {"price_low", "low"}:
32
+ return data.low
33
+ if price_mode in {"price_median", "median"}:
34
+ return (data.high + data.low) / 2.0
35
+ if price_mode in {"price_typical", "typical"}:
36
+ return (data.high + data.low + data.close) / 3.0
37
+ if price_mode in {"price_weighted", "weighted"}:
38
+ return (2.0 * data.close + data.high + data.low) / 4.0
39
+ if price_mode in {"price_simpl", "simpl"}:
40
+ return (data.open + data.close) / 2.0
41
+ if price_mode in {"price_quarter", "quarter"}:
42
+ return (data.open + data.close + data.high + data.low) / 4.0
43
+ return data.close
44
+
45
+
46
+ class EFDistanceIndicator(Indicator):
47
+ """Energy-field distance indicator producing a weighted applied-price value.
48
+
49
+ Weights each price in a window by the accumulated powered distance to the
50
+ other prices in the window, yielding a smoothed ``value`` line whose turns
51
+ signal momentum shifts.
52
+ """
53
+
54
+ lines = ("value",)
55
+ params = (
56
+ ("length", 10),
57
+ ("power", 2.0),
58
+ ("ipc", "price_close"),
59
+ ("price_shift", 0.0),
60
+ )
61
+
62
+ def __init__(self):
63
+ """Set the minimum period required for the energy-field window."""
64
+ self.addminperiod(int(self.p.length) * 2 + 2)
65
+
66
+ def next(self):
67
+ """Compute the energy-field weighted price value for the current bar."""
68
+ length = int(self.p.length)
69
+ float(resolve_price_line(self.data, self.p.ipc)[0])
70
+ weights = []
71
+ prices = []
72
+ for i in range(length):
73
+ base_price = float(resolve_price_line(self.data, self.p.ipc)[-i])
74
+ energy = 0.0
75
+ for j in range(length):
76
+ ref_price = float(resolve_price_line(self.data, self.p.ipc)[-(i + j)])
77
+ energy += abs((base_price - ref_price) ** float(self.p.power))
78
+ weights.append(energy)
79
+ prices.append(base_price)
80
+ norm = sum(weights)
81
+ value = sum(w * p for w, p in zip(weights, prices)) / norm if norm else 0.0
82
+ self.lines.value[0] = value + float(self.p.price_shift)