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,267 @@
1
+ #!/usr/bin/env python
2
+ """Ichimoku Indicator Module - Ichimoku Cloud.
3
+
4
+ This module provides the Ichimoku Kinko Hyo (Ichimoku Cloud) indicator
5
+ developed by Goichi Hosoda in 1969 for comprehensive trend analysis.
6
+
7
+ Classes:
8
+ Ichimoku: Ichimoku Cloud indicator with multiple lines.
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.ichimoku = bt.indicators.Ichimoku(self.data)
14
+
15
+ def next(self):
16
+ # Price above cloud indicates uptrend
17
+ if (self.data.close[0] > self.ichimoku.senkou_span_a[0] and
18
+ self.data.close[0] > self.ichimoku.senkou_span_b[0]):
19
+ self.buy()
20
+ """
21
+
22
+ import math
23
+
24
+ from . import Highest, Indicator, Lowest
25
+
26
+
27
+ def _line_value(line, ago=0):
28
+ try:
29
+ return line[ago]
30
+ except (IndexError, TypeError):
31
+ return float("nan")
32
+
33
+
34
+ def _valid(value):
35
+ return value is not None and not (isinstance(value, float) and not math.isfinite(value))
36
+
37
+
38
+ class Ichimoku(Indicator):
39
+ """
40
+ Developed and published in his book in 1969 by journalist Goichi Hosoda
41
+
42
+ Formula:
43
+ - tenkan_sen = (Highest (High, tenkan) + Lowest (Low, tenkan)) / 2.0
44
+ - kijun_sen = (Highest (High, kijun) + Lowest (Low, kijun)) / 2.0
45
+
46
+ The next 2 are pushed 26 bars into the future
47
+
48
+ - senkou_span_a = (tenkan_sen + kijun_sen) / 2.0
49
+ - senkou_span_b = ((Highest (High, senkou) + Lowest (Low, senkou)) / 2.0
50
+
51
+ This is pushed 26 bars into the past
52
+
53
+ - chikou = close
54
+
55
+ The cloud (Kumo) is formed by the area between the senkou_spans
56
+
57
+ See:
58
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ichimoku_cloud
59
+
60
+ """
61
+
62
+ lines = (
63
+ "tenkan_sen",
64
+ "kijun_sen",
65
+ "senkou_span_a",
66
+ "senkou_span_b",
67
+ "chikou_span",
68
+ )
69
+ params = (
70
+ ("tenkan", 9),
71
+ ("kijun", 26),
72
+ ("senkou", 52),
73
+ ("senkou_lead", 26), # forward push
74
+ ("chikou", 26), # backwards push
75
+ )
76
+
77
+ plotinfo = {"subplot": False}
78
+ plotlines = {
79
+ "senkou_span_a": {"_fill_gt": ("senkou_span_b", "g"), "_fill_lt": ("senkou_span_b", "r")},
80
+ }
81
+
82
+ def __init__(self):
83
+ """Initialize the Ichimoku Cloud indicator.
84
+
85
+ Creates Highest and Lowest sub-indicators for calculating
86
+ the five Ichimoku lines: tenkan_sen, kijun_sen, senkou_span_a,
87
+ senkou_span_b, and chikou_span.
88
+ """
89
+ super().__init__()
90
+
91
+ # Create sub-indicators and store references for explicit computation
92
+ self.hi_tenkan = Highest(self.data.high, period=self.p.tenkan)
93
+ self.lo_tenkan = Lowest(self.data.low, period=self.p.tenkan)
94
+
95
+ self.hi_kijun = Highest(self.data.high, period=self.p.kijun)
96
+ self.lo_kijun = Lowest(self.data.low, period=self.p.kijun)
97
+
98
+ self.hi_senkou = Highest(self.data.high, period=self.p.senkou)
99
+ self.lo_senkou = Lowest(self.data.low, period=self.p.senkou)
100
+
101
+ # Calculate minperiod - need senkou_lead bars of history for the forward shift
102
+ self._minperiod = max(self._minperiod, self.p.senkou + self.p.senkou_lead)
103
+
104
+ # Propagate minperiod to lines
105
+ for line in self.lines:
106
+ line.updateminperiod(self._minperiod)
107
+
108
+ def next(self):
109
+ """Calculate Ichimoku values for the current bar."""
110
+ # Calculate tenkan_sen and kijun_sen
111
+ hi_tenkan_val = _line_value(self.hi_tenkan)
112
+ lo_tenkan_val = _line_value(self.lo_tenkan)
113
+ tenkan_val = (
114
+ (hi_tenkan_val + lo_tenkan_val) / 2.0
115
+ if _valid(hi_tenkan_val) and _valid(lo_tenkan_val)
116
+ else float("nan")
117
+ )
118
+ self.lines.tenkan_sen[0] = tenkan_val
119
+
120
+ hi_kijun_val = _line_value(self.hi_kijun)
121
+ lo_kijun_val = _line_value(self.lo_kijun)
122
+ kijun_val = (
123
+ (hi_kijun_val + lo_kijun_val) / 2.0
124
+ if _valid(hi_kijun_val) and _valid(lo_kijun_val)
125
+ else float("nan")
126
+ )
127
+ self.lines.kijun_sen[0] = kijun_val
128
+
129
+ # senkou_span_a: (tenkan + kijun) / 2, shifted forward by senkou_lead
130
+ # At current bar, we display the value calculated senkou_lead bars ago
131
+ shift = self.p.senkou_lead
132
+ if len(self) > shift:
133
+ past_hi_tenkan = _line_value(self.hi_tenkan, -shift)
134
+ past_lo_tenkan = _line_value(self.lo_tenkan, -shift)
135
+ past_hi_kijun = _line_value(self.hi_kijun, -shift)
136
+ past_lo_kijun = _line_value(self.lo_kijun, -shift)
137
+ if all(
138
+ _valid(v) for v in (past_hi_tenkan, past_lo_tenkan, past_hi_kijun, past_lo_kijun)
139
+ ):
140
+ past_tenkan = (past_hi_tenkan + past_lo_tenkan) / 2.0
141
+ past_kijun = (past_hi_kijun + past_lo_kijun) / 2.0
142
+ self.lines.senkou_span_a[0] = (past_tenkan + past_kijun) / 2.0
143
+ else:
144
+ self.lines.senkou_span_a[0] = float("nan")
145
+ else:
146
+ self.lines.senkou_span_a[0] = float("nan")
147
+
148
+ # senkou_span_b: (hi_senkou + lo_senkou) / 2, shifted forward by senkou_lead
149
+ if len(self) > shift:
150
+ past_hi_senkou = _line_value(self.hi_senkou, -shift)
151
+ past_lo_senkou = _line_value(self.lo_senkou, -shift)
152
+ if _valid(past_hi_senkou) and _valid(past_lo_senkou):
153
+ self.lines.senkou_span_b[0] = (past_hi_senkou + past_lo_senkou) / 2.0
154
+ else:
155
+ self.lines.senkou_span_b[0] = float("nan")
156
+ else:
157
+ self.lines.senkou_span_b[0] = float("nan")
158
+
159
+ # chikou_span: close shifted backward (displayed chikou bars in the past)
160
+ # When accessing chikou_span[0], we get current close (it will be plotted chikou bars back)
161
+ self.lines.chikou_span[0] = self.data.close[0]
162
+
163
+ def once(self, start, end):
164
+ """Calculate Ichimoku in runonce mode"""
165
+ # Get arrays from sub-indicators
166
+ hi_tenkan_arr = self.hi_tenkan.lines[0].array
167
+ lo_tenkan_arr = self.lo_tenkan.lines[0].array
168
+ hi_kijun_arr = self.hi_kijun.lines[0].array
169
+ lo_kijun_arr = self.lo_kijun.lines[0].array
170
+ hi_senkou_arr = self.hi_senkou.lines[0].array
171
+ lo_senkou_arr = self.lo_senkou.lines[0].array
172
+ close_arr = self.data.close.array
173
+
174
+ # Get output arrays
175
+ tenkan_arr = self.lines.tenkan_sen.array
176
+ kijun_arr = self.lines.kijun_sen.array
177
+ senkou_a_arr = self.lines.senkou_span_a.array
178
+ senkou_b_arr = self.lines.senkou_span_b.array
179
+ chikou_arr = self.lines.chikou_span.array
180
+
181
+ # Ensure output arrays are sized
182
+ for arr in [tenkan_arr, kijun_arr, senkou_a_arr, senkou_b_arr, chikou_arr]:
183
+ while len(arr) < end:
184
+ arr.append(float("nan"))
185
+
186
+ shift = self.p.senkou_lead
187
+
188
+ for i in range(start, min(end, len(hi_tenkan_arr), len(lo_tenkan_arr))):
189
+ # tenkan_sen
190
+ hi_t = hi_tenkan_arr[i]
191
+ lo_t = lo_tenkan_arr[i]
192
+ if hi_t is not None and lo_t is not None:
193
+ if not (isinstance(hi_t, float) and math.isnan(hi_t)) and not (
194
+ isinstance(lo_t, float) and math.isnan(lo_t)
195
+ ):
196
+ tenkan_arr[i] = (hi_t + lo_t) / 2.0
197
+ else:
198
+ tenkan_arr[i] = float("nan")
199
+ else:
200
+ tenkan_arr[i] = float("nan")
201
+
202
+ # kijun_sen
203
+ if i < len(hi_kijun_arr) and i < len(lo_kijun_arr):
204
+ hi_k = hi_kijun_arr[i]
205
+ lo_k = lo_kijun_arr[i]
206
+ if hi_k is not None and lo_k is not None:
207
+ if not (isinstance(hi_k, float) and math.isnan(hi_k)) and not (
208
+ isinstance(lo_k, float) and math.isnan(lo_k)
209
+ ):
210
+ kijun_arr[i] = (hi_k + lo_k) / 2.0
211
+ else:
212
+ kijun_arr[i] = float("nan")
213
+ else:
214
+ kijun_arr[i] = float("nan")
215
+
216
+ # senkou_span_a: shifted forward by senkou_lead
217
+ # Value at index i is calculated from index (i - shift)
218
+ past_idx = i - shift
219
+ if (
220
+ past_idx >= 0
221
+ and past_idx < len(hi_tenkan_arr)
222
+ and past_idx < len(lo_tenkan_arr)
223
+ and past_idx < len(hi_kijun_arr)
224
+ and past_idx < len(lo_kijun_arr)
225
+ ):
226
+ past_hi_t = hi_tenkan_arr[past_idx]
227
+ past_lo_t = lo_tenkan_arr[past_idx]
228
+ past_hi_k = hi_kijun_arr[past_idx]
229
+ past_lo_k = lo_kijun_arr[past_idx]
230
+
231
+ valid = True
232
+ for v in [past_hi_t, past_lo_t, past_hi_k, past_lo_k]:
233
+ if v is None or (isinstance(v, float) and math.isnan(v)):
234
+ valid = False
235
+ break
236
+
237
+ if valid:
238
+ past_tenkan = (past_hi_t + past_lo_t) / 2.0
239
+ past_kijun = (past_hi_k + past_lo_k) / 2.0
240
+ senkou_a_arr[i] = (past_tenkan + past_kijun) / 2.0
241
+ else:
242
+ senkou_a_arr[i] = float("nan")
243
+ else:
244
+ senkou_a_arr[i] = float("nan")
245
+
246
+ # senkou_span_b: shifted forward by senkou_lead
247
+ if past_idx >= 0 and past_idx < len(hi_senkou_arr) and past_idx < len(lo_senkou_arr):
248
+ past_hi_s = hi_senkou_arr[past_idx]
249
+ past_lo_s = lo_senkou_arr[past_idx]
250
+
251
+ if past_hi_s is not None and past_lo_s is not None:
252
+ if not (isinstance(past_hi_s, float) and math.isnan(past_hi_s)) and not (
253
+ isinstance(past_lo_s, float) and math.isnan(past_lo_s)
254
+ ):
255
+ senkou_b_arr[i] = (past_hi_s + past_lo_s) / 2.0
256
+ else:
257
+ senkou_b_arr[i] = float("nan")
258
+ else:
259
+ senkou_b_arr[i] = float("nan")
260
+ else:
261
+ senkou_b_arr[i] = float("nan")
262
+
263
+ # chikou_span: current close (will be plotted shifted back)
264
+ if i < len(close_arr):
265
+ chikou_arr[i] = close_arr[i]
266
+ else:
267
+ chikou_arr[i] = float("nan")
@@ -0,0 +1,181 @@
1
+ #!/usr/bin/env python
2
+ """KAMA Indicator Module - Kaufman's Adaptive Moving Average.
3
+
4
+ This module provides the KAMA (Kaufman's Adaptive Moving Average) indicator
5
+ developed by Perry Kaufman to adapt to market volatility and direction.
6
+
7
+ Classes:
8
+ AdaptiveMovingAverage: KAMA indicator (aliases: KAMA, MovingAverageAdaptive).
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.kama = bt.indicators.KAMA(self.data.close, period=30, fast=2, slow=30)
14
+
15
+ def next(self):
16
+ if self.data.close[0] > self.kama[0]:
17
+ self.buy()
18
+ """
19
+
20
+ import math
21
+
22
+ from . import MovingAverageBase
23
+
24
+
25
+ class AdaptiveMovingAverage(MovingAverageBase):
26
+ """
27
+ Defined by Perry Kaufman in his book `"Smarter Trading"`.
28
+
29
+ It is A Moving Average with a continuously scaled smoothing factor by
30
+ taking into account market direction and volatility. The smoothing factor
31
+ is calculated from 2 ExponetialMovingAverage smoothing factors, a fast one
32
+ and slow one.
33
+
34
+ If the market trends, the value will tend to the fast ema smoothing
35
+ period. If the market doesn't trend, it will move towards the slow EMA
36
+ smoothing period.
37
+
38
+ It is a subclass of SmoothingMovingAverage, overriding once to account for
39
+ the live nature of the smoothing factor
40
+
41
+ Formula:
42
+ - direction = close - close_period
43
+ - volatility = sumN(abs (close - close_n), period)
44
+ - effiency_ratio = abs (direction / volatility)
45
+ - fast = 2 / (fast_period + 1)
46
+ - slow = 2 / (slow_period + 1)
47
+
48
+ - Smfactor = squared(efficienty_ratio * (fast - slow) + slow)
49
+ - smfactor1 = 1.0 - smfactor
50
+
51
+ - The initial seed value is a SimpleMovingAverage
52
+
53
+ See also:
54
+ - http://fxcodebase.com/wiki/index.php/Kaufman's_Adaptive_Moving_Average_(KAMA)
55
+ - http://www.metatrader5.com/en/terminal/help/analytics/indicators/trend_indicators/ama
56
+ - http://help.cqg.com/cqgic/default.htm#!Documents/adaptivemovingaverag2.htm
57
+ """
58
+
59
+ alias = (
60
+ "KAMA",
61
+ "MovingAverageAdaptive",
62
+ )
63
+ lines = ("kama",)
64
+ params = (("fast", 2), ("slow", 30))
65
+
66
+ def __init__(self):
67
+ """Initialize the KAMA indicator.
68
+
69
+ Calculates fast and slow smoothing constants for the
70
+ adaptive moving average.
71
+ """
72
+ super().__init__()
73
+ self.fast_sc = 2.0 / (self.p.fast + 1.0)
74
+ self.slow_sc = 2.0 / (self.p.slow + 1.0)
75
+
76
+ def _calc_sc(self):
77
+ """Calculate smoothing constant based on efficiency ratio"""
78
+ period = self.p.period
79
+
80
+ # direction = close - close_period
81
+ direction = self.data[0] - self.data[-period]
82
+
83
+ # volatility = sum of abs(close - close_prev) over period
84
+ volatility = 0.0
85
+ for i in range(period):
86
+ volatility += abs(self.data[-i] - self.data[-i - 1])
87
+
88
+ # efficiency ratio
89
+ if volatility != 0:
90
+ er = abs(direction / volatility)
91
+ else:
92
+ er = 0.0
93
+
94
+ # smoothing constant = (er * (fast - slow) + slow)^2
95
+ sc = pow(er * (self.fast_sc - self.slow_sc) + self.slow_sc, 2)
96
+ return sc
97
+
98
+ def nextstart(self):
99
+ """Seed KAMA calculation with SMA on first valid bar.
100
+
101
+ Calculates simple moving average for the initial seed value.
102
+ """
103
+ # Seed with SMA
104
+ period = self.p.period
105
+ data_sum = 0.0
106
+ for i in range(period):
107
+ data_sum += self.data[-i]
108
+ self.lines.kama[0] = data_sum / period
109
+
110
+ def next(self):
111
+ """Calculate KAMA for the current bar.
112
+
113
+ KAMA = prev_KAMA + sc * (price - prev_KAMA)
114
+ where sc is the adaptive smoothing constant.
115
+ """
116
+ sc = self._calc_sc()
117
+ self.lines.kama[0] = self.lines.kama[-1] + sc * (self.data[0] - self.lines.kama[-1])
118
+
119
+ def once(self, start, end):
120
+ """Calculate KAMA in runonce mode.
121
+
122
+ Seeds with SMA and applies adaptive smoothing for each bar.
123
+ """
124
+ darray = self.data.array
125
+ larray = self.lines.kama.array
126
+ period = self.p.period
127
+ fast_sc = self.fast_sc
128
+ slow_sc = self.slow_sc
129
+
130
+ while len(larray) < end:
131
+ larray.append(float("nan"))
132
+
133
+ # Pre-fill warmup with NaN
134
+ for i in range(min(period, len(darray))):
135
+ if i < len(larray):
136
+ larray[i] = float("nan")
137
+
138
+ # Calculate seed value (SMA)
139
+ seed_idx = period
140
+ if seed_idx < len(darray):
141
+ seed_sum = sum(darray[seed_idx - period : seed_idx])
142
+ prev_kama = seed_sum / period
143
+ if seed_idx < len(larray):
144
+ larray[seed_idx] = prev_kama
145
+ else:
146
+ prev_kama = 0.0
147
+
148
+ # Calculate KAMA
149
+ for i in range(seed_idx + 1, min(end, len(darray))):
150
+ # direction
151
+ if i >= period and i - period >= 0:
152
+ direction = darray[i] - darray[i - period]
153
+ else:
154
+ direction = 0.0
155
+
156
+ # volatility
157
+ volatility = 0.0
158
+ for j in range(period):
159
+ idx = i - j
160
+ if idx > 0 and idx < len(darray) and idx - 1 >= 0:
161
+ volatility += abs(darray[idx] - darray[idx - 1])
162
+
163
+ # efficiency ratio
164
+ if volatility != 0:
165
+ er = abs(direction / volatility)
166
+ else:
167
+ er = 0.0
168
+
169
+ # smoothing constant
170
+ sc = pow(er * (fast_sc - slow_sc) + slow_sc, 2)
171
+
172
+ # Get previous KAMA
173
+ if i > 0 and i - 1 < len(larray):
174
+ prev_val = larray[i - 1]
175
+ if not (isinstance(prev_val, float) and math.isnan(prev_val)):
176
+ prev_kama = prev_val
177
+
178
+ # KAMA formula
179
+ prev_kama = prev_kama + sc * (darray[i] - prev_kama)
180
+ if i < len(larray):
181
+ larray[i] = prev_kama
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env python
2
+ """KST Indicator Module - Know Sure Thing indicator.
3
+
4
+ This module provides the KST (Know Sure Thing) momentum indicator
5
+ developed by Martin Pring.
6
+
7
+ Classes:
8
+ KnowSureThing: KST indicator (alias: KST).
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ self.kst = bt.indicators.KST(self.data)
14
+ self.kst_signal = bt.indicators.KST(self.data, rp1=10, rp2=15, rp3=20, rp4=30)
15
+
16
+ def next(self):
17
+ if self.kst.kst[0] > self.kst.signal[0]:
18
+ self.buy()
19
+ elif self.kst.kst[0] < self.kst.signal[0]:
20
+ self.sell()
21
+ """
22
+
23
+ import math
24
+
25
+ from . import ROC100, SMA, Indicator
26
+
27
+
28
+ class KnowSureThing(Indicator):
29
+ """
30
+ It is a "summed" momentum indicator. Developed by Martin Pring and
31
+ published in 1992 in Stocks & Commodities.
32
+
33
+ Formula:
34
+ - rcma1 = MovAv(roc100(rp1), period)
35
+ - rcma2 = MovAv(roc100(rp2), period)
36
+ - rcma3 = MovAv(roc100(rp3), period)
37
+ - rcma4 = MovAv(roc100(rp4), period)
38
+
39
+ - Kst = 1.0 * rcma1 + 2.0 * rcma2 + 3.0 * rcma3 + 4.0 * rcma4
40
+ - signal = MovAv(kst, speriod)
41
+
42
+ See:
43
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:know_sure_thing_kst
44
+
45
+ Params
46
+
47
+ - ``rma1``, ``rma2``, ``rma3``, ``rma4``: for the MovingAverages on ROCs
48
+ - ``rp1``, ``rp2``, ``rp3``, ``rp4``: for the ROCs
49
+ - ``rsig``: for the MovingAverage for the signal line
50
+ - ``rfactors``: list of factors to apply to the different MovAv(ROCs)
51
+ - ``_movav`` and ``_movavs``, allows to change the Moving Average type
52
+ applied for the calculation of kst and signal
53
+
54
+ """
55
+
56
+ alias = ("KST",)
57
+ lines = (
58
+ "kst",
59
+ "signal",
60
+ )
61
+ params = (
62
+ ("rp1", 10),
63
+ ("rp2", 15),
64
+ ("rp3", 20),
65
+ ("rp4", 30),
66
+ ("rma1", 10),
67
+ ("rma2", 10),
68
+ ("rma3", 10),
69
+ ("rma4", 10),
70
+ ("rsignal", 9),
71
+ ("rfactors", [1.0, 2.0, 3.0, 4.0]),
72
+ ("_rmovav", SMA),
73
+ ("_smovav", SMA),
74
+ )
75
+
76
+ plotinfo = {"plothlines": [0.0]}
77
+
78
+ def __init__(self):
79
+ """Initialize the KST indicator.
80
+
81
+ Creates 4 ROC and moving average sub-indicators.
82
+ """
83
+ super().__init__()
84
+ self.rcma1 = self.p._rmovav(ROC100(self.data, period=self.p.rp1), period=self.p.rma1)
85
+ self.rcma2 = self.p._rmovav(ROC100(self.data, period=self.p.rp2), period=self.p.rma2)
86
+ self.rcma3 = self.p._rmovav(ROC100(self.data, period=self.p.rp3), period=self.p.rma3)
87
+ self.rcma4 = self.p._rmovav(ROC100(self.data, period=self.p.rp4), period=self.p.rma4)
88
+
89
+ def next(self):
90
+ """Calculate KST and signal for the current bar.
91
+
92
+ Formula: KST = w1*RCMA1 + w2*RCMA2 + w3*RCMA3 + w4*RCMA4
93
+ Signal = SMA(KST, rsignal)
94
+ """
95
+ rf = self.p.rfactors
96
+ kst_val = (
97
+ rf[0] * self.rcma1[0]
98
+ + rf[1] * self.rcma2[0]
99
+ + rf[2] * self.rcma3[0]
100
+ + rf[3] * self.rcma4[0]
101
+ )
102
+ self.lines.kst[0] = kst_val
103
+
104
+ # Calculate signal (SMA of KST)
105
+ rsignal = self.p.rsignal
106
+ kst_sum = kst_val
107
+ for i in range(1, rsignal):
108
+ kst_sum += self.lines.kst[-i]
109
+ self.lines.signal[0] = kst_sum / rsignal
110
+
111
+ def once(self, start, end):
112
+ """Calculate KST and signal in runonce mode."""
113
+ rcma1_array = self.rcma1.lines[0].array
114
+ rcma2_array = self.rcma2.lines[0].array
115
+ rcma3_array = self.rcma3.lines[0].array
116
+ rcma4_array = self.rcma4.lines[0].array
117
+ kst_array = self.lines.kst.array
118
+ signal_array = self.lines.signal.array
119
+ rf = self.p.rfactors
120
+ rsignal = self.p.rsignal
121
+
122
+ for arr in [kst_array, signal_array]:
123
+ while len(arr) < end:
124
+ arr.append(float("nan"))
125
+
126
+ # Calculate KST
127
+ for i in range(
128
+ start, min(end, len(rcma1_array), len(rcma2_array), len(rcma3_array), len(rcma4_array))
129
+ ):
130
+ v1 = rcma1_array[i] if i < len(rcma1_array) else 0.0
131
+ v2 = rcma2_array[i] if i < len(rcma2_array) else 0.0
132
+ v3 = rcma3_array[i] if i < len(rcma3_array) else 0.0
133
+ v4 = rcma4_array[i] if i < len(rcma4_array) else 0.0
134
+
135
+ if any(isinstance(v, float) and math.isnan(v) for v in [v1, v2, v3, v4]):
136
+ kst_array[i] = float("nan")
137
+ else:
138
+ kst_array[i] = rf[0] * v1 + rf[1] * v2 + rf[2] * v3 + rf[3] * v4
139
+
140
+ # Calculate signal (SMA of KST)
141
+ for i in range(start, min(end, len(kst_array))):
142
+ kst_val = kst_array[i]
143
+ if isinstance(kst_val, float) and math.isnan(kst_val) or i < rsignal - 1:
144
+ signal_array[i] = float("nan")
145
+ else:
146
+ kst_sum = 0.0
147
+ valid = True
148
+ for j in range(rsignal):
149
+ idx = i - j
150
+ if idx >= 0 and idx < len(kst_array):
151
+ val = kst_array[idx]
152
+ if isinstance(val, float) and math.isnan(val):
153
+ valid = False
154
+ break
155
+ kst_sum += val
156
+ if valid:
157
+ signal_array[i] = kst_sum / rsignal
158
+ else:
159
+ signal_array[i] = float("nan")