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,104 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "PriceChannelStopIndicator",
14
+ ]
15
+
16
+
17
+ class PriceChannelStopIndicator(Indicator):
18
+ """Reconstructs PriceChannel_Stop from its MQ5 source.
19
+
20
+ 6 output buffers mapped to lines:
21
+ 0=DownTrendSignal, 1=DownTrendBuffer, 2=DownTrendLine
22
+ 3=UpTrendSignal, 4=UpTrendBuffer, 5=UpTrendLine
23
+ """
24
+
25
+ lines = ("down_signal", "down_buffer", "down_line", "up_signal", "up_buffer", "up_line")
26
+ params = (
27
+ ("channel_period", 5),
28
+ ("risk", 0.1),
29
+ )
30
+
31
+ def __init__(self):
32
+ """Initialize oscillator state and force initial warm-up period."""
33
+ self._cp = int(self.p.channel_period)
34
+ self._risk = float(self.p.risk)
35
+ self._trend = 0
36
+ self._prev_bsmax = 0.0
37
+ self._prev_bsmin = 0.0
38
+ self.addminperiod(self._cp + 2)
39
+
40
+ def next(self):
41
+ """Update indicator lines from current and rolling high/low windows."""
42
+ cp = self._cp
43
+ risk = self._risk
44
+
45
+ # Highest high and lowest low over [bar, bar+ChannelPeriod)
46
+ hi = max(float(self.data.high[-i]) for i in range(cp))
47
+ lo = min(float(self.data.low[-i]) for i in range(cp))
48
+
49
+ d_price = (hi - lo) * risk
50
+ bsmax = hi - d_price
51
+ bsmin = lo + d_price
52
+
53
+ cur_close = float(self.data.close[0])
54
+
55
+ if cur_close > self._prev_bsmax:
56
+ self._trend = 1
57
+ if cur_close < self._prev_bsmin:
58
+ self._trend = -1
59
+
60
+ # Ratchet
61
+ if self._trend > 0 and bsmin < self._prev_bsmin:
62
+ bsmin = self._prev_bsmin
63
+ if self._trend < 0 and bsmax > self._prev_bsmax:
64
+ bsmax = self._prev_bsmax
65
+
66
+ # Reset all
67
+ self.lines.down_signal[0] = 0.0
68
+ self.lines.down_buffer[0] = 0.0
69
+ self.lines.down_line[0] = 0.0
70
+ self.lines.up_signal[0] = 0.0
71
+ self.lines.up_buffer[0] = 0.0
72
+ self.lines.up_line[0] = 0.0
73
+
74
+ prev_down_buffer = (
75
+ float(self.lines.down_buffer[-1])
76
+ if len(self) > 1 and not math.isnan(float(self.lines.down_buffer[-1]))
77
+ else 0.0
78
+ )
79
+ prev_up_buffer = (
80
+ float(self.lines.up_buffer[-1])
81
+ if len(self) > 1 and not math.isnan(float(self.lines.up_buffer[-1]))
82
+ else 0.0
83
+ )
84
+
85
+ if self._trend > 0:
86
+ price = bsmin
87
+ if prev_down_buffer > 0:
88
+ self.lines.up_signal[0] = price
89
+ self.lines.up_line[0] = price
90
+ else:
91
+ self.lines.up_buffer[0] = price
92
+ self.lines.up_line[0] = price
93
+
94
+ if self._trend < 0:
95
+ price = bsmax
96
+ if prev_up_buffer > 0:
97
+ self.lines.down_signal[0] = price
98
+ self.lines.down_line[0] = price
99
+ else:
100
+ self.lines.down_buffer[0] = price
101
+ self.lines.down_line[0] = price
102
+
103
+ self._prev_bsmax = bsmax
104
+ self._prev_bsmin = bsmin
@@ -0,0 +1,35 @@
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
+ Highest,
10
+ Indicator,
11
+ Lowest,
12
+ )
13
+
14
+ __all__ = [
15
+ "PriceExtremeChannel",
16
+ ]
17
+
18
+
19
+ class PriceExtremeChannel(Indicator):
20
+ """Custom indicator calculating local highest highs and lowest lows.
21
+
22
+ Lines:
23
+ upper (Line): Channel upper boundary.
24
+ lower (Line): Channel lower boundary.
25
+ """
26
+
27
+ lines = ("upper", "lower")
28
+ params = (("multiplier", 5),)
29
+
30
+ def __init__(self):
31
+ """Initialize the custom highest/lowest channel lines and establish minimum warmup period."""
32
+ period = max(int(self.p.multiplier), 1)
33
+ self.lines.upper = Highest(self.data.high(-1), period=period)
34
+ self.lines.lower = Lowest(self.data.low(-1), period=period)
35
+ self.addminperiod(period + 2)
@@ -0,0 +1,129 @@
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
+ RelativeStrengthIndex,
12
+ SimpleMovingAverage,
13
+ SmoothedMovingAverage,
14
+ WeightedMovingAverage,
15
+ )
16
+
17
+ __all__ = [
18
+ "QQECloudIndicator",
19
+ ]
20
+
21
+
22
+ def resolve_ma_class(name):
23
+ """Resolve moving-average class from strategy configuration value."""
24
+ mode = str(name).lower()
25
+ if mode in {"mode_sma", "sma"}:
26
+ return SimpleMovingAverage
27
+ if mode in {
28
+ "mode_ema",
29
+ "ema",
30
+ "mode_jjma",
31
+ "jjma",
32
+ "mode_jurx",
33
+ "jurx",
34
+ "mode_parma",
35
+ "parma",
36
+ "mode_t3",
37
+ "t3",
38
+ "mode_vidya",
39
+ "vidya",
40
+ "mode_ama",
41
+ "ama",
42
+ }:
43
+ return ExponentialMovingAverage
44
+ if mode in {"mode_smma", "smma"}:
45
+ return SmoothedMovingAverage
46
+ return WeightedMovingAverage
47
+
48
+
49
+ class QQECloudIndicator(Indicator):
50
+ """Indicator computing smoothed QQE-like trend values from RSI.
51
+
52
+ Args:
53
+ rsi_period: RSI lookback period.
54
+ sf: Smoothing factor for XRSI and momentum smoothers.
55
+ darfactor: ATR-like factor used to offset trailing reference.
56
+ xma_method: Moving-average method alias used for RSI smoothing.
57
+ xphase: Unused legacy parameter preserved for compatibility.
58
+ """
59
+
60
+ lines = ("up", "down")
61
+ params = (
62
+ ("rsi_period", 14),
63
+ ("sf", 5),
64
+ ("darfactor", 4.236),
65
+ ("xma_method", "sma"),
66
+ ("xphase", 15),
67
+ )
68
+
69
+ def __init__(self):
70
+ """Initialize RSI, smoothed RSI, and momentum smoothing components."""
71
+ self._rsi = RelativeStrengthIndex(self.data.close, period=max(2, int(self.p.rsi_period)))
72
+ ma_cls = resolve_ma_class(self.p.xma_method)
73
+ self._xrsi = ma_cls(self._rsi, period=max(1, int(self.p.sf)))
74
+ wilders_period = max(2, int(self.p.rsi_period) * 2 - 1)
75
+ self._mom = abs(self._xrsi - self._xrsi(-1))
76
+ self._xmom = ma_cls(self._mom, period=wilders_period)
77
+ self._xxmom = ma_cls(self._xmom, period=wilders_period)
78
+ self.addminperiod(int(self.p.rsi_period) + int(self.p.sf) + wilders_period * 2 + 5)
79
+
80
+ def next(self):
81
+ """Update output lines on each tick using previous envelope state."""
82
+ xrsi = float(self._xrsi[0])
83
+ prev_xrsi = float(self._xrsi[-1])
84
+ dar = float(self._xxmom[0]) * float(self.p.darfactor)
85
+ prev_tr = float(self.lines.down[-1]) if len(self) > 0 else 50.0
86
+ if prev_tr != prev_tr:
87
+ prev_tr = 50.0
88
+ tr = prev_tr
89
+ dv = tr
90
+ if xrsi < tr:
91
+ tr = xrsi + dar
92
+ if prev_xrsi < dv and tr > dv:
93
+ tr = dv
94
+ elif xrsi > tr:
95
+ tr = xrsi - dar
96
+ if prev_xrsi > dv and tr < dv:
97
+ tr = dv
98
+ self.lines.up[0] = xrsi
99
+ self.lines.down[0] = tr
100
+
101
+ def once(self, start, end):
102
+ """Vectorized indicator evaluation for vectorized Backtrader runs."""
103
+ xrsi_array = self._xrsi.array
104
+ xxmom_array = self._xxmom.array
105
+ up_line = self.lines.up.array
106
+ down_line = self.lines.down.array
107
+ for line in (up_line, down_line):
108
+ while len(line) < end:
109
+ line.append(float("nan"))
110
+
111
+ prev_tr = 50.0
112
+ actual_end = min(end, len(xrsi_array), len(xxmom_array))
113
+ for i in range(start, actual_end):
114
+ xrsi = float(xrsi_array[i])
115
+ prev_xrsi = float(xrsi_array[i - 1]) if i > 0 else xrsi
116
+ dar = float(xxmom_array[i]) * float(self.p.darfactor)
117
+ tr = prev_tr
118
+ dv = tr
119
+ if xrsi < tr:
120
+ tr = xrsi + dar
121
+ if prev_xrsi < dv and tr > dv:
122
+ tr = dv
123
+ elif xrsi > tr:
124
+ tr = xrsi - dar
125
+ if prev_xrsi > dv and tr < dv:
126
+ tr = dv
127
+ up_line[i] = xrsi
128
+ down_line[i] = tr
129
+ prev_tr = tr
@@ -0,0 +1,40 @@
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
+ )
12
+
13
+ __all__ = [
14
+ "RaviIndicator",
15
+ ]
16
+
17
+
18
+ class RaviIndicator(Indicator):
19
+ """RAVI oscillator: percentage spread between a fast and slow EMA of close."""
20
+
21
+ lines = ("ravi",)
22
+ params = (
23
+ ("fast_length", 7),
24
+ ("slow_length", 65),
25
+ )
26
+
27
+ def __init__(self):
28
+ """Build the fast/slow EMAs and set the indicator warmup period."""
29
+ self.fast_ma = ExponentialMovingAverage(self.data.close, period=self.p.fast_length)
30
+ self.slow_ma = ExponentialMovingAverage(self.data.close, period=self.p.slow_length)
31
+ self.addminperiod(self.p.slow_length + 3)
32
+
33
+ def next(self):
34
+ """Compute the RAVI value as the percent spread of fast over slow EMA."""
35
+ slow = float(self.slow_ma[0])
36
+ if abs(slow) <= 1e-12:
37
+ value = 0.0
38
+ else:
39
+ value = 100.0 * (float(self.fast_ma[0]) - slow) / slow
40
+ self.lines.ravi[0] = value
@@ -0,0 +1,74 @@
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
+ )
12
+
13
+ __all__ = [
14
+ "RawCloseCloseStochastic",
15
+ "CloseCloseEmaStochastic",
16
+ ]
17
+
18
+
19
+ class RawCloseCloseStochastic(Indicator):
20
+ """Raw close-based Stochastic (%K numerator) over a close-only window."""
21
+
22
+ lines = ("raw",)
23
+ params = (("period", 5),)
24
+
25
+ def __init__(self):
26
+ """Set the minimum period required before emitting values."""
27
+ self.addminperiod(int(self.p.period))
28
+
29
+ def next(self):
30
+ """Compute the raw close-based Stochastic value for the current bar."""
31
+ period = int(self.p.period)
32
+ closes = [float(self.data.close[-i]) for i in range(period)]
33
+ highest = max(closes)
34
+ lowest = min(closes)
35
+ denom = highest - lowest
36
+ if denom == 0:
37
+ self.lines.raw[0] = 0.0
38
+ return
39
+ self.lines.raw[0] = 100.0 * (float(self.data.close[0]) - lowest) / denom
40
+
41
+ def once(self, start, end):
42
+ """Vectorized raw close-based Stochastic over the array index range.
43
+
44
+ Args:
45
+ start: Start index (inclusive) of the range to compute.
46
+ end: End index (exclusive) of the range to compute.
47
+ """
48
+ period = int(self.p.period)
49
+ closes = self.data.close.array
50
+ raw = self.lines.raw.array
51
+ for i in range(start, end):
52
+ window_start = max(0, i - period + 1)
53
+ window = closes[window_start : i + 1]
54
+ highest = max(window)
55
+ lowest = min(window)
56
+ denom = highest - lowest
57
+ raw[i] = 0.0 if denom == 0 else 100.0 * (closes[i] - lowest) / denom
58
+
59
+
60
+ class CloseCloseEmaStochastic(Indicator):
61
+ """EMA-smoothed close-based Stochastic exposing ``percK`` and ``percD``."""
62
+
63
+ lines = ("percK", "percD")
64
+ params = (
65
+ ("period", 5),
66
+ ("slowing", 3),
67
+ ("dperiod", 3),
68
+ )
69
+
70
+ def __init__(self):
71
+ """Build the EMA-smoothed %K and %D lines from the raw Stochastic."""
72
+ raw = RawCloseCloseStochastic(self.data, period=int(self.p.period))
73
+ self.lines.percK = ExponentialMovingAverage(raw, period=int(self.p.slowing))
74
+ self.lines.percD = ExponentialMovingAverage(self.lines.percK, period=int(self.p.dperiod))
@@ -0,0 +1,51 @@
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
+ )
12
+
13
+ __all__ = [
14
+ "RDTrendTriggerIndicator",
15
+ ]
16
+
17
+
18
+ class RDTrendTriggerIndicator(Indicator):
19
+ """Custom indicator that derives normalized range-trend trigger values."""
20
+
21
+ lines = ("value",)
22
+ params = (
23
+ ("regress", 15),
24
+ ("t3_length", 5),
25
+ ("t3_phase", 70),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Initialize helper buffers and required warmup length."""
30
+ self._ema = ExponentialMovingAverage(self.lines.value, period=max(1, int(self.p.t3_length)))
31
+ self.addminperiod(int(self.p.regress) * 2 + int(self.p.t3_length) + 3)
32
+
33
+ def next(self):
34
+ """Compute trend trigger value from rolling high/low comparisons."""
35
+ regress = int(self.p.regress)
36
+ highs_recent = [float(self.data.high[-i]) for i in range(regress)]
37
+ highs_older = [float(self.data.high[-regress - i]) for i in range(regress)]
38
+ lows_recent = [float(self.data.low[-i]) for i in range(regress)]
39
+ lows_older = [float(self.data.low[-regress - i]) for i in range(regress)]
40
+ highest_high_recent = max(highs_recent)
41
+ highest_high_older = max(highs_older)
42
+ lowest_low_recent = min(lows_recent)
43
+ lowest_low_older = min(lows_older)
44
+ buy_power = highest_high_recent - lowest_low_older
45
+ sell_power = highest_high_older - lowest_low_recent
46
+ denom = buy_power + sell_power
47
+ ttf = ((buy_power - sell_power) / (0.5 * denom) * 100.0) if denom else 0.0
48
+ prev = float(self.lines.value[-1]) if len(self) > 0 else ttf
49
+ period = max(1, int(self.p.t3_length))
50
+ alpha = 2.0 / (period + 1.0)
51
+ self.lines.value[0] = alpha * ttf + (1.0 - alpha) * prev
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "RenkoLevel",
14
+ ]
15
+
16
+
17
+ class RenkoLevel(Indicator):
18
+ """Fixed-brick Renko level tracker emitting upper/lower levels and color."""
19
+
20
+ lines = ("upper", "lower", "color_idx")
21
+ params = (
22
+ ("size_of_block", 30),
23
+ ("point_size", 0.01),
24
+ )
25
+
26
+ def __init__(self):
27
+ """Precompute the brick price step and epsilon, set minimum period."""
28
+ self.step_price = self.p.size_of_block * self.p.point_size
29
+ self.eps = self.p.point_size * 0.1
30
+ self.addminperiod(1)
31
+
32
+ def _levels(self, price):
33
+ """Round a price to its enclosing Renko brick levels.
34
+
35
+ Args:
36
+ price: The price to snap to the brick grid.
37
+
38
+ Returns:
39
+ A tuple ``(price_ceil, price_round, price_floor)`` of brick levels.
40
+ """
41
+ step = self.step_price
42
+ price_round = round(price / step) * step
43
+ price_ceil = math.ceil((price_round + step / 2.0) / step) * step
44
+ price_floor = math.floor((price_round - step / 2.0) / step) * step
45
+ return price_ceil, price_round, price_floor
46
+
47
+ def next(self):
48
+ """Advance the Renko brick levels for the current bar's close."""
49
+ close_price = float(self.data.close[0])
50
+ if (
51
+ len(self) == 1
52
+ or not math.isfinite(float(self.lines.upper[-1]))
53
+ or not math.isfinite(float(self.lines.lower[-1]))
54
+ ):
55
+ price_ceil, price_round, price_floor = self._levels(close_price)
56
+ self.lines.upper[0] = price_round
57
+ self.lines.lower[0] = price_floor
58
+ self.lines.color_idx[0] = 0.0
59
+ return
60
+ prev_up = float(self.lines.upper[-1])
61
+ prev_down = float(self.lines.lower[-1])
62
+ prev_color = (
63
+ float(self.lines.color_idx[-1])
64
+ if math.isfinite(float(self.lines.color_idx[-1]))
65
+ else 0.0
66
+ )
67
+ price_ceil, price_round, price_floor = self._levels(close_price)
68
+ upper = prev_up
69
+ lower = prev_down
70
+ color = prev_color
71
+ if prev_down <= close_price <= prev_up:
72
+ pass
73
+ elif close_price < prev_down:
74
+ if abs(price_round - prev_down) > self.eps:
75
+ upper = price_ceil
76
+ lower = price_round
77
+ color = 1.0
78
+ elif close_price > prev_up:
79
+ if abs(price_round - prev_up) > self.eps:
80
+ lower = price_floor
81
+ upper = price_round
82
+ color = 0.0
83
+ self.lines.upper[0] = upper
84
+ self.lines.lower[0] = lower
85
+ self.lines.color_idx[0] = color
@@ -0,0 +1,91 @@
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
+ "RenkoLineBreak",
12
+ ]
13
+
14
+
15
+ class RenkoLineBreak(Indicator):
16
+ """Indicator that models renko-like box transitions."""
17
+
18
+ lines = ("upper", "lower", "boxes")
19
+ params = (
20
+ ("min_box_size", 500),
21
+ ("point", 0.01),
22
+ )
23
+
24
+ def __init__(self):
25
+ """Initialize box size and state."""
26
+ box_size = float(self.p.min_box_size)
27
+ if box_size < 0:
28
+ box_size = 300.0
29
+ self._box_size = box_size * float(self.p.point)
30
+ self._seed_close = None
31
+ self._initialized = False
32
+ self._up = False
33
+ self.addminperiod(1)
34
+
35
+ def next(self):
36
+ """Update Renko upper/lower/box count states each bar."""
37
+ price = float(self.data.close[0])
38
+
39
+ if self._seed_close is None:
40
+ self._seed_close = price
41
+ self.lines.upper[0] = 0.0
42
+ self.lines.lower[0] = 0.0
43
+ self.lines.boxes[0] = 0.0
44
+ return
45
+
46
+ if not self._initialized:
47
+ if abs(price - self._seed_close) < self._box_size:
48
+ self.lines.upper[0] = 0.0
49
+ self.lines.lower[0] = 0.0
50
+ self.lines.boxes[0] = 0.0
51
+ return
52
+ if price > self._seed_close:
53
+ self.lines.upper[0] = price
54
+ self.lines.lower[0] = self._seed_close
55
+ self.lines.boxes[0] = 1.0
56
+ self._up = True
57
+ else:
58
+ self.lines.upper[0] = self._seed_close
59
+ self.lines.lower[0] = price
60
+ self.lines.boxes[0] = -1.0
61
+ self._up = False
62
+ self._initialized = True
63
+ return
64
+
65
+ prev_up = float(self.lines.upper[-1])
66
+ prev_dn = float(self.lines.lower[-1])
67
+ prev_boxes = float(self.lines.boxes[-1])
68
+
69
+ if price >= prev_up + self._box_size:
70
+ self.lines.upper[0] = price
71
+ self.lines.lower[0] = prev_up
72
+ if self._up:
73
+ self.lines.boxes[0] = prev_boxes + 1.0
74
+ else:
75
+ self._up = True
76
+ self.lines.boxes[0] = 1.0
77
+ return
78
+
79
+ if price <= prev_dn - self._box_size:
80
+ self.lines.upper[0] = prev_dn
81
+ self.lines.lower[0] = price
82
+ if self._up:
83
+ self._up = False
84
+ self.lines.boxes[0] = -1.0
85
+ else:
86
+ self.lines.boxes[0] = prev_boxes - 1.0
87
+ return
88
+
89
+ self.lines.upper[0] = prev_up
90
+ self.lines.lower[0] = prev_dn
91
+ self.lines.boxes[0] = prev_boxes
@@ -0,0 +1,41 @@
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
+ "RFTLIndicator",
12
+ ]
13
+
14
+
15
+ RFTL_WEIGHTS = [
16
+ -0.0025097319,
17
+ 0.0513007762,
18
+ 0.1142800493,
19
+ 0.1699342860,
20
+ 0.2025269304,
21
+ 0.2025269304,
22
+ 0.1699342860,
23
+ 0.1142800493,
24
+ 0.0513007762,
25
+ -0.0025097319,
26
+ ]
27
+
28
+
29
+ class RFTLIndicator(Indicator):
30
+ """Indicator that computes a weighted RFTL value from weighted close history."""
31
+
32
+ lines = ("rftl",)
33
+ params = (("weights", tuple(RFTL_WEIGHTS)),)
34
+
35
+ def __init__(self):
36
+ """Build the RFTL weighted sum and enforce warmup period."""
37
+ total = 0.0
38
+ for idx, weight in enumerate(self.p.weights):
39
+ total += float(weight) * self.data.close(-idx)
40
+ self.lines.rftl = total
41
+ self.addminperiod(len(self.p.weights) + 1)