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,57 @@
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
+ "Mt5StochasticCloseClose",
12
+ ]
13
+
14
+
15
+ class Mt5StochasticCloseClose(Indicator):
16
+ """Close-close based Smoothed Stochastic oscillator implementation."""
17
+
18
+ lines = ("main", "signal")
19
+ params = (
20
+ ("k_period", 5),
21
+ ("d_period", 3),
22
+ ("slowing", 3),
23
+ )
24
+
25
+ def __init__(self):
26
+ """Set calculation parameters and initial EMA-smoothed state."""
27
+ self.addminperiod(self.p.k_period + max(self.p.d_period, self.p.slowing) + 2)
28
+ self._slow_prev = None
29
+ self._signal_prev = None
30
+ self._alpha_slow = 2.0 / (self.p.slowing + 1.0)
31
+ self._alpha_signal = 2.0 / (self.p.d_period + 1.0)
32
+
33
+ def next(self):
34
+ """Compute smoothed %K/%D and emit current oscillator lines."""
35
+ closes = [float(self.data.close[-i]) for i in range(self.p.k_period)]
36
+ highest_close = max(closes)
37
+ lowest_close = min(closes)
38
+ close0 = float(self.data.close[0])
39
+ if highest_close == lowest_close:
40
+ raw_k = 0.0
41
+ else:
42
+ raw_k = 100.0 * (close0 - lowest_close) / (highest_close - lowest_close)
43
+
44
+ if self._slow_prev is None:
45
+ slow_val = raw_k
46
+ else:
47
+ slow_val = self._slow_prev + self._alpha_slow * (raw_k - self._slow_prev)
48
+
49
+ if self._signal_prev is None:
50
+ signal_val = slow_val
51
+ else:
52
+ signal_val = self._signal_prev + self._alpha_signal * (slow_val - self._signal_prev)
53
+
54
+ self.lines.main[0] = slow_val
55
+ self.lines.signal[0] = signal_val
56
+ self._slow_prev = slow_val
57
+ self._signal_prev = signal_val
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import (
11
+ ExponentialMovingAverage,
12
+ Indicator,
13
+ SimpleMovingAverage,
14
+ )
15
+
16
+ __all__ = [
17
+ "MUVNorDiffCloudIndicator",
18
+ ]
19
+
20
+
21
+ class MUVNorDiffCloudIndicator(Indicator):
22
+ """Calculate normalized DIFF cloud signals used by the strategy."""
23
+
24
+ lines = ("buy", "sell", "sma_res", "ema_res")
25
+ params = (
26
+ ("ma_period", 14),
27
+ ("momentum", 1),
28
+ ("kperiod", 14),
29
+ )
30
+
31
+ def __init__(self):
32
+ """Initialize SMA/EMA buffers and minimum bars required for reliable signals."""
33
+ price = self.data.close
34
+ self._sma = SimpleMovingAverage(price, period=max(1, int(self.p.ma_period)))
35
+ self._ema = ExponentialMovingAverage(price, period=max(1, int(self.p.ma_period)))
36
+ self.addminperiod(int(self.p.ma_period) + int(self.p.momentum) + int(self.p.kperiod) + 5)
37
+
38
+ def next(self):
39
+ """Compute cloud values for the current bar."""
40
+ momentum = max(1, int(self.p.momentum))
41
+ kperiod = max(2, int(self.p.kperiod))
42
+ sma_vals = []
43
+ ema_vals = []
44
+ for i in range(kperiod):
45
+ sma_vals.append(float(self._sma[-i]) - float(self._sma[-i - momentum]))
46
+ ema_vals.append(float(self._ema[-i]) - float(self._ema[-i - momentum]))
47
+ sma_cur = sma_vals[0]
48
+ ema_cur = ema_vals[0]
49
+ sma_max = max(sma_vals)
50
+ sma_min = min(sma_vals)
51
+ ema_max = max(ema_vals)
52
+ ema_min = min(ema_vals)
53
+ sma_range = sma_max - sma_min
54
+ ema_range = ema_max - ema_min
55
+ sma_res = 100.0 - 200.0 * (sma_max - sma_cur) / sma_range if sma_range > 0 else 100.0
56
+ ema_res = 100.0 - 200.0 * (ema_max - ema_cur) / ema_range if ema_range > 0 else 100.0
57
+ self.lines.sma_res[0] = sma_res
58
+ self.lines.ema_res[0] = ema_res
59
+ self.lines.buy[0] = 100.0 if sma_res == 100.0 or ema_res == 100.0 else 0.0
60
+ self.lines.sell[0] = -100.0 if sma_res == -100.0 or ema_res == -100.0 else 0.0
61
+
62
+ def once(self, start, end):
63
+ """Compute cloud values for a pre-allocated bar range in vectorized mode."""
64
+ momentum = max(1, int(self.p.momentum))
65
+ kperiod = max(2, int(self.p.kperiod))
66
+ sma = self._sma.array
67
+ ema = self._ema.array
68
+ buy = self.lines.buy.array
69
+ sell = self.lines.sell.array
70
+ sma_res_line = self.lines.sma_res.array
71
+ ema_res_line = self.lines.ema_res.array
72
+
73
+ for i in range(start, end):
74
+ sma_vals = []
75
+ ema_vals = []
76
+ for j in range(kperiod):
77
+ idx = i - j
78
+ prev = idx - momentum
79
+ if prev < 0:
80
+ continue
81
+ sma_delta = float(sma[idx]) - float(sma[prev])
82
+ ema_delta = float(ema[idx]) - float(ema[prev])
83
+ if math.isfinite(sma_delta):
84
+ sma_vals.append(sma_delta)
85
+ if math.isfinite(ema_delta):
86
+ ema_vals.append(ema_delta)
87
+ if not sma_vals or not ema_vals:
88
+ sma_res = ema_res = 0.0
89
+ else:
90
+ sma_cur = sma_vals[0]
91
+ ema_cur = ema_vals[0]
92
+ sma_max = max(sma_vals)
93
+ sma_min = min(sma_vals)
94
+ ema_max = max(ema_vals)
95
+ ema_min = min(ema_vals)
96
+ sma_range = sma_max - sma_min
97
+ ema_range = ema_max - ema_min
98
+ sma_res = (
99
+ 100.0 - 200.0 * (sma_max - sma_cur) / sma_range if sma_range > 0 else 100.0
100
+ )
101
+ ema_res = (
102
+ 100.0 - 200.0 * (ema_max - ema_cur) / ema_range if ema_range > 0 else 100.0
103
+ )
104
+ sma_res_line[i] = sma_res
105
+ ema_res_line[i] = ema_res
106
+ buy[i] = 100.0 if sma_res == 100.0 or ema_res == 100.0 else 0.0
107
+ sell[i] = -100.0 if sma_res == -100.0 or ema_res == -100.0 else 0.0
@@ -0,0 +1,124 @@
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
+ "NonLagDotIndicator",
14
+ ]
15
+
16
+
17
+ PI = math.pi
18
+
19
+
20
+ class NonLagDotIndicator(Indicator):
21
+ """Reconstructs NonLagDot from its MQ5 source.
22
+
23
+ Applies a weighted cosine kernel over SMA values to produce a non-lag MA,
24
+ then assigns color: 0=gray, 1=magenta(down), 2=green(up).
25
+ """
26
+
27
+ lines = ("nlm", "color")
28
+ params = (
29
+ ("length", 10),
30
+ ("filter_pts", 0),
31
+ ("deviation", 0.0),
32
+ ("point", 0.0001),
33
+ )
34
+
35
+ def __init__(self):
36
+ """Pre-compute kernel parameters and allocate indicator state."""
37
+ self._length = int(self.p.length)
38
+ coeff = 3 * PI
39
+ phase = self._length - 1
40
+ cycle = 4
41
+ self._len_total = int(self._length * cycle + phase)
42
+ self._dT1 = (2 * cycle - 1) / (cycle * self._length - 1)
43
+ self._dT2 = 1.0 / (phase - 1) if phase > 1 else 1.0
44
+ self._kd = 1.0 + self.p.deviation / 100.0
45
+ self._fi = int(self.p.filter_pts) * float(self.p.point)
46
+ self._coeff = coeff
47
+ self._phase = phase
48
+ self._cycle = cycle
49
+ self._trend = 0
50
+ self.addminperiod(self._length + self._len_total + 2)
51
+
52
+ def _calc_sma(self, ago):
53
+ length = self._length
54
+ total = 0.0
55
+ for i in range(length):
56
+ total += float(self.data.close[-(ago + i)])
57
+ return total / length
58
+
59
+ def next(self):
60
+ """Compute smoothed value and trend color for current bar.
61
+
62
+ The method calculates weighted SMA contributions, applies optional filtering,
63
+ and updates `nlm` and `color` lines.
64
+ """
65
+ len_total = self._len_total
66
+ coeff = self._coeff
67
+ phase = self._phase
68
+ fi = self._fi
69
+
70
+ # Build weighted sum using cosine kernel over SMA values
71
+ total_sum = 0.0
72
+ total_weight = 0.0
73
+ t = 0.0
74
+
75
+ for i in range(int(len_total)):
76
+ # SMA at offset i (0 = current bar)
77
+ sma_val = self._calc_sma(i)
78
+ if i <= phase - 1:
79
+ alfa = 1.0
80
+ else:
81
+ alfa = 1.0 / (1.0 + math.exp((i - phase + 0.5) * coeff / len_total))
82
+
83
+ beta = math.cos(PI * t)
84
+ g = 1.0 / (coeff * t + 1.0)
85
+ if t <= 0.5:
86
+ g = 1.0
87
+
88
+ total_sum += sma_val * beta * g * alfa
89
+ total_weight += beta * g * alfa
90
+
91
+ if t < 0.5:
92
+ t += self._dT2
93
+ elif t < len_total - 1:
94
+ t += self._dT1
95
+
96
+ nlm_val = self._kd * total_sum / total_weight if total_weight > 0 else 0.0
97
+
98
+ # Filter: if change < fi, hold previous value
99
+ prev_nlm = (
100
+ float(self.lines.nlm[-1])
101
+ if len(self.lines.nlm) > 1 and not math.isnan(float(self.lines.nlm[-1]))
102
+ else nlm_val
103
+ )
104
+ if fi > 0 and abs(nlm_val - prev_nlm) < fi:
105
+ nlm_val = prev_nlm
106
+
107
+ self.lines.nlm[0] = nlm_val
108
+
109
+ # Trend detection
110
+ trend = self._trend
111
+ if nlm_val - prev_nlm > fi:
112
+ trend = 1 # up
113
+ if prev_nlm - nlm_val > fi:
114
+ trend = -1 # down
115
+
116
+ # Color: 0=gray, 1=magenta(down), 2=green(up)
117
+ color = 0.0
118
+ if trend > 0:
119
+ color = 2.0
120
+ if trend < 0:
121
+ color = 1.0
122
+
123
+ self.lines.color[0] = color
124
+ self._trend = trend
@@ -0,0 +1,95 @@
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
+ "NRTRExtrIndicator",
12
+ ]
13
+
14
+
15
+ class NRTRExtrIndicator(Indicator):
16
+ """Reconstructs NRTR_extr indicator from its MQ5 source.
17
+
18
+ Same as NRTR but uses high/low extremes instead of close for price tracking.
19
+ In uptrend: price = max(price, high[bar]); check close < value.
20
+ In downtrend: price = min(price, low[bar]); check close > value.
21
+ On flip up: price = low[bar], value = price*(1-dK).
22
+ On flip down: price = high[bar], value = price*(1+dK).
23
+ """
24
+
25
+ lines = ("trend_up", "trend_down", "sign_up", "sign_down")
26
+ params = (
27
+ ("iperiod", 10),
28
+ ("idig", 0),
29
+ )
30
+
31
+ def __init__(self):
32
+ """Initialize internal NRTR state and warm-up period."""
33
+ self._period = int(self.p.iperiod)
34
+ self._idig = int(self.p.idig)
35
+ self._trend = 0
36
+ self._trend_prev = 0
37
+ self._price = 0.0
38
+ self._value = 0.0
39
+ self._first = True
40
+ self.addminperiod(self._period + 2)
41
+
42
+ def next(self):
43
+ """Update trend state, channel values, and signal lines."""
44
+ period = self._period
45
+
46
+ if self._first:
47
+ self._trend_prev = 0
48
+ self._price = float(self.data.close[0])
49
+ self._value = self._price
50
+ self._first = False
51
+
52
+ self._trend = self._trend_prev
53
+ price = self._price
54
+ value = self._value
55
+
56
+ avg_range = 0.0
57
+ for i in range(period):
58
+ avg_range += abs(float(self.data.high[-i]) - float(self.data.low[-i]))
59
+ avg_range /= period
60
+
61
+ digits_diff = 5 - self._idig
62
+ dK = avg_range / pow(10, digits_diff) if pow(10, digits_diff) != 0 else avg_range
63
+
64
+ cur_close = float(self.data.close[0])
65
+ cur_high = float(self.data.high[0])
66
+ cur_low = float(self.data.low[0])
67
+
68
+ if self._trend >= 0:
69
+ price = max(price, cur_high) # uses high instead of close
70
+ value = max(value, price * (1.0 - dK))
71
+ if cur_close < value:
72
+ price = cur_high # uses high
73
+ value = price * (1.0 + dK)
74
+ self._trend = -1
75
+ elif self._trend <= 0:
76
+ price = min(price, cur_low) # uses low instead of close
77
+ value = min(value, price * (1.0 + dK))
78
+ if cur_close > value:
79
+ price = cur_low # uses low
80
+ value = price * (1.0 - dK)
81
+ self._trend = 1
82
+
83
+ tu = value if self._trend > 0 else 0.0
84
+ td = value if self._trend < 0 else 0.0
85
+ su = tu if self._trend_prev < 0 and self._trend > 0 else 0.0
86
+ sd = td if self._trend_prev > 0 and self._trend < 0 else 0.0
87
+
88
+ self._trend_prev = self._trend
89
+ self._price = price
90
+ self._value = value
91
+
92
+ self.lines.trend_up[0] = tu
93
+ self.lines.trend_down[0] = td
94
+ self.lines.sign_up[0] = su
95
+ self.lines.sign_down[0] = sd
@@ -0,0 +1,95 @@
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
+ "NRTRIndicator",
12
+ ]
13
+
14
+
15
+ class NRTRIndicator(Indicator):
16
+ """Reconstructs NRTR indicator from its MQ5 source.
17
+
18
+ Uses iPeriod average range to compute dK scaling factor.
19
+ Tracks price (close-based) and value with trend ratchet.
20
+ When close drops below value in uptrend → flip to downtrend.
21
+ When close rises above value in downtrend → flip to uptrend.
22
+ 4 buffers: TrendUp(0), TrendDown(1), SignUp(2), SignDown(3).
23
+ """
24
+
25
+ lines = ("trend_up", "trend_down", "sign_up", "sign_down")
26
+ params = (
27
+ ("iperiod", 10),
28
+ ("idig", 0),
29
+ )
30
+
31
+ def __init__(self):
32
+ """Initialize the NRTR period, trend state and trailing value buffers."""
33
+ self._period = int(self.p.iperiod)
34
+ self._idig = int(self.p.idig)
35
+ self._trend = 0
36
+ self._trend_prev = 0
37
+ self._price = 0.0
38
+ self._value = 0.0
39
+ self._first = True
40
+ self.addminperiod(self._period + 2)
41
+
42
+ def next(self):
43
+ """Update the trailing value, detect trend flips, and emit buffers."""
44
+ period = self._period
45
+
46
+ if self._first:
47
+ self._trend_prev = 0
48
+ self._price = float(self.data.close[0])
49
+ self._value = self._price
50
+ self._first = False
51
+
52
+ self._trend = self._trend_prev
53
+ price = self._price
54
+ value = self._value
55
+
56
+ # Average range
57
+ avg_range = 0.0
58
+ for i in range(period):
59
+ avg_range += abs(float(self.data.high[-i]) - float(self.data.low[-i]))
60
+ avg_range /= period
61
+
62
+ # dK scaling (original uses EURUSD digits but we simplify)
63
+ digits_diff = 5 - self._idig # approximate
64
+ dK = avg_range / pow(10, digits_diff) if pow(10, digits_diff) != 0 else avg_range
65
+
66
+ cur_close = float(self.data.close[0])
67
+
68
+ if self._trend >= 0:
69
+ price = max(price, cur_close)
70
+ value = max(value, price * (1.0 - dK))
71
+ if cur_close < value:
72
+ price = cur_close
73
+ value = price * (1.0 + dK)
74
+ self._trend = -1
75
+ elif self._trend <= 0:
76
+ price = min(price, cur_close)
77
+ value = min(value, price * (1.0 + dK))
78
+ if cur_close > value:
79
+ price = cur_close
80
+ value = price * (1.0 - dK)
81
+ self._trend = 1
82
+
83
+ tu = value if self._trend > 0 else 0.0
84
+ td = value if self._trend < 0 else 0.0
85
+ su = tu if self._trend_prev < 0 and self._trend > 0 else 0.0
86
+ sd = td if self._trend_prev > 0 and self._trend < 0 else 0.0
87
+
88
+ self._trend_prev = self._trend
89
+ self._price = price
90
+ self._value = value
91
+
92
+ self.lines.trend_up[0] = tu
93
+ self.lines.trend_down[0] = td
94
+ self.lines.sign_up[0] = su
95
+ self.lines.sign_down[0] = sd
@@ -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 Indicator
9
+
10
+ __all__ = [
11
+ "PChannelSystem",
12
+ ]
13
+
14
+
15
+ class PChannelSystem(Indicator):
16
+ """Indicator that classifies current bar position versus rolling channel bounds."""
17
+
18
+ lines = ("color",)
19
+ params = (
20
+ ("period", 20),
21
+ ("shift", 2),
22
+ )
23
+
24
+ def __init__(self):
25
+ """Initialize warmup requirements for the configured rolling period."""
26
+ self.addminperiod(int(self.p.period) + int(self.p.shift) + 3)
27
+
28
+ def next(self):
29
+ """Compute channel colors from rolling high/low and current candle body."""
30
+ shift = int(self.p.shift)
31
+ hh = max(float(self.data.high[-(shift + i)]) for i in range(int(self.p.period)))
32
+ ll = min(float(self.data.low[-(shift + i)]) for i in range(int(self.p.period)))
33
+ close = float(self.data.close[0])
34
+ open_ = float(self.data.open[0])
35
+ color = 2.0
36
+ if close > hh:
37
+ color = 4.0 if open_ <= close else 3.0
38
+ if close < ll:
39
+ color = 0.0 if open_ > close else 1.0
40
+ self.lines.color[0] = color
@@ -0,0 +1,37 @@
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
+ Indicator,
10
+ SimpleMovingAverage,
11
+ )
12
+
13
+ __all__ = [
14
+ "PercentEnvelope",
15
+ ]
16
+
17
+
18
+ class PercentEnvelope(Indicator):
19
+ """Percent envelope built from a moving-average midpoint."""
20
+
21
+ lines = ("top", "bot")
22
+ params = (
23
+ ("period", 14),
24
+ ("perc", 1.0),
25
+ )
26
+
27
+ def __init__(self):
28
+ """Initialize MA and enforce minimum lookback warm-up."""
29
+ self.ma = SimpleMovingAverage(self.data, period=int(self.p.period))
30
+ self.addminperiod(int(self.p.period))
31
+
32
+ def next(self):
33
+ """Update upper/lower envelope boundaries for the current bar."""
34
+ offset = float(self.p.perc) / 100.0
35
+ ma = float(self.ma[0])
36
+ self.lines.top[0] = ma * (1.0 + offset)
37
+ self.lines.bot[0] = ma * (1.0 - offset)
@@ -0,0 +1,47 @@
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
+ "PercentageCrossoverChannel",
12
+ ]
13
+
14
+
15
+ class PercentageCrossoverChannel(Indicator):
16
+ """Percent-based dynamic channel indicator.
17
+
18
+ The middle line is gradually adjusted toward current price with separate
19
+ upper/lower bands derived from the configured percentage distance.
20
+ """
21
+
22
+ lines = ("upper", "middle", "lower")
23
+ params = (("percent", 50.0),)
24
+
25
+ def __init__(self):
26
+ """Initialize percent offsets and minimum warm-up settings."""
27
+ self.addminperiod(2)
28
+ percent = max(self.p.percent, 0.001) / 100.0
29
+ self.plus_value = 1 + percent / 100.0
30
+ self.minus_value = 1 - percent / 100.0
31
+
32
+ def next(self):
33
+ """Update middle, upper, and lower channel lines for the current bar."""
34
+ price = float(self.data.close[0])
35
+ if len(self.data) == 1 or self.lines.middle[-1] != self.lines.middle[-1]:
36
+ middle = price
37
+ else:
38
+ prev_middle = float(self.lines.middle[-1])
39
+ if price * self.minus_value > prev_middle:
40
+ middle = price * self.minus_value
41
+ elif price * self.plus_value < prev_middle:
42
+ middle = price * self.plus_value
43
+ else:
44
+ middle = prev_middle
45
+ self.lines.middle[0] = middle
46
+ self.lines.upper[0] = middle * self.plus_value
47
+ self.lines.lower[0] = middle * self.minus_value
@@ -0,0 +1,47 @@
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
+ "PivotZigZagProxy",
12
+ ]
13
+
14
+
15
+ class PivotZigZagProxy(Indicator):
16
+ """Compact pivot and zigzag proxy indicator used by the strategy.
17
+
18
+ It tracks the nearest recent high/low pivot pairs over a configurable depth
19
+ and emits them as four separate output lines.
20
+ """
21
+
22
+ lines = ("high0", "low0", "high1", "low1")
23
+ params = (("depth", 12),)
24
+
25
+ def __init__(self):
26
+ """Initialize minimum required bars for pivot calculation."""
27
+ self.addminperiod(self.p.depth * 3)
28
+
29
+ def next(self):
30
+ """Compute and expose the most recent two high and two low pivot levels."""
31
+ pivots = []
32
+ lookback = min(len(self.data) - 1, self.p.depth * 8)
33
+ for idx in range(2, lookback):
34
+ high = float(self.data.high[-idx])
35
+ low = float(self.data.low[-idx])
36
+ if high >= float(self.data.high[-idx - 1]) and high >= float(self.data.high[-idx + 1]):
37
+ pivots.append(("high", high, idx))
38
+ if low <= float(self.data.low[-idx - 1]) and low <= float(self.data.low[-idx + 1]):
39
+ pivots.append(("low", low, idx))
40
+ pivots.sort(key=lambda item: item[2])
41
+ pivots = pivots[:4]
42
+ highs = [value for kind, value, _ in pivots if kind == "high"]
43
+ lows = [value for kind, value, _ in pivots if kind == "low"]
44
+ self.lines.high0[0] = highs[0] if len(highs) > 0 else 0.0
45
+ self.lines.high1[0] = highs[1] if len(highs) > 1 else 0.0
46
+ self.lines.low0[0] = lows[0] if len(lows) > 0 else 0.0
47
+ self.lines.low1[0] = lows[1] if len(lows) > 1 else 0.0