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,53 @@
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
+ EMA,
10
+ SMA,
11
+ Indicator,
12
+ SmoothedMovingAverage,
13
+ WeightedMovingAverage,
14
+ )
15
+
16
+ __all__ = [
17
+ "ColorJVariationIndicator",
18
+ ]
19
+
20
+
21
+ def resolve_ma_class(name):
22
+ """Resolve a moving-average name to Backtrader MA class."""
23
+ mode = str(name).lower()
24
+ if mode in {"sma", "mode_sma"}:
25
+ return SMA
26
+ if mode in {"ema", "mode_ema"}:
27
+ return EMA
28
+ if mode in {"smma", "mode_smma"}:
29
+ return SmoothedMovingAverage
30
+ return WeightedMovingAverage
31
+
32
+
33
+ class ColorJVariationIndicator(Indicator):
34
+ """Indicator deriving a custom color variation series from MA residuals."""
35
+
36
+ lines = ("value",)
37
+ params = (
38
+ ("period_", 12),
39
+ ("ma_method_", "sma"),
40
+ ("jlength_", 3),
41
+ ("jphase_", 100),
42
+ )
43
+
44
+ def __init__(self):
45
+ """Build nested moving averages and assign EMA-smoothed output line."""
46
+ ma_cls = resolve_ma_class(self.p.ma_method_)
47
+ ma1 = ma_cls(self.data.close, period=self.p.period_)
48
+ residual1 = self.data.close - ma1
49
+ ma2 = ma_cls(residual1, period=self.p.period_)
50
+ residual2 = self.data.close - ma1 - ma2
51
+ ma3 = ma_cls(residual2, period=self.p.period_)
52
+ self.lines.value = EMA(ma3, period=max(1, int(self.p.jlength_)))
53
+ self.addminperiod(self.p.period_ * 3 + self.p.jlength_ + 5)
@@ -0,0 +1,78 @@
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
+ DeMarkerIndicator,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "ColorMetroDeMarkerIndicator",
15
+ ]
16
+
17
+
18
+ class ColorMetroDeMarkerIndicator(Indicator):
19
+ """Colour Metro DeMarker indicator: derives fast/slow adaptive trend lines from the DeM oscillator."""
20
+
21
+ lines = ("fast_line", "slow_line", "demarker")
22
+ params = (
23
+ ("period_demarker", 7),
24
+ ("step_size_fast", 5),
25
+ ("step_size_slow", 15),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Initialize DeMarker instance, set minperiod, reset channel tracking vars."""
30
+ self.dem = DeMarkerIndicator(self.data, period=int(self.p.period_demarker))
31
+ self.addminperiod(int(self.p.period_demarker) + 3)
32
+ self._fmin1 = 999999.0
33
+ self._fmax1 = -999999.0
34
+ self._smin1 = 999999.0
35
+ self._smax1 = -999999.0
36
+ self._ftrend = 0
37
+ self._strend = 0
38
+
39
+ def next(self):
40
+ """Compute fast_line, slow_line and demarker from DeM value using step-based channel logic."""
41
+ dem0 = float(self.dem[0]) * 100.0
42
+ fmax0 = dem0 + 2.0 * float(self.p.step_size_fast)
43
+ fmin0 = dem0 - 2.0 * float(self.p.step_size_fast)
44
+ if dem0 > self._fmax1:
45
+ self._ftrend = 1
46
+ if dem0 < self._fmin1:
47
+ self._ftrend = -1
48
+ if self._ftrend > 0 and fmin0 < self._fmin1:
49
+ fmin0 = self._fmin1
50
+ if self._ftrend < 0 and fmax0 > self._fmax1:
51
+ fmax0 = self._fmax1
52
+ smax0 = dem0 + 2.0 * float(self.p.step_size_slow)
53
+ smin0 = dem0 - 2.0 * float(self.p.step_size_slow)
54
+ if dem0 > self._smax1:
55
+ self._strend = 1
56
+ if dem0 < self._smin1:
57
+ self._strend = -1
58
+ if self._strend > 0 and smin0 < self._smin1:
59
+ smin0 = self._smin1
60
+ if self._strend < 0 and smax0 > self._smax1:
61
+ smax0 = self._smax1
62
+ fast_line = (
63
+ fmin0 + float(self.p.step_size_fast)
64
+ if self._ftrend > 0
65
+ else fmax0 - float(self.p.step_size_fast)
66
+ )
67
+ slow_line = (
68
+ smin0 + float(self.p.step_size_slow)
69
+ if self._strend > 0
70
+ else smax0 - float(self.p.step_size_slow)
71
+ )
72
+ self.lines.fast_line[0] = fast_line
73
+ self.lines.slow_line[0] = slow_line
74
+ self.lines.demarker[0] = dem0
75
+ self._fmin1 = fmin0
76
+ self._fmax1 = fmax0
77
+ self._smin1 = smin0
78
+ self._smax1 = smax0
@@ -0,0 +1,93 @@
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
+ SimpleMovingAverage,
12
+ Stochastic,
13
+ )
14
+
15
+ __all__ = [
16
+ "ColorMetroStochasticIndicator",
17
+ ]
18
+
19
+
20
+ class ColorMetroStochasticIndicator(Indicator):
21
+ """Indicator producing adaptive fast/slow ColorMETRO stochastic levels."""
22
+
23
+ lines = ("fast_line", "slow_line", "stochastic")
24
+ params = (
25
+ ("k_period", 5),
26
+ ("d_period", 3),
27
+ ("slowing", 3),
28
+ ("ma_method", "simple"),
29
+ ("step_size_fast", 5),
30
+ ("step_size_slow", 15),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Initialize Stochastic source and internal trend tracking state."""
35
+ self.stoch = Stochastic(
36
+ self.data,
37
+ period=int(self.p.k_period),
38
+ period_dfast=int(self.p.slowing),
39
+ period_dslow=int(self.p.d_period),
40
+ movav=(
41
+ SimpleMovingAverage
42
+ if str(self.p.ma_method).lower() == "simple"
43
+ else ExponentialMovingAverage
44
+ ),
45
+ )
46
+ self.addminperiod(int(self.p.k_period) + int(self.p.d_period) + int(self.p.slowing) + 3)
47
+ self._fmin1 = 999999.0
48
+ self._fmax1 = -999999.0
49
+ self._smin1 = 999999.0
50
+ self._smax1 = -999999.0
51
+ self._ftrend = 0
52
+ self._strend = 0
53
+
54
+ def next(self):
55
+ """Update fast/slow adaptive lines and push current values."""
56
+ stoch0 = float(self.stoch.percD[0])
57
+ fmax0 = stoch0 + 2.0 * float(self.p.step_size_fast)
58
+ fmin0 = stoch0 - 2.0 * float(self.p.step_size_fast)
59
+ if stoch0 > self._fmax1:
60
+ self._ftrend = 1
61
+ if stoch0 < self._fmin1:
62
+ self._ftrend = -1
63
+ if self._ftrend > 0 and fmin0 < self._fmin1:
64
+ fmin0 = self._fmin1
65
+ if self._ftrend < 0 and fmax0 > self._fmax1:
66
+ fmax0 = self._fmax1
67
+ smax0 = stoch0 + 2.0 * float(self.p.step_size_slow)
68
+ smin0 = stoch0 - 2.0 * float(self.p.step_size_slow)
69
+ if stoch0 > self._smax1:
70
+ self._strend = 1
71
+ if stoch0 < self._smin1:
72
+ self._strend = -1
73
+ if self._strend > 0 and smin0 < self._smin1:
74
+ smin0 = self._smin1
75
+ if self._strend < 0 and smax0 > self._smax1:
76
+ smax0 = self._smax1
77
+ fast_line = (
78
+ fmin0 + float(self.p.step_size_fast)
79
+ if self._ftrend > 0
80
+ else fmax0 - float(self.p.step_size_fast)
81
+ )
82
+ slow_line = (
83
+ smin0 + float(self.p.step_size_slow)
84
+ if self._strend > 0
85
+ else smax0 - float(self.p.step_size_slow)
86
+ )
87
+ self.lines.fast_line[0] = fast_line
88
+ self.lines.slow_line[0] = slow_line
89
+ self.lines.stochastic[0] = stoch0
90
+ self._fmin1 = fmin0
91
+ self._fmax1 = fmax0
92
+ self._smin1 = smin0
93
+ self._smax1 = smax0
@@ -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
+ from .. import (
9
+ Highest,
10
+ Indicator,
11
+ Lowest,
12
+ )
13
+
14
+ __all__ = [
15
+ "ColorMetroWprIndicator",
16
+ ]
17
+
18
+
19
+ class ColorMetroWprIndicator(Indicator):
20
+ """ColorMETRO step lines (fast/slow NRTR) computed over Williams %R."""
21
+
22
+ lines = ("fast_line", "slow_line", "wpr_shifted")
23
+ params = (
24
+ ("period_wpr", 7),
25
+ ("step_size_fast", 5),
26
+ ("step_size_slow", 15),
27
+ )
28
+
29
+ def __init__(self):
30
+ """Build the Highest/Lowest sub-indicators and reset NRTR step state."""
31
+ period = int(self.p.period_wpr)
32
+ self.highest = Highest(self.data.high, period=period)
33
+ self.lowest = Lowest(self.data.low, period=period)
34
+ self.addminperiod(period + 3)
35
+ self._fmin1 = 999999.0
36
+ self._fmax1 = -999999.0
37
+ self._smin1 = 999999.0
38
+ self._smax1 = -999999.0
39
+ self._ftrend = 0
40
+ self._strend = 0
41
+
42
+ def next(self):
43
+ """Update the fast and slow NRTR step lines from the current %R value."""
44
+ highest = float(self.highest[0])
45
+ lowest = float(self.lowest[0])
46
+ close = float(self.data.close[0])
47
+ span = highest - lowest
48
+ wpr0 = 50.0 if span == 0 else 100.0 * (close - lowest) / span
49
+ fmax0 = wpr0 + 2.0 * float(self.p.step_size_fast)
50
+ fmin0 = wpr0 - 2.0 * float(self.p.step_size_fast)
51
+ if wpr0 > self._fmax1:
52
+ self._ftrend = 1
53
+ if wpr0 < self._fmin1:
54
+ self._ftrend = -1
55
+ if self._ftrend > 0 and fmin0 < self._fmin1:
56
+ fmin0 = self._fmin1
57
+ if self._ftrend < 0 and fmax0 > self._fmax1:
58
+ fmax0 = self._fmax1
59
+ smax0 = wpr0 + 2.0 * float(self.p.step_size_slow)
60
+ smin0 = wpr0 - 2.0 * float(self.p.step_size_slow)
61
+ if wpr0 > self._smax1:
62
+ self._strend = 1
63
+ if wpr0 < self._smin1:
64
+ self._strend = -1
65
+ if self._strend > 0 and smin0 < self._smin1:
66
+ smin0 = self._smin1
67
+ if self._strend < 0 and smax0 > self._smax1:
68
+ smax0 = self._smax1
69
+ fast_line = (
70
+ fmin0 + float(self.p.step_size_fast)
71
+ if self._ftrend > 0
72
+ else fmax0 - float(self.p.step_size_fast)
73
+ )
74
+ slow_line = (
75
+ smin0 + float(self.p.step_size_slow)
76
+ if self._strend > 0
77
+ else smax0 - float(self.p.step_size_slow)
78
+ )
79
+ self.lines.fast_line[0] = fast_line
80
+ self.lines.slow_line[0] = slow_line
81
+ self.lines.wpr_shifted[0] = wpr0
82
+ self._fmin1 = fmin0
83
+ self._fmax1 = fmax0
84
+ self._smin1 = smin0
85
+ self._smax1 = smax0
@@ -0,0 +1,92 @@
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
+ from collections import deque
10
+
11
+ from .. import (
12
+ DeMarker,
13
+ Indicator,
14
+ )
15
+
16
+ __all__ = [
17
+ "ColorSchaffDeMarkerTrendCycle",
18
+ ]
19
+
20
+
21
+ class ColorSchaffDeMarkerTrendCycle(Indicator):
22
+ """Schaff Trend Cycle of DeMarker oscillators with a discrete color line."""
23
+
24
+ lines = ("stc", "color")
25
+ params = (
26
+ ("fast_demarker", 23),
27
+ ("slow_demarker", 50),
28
+ ("cycle", 10),
29
+ ("high_level", 60),
30
+ ("low_level", -60),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Build the fast/slow DeMarkers and initialize the STC smoothing state."""
35
+ self.addminperiod(
36
+ 3 * max(int(self.p.fast_demarker), int(self.p.slow_demarker)) + int(self.p.cycle) + 5
37
+ )
38
+ self.fast_demarker = DeMarker(self.data, period=int(self.p.fast_demarker))
39
+ self.slow_demarker = DeMarker(self.data, period=int(self.p.slow_demarker))
40
+ self.factor = 2.0 / (1.0 + float(self.p.cycle))
41
+ self.macd_window = deque(maxlen=int(self.p.cycle))
42
+ self.st_window = deque(maxlen=int(self.p.cycle))
43
+ self.prev_st = None
44
+ self.prev_stc = None
45
+
46
+ def _normalize(self, value, window, scale):
47
+ if not window:
48
+ return 0.0
49
+ llv = min(window)
50
+ hhv = max(window)
51
+ if hhv - llv == 0:
52
+ return None
53
+ return ((value - llv) / (hhv - llv)) * scale
54
+
55
+ def next(self):
56
+ """Compute the STC value and discrete color code for the current bar."""
57
+ fast = float(self.fast_demarker[0]) if math.isfinite(float(self.fast_demarker[0])) else 0.0
58
+ slow = float(self.slow_demarker[0]) if math.isfinite(float(self.slow_demarker[0])) else 0.0
59
+ macd = fast - slow
60
+ self.macd_window.append(macd)
61
+ st_raw = self._normalize(macd, self.macd_window, 100.0)
62
+ if st_raw is None:
63
+ st_value = self.prev_st if self.prev_st is not None else 0.0
64
+ else:
65
+ st_value = st_raw
66
+ if self.prev_st is not None:
67
+ st_value = self.factor * (st_value - self.prev_st) + self.prev_st
68
+ self.prev_st = st_value
69
+ self.st_window.append(st_value)
70
+ stc_raw = self._normalize(st_value, self.st_window, 200.0)
71
+ if stc_raw is None:
72
+ stc_value = self.prev_stc if self.prev_stc is not None else 0.0
73
+ else:
74
+ stc_value = stc_raw - 100.0
75
+ if self.prev_stc is not None:
76
+ stc_value = self.factor * (stc_value - self.prev_stc) + self.prev_stc
77
+ prev = self.prev_stc if self.prev_stc is not None else stc_value
78
+ self.prev_stc = stc_value
79
+ d_sts = stc_value - prev
80
+ clr = 2
81
+ if stc_value > 0:
82
+ if stc_value > float(self.p.high_level):
83
+ clr = 7 if d_sts >= 0 else 6
84
+ else:
85
+ clr = 5 if d_sts >= 0 else 4
86
+ elif stc_value < 0:
87
+ if stc_value < float(self.p.low_level):
88
+ clr = 0 if d_sts < 0 else 1
89
+ else:
90
+ clr = 2 if d_sts < 0 else 3
91
+ self.lines.stc[0] = stc_value
92
+ self.lines.color[0] = clr
@@ -0,0 +1,203 @@
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
+ SimpleMovingAverage,
12
+ SmoothedMovingAverage,
13
+ WeightedMovingAverage,
14
+ )
15
+
16
+ __all__ = [
17
+ "ColorSchaffTrendCycleIndicator",
18
+ ]
19
+
20
+
21
+ def resolve_ma_class(name):
22
+ """Resolve a moving-average selector into a Backtrader indicator class.
23
+
24
+ Args:
25
+ name: MA mode string.
26
+
27
+ Returns:
28
+ class: Backtrader MA indicator class.
29
+ """
30
+ mode = str(name).lower()
31
+ if mode in {"mode_sma", "sma"}:
32
+ return SimpleMovingAverage
33
+ if mode in {
34
+ "mode_ema",
35
+ "ema",
36
+ "mode_jjma",
37
+ "jjma",
38
+ "mode_jurx",
39
+ "jurx",
40
+ "mode_parma",
41
+ "parma",
42
+ "mode_t3",
43
+ "t3",
44
+ "mode_vidya",
45
+ "vidya",
46
+ "mode_ama",
47
+ "ama",
48
+ }:
49
+ return ExponentialMovingAverage
50
+ if mode in {"mode_smma", "smma"}:
51
+ return SmoothedMovingAverage
52
+ return WeightedMovingAverage
53
+
54
+
55
+ def resolve_price_line(data, mode):
56
+ """Resolve a price series selection for indicator calculations.
57
+
58
+ Args:
59
+ data: Backtrader data feed.
60
+ mode: Applied price mode string.
61
+
62
+ Returns:
63
+ backtrader line: Selected price series.
64
+ """
65
+ price_mode = str(mode).lower()
66
+ if price_mode in {"price_open", "open"}:
67
+ return data.open
68
+ if price_mode in {"price_high", "high"}:
69
+ return data.high
70
+ if price_mode in {"price_low", "low"}:
71
+ return data.low
72
+ if price_mode in {"price_median", "median"}:
73
+ return (data.high + data.low) / 2.0
74
+ if price_mode in {"price_typical", "typical"}:
75
+ return (data.high + data.low + data.close) / 3.0
76
+ if price_mode in {"price_weighted", "weighted"}:
77
+ return (data.high + data.low + data.close + data.close) / 4.0
78
+ if price_mode in {"price_simpl", "simpl"}:
79
+ return (data.open + data.close) / 2.0
80
+ if price_mode in {"price_quarter", "quarter"}:
81
+ return (data.high + data.low + data.open + data.close) / 4.0
82
+ return data.close
83
+
84
+
85
+ class ColorSchaffTrendCycleIndicator(Indicator):
86
+ """Custom indicator producing Schaff Trend Cycle value and color states."""
87
+
88
+ lines = ("value", "color")
89
+ params = (
90
+ ("xma_method", "ema"),
91
+ ("fast_xma", 23),
92
+ ("slow_xma", 50),
93
+ ("xphase", 15),
94
+ ("applied_price", "price_close"),
95
+ ("cycle", 10),
96
+ ("high_level", 60),
97
+ ("low_level", -60),
98
+ )
99
+
100
+ def __init__(self):
101
+ """Initialize fast/slow MA dependencies and required history."""
102
+ price_line = resolve_price_line(self.data, self.p.applied_price)
103
+ ma_cls = resolve_ma_class(self.p.xma_method)
104
+ self._fast = ma_cls(price_line, period=max(1, int(self.p.fast_xma)))
105
+ self._slow = ma_cls(price_line, period=max(1, int(self.p.slow_xma)))
106
+ self.addminperiod(
107
+ max(int(self.p.fast_xma), int(self.p.slow_xma)) + int(self.p.cycle) * 2 + 5
108
+ )
109
+
110
+ def next(self):
111
+ """Advance indicator by one bar and compute `value`/`color` for that bar."""
112
+ cycle = max(2, int(self.p.cycle))
113
+ macd_vals = [float(self._fast[-i]) - float(self._slow[-i]) for i in range(cycle)]
114
+ llv1 = min(macd_vals)
115
+ hhv1 = max(macd_vals)
116
+ prev_st = float(self.lines.value[-1]) if len(self) > 0 else 0.0
117
+ if prev_st != prev_st:
118
+ prev_st = 0.0
119
+ cur_macd = macd_vals[0]
120
+ st = ((cur_macd - llv1) / (hhv1 - llv1) * 100.0) if (hhv1 - llv1) != 0 else prev_st
121
+ st = 0.5 * (st - prev_st) + prev_st if len(self) > 0 else st
122
+ st_vals = [st]
123
+ for i in range(1, cycle):
124
+ value = float(self.lines.value[-i])
125
+ if value == value:
126
+ st_vals.append(value)
127
+ llv2 = min(st_vals)
128
+ hhv2 = max(st_vals)
129
+ prev_stc = float(self.lines.value[-1]) if len(self) > 0 else 0.0
130
+ if prev_stc != prev_stc:
131
+ prev_stc = 0.0
132
+ stc = ((st - llv2) / (hhv2 - llv2) * 200.0 - 100.0) if (hhv2 - llv2) != 0 else prev_stc
133
+ stc = 0.5 * (stc - prev_stc) + prev_stc if len(self) > 0 else stc
134
+ self.lines.value[0] = stc
135
+ delta = stc - prev_stc if len(self) > 0 else 0.0
136
+ color = 4
137
+ if stc > 0:
138
+ if stc > float(self.p.high_level):
139
+ color = 7 if delta >= 0 else 6
140
+ else:
141
+ color = 5 if delta >= 0 else 4
142
+ if stc < 0:
143
+ if stc < float(self.p.low_level):
144
+ color = 0 if delta < 0 else 1
145
+ else:
146
+ color = 2 if delta < 0 else 3
147
+ self.lines.color[0] = color
148
+
149
+ def once(self, start, end):
150
+ """Compute indicator output in vectorized mode for backtest startup."""
151
+ fast_array = self._fast.array
152
+ slow_array = self._slow.array
153
+ value_line = self.lines.value.array
154
+ color_line = self.lines.color.array
155
+ for line in (value_line, color_line):
156
+ while len(line) < end:
157
+ line.append(float("nan"))
158
+
159
+ cycle = max(2, int(self.p.cycle))
160
+ prev_value = None
161
+ actual_end = min(end, len(fast_array), len(slow_array))
162
+ for i in range(start, actual_end):
163
+ macd_vals = [
164
+ float(fast_array[i - j]) - float(slow_array[i - j])
165
+ for j in range(cycle)
166
+ if i - j >= 0
167
+ ]
168
+ llv1 = min(macd_vals)
169
+ hhv1 = max(macd_vals)
170
+ prev_st = 0.0 if prev_value is None else prev_value
171
+ cur_macd = macd_vals[0]
172
+ st = ((cur_macd - llv1) / (hhv1 - llv1) * 100.0) if (hhv1 - llv1) != 0 else prev_st
173
+ if prev_value is not None:
174
+ st = 0.5 * (st - prev_st) + prev_st
175
+
176
+ st_vals = [st]
177
+ for j in range(1, cycle):
178
+ idx = i - j
179
+ if idx < start:
180
+ break
181
+ st_vals.append(float(value_line[idx]))
182
+ llv2 = min(st_vals)
183
+ hhv2 = max(st_vals)
184
+ prev_stc = 0.0 if prev_value is None else prev_value
185
+ stc = ((st - llv2) / (hhv2 - llv2) * 200.0 - 100.0) if (hhv2 - llv2) != 0 else prev_stc
186
+ if prev_value is not None:
187
+ stc = 0.5 * (stc - prev_stc) + prev_stc
188
+
189
+ delta = stc - prev_stc if prev_value is not None else 0.0
190
+ color = 4
191
+ if stc > 0:
192
+ if stc > float(self.p.high_level):
193
+ color = 7 if delta >= 0 else 6
194
+ else:
195
+ color = 5 if delta >= 0 else 4
196
+ if stc < 0:
197
+ if stc < float(self.p.low_level):
198
+ color = 0 if delta < 0 else 1
199
+ else:
200
+ color = 2 if delta < 0 else 3
201
+ value_line[i] = stc
202
+ color_line[i] = color
203
+ prev_value = stc