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,194 @@
1
+ #!/usr/bin/env python
2
+ """Williams Indicator Module - Williams %R indicator.
3
+
4
+ This module provides the WilliamsR indicator developed by Larry
5
+ Williams to show overbought/oversold conditions.
6
+
7
+ Classes:
8
+ WilliamsR: Williams %R indicator.
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.williamsr = bt.indicators.WilliamsR(self.data, period=14)
14
+
15
+ def next(self):
16
+ # Williams %R above -20 indicates overbought
17
+ if self.williamsr.percR[0] > -20:
18
+ self.sell()
19
+ # Williams %R below -80 indicates oversold
20
+ elif self.williamsr.percR[0] < -80:
21
+ self.buy()
22
+ """
23
+
24
+ import math
25
+
26
+ from . import DownDay, Highest, Indicator, Lowest, TrueHigh, TrueLow, UpDay
27
+
28
+
29
+ class WilliamsR(Indicator):
30
+ """
31
+ Developed by Larry Williams to show the relation of closing prices to
32
+ the highest-lowest range of a given period.
33
+
34
+ Known as Williams %R (but % is not allowed in Python identifiers)
35
+
36
+ Formula:
37
+ - num = highest_period - close
38
+ - den = highestg_period - lowest_period
39
+ - percR = (num / den) * -100.0
40
+
41
+ See:
42
+ - http://en.wikipedia.org/wiki/Williams_%25R
43
+ """
44
+
45
+ lines = ("percR",)
46
+ params = (
47
+ ("period", 14),
48
+ ("upperband", -20.0),
49
+ ("lowerband", -80.0),
50
+ )
51
+
52
+ plotinfo = {"plotname": "Williams R%"}
53
+ plotlines = {"percR": {"_name": "R%"}}
54
+
55
+ def _plotinif(self):
56
+ self.plotinfo.plotyhlines = [self.p.upperband, self.p.lowerband]
57
+
58
+ def __init__(self):
59
+ """Initialize the Williams %R indicator.
60
+
61
+ Creates Highest and Lowest indicators for calculation.
62
+ """
63
+ super().__init__()
64
+ self.highest = Highest(self.data.high, period=self.p.period)
65
+ self.lowest = Lowest(self.data.low, period=self.p.period)
66
+
67
+ def next(self):
68
+ """Calculate Williams %R for the current bar.
69
+
70
+ %R = -100 * (highest - close) / (highest - lowest)
71
+ Returns 0.0 if denominator is 0 to avoid division by zero.
72
+ """
73
+ h = self.highest[0]
74
+ low = self.lowest[0]
75
+ c = self.data.close[0]
76
+ den = h - low
77
+ if den != 0:
78
+ self.lines.percR[0] = -100.0 * (h - c) / den
79
+ else:
80
+ self.lines.percR[0] = 0.0
81
+
82
+ def once(self, start, end):
83
+ """Calculate Williams %R in runonce mode.
84
+
85
+ Computes %R values across all bars.
86
+ """
87
+ h_array = self.highest.lines[0].array
88
+ l_array = self.lowest.lines[0].array
89
+ c_array = self.data.close.array
90
+ larray = self.lines.percR.array
91
+
92
+ while len(larray) < end:
93
+ larray.append(float("nan"))
94
+
95
+ for i in range(start, min(end, len(h_array), len(l_array), len(c_array))):
96
+ h = h_array[i] if i < len(h_array) else 0.0
97
+ low = l_array[i] if i < len(l_array) else 0.0
98
+ c = c_array[i] if i < len(c_array) else 0.0
99
+
100
+ if isinstance(h, float) and math.isnan(h) or isinstance(low, float) and math.isnan(low):
101
+ larray[i] = float("nan")
102
+ else:
103
+ den = h - low
104
+ if den != 0:
105
+ larray[i] = -100.0 * (h - c) / den
106
+ else:
107
+ larray[i] = 0.0
108
+
109
+
110
+ class WilliamsAD(Indicator):
111
+ """
112
+ By Larry Williams. It does cumulatively measure if the price is
113
+ accumulating (upwards) or distributing (downwards) by using the concept of
114
+ UpDays and DownDays.
115
+
116
+ Prices can go upwards but do so in a fashion that no longer shows
117
+ accumulation because updays and downdays are canceling out each other,
118
+ creating a divergence.
119
+
120
+ See:
121
+ - http://www.metastock.com/Customer/Resources/TAAZ/?p=125
122
+ - http://ta.mql4.com/indicators/trends/williams_accumulation_distribution
123
+ """
124
+
125
+ lines = ("ad",)
126
+
127
+ def __init__(self):
128
+ """Initialize the Williams A/D indicator.
129
+
130
+ Creates up/down day and true high/low indicators.
131
+ """
132
+ super().__init__()
133
+ self.upday = UpDay(self.data.close)
134
+ self.downday = DownDay(self.data.close)
135
+ self.truelow = TrueLow(self.data)
136
+ self.truehigh = TrueHigh(self.data)
137
+ self._accum = 0.0
138
+
139
+ def next(self):
140
+ """Calculate Williams A/D for the current bar.
141
+
142
+ Accumulates based on up days and down days using true range.
143
+ """
144
+ upday_val = self.upday[0]
145
+ downday_val = self.downday[0]
146
+
147
+ if upday_val > 0:
148
+ adup = self.data.close[0] - self.truelow[0]
149
+ else:
150
+ adup = 0.0
151
+
152
+ if downday_val > 0:
153
+ addown = self.data.close[0] - self.truehigh[0]
154
+ else:
155
+ addown = 0.0
156
+
157
+ self._accum += adup + addown
158
+ self.lines.ad[0] = self._accum
159
+
160
+ def once(self, start, end):
161
+ """Calculate Williams A/D in runonce mode.
162
+
163
+ Accumulates values across all bars.
164
+ """
165
+ upday_array = self.upday.lines[0].array
166
+ downday_array = self.downday.lines[0].array
167
+ truelow_array = self.truelow.lines[0].array
168
+ truehigh_array = self.truehigh.lines[0].array
169
+ c_array = self.data.close.array
170
+ larray = self.lines.ad.array
171
+
172
+ while len(larray) < end:
173
+ larray.append(float("nan"))
174
+
175
+ accum = 0.0
176
+ for i in range(start, min(end, len(upday_array), len(downday_array), len(c_array))):
177
+ upday_val = upday_array[i] if i < len(upday_array) else 0.0
178
+ downday_val = downday_array[i] if i < len(downday_array) else 0.0
179
+ close = c_array[i] if i < len(c_array) else 0.0
180
+ tl = truelow_array[i] if i < len(truelow_array) else 0.0
181
+ th = truehigh_array[i] if i < len(truehigh_array) else 0.0
182
+
183
+ if upday_val > 0:
184
+ adup = close - tl
185
+ else:
186
+ adup = 0.0
187
+
188
+ if downday_val > 0:
189
+ addown = close - th
190
+ else:
191
+ addown = 0.0
192
+
193
+ accum += adup + addown
194
+ larray[i] = accum
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python
2
+ """WMA Indicator Module - Weighted Moving Average.
3
+
4
+ This module provides the WMA (Weighted Moving Average) indicator
5
+ which gives more weight to recent prices.
6
+
7
+ Classes:
8
+ WeightedMovingAverage: WMA indicator (alias: WMA).
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.wma = bt.indicators.WMA(self.data.close, period=20)
14
+
15
+ def next(self):
16
+ # Price above WMA indicates uptrend
17
+ if self.data.close[0] > self.wma[0]:
18
+ self.buy()
19
+ # Price below WMA indicates downtrend
20
+ elif self.data.close[0] < self.wma[0]:
21
+ self.sell()
22
+ """
23
+
24
+ import math
25
+
26
+ from ..utils.py3 import range
27
+ from . import MovingAverageBase
28
+
29
+
30
+ class WeightedMovingAverage(MovingAverageBase):
31
+ """
32
+ A Moving Average which gives an arithmetic weighting to values with the
33
+ newest having the more weight
34
+
35
+ Formula:
36
+ - weights = range(1, period + 1)
37
+ - coef = 2 / (period * (period + 1))
38
+ - movav = coef * Sum(weight[i] * data[period - i] for i in range(period))
39
+
40
+ See also:
41
+ - http://en.wikipedia.org/wiki/Moving_average#Weighted_moving_average
42
+ """
43
+
44
+ alias = (
45
+ "WMA",
46
+ "MovingAverageWeighted",
47
+ )
48
+ lines = ("wma",)
49
+
50
+ def __init__(self):
51
+ """Initialize the WMA indicator.
52
+
53
+ Calculates weights and coefficient for weighted moving average.
54
+ """
55
+ super().__init__()
56
+ self.coef = 2.0 / (self.p.period * (self.p.period + 1.0))
57
+ self.weights = tuple(float(x) for x in range(1, self.p.period + 1))
58
+
59
+ def next(self):
60
+ """Calculate WMA for the current bar.
61
+
62
+ Applies arithmetic weighting with newest values having more weight.
63
+ Uses math.fsum over chronological (oldest-first) order to match the
64
+ framework's WeightedAverage accumulation exactly and avoid 1-ULP
65
+ drift between runonce and event modes.
66
+ """
67
+ period = self.p.period
68
+ coef = self.coef
69
+ weights = self.weights
70
+
71
+ # data oldest-first: data[-(period-1)] .. data[0]
72
+ data = [self.data[-(period - 1 - i)] for i in range(period)]
73
+ self.lines.wma[0] = coef * math.fsum(weights[i] * data[i] for i in range(period))
74
+
75
+ def once(self, start, end):
76
+ """Calculate WMA in runonce mode.
77
+
78
+ Applies weighted average calculation across all bars. Uses math.fsum
79
+ over the chronological window (oldest-first) so results match the
80
+ framework's WeightedAverage and the event-mode next() bit-for-bit.
81
+ """
82
+ darray = self.data.array
83
+ larray = self.lines.wma.array
84
+ period = self.p.period
85
+ coef = self.coef
86
+ weights = self.weights
87
+
88
+ while len(larray) < end:
89
+ larray.append(float("nan"))
90
+
91
+ # Pre-fill warmup with NaN
92
+ for i in range(min(period - 1, len(darray))):
93
+ if i < len(larray):
94
+ larray[i] = float("nan")
95
+
96
+ darray_len = len(darray)
97
+ for i in range(period - 1, min(end, darray_len)):
98
+ window = darray[i - period + 1 : i + 1]
99
+ # window is oldest-first; weights[0]=1.0 weights the oldest value.
100
+ larray[i] = coef * math.fsum(weights[j] * window[j] for j in range(period))
101
+
102
+
103
+ WMA = WeightedMovingAverage
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env python
2
+ """ZLEMA Indicator Module - Zero Lag Exponential Moving Average.
3
+
4
+ This module provides the ZLEMA (Zero Lag Exponential Moving Average)
5
+ indicator which aims to reduce lag in the standard EMA.
6
+
7
+ Classes:
8
+ ZeroLagExponentialMovingAverage: ZLEMA indicator (aliases: ZLEMA, ZeroLagEma).
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.zlema = bt.indicators.ZLEMA(self.data.close, period=20)
14
+
15
+ def next(self):
16
+ # Price above ZLEMA indicates uptrend
17
+ if self.data.close[0] > self.zlema[0]:
18
+ self.buy()
19
+ # Price below ZLEMA indicates downtrend
20
+ elif self.data.close[0] < self.zlema[0]:
21
+ self.sell()
22
+ """
23
+
24
+ import math
25
+
26
+ from . import MovingAverageBase
27
+ from .ema import EMA
28
+
29
+
30
+ class ZeroLagExponentialMovingAverage(MovingAverageBase):
31
+ """
32
+ The zero-lag exponential moving average (ZLEMA) is a variation of the EMA
33
+ which adds a momentum term aiming to reduce lag in the average to
34
+ track current prices more closely.
35
+
36
+ Formula:
37
+ - lag = (period - 1) / 2
38
+ - zlema = ema(2 * data - data(-lag))
39
+
40
+ See also:
41
+ - http://user42.tuxfamily.org/chart/manual/Zero_002dLag-Exponential-Moving-Average.html
42
+
43
+ """
44
+
45
+ alias = (
46
+ "ZLEMA",
47
+ "ZeroLagEma",
48
+ )
49
+ lines = ("zlema",)
50
+ params = (("_movav", EMA),)
51
+
52
+ def __init__(self):
53
+ """Initialize the ZLEMA indicator.
54
+
55
+ Calculates lag and alpha values for zero-lag EMA.
56
+ """
57
+ super().__init__()
58
+ self.lag = (self.p.period - 1) // 2
59
+ self.alpha = 2.0 / (1.0 + self.p.period)
60
+ self.alpha1 = 1.0 - self.alpha
61
+ self.addminperiod(self.lag + self.p.period)
62
+
63
+ def nextstart(self):
64
+ """Seed ZLEMA calculation with SMA on first valid bar.
65
+
66
+ Uses SMA of lag-adjusted data for initial seed value.
67
+ """
68
+ # Seed with SMA of adjusted data
69
+ period = self.p.period
70
+ lag = self.lag
71
+ data_sum = 0.0
72
+ for i in range(period):
73
+ adjusted = 2.0 * self.data[-i] - self.data[-i - lag]
74
+ data_sum += adjusted
75
+ self.lines.zlema[0] = data_sum / period
76
+
77
+ def next(self):
78
+ """Calculate ZLEMA for the current bar.
79
+
80
+ Applies EMA to lag-adjusted data: 2 * data - data(-lag).
81
+ """
82
+ lag = self.lag
83
+ adjusted = 2.0 * self.data[0] - self.data[-lag]
84
+ self.lines.zlema[0] = self.lines.zlema[-1] * self.alpha1 + adjusted * self.alpha
85
+
86
+ def once(self, start, end):
87
+ """Calculate ZLEMA in runonce mode.
88
+
89
+ Applies EMA to lag-adjusted data across all bars.
90
+ """
91
+ darray = self.data.array
92
+ larray = self.lines.zlema.array
93
+ period = self.p.period
94
+ lag = self.lag
95
+ alpha = self.alpha
96
+ alpha1 = self.alpha1
97
+
98
+ while len(larray) < end:
99
+ larray.append(float("nan"))
100
+
101
+ minperiod = lag + period
102
+ for i in range(min(minperiod - 1, len(darray))):
103
+ if i < len(larray):
104
+ larray[i] = float("nan")
105
+
106
+ # Seed value
107
+ seed_idx = minperiod - 1
108
+ if seed_idx < len(darray) and seed_idx >= lag:
109
+ seed_sum = 0.0
110
+ for j in range(period):
111
+ idx = seed_idx - j
112
+ if idx >= lag and idx < len(darray) and idx - lag >= 0:
113
+ adjusted = 2.0 * darray[idx] - darray[idx - lag]
114
+ seed_sum += adjusted
115
+ prev = seed_sum / period
116
+ if seed_idx < len(larray):
117
+ larray[seed_idx] = prev
118
+ else:
119
+ prev = 0.0
120
+
121
+ # Calculate ZLEMA
122
+ for i in range(minperiod, min(end, len(darray))):
123
+ if i >= lag and i - lag >= 0:
124
+ adjusted = 2.0 * darray[i] - darray[i - lag]
125
+ else:
126
+ adjusted = darray[i]
127
+
128
+ if i > 0 and i - 1 < len(larray):
129
+ prev_val = larray[i - 1]
130
+ if not (isinstance(prev_val, float) and math.isnan(prev_val)):
131
+ prev = prev_val
132
+
133
+ prev = prev * alpha1 + adjusted * alpha
134
+ if i < len(larray):
135
+ larray[i] = prev
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env python
2
+ """Zero Lag Indicator Module - Zero-lag error correction.
3
+
4
+ This module provides the ZeroLagIndicator developed by John Ehlers
5
+ and Ric Way to reduce lag in moving averages.
6
+
7
+ Classes:
8
+ ZeroLagIndicator: Zero-lag indicator with error correction.
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.zlind = bt.indicators.ZeroLagIndicator(self.data.close, period=20, gainlimit=50)
14
+
15
+ def next(self):
16
+ # Price above ZeroLagIndicator indicates uptrend
17
+ if self.data.close[0] > self.zlind[0]:
18
+ self.buy()
19
+ # Price below ZeroLagIndicator indicates downtrend
20
+ elif self.data.close[0] < self.zlind[0]:
21
+ self.sell()
22
+ """
23
+
24
+ from backtrader.utils.py3 import MAXINT
25
+
26
+ from . import MovingAverageBase
27
+ from .ema import EMA
28
+
29
+
30
+ class ZeroLagIndicator(MovingAverageBase):
31
+ """By John Ehlers and Ric Way
32
+
33
+ The zero-lag indicator (ZLIndicator) is a variation of the EMA
34
+ which modifies the EMA by trying to minimize the error (distance price -
35
+ error correction) and thus reduce the lag
36
+
37
+ Formula:
38
+ - EMA(data, period)
39
+
40
+ - For each iteration calculate a best-error-correction of the ema (see
41
+ the paper and/or the code) iterating over ``-bestgain`` ->
42
+ ``+bestgain`` for the error correction factor (both incl.)
43
+
44
+ - The default moving average is EMA, but can be changed with the
45
+ parameter ``_movav``
46
+
47
+ ::note:: the passed moving average must calculate alpha (and 1 -
48
+ alpha) and make them available as attributes ``alpha`` and
49
+ ``alpha1`` in the instance
50
+
51
+ See also:
52
+ - http://www.mesasoftware.com/papers/ZeroLag.pdf
53
+
54
+ """
55
+
56
+ alias = (
57
+ "ZLIndicator",
58
+ "ZLInd",
59
+ "EC",
60
+ "ErrorCorrecting",
61
+ )
62
+ lines = ("ec",)
63
+ params = (
64
+ ("gainlimit", 50),
65
+ ("_movav", EMA),
66
+ )
67
+
68
+ def _plotlabel(self):
69
+ plabels = [self.p.period, self.p.gainlimit]
70
+ plabels += [self.p._movav] * self.p.notdefault("_movav")
71
+ return plabels
72
+
73
+ def __init__(self):
74
+ """Initialize the Zero Lag Indicator.
75
+
76
+ Creates EMA and sets up gain limits for error correction.
77
+ """
78
+ self.ema = self.p._movav(period=self.p.period)
79
+ self.limits = [-self.p.gainlimit, self.p.gainlimit + 1]
80
+
81
+ # To make mixins work - super at the end for cooperative inheritance
82
+ super().__init__()
83
+
84
+ def next(self):
85
+ """Calculate zero lag indicator for the current bar.
86
+
87
+ Iterates over gain values to find the error correction that
88
+ minimizes the difference between price and corrected EMA.
89
+ """
90
+ leasterror = MAXINT # 1000000 in original code
91
+ bestec = ema = self.ema[0] # seed value 1st time for ec
92
+ price = self.data[0]
93
+ ec1 = self.lines.ec[-1]
94
+ alpha, alpha1 = self.ema.alpha, self.ema.alpha1
95
+
96
+ for value1 in range(*self.limits):
97
+ gain = value1 / 10
98
+ ec = alpha * (ema + gain * (price - ec1)) + alpha1 * ec1
99
+ error = abs(price - ec)
100
+ if error < leasterror:
101
+ leasterror = error
102
+ bestec = ec
103
+
104
+ self.lines.ec[0] = bestec