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,195 @@
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
+ "KwanCccIndicator",
14
+ ]
15
+
16
+
17
+ class KwanCccIndicator(Indicator):
18
+ """Custom Kwan CCC technical indicator.
19
+
20
+ Lines:
21
+ kwan (LineSeries): Smoothed combination of Chaikin, CCI, and Momentum.
22
+ direction (LineSeries): Directional momentum flag (0 = bullish, 1 = flat, 2 = bearish).
23
+ """
24
+
25
+ lines = (
26
+ "kwan",
27
+ "direction",
28
+ )
29
+
30
+ params = (
31
+ ("fast_ma_period", 3),
32
+ ("slow_ma_period", 10),
33
+ ("ma_method", "LWMA"),
34
+ ("cci_period", 14),
35
+ ("cci_price", "MEDIAN"),
36
+ ("momentum_period", 7),
37
+ ("momentum_price", "CLOSE"),
38
+ ("xma_method", "JJMA"),
39
+ ("x_length", 7),
40
+ ("x_phase", 100),
41
+ )
42
+
43
+ def __init__(self):
44
+ """Initialize indicator variables, buffer lists, and min periods."""
45
+ self.addminperiod(
46
+ max(self.p.slow_ma_period, self.p.cci_period, self.p.momentum_period)
47
+ + self.p.x_length
48
+ + 5
49
+ )
50
+ self._adl_buf = []
51
+ self._chaikin_buf = []
52
+ self._cci_price_buf = []
53
+ self._momentum_price_buf = []
54
+ self._raw_buf = []
55
+ self._smooth_prev = None
56
+ self._smooth_buf = []
57
+
58
+ def _select_price(self, mode):
59
+ mode = str(mode).upper()
60
+ if mode == "OPEN":
61
+ return float(self.data.open[0])
62
+ if mode == "HIGH":
63
+ return float(self.data.high[0])
64
+ if mode == "LOW":
65
+ return float(self.data.low[0])
66
+ if mode == "MEDIAN":
67
+ return (float(self.data.high[0]) + float(self.data.low[0])) / 2.0
68
+ if mode == "TYPICAL":
69
+ return (
70
+ float(self.data.high[0]) + float(self.data.low[0]) + float(self.data.close[0])
71
+ ) / 3.0
72
+ if mode == "WEIGHTED":
73
+ return (
74
+ float(self.data.high[0]) + float(self.data.low[0]) + 2.0 * float(self.data.close[0])
75
+ ) / 4.0
76
+ return float(self.data.close[0])
77
+
78
+ @staticmethod
79
+ def _sma(values, period):
80
+ if len(values) < period or period <= 0:
81
+ return None
82
+ window = values[-period:]
83
+ return sum(window) / float(period)
84
+
85
+ @staticmethod
86
+ def _lwma(values, period):
87
+ if len(values) < period or period <= 0:
88
+ return None
89
+ window = values[-period:]
90
+ weights = list(range(1, period + 1))
91
+ denom = sum(weights)
92
+ return sum(v * w for v, w in zip(window, weights)) / float(denom)
93
+
94
+ def _ma(self, values, period, method):
95
+ method = str(method).upper()
96
+ if method in ("MODE_LWMA", "LWMA"):
97
+ return self._lwma(values, period)
98
+ return self._sma(values, period)
99
+
100
+ def _calc_cci(self):
101
+ period = int(self.p.cci_period)
102
+ if len(self._cci_price_buf) < period or period <= 0:
103
+ return None
104
+ window = self._cci_price_buf[-period:]
105
+ sma = sum(window) / float(period)
106
+ mean_dev = sum(abs(v - sma) for v in window) / float(period)
107
+ if mean_dev == 0:
108
+ return 0.0
109
+ return (window[-1] - sma) / (0.015 * mean_dev)
110
+
111
+ def _calc_momentum(self):
112
+ period = int(self.p.momentum_period)
113
+ if len(self._momentum_price_buf) <= period or period <= 0:
114
+ return None
115
+ prev_price = self._momentum_price_buf[-(period + 1)]
116
+ curr_price = self._momentum_price_buf[-1]
117
+ if prev_price == 0:
118
+ return None
119
+ return 100.0 * curr_price / prev_price
120
+
121
+ def _smooth_value(self, raw_value):
122
+ method = str(self.p.xma_method).upper()
123
+ if method in ("MODE_SMA_", "SMA"):
124
+ period = max(1, int(self.p.x_length))
125
+ if len(self._raw_buf) < period:
126
+ return raw_value
127
+ return sum(self._raw_buf[-period:]) / float(period)
128
+
129
+ length = max(1, int(self.p.x_length))
130
+ phase = max(-100, min(100, int(self.p.x_phase)))
131
+ alpha = 2.0 / (length + 1.0)
132
+ alpha *= 1.0 + 0.35 * (phase / 100.0)
133
+ alpha = max(0.01, min(0.99, alpha))
134
+ if self._smooth_prev is None or not math.isfinite(self._smooth_prev):
135
+ smooth = raw_value
136
+ else:
137
+ smooth = self._smooth_prev + alpha * (raw_value - self._smooth_prev)
138
+ self._smooth_prev = smooth
139
+ return smooth
140
+
141
+ def next(self):
142
+ """Compute the Kwan CCC metric and directional momentum flags on each bar."""
143
+ high = float(self.data.high[0])
144
+ low = float(self.data.low[0])
145
+ close = float(self.data.close[0])
146
+ volume = float(self.data.volume[0]) if math.isfinite(float(self.data.volume[0])) else 0.0
147
+
148
+ if high != low:
149
+ mf_mult = ((close - low) - (high - close)) / (high - low)
150
+ else:
151
+ mf_mult = 0.0
152
+ adl_prev = self._adl_buf[-1] if self._adl_buf else 0.0
153
+ adl = adl_prev + mf_mult * volume
154
+ self._adl_buf.append(adl)
155
+
156
+ chaikin_fast = self._ma(self._adl_buf, int(self.p.fast_ma_period), self.p.ma_method)
157
+ chaikin_slow = self._ma(self._adl_buf, int(self.p.slow_ma_period), self.p.ma_method)
158
+ if chaikin_fast is None or chaikin_slow is None:
159
+ self.lines.kwan[0] = 0.0
160
+ self.lines.direction[0] = 1.0
161
+ return
162
+ chaikin = chaikin_fast - chaikin_slow
163
+ self._chaikin_buf.append(chaikin)
164
+
165
+ self._cci_price_buf.append(self._select_price(self.p.cci_price))
166
+ self._momentum_price_buf.append(self._select_price(self.p.momentum_price))
167
+
168
+ cci = self._calc_cci()
169
+ momentum = self._calc_momentum()
170
+ if cci is None or momentum is None:
171
+ self.lines.kwan[0] = 0.0
172
+ self.lines.direction[0] = 1.0
173
+ return
174
+
175
+ if momentum == 0 or not math.isfinite(momentum):
176
+ raw_value = 100.0
177
+ else:
178
+ raw_value = chaikin * cci / momentum
179
+ self._raw_buf.append(raw_value)
180
+
181
+ smooth = self._smooth_value(raw_value)
182
+ self._smooth_buf.append(smooth)
183
+ self.lines.kwan[0] = smooth
184
+
185
+ if len(self._smooth_buf) < 2:
186
+ self.lines.direction[0] = 1.0
187
+ return
188
+
189
+ prev_smooth = self._smooth_buf[-2]
190
+ if smooth > prev_smooth:
191
+ self.lines.direction[0] = 0.0
192
+ elif smooth < prev_smooth:
193
+ self.lines.direction[0] = 2.0
194
+ else:
195
+ self.lines.direction[0] = 1.0
@@ -0,0 +1,113 @@
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
+ RSI,
12
+ Indicator,
13
+ MomentumOscillator,
14
+ Stochastic,
15
+ )
16
+
17
+ __all__ = [
18
+ "KwanNrpIndicator",
19
+ ]
20
+
21
+
22
+ class KwanNrpIndicator(Indicator):
23
+ """Compute smoothed KWAN_NRP value and direction direction states."""
24
+
25
+ lines = (
26
+ "kwan",
27
+ "direction",
28
+ )
29
+
30
+ params = (
31
+ ("k_period", 5),
32
+ ("d_period", 3),
33
+ ("slowing", 3),
34
+ ("rsi_period", 14),
35
+ ("momentum_period", 14),
36
+ ("x_length", 3),
37
+ )
38
+
39
+ def __init__(self):
40
+ """Prepare stochastic, RSI, and momentum components for indicator output."""
41
+ # --- Stochastic %D (signal line) ---
42
+ stoch = Stochastic(
43
+ self.data,
44
+ period=self.p.k_period,
45
+ period_dfast=self.p.slowing,
46
+ period_dslow=self.p.d_period,
47
+ )
48
+ self.stoch_d = stoch.percD
49
+
50
+ # --- RSI ---
51
+ self.rsi = RSI(
52
+ self.data.close,
53
+ period=self.p.rsi_period,
54
+ )
55
+
56
+ # --- Momentum Oscillator = 100 * close / close[-period] ---
57
+ self.mom_osc = MomentumOscillator(
58
+ self.data.close,
59
+ period=self.p.momentum_period,
60
+ )
61
+
62
+ # --- Raw KWAN oscillator ---
63
+ # kwan_raw = stoch_d * rsi / mom_osc
64
+ # Guard against mom_osc == 0 in next() and protect period alignment.
65
+ self.addminperiod(
66
+ max(
67
+ self.p.k_period + self.p.slowing + self.p.d_period,
68
+ self.p.rsi_period,
69
+ self.p.momentum_period,
70
+ )
71
+ + self.p.x_length
72
+ + 2
73
+ )
74
+
75
+ # Internal raw value buffer.
76
+ self._raw_buf = []
77
+
78
+ def next(self):
79
+ """Update KWAN value and directional signal line."""
80
+ mom = self.mom_osc[0]
81
+ if mom == 0 or not math.isfinite(mom):
82
+ kwan_raw = 100.0
83
+ else:
84
+ kwan_raw = self.stoch_d[0] * self.rsi[0] / mom
85
+
86
+ self._raw_buf.append(kwan_raw)
87
+
88
+ # Smooth raw values with a simple moving average of the last XLength bars.
89
+ xl = self.p.x_length
90
+ if len(self._raw_buf) >= xl:
91
+ smoothed = sum(self._raw_buf[-xl:]) / xl
92
+ else:
93
+ smoothed = kwan_raw
94
+
95
+ self.lines.kwan[0] = smoothed
96
+
97
+ # Determine direction: rise / fall / flat versus previous smoothed value.
98
+ if len(self._raw_buf) < xl + 1:
99
+ self.lines.direction[0] = 1.0
100
+ return
101
+
102
+ prev_smoothed_vals = self._raw_buf[-(xl + 1) : -1]
103
+ if len(prev_smoothed_vals) >= xl:
104
+ prev_smoothed = sum(prev_smoothed_vals[-xl:]) / xl
105
+ else:
106
+ prev_smoothed = smoothed
107
+
108
+ if smoothed > prev_smoothed:
109
+ self.lines.direction[0] = 0.0 # rising
110
+ elif smoothed < prev_smoothed:
111
+ self.lines.direction[0] = 2.0 # falling
112
+ else:
113
+ self.lines.direction[0] = 1.0
@@ -0,0 +1,192 @@
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
+ "KwanRdpIndicator",
14
+ ]
15
+
16
+
17
+ class KwanRdpIndicator(Indicator):
18
+ """Custom Kwan RDP technical indicator.
19
+
20
+ Lines:
21
+ kwan (LineSeries): Smoothed combination of DeMarker, MFI, and Momentum.
22
+ direction (LineSeries): Directional momentum flag (0 = bullish, 1 = flat, 2 = bearish).
23
+ """
24
+
25
+ lines = (
26
+ "kwan",
27
+ "direction",
28
+ )
29
+
30
+ params = (
31
+ ("demarker_period", 14),
32
+ ("mfi_period", 14),
33
+ ("volume_type", "TICK"),
34
+ ("momentum_period", 14),
35
+ ("momentum_price", "CLOSE"),
36
+ ("xma_method", "JJMA"),
37
+ ("x_length", 7),
38
+ ("x_phase", 100),
39
+ )
40
+
41
+ def __init__(self):
42
+ """Initialize indicator state: rolling buffers and minperiod."""
43
+ self.addminperiod(
44
+ max(self.p.demarker_period, self.p.mfi_period, self.p.momentum_period)
45
+ + self.p.x_length
46
+ + 5
47
+ )
48
+ self._high_buf = []
49
+ self._low_buf = []
50
+ self._close_buf = []
51
+ self._typical_buf = []
52
+ self._money_flow_buf = []
53
+ self._raw_buf = []
54
+ self._smooth_prev = None
55
+ self._smooth_buf = []
56
+
57
+ def _select_price(self, mode):
58
+ """Return the selected price value (open/high/low/median/typical/weighted/close)."""
59
+ mode = str(mode).upper()
60
+ if mode == "OPEN":
61
+ return float(self.data.open[0])
62
+ if mode == "HIGH":
63
+ return float(self.data.high[0])
64
+ if mode == "LOW":
65
+ return float(self.data.low[0])
66
+ if mode == "MEDIAN":
67
+ return (float(self.data.high[0]) + float(self.data.low[0])) / 2.0
68
+ if mode == "TYPICAL":
69
+ return (
70
+ float(self.data.high[0]) + float(self.data.low[0]) + float(self.data.close[0])
71
+ ) / 3.0
72
+ if mode == "WEIGHTED":
73
+ return (
74
+ float(self.data.high[0]) + float(self.data.low[0]) + 2.0 * float(self.data.close[0])
75
+ ) / 4.0
76
+ return float(self.data.close[0])
77
+
78
+ def _calc_demarker(self):
79
+ """Compute DeMarker oscillator from rolling high/low buffers."""
80
+ p = int(self.p.demarker_period)
81
+ if len(self._high_buf) <= p or len(self._low_buf) <= p:
82
+ return None
83
+ demax = []
84
+ demin = []
85
+ for i in range(len(self._high_buf) - p, len(self._high_buf)):
86
+ high_diff = self._high_buf[i] - self._high_buf[i - 1]
87
+ low_diff = self._low_buf[i - 1] - self._low_buf[i]
88
+ demax.append(max(high_diff, 0.0))
89
+ demin.append(max(low_diff, 0.0))
90
+ smax = sum(demax)
91
+ smin = sum(demin)
92
+ denom = smax + smin
93
+ if denom == 0:
94
+ return 0.5
95
+ return smax / denom
96
+
97
+ def _calc_mfi(self):
98
+ """Compute Money Flow Index from typical price and volume buffers."""
99
+ p = int(self.p.mfi_period)
100
+ if len(self._typical_buf) <= p or len(self._money_flow_buf) <= p:
101
+ return None
102
+ pos_flow = 0.0
103
+ neg_flow = 0.0
104
+ start = len(self._typical_buf) - p
105
+ for i in range(start, len(self._typical_buf)):
106
+ prev_tp = self._typical_buf[i - 1]
107
+ curr_tp = self._typical_buf[i]
108
+ curr_flow = self._money_flow_buf[i]
109
+ if curr_tp > prev_tp:
110
+ pos_flow += curr_flow
111
+ elif curr_tp < prev_tp:
112
+ neg_flow += curr_flow
113
+ if neg_flow == 0:
114
+ return 100.0
115
+ money_ratio = pos_flow / neg_flow
116
+ return 100.0 - (100.0 / (1.0 + money_ratio))
117
+
118
+ def _calc_momentum(self):
119
+ """Compute momentum as percentage change of selected price over period."""
120
+ p = int(self.p.momentum_period)
121
+ if len(self._close_buf) <= p:
122
+ return None
123
+ prev_price = self._close_buf[-(p + 1)]
124
+ curr_price = self._select_price(self.p.momentum_price)
125
+ if prev_price == 0:
126
+ return None
127
+ return 100.0 * curr_price / prev_price
128
+
129
+ def _smooth_value(self, raw_value):
130
+ """Smooth raw_value using SMA or phase-adjusted exponential (JJMA-like)."""
131
+ method = str(self.p.xma_method).upper()
132
+ if method in ("MODE_SMA_", "SMA"):
133
+ period = max(1, int(self.p.x_length))
134
+ if len(self._raw_buf) < period:
135
+ return raw_value
136
+ return sum(self._raw_buf[-period:]) / float(period)
137
+
138
+ length = max(1, int(self.p.x_length))
139
+ phase = max(-100, min(100, int(self.p.x_phase)))
140
+ alpha = 2.0 / (length + 1.0)
141
+ alpha *= 1.0 + 0.35 * (phase / 100.0)
142
+ alpha = max(0.01, min(0.99, alpha))
143
+ if self._smooth_prev is None or not math.isfinite(self._smooth_prev):
144
+ smooth = raw_value
145
+ else:
146
+ smooth = self._smooth_prev + alpha * (raw_value - self._smooth_prev)
147
+ self._smooth_prev = smooth
148
+ return smooth
149
+
150
+ def next(self):
151
+ """Compute Kwan RDP indicator: composite of DeMarker * MFI / momentum, smoothed."""
152
+ high = float(self.data.high[0])
153
+ low = float(self.data.low[0])
154
+ close = float(self.data.close[0])
155
+ volume = float(self.data.volume[0]) if math.isfinite(float(self.data.volume[0])) else 0.0
156
+
157
+ self._high_buf.append(high)
158
+ self._low_buf.append(low)
159
+ self._close_buf.append(close)
160
+ typical = (high + low + close) / 3.0
161
+ self._typical_buf.append(typical)
162
+ self._money_flow_buf.append(typical * volume)
163
+
164
+ demarker = self._calc_demarker()
165
+ mfi = self._calc_mfi()
166
+ momentum = self._calc_momentum()
167
+ if demarker is None or mfi is None or momentum is None:
168
+ self.lines.kwan[0] = 0.0
169
+ self.lines.direction[0] = 1.0
170
+ return
171
+
172
+ if momentum == 0 or not math.isfinite(momentum):
173
+ raw_value = 100.0
174
+ else:
175
+ raw_value = 100.0 * demarker * mfi / momentum
176
+ self._raw_buf.append(raw_value)
177
+
178
+ smooth = self._smooth_value(raw_value)
179
+ self._smooth_buf.append(smooth)
180
+ self.lines.kwan[0] = smooth
181
+
182
+ if len(self._smooth_buf) < 2:
183
+ self.lines.direction[0] = 1.0
184
+ return
185
+
186
+ prev_smooth = self._smooth_buf[-2]
187
+ if smooth > prev_smooth:
188
+ self.lines.direction[0] = 0.0
189
+ elif smooth < prev_smooth:
190
+ self.lines.direction[0] = 2.0
191
+ else:
192
+ self.lines.direction[0] = 1.0
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import (
11
+ Indicator,
12
+ MinusDirectionalIndicator,
13
+ PlusDirectionalIndicator,
14
+ )
15
+
16
+ __all__ = [
17
+ "LaguerreAdxIndicator",
18
+ ]
19
+
20
+
21
+ class LaguerreAdxIndicator(Indicator):
22
+ """Laguerre-filtered ADX directional components built from +/- DI."""
23
+
24
+ lines = ("up", "down")
25
+ params = (
26
+ ("adx_period", 14),
27
+ ("gamma", 0.764),
28
+ )
29
+
30
+ def __init__(self):
31
+ """Initialize DI inputs, laguerre states, and minimum period."""
32
+ self.addminperiod(int(self.p.adx_period) + 5)
33
+ self.plus_di = PlusDirectionalIndicator(self.data, period=int(self.p.adx_period))
34
+ self.minus_di = MinusDirectionalIndicator(self.data, period=int(self.p.adx_period))
35
+ self._p = {"l0": 0.0, "l1": 0.0, "l2": 0.0, "l3": 0.0}
36
+ self._m = {"l0": 0.0, "l1": 0.0, "l2": 0.0, "l3": 0.0}
37
+
38
+ def _laguerre_step(self, value, state, previous_output):
39
+ gamma = float(self.p.gamma)
40
+ l0a = state["l0"]
41
+ l1a = state["l1"]
42
+ l2a = state["l2"]
43
+ l3a = state["l3"]
44
+ l0 = (1.0 - gamma) * value + gamma * l0a
45
+ l1 = -gamma * l0 + l0a + gamma * l1a
46
+ l2 = -gamma * l1 + l1a + gamma * l2a
47
+ l3 = -gamma * l2 + l2a + gamma * l3a
48
+ state["l0"] = l0
49
+ state["l1"] = l1
50
+ state["l2"] = l2
51
+ state["l3"] = l3
52
+ cu = 0.0
53
+ cd = 0.0
54
+ if l0 >= l1:
55
+ cu = l0 - l1
56
+ else:
57
+ cd = l1 - l0
58
+ if l1 >= l2:
59
+ cu += l1 - l2
60
+ else:
61
+ cd += l2 - l1
62
+ if l2 >= l3:
63
+ cu += l2 - l3
64
+ else:
65
+ cd += l3 - l2
66
+ if cu + cd != 0.0:
67
+ return cu / (cu + cd)
68
+ return previous_output
69
+
70
+ def next(self):
71
+ """Compute smoothed up/down values from directional indicators."""
72
+ prev_up = (
73
+ float(self.lines.up[-1])
74
+ if len(self) > 0 and math.isfinite(float(self.lines.up[-1]))
75
+ else 0.0
76
+ )
77
+ prev_down = (
78
+ float(self.lines.down[-1])
79
+ if len(self) > 0 and math.isfinite(float(self.lines.down[-1]))
80
+ else 0.0
81
+ )
82
+ plus_value = float(self.plus_di[0]) if math.isfinite(float(self.plus_di[0])) else 0.0
83
+ minus_value = float(self.minus_di[0]) if math.isfinite(float(self.minus_di[0])) else 0.0
84
+ self.lines.up[0] = self._laguerre_step(plus_value, self._p, prev_up)
85
+ self.lines.down[0] = self._laguerre_step(minus_value, self._m, prev_down)
@@ -0,0 +1,66 @@
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
+ "LaguerreFilterIndicator",
12
+ ]
13
+
14
+
15
+ class LaguerreFilterIndicator(Indicator):
16
+ """Laguerre smoothing indicator with finite impulse response fallback lines."""
17
+
18
+ lines = ("laguerre", "fir")
19
+ params = (("gamma", 0.7),)
20
+
21
+ def __init__(self):
22
+ """Initialize internal Laguerre filter state and warm-up requirements."""
23
+ self.addminperiod(4)
24
+ self._l0 = None
25
+ self._l1 = None
26
+ self._l2 = None
27
+ self._l3 = None
28
+
29
+ def _price(self, ago=0):
30
+ return (float(self.data.high[ago]) + float(self.data.low[ago])) / 2.0
31
+
32
+ def next(self):
33
+ """Compute current Laguerre and FIR values for the current bar."""
34
+ price = self._price(0)
35
+ if self._l0 is None:
36
+ self._l0 = price
37
+ self._l1 = price
38
+ self._l2 = price
39
+ self._l3 = price
40
+ self.lines.laguerre[0] = price
41
+ self.lines.fir[0] = price
42
+ return
43
+ l0a = self._l0
44
+ l1a = self._l1
45
+ l2a = self._l2
46
+ l3a = self._l3
47
+ gamma = float(self.p.gamma)
48
+ l0 = (1.0 - gamma) * price + gamma * l0a
49
+ l1 = -gamma * l0 + l0a + gamma * l1a
50
+ l2 = -gamma * l1 + l1a + gamma * l2a
51
+ l3 = -gamma * l2 + l2a + gamma * l3a
52
+ self._l0 = l0
53
+ self._l1 = l1
54
+ self._l2 = l2
55
+ self._l3 = l3
56
+ if len(self) > 4:
57
+ self.lines.laguerre[0] = (l0 + 2.0 * l1 + 2.0 * l2 + l3) / 6.0
58
+ self.lines.fir[0] = (
59
+ 1.0 * self._price(0)
60
+ + 2.0 * self._price(-1)
61
+ + 2.0 * self._price(-2)
62
+ + 1.0 * self._price(-3)
63
+ ) / 6.0
64
+ else:
65
+ self.lines.laguerre[0] = price
66
+ self.lines.fir[0] = price