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,56 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ExponentialMovingAverage,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "BullsPower",
15
+ "BearsPower",
16
+ ]
17
+
18
+
19
+ class BullsPower(Indicator):
20
+ """Indicator for Bulls Power built from high price minus EMA."""
21
+
22
+ lines = ("value",)
23
+ params = (("period", 5),)
24
+
25
+ def __init__(self):
26
+ """Initialize EMA and minimum period.
27
+
28
+ Args:
29
+ self: Instance reference.
30
+ """
31
+ self.ema = ExponentialMovingAverage(self.data.close, period=self.p.period)
32
+ self.addminperiod(self.p.period + 3)
33
+
34
+ def next(self):
35
+ """Update current Bulls Power value."""
36
+ self.lines.value[0] = float(self.data.high[0]) - float(self.ema[0])
37
+
38
+
39
+ class BearsPower(Indicator):
40
+ """Indicator for Bears Power built from low price minus EMA."""
41
+
42
+ lines = ("value",)
43
+ params = (("period", 5),)
44
+
45
+ def __init__(self):
46
+ """Initialize EMA and minimum period.
47
+
48
+ Args:
49
+ self: Instance reference.
50
+ """
51
+ self.ema = ExponentialMovingAverage(self.data.close, period=self.p.period)
52
+ self.addminperiod(self.p.period + 3)
53
+
54
+ def next(self):
55
+ """Update current Bears Power value."""
56
+ self.lines.value[0] = float(self.data.low[0]) - float(self.ema[0])
@@ -0,0 +1,102 @@
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
+ ATR,
10
+ Indicator,
11
+ SmoothedMovingAverage,
12
+ )
13
+
14
+ __all__ = [
15
+ "BWWiseMan1Signal",
16
+ ]
17
+
18
+
19
+ class BWWiseMan1Signal(Indicator):
20
+ """Generate long/short trigger values based on Alligator-like MAs and ATR.
21
+
22
+ The indicator outputs two value lines (`buy`, `sell`) that represent candidate
23
+ entry levels for short and long flips under the configured market regime.
24
+ """
25
+
26
+ lines = ("sell", "buy")
27
+ params = (
28
+ ("retrogradely", True),
29
+ ("back", 2),
30
+ ("jaw_period", 13),
31
+ ("jaw_shift", 8),
32
+ ("teeth_period", 8),
33
+ ("teeth_shift", 5),
34
+ ("lips_period", 5),
35
+ ("lips_shift", 3),
36
+ ("atr_period", 15),
37
+ )
38
+
39
+ def __init__(self):
40
+ """Initialize moving average and ATR lines and minimum period requirements."""
41
+ median_price = (self.data.high + self.data.low) / 2.0
42
+ self.jaw = SmoothedMovingAverage(median_price, period=max(int(self.p.jaw_period), 1))
43
+ self.teeth = SmoothedMovingAverage(median_price, period=max(int(self.p.teeth_period), 1))
44
+ self.lips = SmoothedMovingAverage(median_price, period=max(int(self.p.lips_period), 1))
45
+ self.atr = ATR(self.data, period=max(int(self.p.atr_period), 1))
46
+ self.addminperiod(
47
+ max(
48
+ int(self.p.jaw_period) + int(self.p.jaw_shift),
49
+ int(self.p.teeth_period) + int(self.p.teeth_shift),
50
+ int(self.p.lips_period) + int(self.p.lips_shift),
51
+ int(self.p.atr_period),
52
+ )
53
+ + int(self.p.back)
54
+ + 2
55
+ )
56
+
57
+ def next(self):
58
+ """Compute current `buy`/`sell` trigger values from MA and ATR relationships."""
59
+ self.lines.buy[0] = 0.0
60
+ self.lines.sell[0] = 0.0
61
+
62
+ if len(self.data) <= max(
63
+ int(self.p.jaw_shift), int(self.p.teeth_shift), int(self.p.lips_shift), int(self.p.back)
64
+ ):
65
+ return
66
+
67
+ jaw = float(self.jaw[-int(self.p.jaw_shift)])
68
+ teeth = float(self.teeth[-int(self.p.teeth_shift)])
69
+ lips = float(self.lips[-int(self.p.lips_shift)])
70
+ high = float(self.data.high[0])
71
+ low = float(self.data.low[0])
72
+ close = float(self.data.close[0])
73
+ mid = (high + low) / 2.0
74
+ atr = float(self.atr[0])
75
+
76
+ raw_sell = 0.0
77
+ raw_buy = 0.0
78
+
79
+ if low > lips and low > teeth and low > jaw and close < mid:
80
+ contup = True
81
+ for i in range(1, int(self.p.back) + 1):
82
+ if high <= float(self.data.high[-i]):
83
+ contup = False
84
+ break
85
+ if contup:
86
+ raw_sell = high + atr * 3.0 / 8.0
87
+
88
+ if high < lips and high < teeth and high < jaw and close > mid:
89
+ contup = True
90
+ for i in range(1, int(self.p.back) + 1):
91
+ if low >= float(self.data.low[-i]):
92
+ contup = False
93
+ break
94
+ if contup:
95
+ raw_buy = low - atr * 3.0 / 8.0
96
+
97
+ if bool(self.p.retrogradely):
98
+ self.lines.buy[0] = raw_sell
99
+ self.lines.sell[0] = raw_buy
100
+ else:
101
+ self.lines.buy[0] = raw_buy
102
+ self.lines.sell[0] = raw_sell
@@ -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 Indicator
9
+
10
+ __all__ = [
11
+ "BykovTrendIndicator",
12
+ ]
13
+
14
+
15
+ class BykovTrendIndicator(Indicator):
16
+ """Reconstructs BykovTrend from its MQ5 source.
17
+
18
+ Uses WPR(SSP) + ATR(15) to detect trend flips.
19
+ Outputs buy_arrow / sell_arrow (non-zero price level when arrow fires).
20
+ """
21
+
22
+ lines = ("buy_arrow", "sell_arrow")
23
+ params = (
24
+ ("risk", 3),
25
+ ("ssp", 9),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Cache WPR/ATR periods, the risk threshold, and set indicator warmup."""
30
+ self._k = 33 - int(self.p.risk)
31
+ self._atr_period = 15
32
+ self._wpr_period = int(self.p.ssp)
33
+ self._uptrend = True
34
+ self._old = True
35
+ self.addminperiod(max(self._wpr_period, self._atr_period) + 2)
36
+
37
+ def _calc_wpr(self):
38
+ period = self._wpr_period
39
+ if len(self.data) < period:
40
+ return 0.0
41
+ hh = max(float(self.data.high[-i]) for i in range(period))
42
+ ll = min(float(self.data.low[-i]) for i in range(period))
43
+ close_val = float(self.data.close[0])
44
+ if hh == ll:
45
+ return 0.0
46
+ return -100.0 * (hh - close_val) / (hh - ll)
47
+
48
+ def _calc_atr(self):
49
+ period = self._atr_period
50
+ if len(self.data) < period + 1:
51
+ return 0.0
52
+ total = 0.0
53
+ for i in range(period):
54
+ hi = float(self.data.high[-i])
55
+ lo = float(self.data.low[-i])
56
+ prev_close = float(self.data.close[-(i + 1)])
57
+ tr = max(hi - lo, abs(hi - prev_close), abs(prev_close - lo))
58
+ total += tr
59
+ return total / period
60
+
61
+ def next(self):
62
+ """Update the trend state and emit buy/sell arrow offsets on flips."""
63
+ k = self._k
64
+ wpr = self._calc_wpr()
65
+ atr = self._calc_atr()
66
+ rng = atr * 3.0 / 8.0
67
+
68
+ uptrend = self._uptrend
69
+ if wpr < -100 + k:
70
+ uptrend = False
71
+ if wpr > -k:
72
+ uptrend = True
73
+
74
+ buy_val = 0.0
75
+ sell_val = 0.0
76
+ if not self._old and uptrend:
77
+ buy_val = float(self.data.low[0]) - rng
78
+ if self._old and not uptrend:
79
+ sell_val = float(self.data.high[0]) + rng
80
+
81
+ self.lines.buy_arrow[0] = buy_val
82
+ self.lines.sell_arrow[0] = sell_val
83
+
84
+ self._old = uptrend
85
+ self._uptrend = uptrend
@@ -0,0 +1,46 @@
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
+ "CandleStopColor",
12
+ ]
13
+
14
+
15
+ class CandleStopColor(Indicator):
16
+ """Indicator computing highest-high/ lowest-low trailing stop channels with color breakout signal."""
17
+
18
+ lines = ("color_idx", "upper", "lower")
19
+ params = (
20
+ ("up_trail_periods", 5),
21
+ ("up_trail_shift", 5),
22
+ ("dn_trail_periods", 5),
23
+ ("dn_trail_shift", 5),
24
+ )
25
+
26
+ def next(self):
27
+ """Compute trailing high/low range and set color index based on close position."""
28
+ hh_indices = range(self.p.up_trail_shift, self.p.up_trail_shift + self.p.up_trail_periods)
29
+ ll_indices = range(self.p.dn_trail_shift, self.p.dn_trail_shift + self.p.dn_trail_periods)
30
+ highs = [float(self.data.high[-idx]) for idx in hh_indices if len(self.data) > idx]
31
+ lows = [float(self.data.low[-idx]) for idx in ll_indices if len(self.data) > idx]
32
+ if not highs or not lows:
33
+ self.lines.color_idx[0] = 4.0
34
+ return
35
+ upper = max(highs)
36
+ lower = min(lows)
37
+ close = float(self.data.close[0])
38
+ open_ = float(self.data.open[0])
39
+ self.lines.upper[0] = upper
40
+ self.lines.lower[0] = lower
41
+ color = 4.0
42
+ if close > upper:
43
+ color = 3.0 if close >= open_ else 2.0
44
+ elif close < lower:
45
+ color = 0.0 if close <= open_ else 1.0
46
+ self.lines.color_idx[0] = color
@@ -0,0 +1,69 @@
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
+ "CandlesXSmoothedIndicator",
18
+ ]
19
+
20
+
21
+ def resolve_ma_class(name):
22
+ """Resolve moving-average strategy by string key.
23
+
24
+ Args:
25
+ name (str): MA method key from config.
26
+
27
+ Returns:
28
+ indicator: Corresponding Backtrader MA class.
29
+ """
30
+ mode = str(name).lower()
31
+ if mode in {"sma", "mode_sma"}:
32
+ return SMA
33
+ if mode in {"ema", "mode_ema"}:
34
+ return EMA
35
+ if mode in {"smma", "mode_smma"}:
36
+ return SmoothedMovingAverage
37
+ return WeightedMovingAverage
38
+
39
+
40
+ class CandlesXSmoothedIndicator(Indicator):
41
+ """Indicator that smooths OHLC bars with configurable MA and derives color state."""
42
+
43
+ lines = (
44
+ "smooth_open",
45
+ "smooth_high",
46
+ "smooth_low",
47
+ "smooth_close",
48
+ "color_state",
49
+ )
50
+ params = (
51
+ ("ma_method", "lwma"),
52
+ ("ma_length", 30),
53
+ ("ma_phase", 100),
54
+ )
55
+
56
+ def __init__(self):
57
+ """Initialize all smoothed OHLC lines and color state."""
58
+ ma_cls = resolve_ma_class(self.p.ma_method)
59
+ self.lines.smooth_open = ma_cls(self.data.open, period=self.p.ma_length)
60
+ self.lines.smooth_high = ma_cls(self.data.high, period=self.p.ma_length)
61
+ self.lines.smooth_low = ma_cls(self.data.low, period=self.p.ma_length)
62
+ self.lines.smooth_close = ma_cls(self.data.close, period=self.p.ma_length)
63
+ self.addminperiod(self.p.ma_length + 2)
64
+
65
+ def next(self):
66
+ """Set color state to bullish (`0`) or bearish (`1`) for current bar."""
67
+ self.lines.color_state[0] = (
68
+ 0.0 if float(self.lines.smooth_open[0]) < float(self.lines.smooth_close[0]) else 1.0
69
+ )
@@ -0,0 +1,45 @@
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
+ SMA,
10
+ AwesomeOscillator,
11
+ Indicator,
12
+ )
13
+
14
+ __all__ = [
15
+ "CandlesticksBW",
16
+ ]
17
+
18
+
19
+ class CandlesticksBW(Indicator):
20
+ """Indicator that encodes AO/AC state into a numeric candle color code."""
21
+
22
+ lines = ("color",)
23
+ params = ()
24
+
25
+ def __init__(self):
26
+ """Set up AO and AC dependencies and minimum period."""
27
+ self.addminperiod(40)
28
+ self.ao = AwesomeOscillator(self.data)
29
+ self.ac = self.ao - SMA(self.ao, period=5)
30
+
31
+ def next(self):
32
+ """Compute the color code for the current bar."""
33
+ ao0 = float(self.ao[0])
34
+ ao1 = float(self.ao[-1])
35
+ ac0 = float(self.ac[0])
36
+ ac1 = float(self.ac[-1])
37
+ open_ = float(self.data.open[0])
38
+ close = float(self.data.close[0])
39
+ if ao0 >= ao1 and ac0 >= ac1:
40
+ color = 0.0 if open_ <= close else 1.0
41
+ elif ao0 <= ao1 and ac0 <= ac1:
42
+ color = 5.0 if open_ >= close else 4.0
43
+ else:
44
+ color = 2.0 if open_ <= close else 3.0
45
+ self.lines.color[0] = color
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ Indicator,
10
+ SimpleMovingAverage,
11
+ )
12
+
13
+ __all__ = [
14
+ "CaudateXPeriodCandleColor",
15
+ ]
16
+
17
+
18
+ class CaudateXPeriodCandleColor(Indicator):
19
+ """Synthetic period-candle indicator emitting a color index and smoothed OHLC."""
20
+
21
+ lines = ("color_idx", "xopen", "xclose", "xhigh", "xlow")
22
+ params = (
23
+ ("cperiod", 5),
24
+ ("ma_length", 3),
25
+ )
26
+
27
+ def __init__(self):
28
+ """Build the smoothed OHLC moving averages and set the warmup period."""
29
+ self.smooth_open = SimpleMovingAverage(self.data.open, period=self.p.ma_length)
30
+ self.smooth_high = SimpleMovingAverage(self.data.high, period=self.p.ma_length)
31
+ self.smooth_low = SimpleMovingAverage(self.data.low, period=self.p.ma_length)
32
+ self.smooth_close = SimpleMovingAverage(self.data.close, period=self.p.ma_length)
33
+ self.addminperiod(self.p.ma_length + self.p.cperiod)
34
+
35
+ def next(self):
36
+ """Build the period candle and assign its color index from the midpoint."""
37
+ lookback = max(1, int(self.p.cperiod))
38
+ start = -(lookback - 1)
39
+ xopen = float(self.smooth_open[start])
40
+ xclose = float(self.smooth_close[0])
41
+ highs = [float(self.smooth_high[-i]) for i in range(lookback)]
42
+ lows = [float(self.smooth_low[-i]) for i in range(lookback)]
43
+ xhigh = max(highs)
44
+ xlow = min(lows)
45
+ self.lines.xopen[0] = xopen
46
+ self.lines.xclose[0] = xclose
47
+ self.lines.xhigh[0] = xhigh
48
+ self.lines.xlow[0] = xlow
49
+
50
+ color = 2.0 if xopen <= xclose else 4.0
51
+ candle_half = (xhigh + xlow) / 2.0
52
+ if xopen > candle_half and xclose > candle_half:
53
+ color = 0.0 if xopen <= xclose else 1.0
54
+ elif xopen < candle_half and xclose < candle_half:
55
+ color = 6.0 if xopen >= xclose else 5.0
56
+ self.lines.color_idx[0] = color
@@ -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
+ CommodityChannelIndex,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "CCIHistogramIndicator",
15
+ ]
16
+
17
+
18
+ class CCIHistogramIndicator(Indicator):
19
+ """CCI-based colour-state indicator classifying CCI into three zones.
20
+
21
+ Lines
22
+ -----
23
+ cci : float
24
+ Commodity Channel Index value.
25
+ color_state : float
26
+ 0.0 = overbought (CCI > high_level), 1.0 = neutral, 2.0 = oversold.
27
+ hist_base : float
28
+ Always 0.0 (placeholder for histogram baseline).
29
+ """
30
+
31
+ lines = ("cci", "color_state", "hist_base")
32
+ params = (
33
+ ("cci_period", 14),
34
+ ("high_level", 100),
35
+ ("low_level", -100),
36
+ )
37
+
38
+ def __init__(self):
39
+ """Initialise indicator state: attach CCI sub-indicator and set minimum period."""
40
+ cci = CommodityChannelIndex(self.data, period=int(self.p.cci_period))
41
+ self.lines.cci = cci
42
+ self.addminperiod(int(self.p.cci_period) + 2)
43
+
44
+ def next(self):
45
+ """Classify current CCI value into colour state (0=overbought, 1=neutral, 2=oversold)."""
46
+ cci_value = float(self.lines.cci[0])
47
+ color = 1.0
48
+ if cci_value > float(self.p.high_level):
49
+ color = 0.0
50
+ elif cci_value < float(self.p.low_level):
51
+ color = 2.0
52
+ self.lines.color_state[0] = color
53
+ self.lines.hist_base[0] = 0.0
@@ -0,0 +1,80 @@
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
+ "CCIWoodiesIndicator",
12
+ ]
13
+
14
+
15
+ def _applied_price(data, price_type, ago=0):
16
+ """Get price based on ENUM_APPLIED_PRICE."""
17
+ o = float(data.open[-ago])
18
+ h = float(data.high[-ago])
19
+ low_price = float(data.low[-ago])
20
+ c = float(data.close[-ago])
21
+ if price_type == 0:
22
+ return c # PRICE_CLOSE
23
+ if price_type == 1:
24
+ return o # PRICE_OPEN
25
+ if price_type == 2:
26
+ return h # PRICE_HIGH
27
+ if price_type == 3:
28
+ return low_price # PRICE_LOW
29
+ if price_type == 4:
30
+ return (h + low_price) / 2 # PRICE_MEDIAN
31
+ if price_type == 5:
32
+ return (h + low_price + c) / 3 # PRICE_TYPICAL
33
+ if price_type == 6:
34
+ return (h + low_price + c + c) / 4 # PRICE_WEIGHTED
35
+ return c
36
+
37
+
38
+ class CCIWoodiesIndicator(Indicator):
39
+ """Reconstructs CCI_Woodies indicator.
40
+
41
+ DRAW_FILLING between FastCCI and SlowCCI.
42
+ Buffer 0 = FastCCI, Buffer 1 = SlowCCI.
43
+ When Fast > Slow → bullish (Lime fill); when Fast < Slow → bearish (Plum fill).
44
+ """
45
+
46
+ lines = ("fast_cci", "slow_cci")
47
+ params = (
48
+ ("fast_period", 6),
49
+ ("fast_price", 4),
50
+ ("slow_period", 14),
51
+ ("slow_price", 4),
52
+ )
53
+
54
+ def __init__(self):
55
+ """Build internal period and price type state for fast and slow CCI."""
56
+ self._fp = int(self.p.fast_period)
57
+ self._sp = int(self.p.slow_period)
58
+ self._fpr = int(self.p.fast_price)
59
+ self._spr = int(self.p.slow_price)
60
+ self.addminperiod(max(self._fp, self._sp) + 2)
61
+
62
+ def _calc_cci(self, period, price_type):
63
+ prices = []
64
+ for i in range(period):
65
+ if i >= len(self.data):
66
+ break
67
+ prices.append(_applied_price(self.data, price_type, i))
68
+ if not prices:
69
+ return 0.0
70
+ mean = sum(prices) / len(prices)
71
+ mad = sum(abs(p - mean) for p in prices) / len(prices)
72
+ tp = prices[0] # current bar
73
+ if mad == 0:
74
+ return 0.0
75
+ return (tp - mean) / (0.015 * mad)
76
+
77
+ def next(self):
78
+ """Compute and store current fast and slow CCI values for each bar."""
79
+ self.lines.fast_cci[0] = self._calc_cci(self._fp, self._fpr)
80
+ self.lines.slow_cci[0] = self._calc_cci(self._sp, self._spr)
@@ -0,0 +1,83 @@
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
+ "CenterOfGravityCandleIndicator",
18
+ ]
19
+
20
+
21
+ class CenterOfGravityCandleIndicator(Indicator):
22
+ """Center-of-Gravity Candle indicator exposing center, signal, and state lines."""
23
+
24
+ lines = ("center", "signal", "state")
25
+ params = (
26
+ ("period", 10),
27
+ ("smooth_period", 3),
28
+ ("ma_method", "sma"),
29
+ ("applied_price", "close"),
30
+ ("point", 0.01),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Build the center, signal, and warmup period from the applied price.
35
+
36
+ Side effects:
37
+ Computes ``center`` as the point-scaled product of an SMA and a LWMA
38
+ of the applied price, derives ``signal`` by smoothing ``center``, and
39
+ sets the minimum warmup period.
40
+ """
41
+ ma_cls = self._ma_class()
42
+ price = self._price_line()
43
+ sma = SimpleMovingAverage(price, period=self.p.period)
44
+ lwma = WeightedMovingAverage(price, period=self.p.period)
45
+ self.lines.center = (sma * lwma) / self.p.point
46
+ self.lines.signal = ma_cls(self.lines.center, period=self.p.smooth_period)
47
+ self.addminperiod(self.p.period + self.p.smooth_period + 5)
48
+
49
+ def _ma_class(self):
50
+ mode = str(self.p.ma_method).lower()
51
+ if mode in {"ema", "mode_ema"}:
52
+ return ExponentialMovingAverage
53
+ if mode in {"smma", "smoothed", "mode_smma"}:
54
+ return SmoothedMovingAverage
55
+ if mode in {"lwma", "wma", "mode_lwma"}:
56
+ return WeightedMovingAverage
57
+ return SimpleMovingAverage
58
+
59
+ def _price_line(self):
60
+ mode = str(self.p.applied_price).lower()
61
+ if mode == "open":
62
+ return self.data.open
63
+ if mode == "high":
64
+ return self.data.high
65
+ if mode == "low":
66
+ return self.data.low
67
+ if mode == "median":
68
+ return (self.data.high + self.data.low) / 2.0
69
+ if mode == "typical":
70
+ return (self.data.high + self.data.low + self.data.close) / 3.0
71
+ if mode == "weighted":
72
+ return (self.data.high + self.data.low + self.data.close + self.data.close) / 4.0
73
+ if mode == "simpl":
74
+ return (self.data.open + self.data.close) / 2.0
75
+ if mode == "quarter":
76
+ return (self.data.high + self.data.low + self.data.open + self.data.close) / 4.0
77
+ return self.data.close
78
+
79
+ def next(self):
80
+ """Set ``state`` to 2 when center is above signal, else 0, for the bar."""
81
+ self.lines.state[0] = (
82
+ 2.0 if float(self.lines.center[0]) > float(self.lines.signal[0]) else 0.0
83
+ )