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,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
+ from .. import (
9
+ ExponentialMovingAverage,
10
+ Indicator,
11
+ SimpleMovingAverage,
12
+ )
13
+
14
+ __all__ = [
15
+ "AccumulationDistributionLine",
16
+ "ChaikinOscillator",
17
+ "LineCCI",
18
+ "CCIDualOnMA",
19
+ ]
20
+
21
+
22
+ class AccumulationDistributionLine(Indicator):
23
+ """Accumulate the ADL indicator from price and volume progression."""
24
+
25
+ lines = ("adl",)
26
+
27
+ def next(self):
28
+ """Compute one bar's accumulation/distribution line value."""
29
+ high = float(self.data.high[0])
30
+ low = float(self.data.low[0])
31
+ close = float(self.data.close[0])
32
+ volume = float(self.data.volume[0])
33
+ if high == low:
34
+ money_flow_multiplier = 0.0
35
+ else:
36
+ money_flow_multiplier = ((close - low) - (high - close)) / (high - low)
37
+ previous = float(self.lines.adl[-1]) if len(self) > 1 else 0.0
38
+ self.lines.adl[0] = previous + money_flow_multiplier * volume
39
+
40
+
41
+ class ChaikinOscillator(Indicator):
42
+ """Chaikin oscillator as EMA(short) minus EMA(long) of ADL."""
43
+
44
+ lines = ("cho",)
45
+ params = (
46
+ ("fast_period", 3),
47
+ ("slow_period", 10),
48
+ )
49
+
50
+ def __init__(self):
51
+ """Initialize fast/slow ADL EMAs."""
52
+ self.adl = AccumulationDistributionLine(self.data)
53
+ fast = ExponentialMovingAverage(self.adl, period=self.p.fast_period)
54
+ slow = ExponentialMovingAverage(self.adl, period=self.p.slow_period)
55
+ self.lines.cho = fast - slow
56
+
57
+
58
+ class LineCCI(Indicator):
59
+ """Custom CCI computation on the selected input data."""
60
+
61
+ lines = ("cci",)
62
+ params = (("period", 14),)
63
+
64
+ def next(self):
65
+ """Calculate a bar's CCI value with zero-handling for degenerate windows."""
66
+ if len(self.data) < self.p.period:
67
+ self.lines.cci[0] = 0.0
68
+ return
69
+ values = [float(self.data[-i]) for i in range(self.p.period)]
70
+ mean_value = sum(values) / self.p.period
71
+ mean_dev = sum(abs(v - mean_value) for v in values) / self.p.period
72
+ if mean_dev == 0:
73
+ self.lines.cci[0] = 0.0
74
+ return
75
+ self.lines.cci[0] = (float(self.data[0]) - mean_value) / (0.015 * mean_dev)
76
+
77
+
78
+ class CCIDualOnMA(Indicator):
79
+ """Provide fast/slow CCI values computed on a smoothing moving average."""
80
+
81
+ lines = ("fast", "slow")
82
+ params = (
83
+ ("ma_period", 12),
84
+ ("fast_period", 14),
85
+ ("slow_period", 50),
86
+ )
87
+
88
+ def __init__(self):
89
+ """Initialize smoothed MA and dual CCI lines."""
90
+ self.ma = SimpleMovingAverage(self.data.close, period=self.p.ma_period)
91
+ self.lines.fast = LineCCI(self.ma, period=self.p.fast_period)
92
+ self.lines.slow = LineCCI(self.ma, period=self.p.slow_period)
@@ -0,0 +1,249 @@
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
+ AverageTrueRange,
10
+ ExponentialMovingAverage,
11
+ Indicator,
12
+ MinusDirectionalIndicator,
13
+ PlusDirectionalIndicator,
14
+ SimpleMovingAverage,
15
+ SmoothedMovingAverage,
16
+ WeightedMovingAverage,
17
+ )
18
+
19
+ __all__ = [
20
+ "ADXCrossHullStyleIndicator",
21
+ "UltraXMAIndicator",
22
+ ]
23
+
24
+
25
+ def resolve_ma_class(name):
26
+ """Map an MT5 moving-average method name to a backtrader indicator class.
27
+
28
+ Args:
29
+ name: MT5 MA method name (e.g. ``'sma'``, ``'ema'``, ``'jjma'``).
30
+
31
+ Returns:
32
+ The backtrader moving-average indicator class for the method, defaulting
33
+ to WeightedMovingAverage for unrecognized names.
34
+ """
35
+ mode = str(name).lower()
36
+ if mode in {"mode_sma", "sma"}:
37
+ return SimpleMovingAverage
38
+ if mode in {
39
+ "mode_ema",
40
+ "ema",
41
+ "mode_jjma",
42
+ "jjma",
43
+ "mode_jurx",
44
+ "jurx",
45
+ "mode_parma",
46
+ "parma",
47
+ "mode_t3",
48
+ "t3",
49
+ "mode_vidya",
50
+ "vidya",
51
+ "mode_ama",
52
+ "ama",
53
+ }:
54
+ return ExponentialMovingAverage
55
+ if mode in {"mode_smma", "smma"}:
56
+ return SmoothedMovingAverage
57
+ return WeightedMovingAverage
58
+
59
+
60
+ def resolve_price_line(data, mode):
61
+ """Build an applied-price line from a data feed per MT5 price modes.
62
+
63
+ Args:
64
+ data: The backtrader data feed providing OHLC lines.
65
+ mode: MT5 applied-price mode (e.g. ``'price_close'``, ``'price_typical'``).
66
+
67
+ Returns:
68
+ A backtrader line expression for the selected applied price, defaulting
69
+ to the close line.
70
+ """
71
+ price_mode = str(mode).lower()
72
+ if price_mode in {"price_open", "open"}:
73
+ return data.open
74
+ if price_mode in {"price_high", "high"}:
75
+ return data.high
76
+ if price_mode in {"price_low", "low"}:
77
+ return data.low
78
+ if price_mode in {"price_median", "median"}:
79
+ return (data.high + data.low) / 2.0
80
+ if price_mode in {"price_typical", "typical"}:
81
+ return (data.high + data.low + data.close) / 3.0
82
+ if price_mode in {"price_weighted", "weighted"}:
83
+ return (data.high + data.low + data.close + data.close) / 4.0
84
+ if price_mode in {"price_simple", "simple"}:
85
+ return (data.open + data.close) / 2.0
86
+ if price_mode in {"price_quarter", "quarter"}:
87
+ return (data.high + data.low + data.open + data.close) / 4.0
88
+ return data.close
89
+
90
+
91
+ class ADXCrossHullStyleIndicator(Indicator):
92
+ """Hull-style ADX cross indicator emitting up/down directional signal levels.
93
+
94
+ Builds smoothed +DI/-DI values from a full and a half-length directional
95
+ index and marks an ``up`` level on a bullish DI cross or a ``down`` level on a
96
+ bearish DI cross, each offset from price by a fraction of ATR.
97
+ """
98
+
99
+ lines = ("up", "down")
100
+ params = (("adx_period", 14),)
101
+
102
+ def __init__(self):
103
+ """Construct the directional-index and ATR components and set min period."""
104
+ period = max(2, int(self.p.adx_period))
105
+ self._plus1 = PlusDirectionalIndicator(self.data, period=period)
106
+ self._plus2 = PlusDirectionalIndicator(self.data, period=max(2, period // 2))
107
+ self._minus1 = MinusDirectionalIndicator(self.data, period=period)
108
+ self._minus2 = MinusDirectionalIndicator(self.data, period=max(2, period // 2))
109
+ self._atr = AverageTrueRange(self.data, period=10)
110
+ self.addminperiod(period + 12)
111
+
112
+ def next(self):
113
+ """Compute the per-bar up/down signal levels from smoothed DI crosses."""
114
+ b4plusdi = 2.0 * float(self._plus2[-1]) - float(self._plus1[-1])
115
+ nowplusdi = 2.0 * float(self._plus2[0]) - float(self._plus1[0])
116
+ b4minusdi = 2.0 * float(self._minus2[-1]) - float(self._minus1[-1])
117
+ nowminusdi = 2.0 * float(self._minus2[0]) - float(self._minus1[0])
118
+ self.lines.up[0] = 0.0
119
+ self.lines.down[0] = 0.0
120
+ if b4plusdi < b4minusdi and nowplusdi > nowminusdi:
121
+ self.lines.up[0] = float(self.data.low[0]) - 0.25 * float(self._atr[0])
122
+ if b4plusdi > b4minusdi and nowplusdi < nowminusdi:
123
+ self.lines.down[0] = float(self.data.high[0]) + 0.25 * float(self._atr[0])
124
+
125
+ def once(self, start, end):
126
+ """Vectorized batch computation of up/down signal levels over a range.
127
+
128
+ Args:
129
+ start: First index in the array range to compute.
130
+ end: One past the last index in the array range to compute.
131
+ """
132
+ plus1 = self._plus1.array
133
+ plus2 = self._plus2.array
134
+ minus1 = self._minus1.array
135
+ minus2 = self._minus2.array
136
+ atr = self._atr.array
137
+ low = self.data.low.array
138
+ high = self.data.high.array
139
+ up_line = self.lines.up.array
140
+ down_line = self.lines.down.array
141
+ for line in (up_line, down_line):
142
+ while len(line) < end:
143
+ line.append(float("nan"))
144
+
145
+ actual_end = min(
146
+ end, len(plus1), len(plus2), len(minus1), len(minus2), len(atr), len(low), len(high)
147
+ )
148
+ for i in range(start, actual_end):
149
+ up_line[i] = 0.0
150
+ down_line[i] = 0.0
151
+ if i <= 0:
152
+ continue
153
+ b4plusdi = 2.0 * float(plus2[i - 1]) - float(plus1[i - 1])
154
+ nowplusdi = 2.0 * float(plus2[i]) - float(plus1[i])
155
+ b4minusdi = 2.0 * float(minus2[i - 1]) - float(minus1[i - 1])
156
+ nowminusdi = 2.0 * float(minus2[i]) - float(minus1[i])
157
+ if b4plusdi < b4minusdi and nowplusdi > nowminusdi:
158
+ up_line[i] = float(low[i]) - 0.25 * float(atr[i])
159
+ if b4plusdi > b4minusdi and nowplusdi < nowminusdi:
160
+ down_line[i] = float(high[i]) + 0.25 * float(atr[i])
161
+
162
+
163
+ class UltraXMAIndicator(Indicator):
164
+ """UltraXMA breadth indicator counting rising vs falling fanned moving averages.
165
+
166
+ Computes a fan of moving averages over increasing periods, counts how many
167
+ are rising (bulls) versus falling (bears) each bar, and smooths those counts
168
+ with an exponential factor to produce trend-strength breadth lines.
169
+ """
170
+
171
+ lines = ("bulls", "bears")
172
+ params = (
173
+ ("w_method", "jjma"),
174
+ ("start_length", 3),
175
+ ("wphase", 100),
176
+ ("step", 5),
177
+ ("steps_total", 10),
178
+ ("smooth_method", "jjma"),
179
+ ("smooth_length", 3),
180
+ ("smooth_phase", 100),
181
+ ("ipc", "price_close"),
182
+ )
183
+
184
+ def __init__(self):
185
+ """Build the fan of moving averages and breadth smoothing, set min period."""
186
+ price_line = resolve_price_line(self.data, self.p.ipc)
187
+ ma_cls = resolve_ma_class(self.p.w_method)
188
+ smooth_cls = resolve_ma_class(self.p.smooth_method)
189
+ self._periods = [
190
+ int(self.p.start_length + i * self.p.step) for i in range(int(self.p.steps_total) + 1)
191
+ ]
192
+ self._ma_lines = [ma_cls(price_line, period=max(1, p)) for p in self._periods]
193
+ self._bull_smooth = smooth_cls(self.lines.bulls, period=max(1, int(self.p.smooth_length)))
194
+ self._bear_smooth = smooth_cls(self.lines.bears, period=max(1, int(self.p.smooth_length)))
195
+ self.addminperiod(max(self._periods) + int(self.p.smooth_length) + 5)
196
+
197
+ def next(self):
198
+ """Compute and smooth the per-bar bullish/bearish moving-average counts."""
199
+ upsch = 0.0
200
+ dnsch = 0.0
201
+ for ma_line in self._ma_lines:
202
+ if float(ma_line[0]) > float(ma_line[-1]):
203
+ upsch += 1.0
204
+ else:
205
+ dnsch += 1.0
206
+ period = max(1, int(self.p.smooth_length))
207
+ alpha = 2.0 / (period + 1.0)
208
+ prev_bulls = float(self.lines.bulls[-1]) if len(self) > 0 else upsch
209
+ prev_bears = float(self.lines.bears[-1]) if len(self) > 0 else dnsch
210
+ if prev_bulls != prev_bulls:
211
+ prev_bulls = upsch
212
+ if prev_bears != prev_bears:
213
+ prev_bears = dnsch
214
+ self.lines.bulls[0] = alpha * upsch + (1.0 - alpha) * prev_bulls if len(self) > 0 else upsch
215
+ self.lines.bears[0] = alpha * dnsch + (1.0 - alpha) * prev_bears if len(self) > 0 else dnsch
216
+
217
+ def once(self, start, end):
218
+ """Vectorized batch computation of smoothed breadth counts over a range.
219
+
220
+ Args:
221
+ start: First index in the array range to compute.
222
+ end: One past the last index in the array range to compute.
223
+ """
224
+ ma_arrays = [ma_line.array for ma_line in self._ma_lines]
225
+ bulls_line = self.lines.bulls.array
226
+ bears_line = self.lines.bears.array
227
+ for line in (bulls_line, bears_line):
228
+ while len(line) < end:
229
+ line.append(float("nan"))
230
+
231
+ period = max(1, int(self.p.smooth_length))
232
+ alpha = 2.0 / (period + 1.0)
233
+ prev_bulls = None
234
+ prev_bears = None
235
+ actual_end = min([end] + [len(array) for array in ma_arrays])
236
+ for i in range(start, actual_end):
237
+ upsch = 0.0
238
+ dnsch = 0.0
239
+ for ma_array in ma_arrays:
240
+ if i > 0 and float(ma_array[i]) > float(ma_array[i - 1]):
241
+ upsch += 1.0
242
+ else:
243
+ dnsch += 1.0
244
+ bulls = upsch if prev_bulls is None else alpha * upsch + (1.0 - alpha) * prev_bulls
245
+ bears = dnsch if prev_bears is None else alpha * dnsch + (1.0 - alpha) * prev_bears
246
+ bulls_line[i] = bulls
247
+ bears_line[i] = bears
248
+ prev_bulls = bulls
249
+ prev_bears = bears
@@ -0,0 +1,34 @@
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
+ MinusDirectionalIndicator,
11
+ PlusDirectionalIndicator,
12
+ )
13
+
14
+ __all__ = [
15
+ "ADXDMI",
16
+ ]
17
+
18
+
19
+ class ADXDMI(Indicator):
20
+ """DMI direction indicator exposing plus/minus directional values."""
21
+
22
+ lines = ("plus", "minus")
23
+ params = (("period", 14),)
24
+
25
+ def __init__(self):
26
+ """Initialize plus and minus directional sub-indicators."""
27
+ self.addminperiod(int(self.p.period) + 3)
28
+ self.plus_di = PlusDirectionalIndicator(self.data, period=int(self.p.period))
29
+ self.minus_di = MinusDirectionalIndicator(self.data, period=int(self.p.period))
30
+
31
+ def next(self):
32
+ """Write current directional index values to output lines."""
33
+ self.lines.plus[0] = float(self.plus_di[0])
34
+ self.lines.minus[0] = float(self.minus_di[0])
@@ -0,0 +1,34 @@
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
+ "AIAccelerationDecelerationOscillator",
15
+ ]
16
+
17
+
18
+ class AIAccelerationDecelerationOscillator(Indicator):
19
+ """Indicator computing acceleration/deceleration oscillator from SMA spread."""
20
+
21
+ lines = ("ac",)
22
+ params = (
23
+ ("fast", 5),
24
+ ("slow", 34),
25
+ ("signal", 5),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Initialize AC line based on fast/slow/signal SMAs."""
30
+ median = (self.data.high + self.data.low) / 2.0
31
+ ao = SimpleMovingAverage(median, period=self.p.fast) - SimpleMovingAverage(
32
+ median, period=self.p.slow
33
+ )
34
+ self.lines.ac = ao - SimpleMovingAverage(ao, period=self.p.signal)
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import (
11
+ AverageDirectionalMovementIndex,
12
+ Indicator,
13
+ )
14
+
15
+ __all__ = [
16
+ "AltrTrendSignalV22",
17
+ ]
18
+
19
+
20
+ class AltrTrendSignalV22(Indicator):
21
+ """Adaptive trend breakout indicator used by the strategy."""
22
+
23
+ lines = ("sell", "buy")
24
+ params = (
25
+ ("k", 30),
26
+ ("kstop", 0.5),
27
+ ("kperiod", 150),
28
+ ("per_adx", 14),
29
+ )
30
+
31
+ def __init__(self):
32
+ """Create ADX trend indicator and initialize state."""
33
+ self.adx = AverageDirectionalMovementIndex(self.data, period=max(int(self.p.per_adx), 1))
34
+ self.addminperiod(max(int(self.p.per_adx), 1) + 2)
35
+ self._trend = 0
36
+
37
+ def next(self):
38
+ """Compute breakout level and emit short/long trigger values."""
39
+ self.lines.buy[0] = 0.0
40
+ self.lines.sell[0] = 0.0
41
+
42
+ adx_prev = float(self.adx[-1]) if len(self) > 1 else float(self.adx[0])
43
+ if math.isnan(adx_prev) or adx_prev <= 0:
44
+ return
45
+
46
+ ssp = max(int(math.ceil(float(self.p.kperiod) / adx_prev)), 1)
47
+ lookback = min(ssp, len(self.data))
48
+ if lookback <= 0:
49
+ return
50
+
51
+ highs = []
52
+ lows = []
53
+ avg_range = 0.0
54
+ for idx in range(lookback):
55
+ high = float(self.data.high[-idx])
56
+ low = float(self.data.low[-idx])
57
+ highs.append(high)
58
+ lows.append(low)
59
+ avg_range += abs(high - low)
60
+
61
+ trading_range = avg_range / (ssp + 1.0)
62
+ ss_max = max(highs)
63
+ ss_min = min(lows)
64
+ threshold = (ss_max - ss_min) * float(self.p.k) / 100.0
65
+ smin = ss_min + threshold
66
+ smax = ss_max - threshold
67
+
68
+ previous_trend = self._trend
69
+ trend = previous_trend
70
+ close = float(self.data.close[0])
71
+
72
+ if close < smin:
73
+ trend = -1
74
+ if close > smax:
75
+ trend = 1
76
+
77
+ if previous_trend == 0:
78
+ previous_trend = trend
79
+
80
+ if trend != previous_trend and close > smax:
81
+ self.lines.buy[0] = float(self.data.low[0]) - trading_range * float(self.p.kstop)
82
+ if trend != previous_trend and close < smin:
83
+ self.lines.sell[0] = float(self.data.high[0]) + trading_range * float(self.p.kstop)
84
+
85
+ self._trend = trend if trend != 0 else previous_trend
@@ -0,0 +1,115 @@
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
+ )
13
+
14
+ __all__ = [
15
+ "AnchoredMomentumLine",
16
+ "AnchoredMomentumCandleIndicator",
17
+ ]
18
+
19
+
20
+ class AnchoredMomentumLine(Indicator):
21
+ """Anchored Momentum line: EMA-vs-SMA percentage plus a zone classifier."""
22
+
23
+ lines = ("momentum", "zone")
24
+ params = (
25
+ ("mom_period", 8),
26
+ ("smooth_period", 6),
27
+ ("up_level", 0.025),
28
+ ("dn_level", -0.025),
29
+ )
30
+
31
+ def __init__(self):
32
+ """Create the SMA/EMA sub-indicators and set the minimum period."""
33
+ self.sma = SimpleMovingAverage(self.data, period=int(self.p.mom_period))
34
+ self.ema = ExponentialMovingAverage(self.data, period=int(self.p.mom_period))
35
+ self.addminperiod(int(self.p.mom_period) + 2)
36
+
37
+ def next(self):
38
+ """Compute the percentage momentum and assign its up/neutral/down zone."""
39
+ sma = float(self.sma[0])
40
+ if sma == 0:
41
+ momentum = 0.0
42
+ else:
43
+ momentum = 100.0 * (float(self.ema[0]) / sma - 1.0)
44
+ self.lines.momentum[0] = momentum
45
+ if momentum > float(self.p.up_level):
46
+ zone = 2
47
+ elif momentum < float(self.p.dn_level):
48
+ zone = 0
49
+ else:
50
+ zone = 1
51
+ self.lines.zone[0] = zone
52
+
53
+
54
+ class AnchoredMomentumCandleIndicator(Indicator):
55
+ """Synthetic candle from Anchored Momentum on each OHLC price plus colour."""
56
+
57
+ lines = ("a_open", "a_high", "a_low", "a_close", "color")
58
+ params = (
59
+ ("mom_period", 8),
60
+ ("smooth_period", 6),
61
+ ("up_level", 0.025),
62
+ ("dn_level", -0.025),
63
+ )
64
+
65
+ def __init__(self):
66
+ """Create the four per-price Anchored Momentum lines and set min period."""
67
+ self.mom_open = AnchoredMomentumLine(
68
+ self.data.open,
69
+ mom_period=self.p.mom_period,
70
+ smooth_period=self.p.smooth_period,
71
+ up_level=self.p.up_level,
72
+ dn_level=self.p.dn_level,
73
+ )
74
+ self.mom_high = AnchoredMomentumLine(
75
+ self.data.high,
76
+ mom_period=self.p.mom_period,
77
+ smooth_period=self.p.smooth_period,
78
+ up_level=self.p.up_level,
79
+ dn_level=self.p.dn_level,
80
+ )
81
+ self.mom_low = AnchoredMomentumLine(
82
+ self.data.low,
83
+ mom_period=self.p.mom_period,
84
+ smooth_period=self.p.smooth_period,
85
+ up_level=self.p.up_level,
86
+ dn_level=self.p.dn_level,
87
+ )
88
+ self.mom_close = AnchoredMomentumLine(
89
+ self.data.close,
90
+ mom_period=self.p.mom_period,
91
+ smooth_period=self.p.smooth_period,
92
+ up_level=self.p.up_level,
93
+ dn_level=self.p.dn_level,
94
+ )
95
+ self.addminperiod(int(self.p.mom_period) + 2)
96
+
97
+ def next(self):
98
+ """Assemble the momentum candle OHLC and colour for the current bar."""
99
+ o = float(self.mom_open.momentum[0])
100
+ h = max(float(self.mom_high.momentum[0]), o)
101
+ low_price = min(float(self.mom_low.momentum[0]), o)
102
+ c = float(self.mom_close.momentum[0])
103
+ h = max(h, c)
104
+ low_price = min(low_price, c)
105
+ self.lines.a_open[0] = o
106
+ self.lines.a_high[0] = h
107
+ self.lines.a_low[0] = low_price
108
+ self.lines.a_close[0] = c
109
+ if o < c:
110
+ color = 2
111
+ elif o > c:
112
+ color = 0
113
+ else:
114
+ color = 1
115
+ self.lines.color[0] = color
@@ -0,0 +1,82 @@
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 backtrader.utils.dateintern import num2date
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "AnyRangeCldTailIndicator",
14
+ ]
15
+
16
+
17
+ class AnyRangeCldTailIndicator(Indicator):
18
+ """Compute a session-based daily channel and color-state trend signal."""
19
+
20
+ lines = ("color_state", "upper", "lower")
21
+ params = (
22
+ ("time1", "02:00"),
23
+ ("time2", "07:00"),
24
+ )
25
+
26
+ def __init__(self):
27
+ """Initialize session boundaries and window tracking state."""
28
+ self._time1 = self._parse_hhmm(self.p.time1)
29
+ self._time2 = self._parse_hhmm(self.p.time2)
30
+ self._window_start = min(self._time1, self._time2)
31
+ self._window_end = max(self._time1, self._time2)
32
+ self._current_day = None
33
+ self._range_high = None
34
+ self._range_low = None
35
+ self._channel_high = None
36
+ self._channel_low = None
37
+ self._window_finalized = False
38
+ self.addminperiod(2)
39
+
40
+ @staticmethod
41
+ def _parse_hhmm(value):
42
+ hour, minute = value.split(":")
43
+ return int(hour) * 60 + int(minute)
44
+
45
+ def next(self):
46
+ """Update channel bounds and emit color state for the current bar."""
47
+ dt = num2date(self.data.datetime[0])
48
+ day = dt.date()
49
+ minute = dt.hour * 60 + dt.minute
50
+ if self._current_day != day:
51
+ self._current_day = day
52
+ self._range_high = None
53
+ self._range_low = None
54
+ self._channel_high = None
55
+ self._channel_low = None
56
+ self._window_finalized = False
57
+ in_window = self._window_start < minute <= self._window_end
58
+ if in_window:
59
+ high = float(self.data.high[0])
60
+ low = float(self.data.low[0])
61
+ self._range_high = high if self._range_high is None else max(self._range_high, high)
62
+ self._range_low = low if self._range_low is None else min(self._range_low, low)
63
+ elif (
64
+ minute > self._window_end
65
+ and not self._window_finalized
66
+ and self._range_high is not None
67
+ and self._range_low is not None
68
+ ):
69
+ self._channel_high = self._range_high
70
+ self._channel_low = self._range_low
71
+ self._window_finalized = True
72
+ color = 4.0
73
+ if self._channel_high is not None and self._channel_low is not None and not in_window:
74
+ close = float(self.data.close[0])
75
+ open_ = float(self.data.open[0])
76
+ if close > self._channel_high:
77
+ color = 3.0 if close >= open_ else 2.0
78
+ elif close < self._channel_low:
79
+ color = 0.0 if close <= open_ else 1.0
80
+ self.lines.color_state[0] = color
81
+ self.lines.upper[0] = self._channel_high if self._channel_high is not None else float("nan")
82
+ self.lines.lower[0] = self._channel_low if self._channel_low is not None else float("nan")