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,145 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+ from collections import deque
10
+
11
+ from .. import Indicator
12
+
13
+ __all__ = [
14
+ "XDeMarkerHistogramVolDirectIndicator",
15
+ ]
16
+
17
+
18
+ class XDeMarkerHistogramVolDirectIndicator(Indicator):
19
+ """Indicator that calculates DeMarker histogram zone and direct trend color."""
20
+
21
+ lines = ("value", "color_zone", "color_direct", "upper2", "upper1", "lower1", "lower2")
22
+ params = (
23
+ ("de_marker_period", 14),
24
+ ("volume_type", "tick"),
25
+ ("high_level2", 20),
26
+ ("high_level1", 15),
27
+ ("low_level1", -15),
28
+ ("low_level2", -20),
29
+ ("ma_method", "MODE_SMA_"),
30
+ ("ma_length", 12),
31
+ ("ma_phase", 15),
32
+ )
33
+
34
+ def __init__(self):
35
+ """Initialize de_marker state deques and warm-up period."""
36
+ self._demax = deque(maxlen=max(1, int(self.p.de_marker_period)))
37
+ self._demin = deque(maxlen=max(1, int(self.p.de_marker_period)))
38
+ self._raw = deque(maxlen=max(1, int(self.p.ma_length)))
39
+ self._vol = deque(maxlen=max(1, int(self.p.ma_length)))
40
+ self.addminperiod(max(int(self.p.de_marker_period), int(self.p.ma_length)) + 2)
41
+
42
+ @staticmethod
43
+ def _nan():
44
+ return float("nan")
45
+
46
+ @staticmethod
47
+ def _finite(value):
48
+ return value is not None and math.isfinite(value)
49
+
50
+ def _bar_volume(self):
51
+ volume_type = str(self.p.volume_type).lower()
52
+ if volume_type in {"real", "volume_real", "volume"}:
53
+ raw = float(self.data.openinterest[0])
54
+ if math.isfinite(raw) and raw > 0:
55
+ return raw
56
+ raw = float(self.data.volume[0])
57
+ return raw if math.isfinite(raw) else 0.0
58
+
59
+ def next(self):
60
+ """Compute de_marker-derived raw value, smoothing, and colors."""
61
+ if len(self.data) < 2:
62
+ for line in self.lines:
63
+ line[0] = self._nan()
64
+ return
65
+
66
+ high_now = float(self.data.high[0])
67
+ high_prev = float(self.data.high[-1])
68
+ low_now = float(self.data.low[0])
69
+ low_prev = float(self.data.low[-1])
70
+ vol_now = self._bar_volume()
71
+
72
+ self._demax.append(max(high_now - high_prev, 0.0))
73
+ self._demin.append(max(low_prev - low_now, 0.0))
74
+
75
+ value = self._nan()
76
+ color_zone = self._nan()
77
+ color_direct = (
78
+ self.lines.color_direct[-1]
79
+ if len(self) > 1 and self._finite(self.lines.color_direct[-1])
80
+ else self._nan()
81
+ )
82
+ upper2 = self._nan()
83
+ upper1 = self._nan()
84
+ lower1 = self._nan()
85
+ lower2 = self._nan()
86
+
87
+ if len(self._demax) >= int(self.p.de_marker_period) and len(self._demin) >= int(
88
+ self.p.de_marker_period
89
+ ):
90
+ sum_max = sum(self._demax)
91
+ sum_min = sum(self._demin)
92
+ denom = sum_max + sum_min
93
+ demarker = (sum_max / denom) if denom > 0 else 0.5
94
+ raw = ((demarker * 100.0) - 50.0) * vol_now
95
+ self._raw.append(raw)
96
+ self._vol.append(vol_now)
97
+
98
+ if len(self._raw) >= int(self.p.ma_length) and len(self._vol) >= int(self.p.ma_length):
99
+ if str(self.p.ma_method).upper() != "MODE_SMA_":
100
+ raise ValueError(
101
+ "Current backtrader migration only supports MODE_SMA_ for XDeMarker_Histogram_Vol_Direct"
102
+ )
103
+ value = sum(self._raw) / len(self._raw)
104
+ avg_vol = sum(self._vol) / len(self._vol)
105
+ upper2 = self.p.high_level2 * avg_vol
106
+ upper1 = self.p.high_level1 * avg_vol
107
+ lower1 = self.p.low_level1 * avg_vol
108
+ lower2 = self.p.low_level2 * avg_vol
109
+ if value > upper2:
110
+ color_zone = 0.0
111
+ elif value > upper1:
112
+ color_zone = 1.0
113
+ elif value < lower2:
114
+ color_zone = 4.0
115
+ elif value < lower1:
116
+ color_zone = 3.0
117
+ else:
118
+ color_zone = 2.0
119
+
120
+ prev_value = (
121
+ self.lines.value[-1]
122
+ if len(self) > 1 and self._finite(self.lines.value[-1])
123
+ else self._nan()
124
+ )
125
+ prev_direct = (
126
+ self.lines.color_direct[-1]
127
+ if len(self) > 1 and self._finite(self.lines.color_direct[-1])
128
+ else 1.0
129
+ )
130
+ if not self._finite(prev_value):
131
+ color_direct = prev_direct
132
+ elif value > prev_value:
133
+ color_direct = 0.0
134
+ elif value < prev_value:
135
+ color_direct = 1.0
136
+ else:
137
+ color_direct = prev_direct
138
+
139
+ self.lines.value[0] = value
140
+ self.lines.color_zone[0] = color_zone
141
+ self.lines.color_direct[0] = color_direct
142
+ self.lines.upper2[0] = upper2
143
+ self.lines.upper1[0] = upper1
144
+ self.lines.lower1[0] = lower1
145
+ self.lines.lower2[0] = lower2
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "XFisherIndicator",
14
+ ]
15
+
16
+
17
+ class XFisherIndicator(Indicator):
18
+ """Fisher Transform of Williams %R position with an EMA-smoothed signal line."""
19
+
20
+ lines = ("xfisher", "signal")
21
+ params = (
22
+ ("flength", 7),
23
+ ("ma_length", 5),
24
+ )
25
+
26
+ def __init__(self):
27
+ """Set the warm-up period, recurrence seeds, and EMA smoothing factor."""
28
+ self.addminperiod(self.p.flength + self.p.ma_length + 2)
29
+ self._value_prev = 0.0
30
+ self._fish_prev = 0.0
31
+ self._smooth_prev = None
32
+ self._alpha = 2.0 / (self.p.ma_length + 1.0)
33
+
34
+ def next(self):
35
+ """Compute the smoothed Fisher value and store it with its lagged signal."""
36
+ highs = [float(self.data.high[-i]) for i in range(self.p.flength)]
37
+ lows = [float(self.data.low[-i]) for i in range(self.p.flength)]
38
+ smax = max(highs)
39
+ smin = min(lows)
40
+ spread = smax - smin
41
+ if spread == 0:
42
+ spread = 1e-12
43
+
44
+ price = float(self.data.close[0])
45
+ wpr = (price - smin) / spread
46
+ value = (wpr - 0.5) + 0.67 * self._value_prev
47
+ value = max(min(value, 0.999), -0.999)
48
+
49
+ ratio = (1.0 + value) / (1.0 - value)
50
+ ratio = max(ratio, 1e-7)
51
+ fish = 0.5 * math.log(ratio) + 0.5 * self._fish_prev
52
+ smooth = (
53
+ fish
54
+ if self._smooth_prev is None
55
+ else self._smooth_prev + self._alpha * (fish - self._smooth_prev)
56
+ )
57
+
58
+ prev_smooth = smooth if len(self) <= 1 else float(self.lines.xfisher[-1])
59
+ self.lines.xfisher[0] = smooth
60
+ self.lines.signal[0] = prev_smooth
61
+
62
+ self._value_prev = value
63
+ self._fish_prev = fish
64
+ self._smooth_prev = smooth
@@ -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 Indicator
9
+
10
+ __all__ = [
11
+ "XCCIHistogramVolDirectIndicator",
12
+ ]
13
+
14
+
15
+ class XCCIHistogramVolDirectIndicator(Indicator):
16
+ """Direct XCCI histogram indicator producing smoothed value and color state."""
17
+
18
+ lines = ("color_state", "value")
19
+ params = (
20
+ ("cci_period", 14),
21
+ ("ma_length", 12),
22
+ )
23
+
24
+ def __init__(self):
25
+ """Initialize rolling scaled-history buffers and minimum periods."""
26
+ self._scaled_history = []
27
+ self.addminperiod(max(self.p.cci_period, self.p.ma_length) + 3)
28
+
29
+ def next(self):
30
+ """Compute CCI*volume histogram value and binary color transition."""
31
+ typical_prices = []
32
+ for idx in range(self.p.cci_period):
33
+ typical_prices.append(
34
+ (
35
+ float(self.data.high[-idx])
36
+ + float(self.data.low[-idx])
37
+ + float(self.data.close[-idx])
38
+ )
39
+ / 3.0
40
+ )
41
+ tp_now = typical_prices[0]
42
+ tp_sma = sum(typical_prices) / float(len(typical_prices))
43
+ mean_dev = sum(abs(tp - tp_sma) for tp in typical_prices) / float(len(typical_prices))
44
+ if mean_dev <= 1e-12:
45
+ cci_value = 0.0
46
+ else:
47
+ cci_value = (tp_now - tp_sma) / (0.015 * mean_dev)
48
+ raw = cci_value * float(self.data.volume[0])
49
+ self._scaled_history.append(raw)
50
+ if len(self._scaled_history) > self.p.ma_length:
51
+ self._scaled_history.pop(0)
52
+ current = sum(self._scaled_history) / float(len(self._scaled_history))
53
+ previous = self.lines.value[-1] if len(self) else 0.0
54
+ color = 0.0 if current >= previous else 1.0
55
+ self.lines.value[0] = current
56
+ self.lines.color_state[0] = color
@@ -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
+ "XCCIHistogramVolIndicator",
12
+ ]
13
+
14
+
15
+ class XCCIHistogramVolIndicator(Indicator):
16
+ """Compute volume-scaled XCCI histogram levels and color state."""
17
+
18
+ lines = ("color_state", "value", "max_level", "up_level", "dn_level", "min_level")
19
+ params = (
20
+ ("cci_period", 14),
21
+ ("high_level2", 100),
22
+ ("high_level1", 80),
23
+ ("low_level1", -80),
24
+ ("low_level2", -100),
25
+ ("ma_length", 12),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Initialize rolling CCI and volume histories."""
30
+ self._scaled_history = []
31
+ self._volume_history = []
32
+ self.addminperiod(max(self.p.cci_period, self.p.ma_length) + 3)
33
+
34
+ def next(self):
35
+ """Update scaled CCI, levels, and derived color state."""
36
+ vol = float(self.data.volume[0]) if len(self.data.volume) else 0.0
37
+ typical_prices = []
38
+ for idx in range(self.p.cci_period):
39
+ typical_prices.append(
40
+ (
41
+ float(self.data.high[-idx])
42
+ + float(self.data.low[-idx])
43
+ + float(self.data.close[-idx])
44
+ )
45
+ / 3.0
46
+ )
47
+ tp_now = typical_prices[0]
48
+ tp_sma = sum(typical_prices) / float(len(typical_prices))
49
+ mean_dev = sum(abs(tp - tp_sma) for tp in typical_prices) / float(len(typical_prices))
50
+ if mean_dev <= 1e-12:
51
+ cci_value = 0.0
52
+ else:
53
+ cci_value = (tp_now - tp_sma) / (0.015 * mean_dev)
54
+ raw = cci_value * vol
55
+ self._scaled_history.append(raw)
56
+ self._volume_history.append(vol)
57
+ if len(self._scaled_history) > self.p.ma_length:
58
+ self._scaled_history.pop(0)
59
+ if len(self._volume_history) > self.p.ma_length:
60
+ self._volume_history.pop(0)
61
+ scaled = sum(self._scaled_history) / float(len(self._scaled_history))
62
+ avg_vol = (
63
+ sum(self._volume_history) / float(len(self._volume_history))
64
+ if self._volume_history
65
+ else max(vol, 1.0)
66
+ )
67
+ max_level = self.p.high_level2 * avg_vol
68
+ up_level = self.p.high_level1 * avg_vol
69
+ dn_level = self.p.low_level1 * avg_vol
70
+ min_level = self.p.low_level2 * avg_vol
71
+ clr = 2.0
72
+ if scaled > max_level:
73
+ clr = 0.0
74
+ elif scaled > up_level:
75
+ clr = 1.0
76
+ elif scaled < min_level:
77
+ clr = 4.0
78
+ elif scaled < dn_level:
79
+ clr = 3.0
80
+ self.lines.value[0] = scaled
81
+ self.lines.max_level[0] = max_level
82
+ self.lines.up_level[0] = up_level
83
+ self.lines.dn_level[0] = dn_level
84
+ self.lines.min_level[0] = min_level
85
+ self.lines.color_state[0] = clr
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "XmaIchimoku",
14
+ "TwoXmaIchimokuOscillator",
15
+ ]
16
+
17
+
18
+ class XmaIchimoku(Indicator):
19
+ """Calculate a smoothed midpoint of selected high/low ranges."""
20
+
21
+ lines = ("value",)
22
+
23
+ params = (
24
+ ("up_period", 6),
25
+ ("dn_period", 6),
26
+ ("up_mode", "HIGH"),
27
+ ("dn_mode", "LOW"),
28
+ ("xma_method", "SMA"),
29
+ ("x_length", 25),
30
+ ("x_phase", 15),
31
+ ("price_shift", 0.0),
32
+ )
33
+
34
+ def __init__(self):
35
+ """Initialize Ichimoku-like windows and smoothing helpers."""
36
+ self.addminperiod(
37
+ max(int(self.p.up_period), int(self.p.dn_period)) + int(self.p.x_length) + 5
38
+ )
39
+ self._raw_buf = []
40
+ self._smooth_prev = None
41
+
42
+ def _series_value(self, mode, ago):
43
+ mode = str(mode).upper()
44
+ if mode == "OPEN":
45
+ return float(self.data.open[ago])
46
+ if mode == "LOW":
47
+ return float(self.data.low[ago])
48
+ if mode == "HIGH":
49
+ return float(self.data.high[ago])
50
+ return float(self.data.close[ago])
51
+
52
+ def _smooth_value(self, raw_value):
53
+ method = str(self.p.xma_method).upper()
54
+ if method in ("MODE_SMA_", "SMA"):
55
+ period = max(1, int(self.p.x_length))
56
+ if len(self._raw_buf) < period:
57
+ return raw_value
58
+ return sum(self._raw_buf[-period:]) / float(period)
59
+
60
+ length = max(1, int(self.p.x_length))
61
+ phase = max(-100, min(100, int(self.p.x_phase)))
62
+ alpha = 2.0 / (length + 1.0)
63
+ alpha *= 1.0 + 0.35 * (phase / 100.0)
64
+ alpha = max(0.01, min(0.99, alpha))
65
+ if self._smooth_prev is None or not math.isfinite(self._smooth_prev):
66
+ smooth = raw_value
67
+ else:
68
+ smooth = self._smooth_prev + alpha * (raw_value - self._smooth_prev)
69
+ self._smooth_prev = smooth
70
+ return smooth
71
+
72
+ def next(self):
73
+ """Compute smoothed range midpoint for each bar."""
74
+ up_period = int(self.p.up_period)
75
+ dn_period = int(self.p.dn_period)
76
+ if len(self.data) < max(up_period, dn_period):
77
+ self.lines.value[0] = 0.0
78
+ return
79
+
80
+ highs = [self._series_value(self.p.up_mode, -i) for i in range(up_period)]
81
+ lows = [self._series_value(self.p.dn_mode, -i) for i in range(dn_period)]
82
+ ish_up = max(highs)
83
+ ish_dn = min(lows)
84
+ raw_value = (ish_up + ish_dn) / 2.0
85
+ self._raw_buf.append(raw_value)
86
+ smooth = self._smooth_value(raw_value) + float(self.p.price_shift)
87
+ self.lines.value[0] = smooth
88
+
89
+
90
+ class TwoXmaIchimokuOscillator(Indicator):
91
+ """Combine two XMA windows into oscillator value and color channels."""
92
+
93
+ lines = (
94
+ "line",
95
+ "color",
96
+ )
97
+
98
+ params = (
99
+ ("up_period1", 6),
100
+ ("dn_period1", 6),
101
+ ("up_period2", 9),
102
+ ("dn_period2", 9),
103
+ ("up_mode1", "HIGH"),
104
+ ("dn_mode1", "LOW"),
105
+ ("up_mode2", "HIGH"),
106
+ ("dn_mode2", "LOW"),
107
+ ("xma1_method", "SMA"),
108
+ ("xma2_method", "SMA"),
109
+ ("x_length1", 25),
110
+ ("x_length2", 80),
111
+ ("x_phase", 15),
112
+ ("point", 0.01),
113
+ )
114
+
115
+ def __init__(self):
116
+ """Create two :class:`XmaIchimoku` instances and reset color state."""
117
+ self.xma1 = XmaIchimoku(
118
+ self.data,
119
+ up_period=self.p.up_period1,
120
+ dn_period=self.p.dn_period1,
121
+ up_mode=self.p.up_mode1,
122
+ dn_mode=self.p.dn_mode1,
123
+ xma_method=self.p.xma1_method,
124
+ x_length=self.p.x_length1,
125
+ x_phase=self.p.x_phase,
126
+ )
127
+ self.xma2 = XmaIchimoku(
128
+ self.data,
129
+ up_period=self.p.up_period2,
130
+ dn_period=self.p.dn_period2,
131
+ up_mode=self.p.up_mode2,
132
+ dn_mode=self.p.dn_mode2,
133
+ xma_method=self.p.xma2_method,
134
+ x_length=self.p.x_length2,
135
+ x_phase=self.p.x_phase,
136
+ )
137
+ self._prev_color = 2.0
138
+
139
+ def next(self):
140
+ """Update oscillator value and derived color trend state."""
141
+ point = float(self.p.point) if float(self.p.point) != 0 else 1.0
142
+ line_value = (float(self.xma1[0]) - float(self.xma2[0])) / point
143
+ self.lines.line[0] = line_value
144
+
145
+ if len(self) < 2:
146
+ self.lines.color[0] = 2.0
147
+ self._prev_color = 2.0
148
+ return
149
+
150
+ prev_line = float(self.lines.line[-1])
151
+ color = self._prev_color
152
+ if line_value >= 0:
153
+ if line_value > prev_line:
154
+ color = 0.0
155
+ elif line_value < prev_line:
156
+ color = 1.0
157
+ else:
158
+ if line_value < prev_line:
159
+ color = 4.0
160
+ elif line_value > prev_line:
161
+ color = 3.0
162
+ self.lines.color[0] = color
163
+ self._prev_color = color
@@ -0,0 +1,65 @@
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
+ Highest,
12
+ Indicator,
13
+ Lowest,
14
+ SmoothedMovingAverage,
15
+ WeightedMovingAverage,
16
+ )
17
+
18
+ __all__ = [
19
+ "XMAIshimokuChannelIndicator",
20
+ ]
21
+
22
+
23
+ def resolve_ma_class(name):
24
+ """Resolve a moving-average identifier into a Backtrader indicator class."""
25
+ mode = str(name).lower()
26
+ if mode in {"sma", "mode_sma"}:
27
+ return SMA
28
+ if mode in {"ema", "mode_ema"}:
29
+ return EMA
30
+ if mode in {"smma", "mode_smma"}:
31
+ return SmoothedMovingAverage
32
+ return WeightedMovingAverage
33
+
34
+
35
+ class XMAIshimokuChannelIndicator(Indicator):
36
+ """Compute XMA-smoothed midpoint channel lines."""
37
+
38
+ lines = (
39
+ "mid",
40
+ "upper",
41
+ "lower",
42
+ )
43
+ params = (
44
+ ("up_period", 3),
45
+ ("dn_period", 3),
46
+ ("up_mode", "high"),
47
+ ("dn_mode", "low"),
48
+ ("xma_method", "sma"),
49
+ ("xlength", 100),
50
+ ("xphase", 15),
51
+ ("up_percent", 1.0),
52
+ ("dn_percent", 1.0),
53
+ ("price_shift", 0),
54
+ )
55
+
56
+ def __init__(self):
57
+ """Prepare indicator buffers and min-period for channel outputs."""
58
+ ma_cls = resolve_ma_class(self.p.xma_method)
59
+ highest = Highest(self.data.high, period=self.p.up_period)
60
+ lowest = Lowest(self.data.low, period=self.p.dn_period)
61
+ midpoint = (highest + lowest) / 2.0
62
+ self.lines.mid = ma_cls(midpoint, period=self.p.xlength) + self.p.price_shift
63
+ self.lines.upper = self.lines.mid * (1.0 + self.p.up_percent / 100.0)
64
+ self.lines.lower = self.lines.mid * (1.0 - self.p.dn_percent / 100.0)
65
+ self.addminperiod(max(self.p.up_period, self.p.dn_period, self.p.xlength) + 3)
@@ -0,0 +1,68 @@
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
+ Highest,
12
+ Indicator,
13
+ Lowest,
14
+ SmoothedMovingAverage,
15
+ WeightedMovingAverage,
16
+ )
17
+
18
+ __all__ = [
19
+ "XMAIshimokuLine",
20
+ ]
21
+
22
+
23
+ def resolve_ma_class(name):
24
+ """Map a moving-average name to its backtrader indicator class.
25
+
26
+ Args:
27
+ name: MA type name (e.g. ``sma``, ``ema``, ``smma`` or MT5-style
28
+ ``mode_*`` variants).
29
+
30
+ Returns:
31
+ The matching backtrader moving-average indicator class, defaulting to
32
+ the weighted moving average for unrecognized names.
33
+ """
34
+ mode = str(name).lower()
35
+ if mode in {"sma", "mode_sma"}:
36
+ return SMA
37
+ if mode in {"ema", "mode_ema"}:
38
+ return EMA
39
+ if mode in {"smma", "mode_smma"}:
40
+ return SmoothedMovingAverage
41
+ return WeightedMovingAverage
42
+
43
+
44
+ class XMAIshimokuLine(Indicator):
45
+ """Smoothed Ishimoku-style midprice line.
46
+
47
+ Computes the midpoint of the rolling highest high and lowest low over the
48
+ up/down periods, then smooths it with the configured moving average over
49
+ ``xlength`` to produce a single ``xma`` trend line.
50
+ """
51
+
52
+ lines = ("xma",)
53
+ params = (
54
+ ("up_period", 3),
55
+ ("dn_period", 3),
56
+ ("xma_method", "sma"),
57
+ ("xlength", 8),
58
+ ("xphase", 15),
59
+ )
60
+
61
+ def __init__(self):
62
+ """Build the high/low midpoint and its moving average; set min period."""
63
+ highest = Highest(self.data.high, period=self.p.up_period)
64
+ lowest = Lowest(self.data.low, period=self.p.dn_period)
65
+ midpoint = (highest + lowest) / 2.0
66
+ ma_cls = resolve_ma_class(self.p.xma_method)
67
+ self.lines.xma = ma_cls(midpoint, period=self.p.xlength)
68
+ self.addminperiod(max(self.p.up_period, self.p.dn_period, self.p.xlength) + 3)