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,105 @@
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
+ "SidusIndicator",
12
+ ]
13
+
14
+
15
+ class SidusIndicator(Indicator):
16
+ """Reconstructs Sidus indicator from its MQ5 source.
17
+
18
+ Uses 4 MAs: FastEMA, SlowEMA, FastLWMA, SlowLWMA + ATR(15).
19
+ Buy arrows on: FastLWMA crosses above SlowLWMA, or SlowLWMA crosses above SlowEMA.
20
+ Sell arrows on reverse crosses.
21
+ Arrow offset = ATR * digit scaling.
22
+ """
23
+
24
+ lines = ("buy_arrow", "sell_arrow")
25
+ params = (
26
+ ("fast_ema", 18),
27
+ ("slow_ema", 28),
28
+ ("fast_lwma", 5),
29
+ ("slow_lwma", 8),
30
+ ("digit", 0),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Cache MA periods and digit scaling, and set the indicator warmup."""
35
+ self._fe = int(self.p.fast_ema)
36
+ self._se = int(self.p.slow_ema)
37
+ self._fl = int(self.p.fast_lwma)
38
+ self._sl = int(self.p.slow_lwma)
39
+ self._digit = float(10 ** int(self.p.digit)) if int(self.p.digit) > 0 else 0.0
40
+ self.addminperiod(max(self._fe, self._se, self._fl, self._sl) + 3)
41
+
42
+ def _ema(self, period, ago):
43
+ # Simple EMA approximation using close prices
44
+ k = 2.0 / (period + 1)
45
+ val = float(self.data.close[-(ago + period - 1)])
46
+ for i in range(ago + period - 2, ago - 1, -1):
47
+ val = float(self.data.close[-i]) * k + val * (1 - k) if i >= 0 else val
48
+ return val
49
+
50
+ def _lwma(self, period, ago):
51
+ total = 0.0
52
+ wsum = 0.0
53
+ for i in range(period):
54
+ w = float(period - i)
55
+ total += float(self.data.close[-(ago + i)]) * w
56
+ wsum += w
57
+ return total / wsum if wsum > 0 else 0.0
58
+
59
+ def _atr(self, period, ago):
60
+ total = 0.0
61
+ for i in range(period):
62
+ idx = ago + i
63
+ h = float(self.data.high[-idx])
64
+ low_price = float(self.data.low[-idx])
65
+ if idx + 1 < len(self.data):
66
+ pc = float(self.data.close[-(idx + 1)])
67
+ tr = max(h - low_price, abs(h - pc), abs(low_price - pc))
68
+ else:
69
+ tr = h - low_price
70
+ total += tr
71
+ return total / period
72
+
73
+ def next(self):
74
+ """Emit buy/sell arrow offsets when the LWMA/EMA cross conditions fire."""
75
+ # Current bar (ago=0) and previous bar (ago=1)
76
+ self._ema(self._fe, 0)
77
+ slw_ema_0 = self._ema(self._se, 0)
78
+ fst_lwma_0 = self._lwma(self._fl, 0)
79
+ slw_lwma_0 = self._lwma(self._sl, 0)
80
+
81
+ fst_lwma_1 = self._lwma(self._fl, 1)
82
+ slw_lwma_1 = self._lwma(self._sl, 1)
83
+ slw_ema_1 = self._ema(self._se, 1)
84
+
85
+ atr_val = self._atr(15, 0)
86
+ rng = atr_val * 3.0
87
+ digit = self._digit
88
+
89
+ buy_val = 0.0
90
+ sell_val = 0.0
91
+
92
+ # Buy: FastLWMA crosses above SlowLWMA, or SlowLWMA crosses above SlowEMA
93
+ if fst_lwma_0 > slw_lwma_0 + digit and fst_lwma_1 <= slw_lwma_1:
94
+ buy_val = float(self.data.low[0]) - rng
95
+ if slw_lwma_0 > slw_ema_0 + digit and slw_lwma_1 <= slw_ema_1:
96
+ buy_val = float(self.data.low[0]) - rng
97
+
98
+ # Sell: FastLWMA crosses below SlowLWMA, or SlowLWMA crosses below SlowEMA
99
+ if fst_lwma_0 < slw_lwma_0 - digit and fst_lwma_1 >= slw_lwma_1:
100
+ sell_val = float(self.data.high[0]) + rng
101
+ if slw_lwma_0 < slw_ema_0 - digit and slw_lwma_1 >= slw_ema_1:
102
+ sell_val = float(self.data.high[0]) + rng
103
+
104
+ self.lines.buy_arrow[0] = buy_val
105
+ self.lines.sell_arrow[0] = sell_val
@@ -0,0 +1,79 @@
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
+ "SilverTrendIndicator",
12
+ ]
13
+
14
+
15
+ class SilverTrendIndicator(Indicator):
16
+ """Reconstructs SilverTrend_Signal from its MQ5 source.
17
+
18
+ Uses SSP-period average range to compute smin/smax bands.
19
+ K = RISK * 100.
20
+ smin = SsMin + (SsMax - SsMin) * K / 100
21
+ smax = SsMax - (SsMax - SsMin) * K / 100
22
+ Trend toggles: close < smin → downtrend, close > smax → uptrend.
23
+ Buy arrow on uptrend toggle, sell arrow on downtrend toggle.
24
+ """
25
+
26
+ lines = ("buy_arrow", "sell_arrow")
27
+ params = (
28
+ ("ssp", 9),
29
+ ("risk", 3),
30
+ )
31
+
32
+ def __init__(self):
33
+ """Cache SSP/risk parameters, reset trend state, and set min period."""
34
+ self._ssp = int(self.p.ssp)
35
+ self._k = float(self.p.risk) * 100.0
36
+ self._uptrend = False
37
+ self._old = False
38
+ self.addminperiod(self._ssp + 2)
39
+
40
+ def next(self):
41
+ """Update the adaptive bands and emit buy/sell arrows on trend flips."""
42
+ ssp = self._ssp
43
+
44
+ # Compute average range over SSP bars
45
+ total_range = 0.0
46
+ for i in range(ssp):
47
+ h = float(self.data.high[-i])
48
+ low_price = float(self.data.low[-i])
49
+ total_range += h - low_price
50
+ avg_range = total_range / ssp
51
+ rng = avg_range
52
+
53
+ # SsMax = highest high over SSP bars, SsMin = lowest low
54
+ ss_max = max(float(self.data.high[-i]) for i in range(ssp))
55
+ ss_min = min(float(self.data.low[-i]) for i in range(ssp))
56
+
57
+ k = self._k
58
+ smin = ss_min + (ss_max - ss_min) * k / 100.0
59
+ smax = ss_max - (ss_max - ss_min) * k / 100.0
60
+
61
+ cur_close = float(self.data.close[0])
62
+
63
+ if cur_close < smin:
64
+ self._uptrend = False
65
+ if cur_close > smax:
66
+ self._uptrend = True
67
+
68
+ buy_val = 0.0
69
+ sell_val = 0.0
70
+
71
+ if self._uptrend != self._old and self._uptrend:
72
+ buy_val = float(self.data.low[0]) - rng * 0.5
73
+ if self._uptrend != self._old and not self._uptrend:
74
+ sell_val = float(self.data.high[0]) + rng * 0.5
75
+
76
+ self._old = self._uptrend
77
+
78
+ self.lines.buy_arrow[0] = buy_val
79
+ self.lines.sell_arrow[0] = sell_val
@@ -0,0 +1,56 @@
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
+ "SlidingRangeColor",
12
+ ]
13
+
14
+
15
+ class SlidingRangeColor(Indicator):
16
+ """Indicator computing sliding-window average range channels with a color index for breakout direction."""
17
+
18
+ lines = ("color_idx", "upper", "lower")
19
+ params = (
20
+ ("up_calc_period_range", 5),
21
+ ("up_calc_period_shift", 0),
22
+ ("dn_calc_period_range", 5),
23
+ ("dn_calc_period_shift", 0),
24
+ ("up_digit", 2),
25
+ ("dn_digit", 2),
26
+ )
27
+
28
+ def next(self):
29
+ """Compute rounded average of recent highs/lows and set color based on close relative to the range."""
30
+ up_end = len(self.data) - 1 - self.p.up_calc_period_shift
31
+ up_start = max(0, up_end - self.p.up_calc_period_range + 1)
32
+ dn_end = len(self.data) - 1 - self.p.dn_calc_period_shift
33
+ dn_start = max(0, dn_end - self.p.dn_calc_period_range + 1)
34
+ highs = [
35
+ float(self.data.high[-idx])
36
+ for idx in range(len(self.data) - 1 - up_end, len(self.data) - up_start)
37
+ ]
38
+ lows = [
39
+ float(self.data.low[-idx])
40
+ for idx in range(len(self.data) - 1 - dn_end, len(self.data) - dn_start)
41
+ ]
42
+ if not highs or not lows:
43
+ self.lines.color_idx[0] = 4.0
44
+ return
45
+ upper = round(sum(highs) / len(highs), self.p.up_digit)
46
+ lower = round(sum(lows) / len(lows), self.p.dn_digit)
47
+ close = float(self.data.close[0])
48
+ open_ = float(self.data.open[0])
49
+ self.lines.upper[0] = upper
50
+ self.lines.lower[0] = lower
51
+ color = 4.0
52
+ if close > upper:
53
+ color = 3.0 if close >= open_ else 2.0
54
+ elif close < lower:
55
+ color = 0.0 if close <= open_ else 1.0
56
+ self.lines.color_idx[0] = color
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ExponentialMovingAverage,
10
+ Indicator,
11
+ StochasticFull,
12
+ )
13
+
14
+ __all__ = [
15
+ "SlowStoch",
16
+ ]
17
+
18
+
19
+ class SlowStoch(Indicator):
20
+ """EMA-smoothed slow stochastic exposing an oscillator and a signal line."""
21
+
22
+ lines = ("sto", "signal")
23
+ params = (
24
+ ("k_period", 5),
25
+ ("d_period", 3),
26
+ ("slowing", 3),
27
+ ("xlength", 5),
28
+ )
29
+
30
+ def __init__(self):
31
+ """Build the StochasticFull and EMA-smooth its %D and slow %D lines."""
32
+ stoch = StochasticFull(
33
+ self.data,
34
+ period=max(int(self.p.k_period), 1),
35
+ period_dfast=max(int(self.p.d_period), 1),
36
+ period_dslow=max(int(self.p.slowing), 1),
37
+ safediv=True,
38
+ )
39
+ self.l.sto = ExponentialMovingAverage(stoch.percD, period=max(int(self.p.xlength), 1))
40
+ self.l.signal = ExponentialMovingAverage(
41
+ stoch.percDSlow, period=max(int(self.p.xlength), 1)
42
+ )
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ADX,
10
+ ExponentialMovingAverage,
11
+ Indicator,
12
+ MinusDirectionalIndicator,
13
+ PlusDirectionalIndicator,
14
+ SimpleMovingAverage,
15
+ SmoothedMovingAverage,
16
+ WeightedMovingAverage,
17
+ )
18
+
19
+ __all__ = [
20
+ "SmoothedADXIndicator",
21
+ ]
22
+
23
+
24
+ def resolve_ma_class(name):
25
+ """Map a moving-average name to its backtrader indicator class.
26
+
27
+ Args:
28
+ name: MA type name (e.g. ``t3``, ``ema``, ``sma``, ``smma`` or MT5-style
29
+ ``mode_*`` variants); several smoothing variants map to EMA.
30
+
31
+ Returns:
32
+ The matching backtrader moving-average indicator class, defaulting to
33
+ the weighted moving average for unrecognized names.
34
+ """
35
+ mode = str(name).lower()
36
+ if mode in {
37
+ "mode_t3",
38
+ "t3",
39
+ "mode_ema",
40
+ "ema",
41
+ "mode_ama",
42
+ "ama",
43
+ "mode_jjma",
44
+ "jjma",
45
+ "mode_jurx",
46
+ "jurx",
47
+ "mode_vidya",
48
+ "vidya",
49
+ "mode_parma",
50
+ "parma",
51
+ }:
52
+ return ExponentialMovingAverage
53
+ if mode in {"mode_sma", "sma"}:
54
+ return SimpleMovingAverage
55
+ if mode in {"mode_smma", "smma"}:
56
+ return SmoothedMovingAverage
57
+ return WeightedMovingAverage
58
+
59
+
60
+ class SmoothedADXIndicator(Indicator):
61
+ """ADX/DI system with each line smoothed by a configurable moving average.
62
+
63
+ Computes raw +DI, -DI and ADX over ``adx_period`` and exposes moving-average
64
+ smoothed versions on the ``plus_di``, ``minus_di`` and ``adx`` lines.
65
+ """
66
+
67
+ lines = ("plus_di", "minus_di", "adx")
68
+ params = (
69
+ ("xma_method", "t3"),
70
+ ("adx_period", 14),
71
+ ("adx_phase", 100),
72
+ )
73
+
74
+ def __init__(self):
75
+ """Build the raw +DI/-DI/ADX indicators and their smoothed lines."""
76
+ ma_cls = resolve_ma_class(self.p.xma_method)
77
+ self._plus = PlusDirectionalIndicator(self.data, period=max(1, int(self.p.adx_period)))
78
+ self._minus = MinusDirectionalIndicator(self.data, period=max(1, int(self.p.adx_period)))
79
+ self._adx_raw = ADX(self.data, period=max(1, int(self.p.adx_period)))
80
+ self._plus_smooth = ma_cls(self._plus, period=max(1, int(self.p.adx_period)))
81
+ self._minus_smooth = ma_cls(self._minus, period=max(1, int(self.p.adx_period)))
82
+ self._adx_smooth = ma_cls(self._adx_raw, period=max(1, int(self.p.adx_period)))
83
+ self.lines.plus_di = self._plus_smooth
84
+ self.lines.minus_di = self._minus_smooth
85
+ self.lines.adx = self._adx_smooth
86
+ self.addminperiod(int(self.p.adx_period) * 3)
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ RSI,
10
+ Indicator,
11
+ SimpleMovingAverage,
12
+ )
13
+
14
+ __all__ = [
15
+ "SmoothedRsi",
16
+ ]
17
+
18
+
19
+ class SmoothedRsi(Indicator):
20
+ """Smooth RSI value using an outer simple moving average."""
21
+
22
+ lines = ("value",)
23
+ params = (
24
+ ("period", 14),
25
+ ("smoothing", 6),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Initialize RSI and smoothed value lines from configured parameters."""
30
+ rsi = RSI(self.data, period=self.p.period)
31
+ self.lines.value = SimpleMovingAverage(rsi, period=self.p.smoothing)
@@ -0,0 +1,60 @@
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
+ "SpearmanRankCorrelationHistogram",
12
+ ]
13
+
14
+
15
+ class SpearmanRankCorrelationHistogram(Indicator):
16
+ """Compute a Spearman-rank-style correlation histogram and regime color."""
17
+
18
+ lines = ("value", "color")
19
+ params = (
20
+ ("range_n", 14),
21
+ ("direction", True),
22
+ ("in_high_level", 0.5),
23
+ ("in_low_level", -0.5),
24
+ )
25
+
26
+ def __init__(self):
27
+ """Set the indicator minimum period."""
28
+ self.addminperiod(int(self.p.range_n) + 2)
29
+
30
+ def _ranks(self, values):
31
+ indexed = list(enumerate(values))
32
+ sorted_values = sorted(indexed, key=lambda item: item[1], reverse=bool(self.p.direction))
33
+ ranks = [0.0] * len(values)
34
+ i = 0
35
+ while i < len(sorted_values):
36
+ j = i + 1
37
+ while j < len(sorted_values) and sorted_values[j][1] == sorted_values[i][1]:
38
+ j += 1
39
+ avg_rank = (i + 1 + j) / 2.0
40
+ for k in range(i, j):
41
+ ranks[sorted_values[k][0]] = avg_rank
42
+ i = j
43
+ return ranks
44
+
45
+ def next(self):
46
+ """Compute one step of correlation value and color code."""
47
+ n = int(self.p.range_n)
48
+ values = [int(round(float(self.data.close[-i]) * 100.0)) for i in range(n)]
49
+ ranks = self._ranks(values)
50
+ z2 = 0.0
51
+ for i, rank in enumerate(ranks):
52
+ z2 += (rank - (i + 1)) ** 2
53
+ res = 1.0 - 6.0 * z2 / (n**3 - n)
54
+ self.lines.value[0] = res
55
+ clr = 2
56
+ if res > 0:
57
+ clr = 4 if res > float(self.p.in_high_level) else 3
58
+ elif res < 0:
59
+ clr = 0 if res < float(self.p.in_low_level) else 1
60
+ self.lines.color[0] = clr
@@ -0,0 +1,152 @@
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
+ "StalinIndicator",
12
+ ]
13
+
14
+
15
+ class StalinIndicator(Indicator):
16
+ """Reconstructs Stalin indicator from its MQ5 source.
17
+
18
+ Uses Fast/Slow MA crossover with optional RSI filter.
19
+ BU() fires buy arrow at low if flat distance check passes.
20
+ BD() fires sell arrow at high if flat distance check passes.
21
+ Optional Confirm parameter adds a price-distance confirmation step.
22
+ """
23
+
24
+ lines = ("buy_arrow", "sell_arrow")
25
+ params = (
26
+ ("ma_method", "ema"),
27
+ ("fast", 14),
28
+ ("slow", 21),
29
+ ("rsi_period", 17),
30
+ ("confirm", 0),
31
+ ("flat", 0),
32
+ ("point", 0.0001),
33
+ )
34
+
35
+ def __init__(self):
36
+ """Prepare cached MA/RSI parameters and state for BU/BD arrow generation."""
37
+ self._fast = int(self.p.fast)
38
+ self._slow = int(self.p.slow)
39
+ self._rsi = int(self.p.rsi_period)
40
+ self._confirm2 = float(self.p.confirm) * float(self.p.point)
41
+ self._flat2 = float(self.p.flat) * float(self.p.point)
42
+ self._e1 = 0.0 # last buy arrow price
43
+ self._e2 = 0.0 # last sell arrow price
44
+ self._iup = 0.0 # pending buy confirmation price
45
+ self._idn = 0.0 # pending sell confirmation price
46
+ self.addminperiod(max(self._fast, self._slow, self._rsi if self._rsi > 0 else 1) + 3)
47
+
48
+ def _calc_ema(self, period, ago):
49
+ k = 2.0 / (period + 1)
50
+ val = float(self.data.close[-(ago + period - 1)])
51
+ for i in range(ago + period - 2, ago - 1, -1):
52
+ val = float(self.data.close[-i]) * k + val * (1 - k) if i >= 0 else val
53
+ return val
54
+
55
+ def _calc_lwma(self, period, ago):
56
+ total = 0.0
57
+ wsum = 0.0
58
+ for i in range(period):
59
+ w = float(period - i)
60
+ total += float(self.data.close[-(ago + i)]) * w
61
+ wsum += w
62
+ return total / wsum if wsum > 0 else 0.0
63
+
64
+ def _calc_sma(self, period, ago):
65
+ total = 0.0
66
+ for i in range(period):
67
+ total += float(self.data.close[-(ago + i)])
68
+ return total / period
69
+
70
+ def _calc_ma(self, period, ago):
71
+ method = str(self.p.ma_method).lower()
72
+ if method == "lwma":
73
+ return self._calc_lwma(period, ago)
74
+ if method == "sma":
75
+ return self._calc_sma(period, ago)
76
+ return self._calc_ema(period, ago)
77
+
78
+ def _calc_rsi(self, period, ago):
79
+ gains = 0.0
80
+ losses = 0.0
81
+ for i in range(period):
82
+ idx = ago + i
83
+ c = float(self.data.close[-idx])
84
+ cp = float(self.data.close[-(idx + 1)])
85
+ diff = c - cp
86
+ if diff > 0:
87
+ gains += diff
88
+ else:
89
+ losses -= diff
90
+ avg_gain = gains / period
91
+ avg_loss = losses / period
92
+ if avg_loss == 0:
93
+ return 100.0
94
+ rs = avg_gain / avg_loss
95
+ return 100.0 - (100.0 / (1.0 + rs))
96
+
97
+ def next(self):
98
+ """Compute MA crossover and optional RSI filters, then emit buy/sell arrows."""
99
+ fast_ma_0 = self._calc_ma(self._fast, 0)
100
+ slow_ma_0 = self._calc_ma(self._slow, 0)
101
+ fast_ma_1 = self._calc_ma(self._fast, 1)
102
+ slow_ma_1 = self._calc_ma(self._slow, 1)
103
+
104
+ use_rsi = self._rsi > 0
105
+ rsi_val = self._calc_rsi(self._rsi, 0) if use_rsi else 50.0
106
+
107
+ buy_val = 0.0
108
+ sell_val = 0.0
109
+
110
+ cur_low = float(self.data.low[0])
111
+ cur_high = float(self.data.high[0])
112
+ cur_close = float(self.data.close[0])
113
+ flat2 = self._flat2
114
+ confirm2 = self._confirm2
115
+
116
+ # MA crossover buy signal
117
+ if (not use_rsi) or (fast_ma_1 < slow_ma_1 and fast_ma_0 > slow_ma_0 and rsi_val > 50):
118
+ if not confirm2:
119
+ # BU: fire buy arrow if flat distance passes
120
+ if cur_low >= (self._e1 + flat2) or cur_low <= (self._e1 - flat2):
121
+ buy_val = cur_low
122
+ self._e1 = cur_low
123
+ else:
124
+ self._iup = cur_low
125
+ self._idn = 0.0
126
+
127
+ # MA crossover sell signal
128
+ if (not use_rsi) or (fast_ma_1 > slow_ma_1 and fast_ma_0 < slow_ma_0 and rsi_val < 50):
129
+ if not confirm2:
130
+ if cur_high >= (self._e2 + flat2) or cur_high <= (self._e2 - flat2):
131
+ sell_val = cur_high
132
+ self._e2 = cur_high
133
+ else:
134
+ self._idn = cur_high
135
+ self._iup = 0.0
136
+
137
+ # Confirm pending buy
138
+ if self._iup and cur_high - self._iup >= confirm2 and cur_close <= cur_high:
139
+ if cur_low >= (self._e1 + flat2) or cur_low <= (self._e1 - flat2):
140
+ buy_val = cur_low
141
+ self._e1 = cur_low
142
+ self._iup = 0.0
143
+
144
+ # Confirm pending sell
145
+ if self._idn and self._idn - cur_low >= confirm2 and float(self.data.open[0]) >= cur_close:
146
+ if cur_high >= (self._e2 + flat2) or cur_high <= (self._e2 - flat2):
147
+ sell_val = cur_high
148
+ self._e2 = cur_high
149
+ self._idn = 0.0
150
+
151
+ self.lines.buy_arrow[0] = buy_val
152
+ self.lines.sell_arrow[0] = sell_val
@@ -0,0 +1,62 @@
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
+ "StarterLaguerreFilter",
12
+ ]
13
+
14
+
15
+ class StarterLaguerreFilter(Indicator):
16
+ """Laguerre filter oscillator bounded in the [0, 1] range.
17
+
18
+ Implements Ehlers' four-stage Laguerre filter and converts the staged
19
+ values into a normalised oscillator. Readings near 0 indicate oversold
20
+ conditions and readings near 1 indicate overbought conditions.
21
+ """
22
+
23
+ lines = ("value",)
24
+ params = (("gamma", 0.7),)
25
+
26
+ def __init__(self):
27
+ """Set the minimum period and reset the four Laguerre stage buffers."""
28
+ self.addminperiod(2)
29
+ self._l0 = None
30
+ self._l1 = None
31
+ self._l2 = None
32
+ self._l3 = None
33
+
34
+ def next(self):
35
+ """Advance the Laguerre stages and emit the normalised oscillator value."""
36
+ price = float(self.data[0])
37
+ gamma = float(self.p.gamma)
38
+ if self._l0 is None:
39
+ self._l0 = price
40
+ self._l1 = price
41
+ self._l2 = price
42
+ self._l3 = price
43
+ self.lines.value[0] = 0.5
44
+ return
45
+ l0_prev = self._l0
46
+ l1_prev = self._l1
47
+ l2_prev = self._l2
48
+ l3_prev = self._l3
49
+ self._l0 = (1.0 - gamma) * price + gamma * l0_prev
50
+ self._l1 = -gamma * self._l0 + l0_prev + gamma * l1_prev
51
+ self._l2 = -gamma * self._l1 + l1_prev + gamma * l2_prev
52
+ self._l3 = -gamma * self._l2 + l2_prev + gamma * l3_prev
53
+ cu = 0.0
54
+ cd = 0.0
55
+ pairs = ((self._l0, self._l1), (self._l1, self._l2), (self._l2, self._l3))
56
+ for left, right in pairs:
57
+ if left >= right:
58
+ cu += left - right
59
+ else:
60
+ cd += right - left
61
+ denom = cu + cd
62
+ self.lines.value[0] = cu / denom if denom else self.lines.value[-1]