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,137 @@
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
+ "StepMANRTRIndicator",
12
+ ]
13
+
14
+
15
+ class StepMANRTRIndicator(Indicator):
16
+ """Reconstructs StepMA_NRTR indicator.
17
+
18
+ StepSizeCalc: Volty-based step size from ATR-like calculation.
19
+ StepMACalc: Trend-following MA with NRTR ratchet.
20
+ 4 buffers: UpBuffer(0), DnBuffer(1), BuySignal(2), SellSignal(3).
21
+ Buy when trend flips from down to up. Sell on reverse.
22
+ """
23
+
24
+ lines = ("trend_up", "trend_down", "buy_signal", "sell_signal")
25
+ params = (
26
+ ("length", 10),
27
+ ("kv", 1.0),
28
+ ("step_size", 0),
29
+ ("percentage", 0),
30
+ ("switch", 1),
31
+ )
32
+
33
+ def __init__(self):
34
+ """Initialize rolling state and derived parameters for indicator updates."""
35
+ self._length = int(self.p.length)
36
+ self._kv = float(self.p.kv)
37
+ self._step_size = int(self.p.step_size)
38
+ self._percentage = float(self.p.percentage)
39
+ self._switch = int(self.p.switch) # 0=Close, 1=HighLow
40
+ self._trend0 = 0
41
+ self._trend1 = 0
42
+ self._trend1_ = 0
43
+ self._smax1 = 0.0
44
+ self._smin1 = 0.0
45
+ self._first = True
46
+ self.addminperiod(self._length + 3)
47
+
48
+ def _step_size_calc(self, bar_idx):
49
+ length = self._length
50
+ kv = self._kv
51
+ if self._step_size > 0:
52
+ return self._step_size
53
+ # Volty calculation: average of high-low ranges
54
+ total = 0.0
55
+ for i in range(length):
56
+ h = float(self.data.high[-i])
57
+ low_price = float(self.data.low[-i])
58
+ total += h - low_price
59
+ avg = total / length if length > 0 else 0
60
+ # Convert to points-like value
61
+ step = avg * kv / self.data.close[0] * 10000 if self.data.close[0] != 0 else 0
62
+ return max(step, 1)
63
+
64
+ def _step_ma_calc(self):
65
+ step = self._step_size_calc(0)
66
+ point = float(self.data.close[0]) / 10000.0 if float(self.data.close[0]) > 10 else 0.0001
67
+ size_p = step * point
68
+ size_2p = size_p * 2
69
+
70
+ cur_high = float(self.data.high[0])
71
+ cur_low = float(self.data.low[0])
72
+ cur_close = float(self.data.close[0])
73
+
74
+ if self._first:
75
+ self._trend1 = 0
76
+ self._smax1 = cur_low + size_2p
77
+ self._smin1 = cur_high - size_2p
78
+ self._first = False
79
+
80
+ if self._switch: # HighLow mode
81
+ smax0 = cur_high - size_2p
82
+ smin0 = cur_low + size_2p
83
+ else:
84
+ smax0 = cur_close + size_2p
85
+ smin0 = cur_close - size_2p
86
+
87
+ self._trend0 = self._trend1
88
+
89
+ if cur_close > self._smax1:
90
+ self._trend0 = 1
91
+ if cur_close < self._smin1:
92
+ self._trend0 = -1
93
+
94
+ if self._trend0 > 0:
95
+ if smin0 < self._smin1:
96
+ smin0 = self._smin1
97
+ result = smin0 + size_p
98
+ else:
99
+ if smax0 > self._smax1:
100
+ smax0 = self._smax1
101
+ result = smax0 - size_p
102
+
103
+ self._trend1_ = self._trend1
104
+ self._smax1 = smax0
105
+ self._smin1 = smin0
106
+ self._trend1 = self._trend0
107
+
108
+ return result, size_p
109
+
110
+ def next(self):
111
+ """Compute trend-up/down lines and buy/sell trigger levels for this bar."""
112
+ result, size_p = self._step_ma_calc()
113
+ ratio = self._percentage / 100.0 if self._percentage > 0 else 0
114
+ step = self._step_size_calc(0)
115
+ if step > 0:
116
+ result += ratio / step
117
+
118
+ tu = 0.0
119
+ td = 0.0
120
+ bs = 0.0
121
+ ss = 0.0
122
+
123
+ point = float(self.data.close[0]) / 10000.0 if float(self.data.close[0]) > 10 else 0.0001
124
+
125
+ if self._trend0 > 0:
126
+ tu = result - step * point
127
+ if self._trend1_ < 0:
128
+ bs = tu
129
+ if self._trend0 < 0:
130
+ td = result + step * point
131
+ if self._trend1_ > 0:
132
+ ss = td
133
+
134
+ self.lines.trend_up[0] = tu
135
+ self.lines.trend_down[0] = td
136
+ self.lines.buy_signal[0] = bs
137
+ self.lines.sell_signal[0] = ss
@@ -0,0 +1,143 @@
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
+ "StochasticHistogramIndicator",
12
+ ]
13
+
14
+
15
+ class StochasticHistogramIndicator(Indicator):
16
+ """Stochastic-based indicator with a smoothed main line, signal line, and color state.
17
+
18
+ The indicator outputs:
19
+ - ``main``: smoothed %K values.
20
+ - ``signal``: smoothed trigger line derived from main.
21
+ - ``hist_base``: fixed base reference line (50.0).
22
+ - ``color_state``: 0 for overbought, 1 for neutral, 2 for oversold.
23
+ """
24
+
25
+ lines = ("main", "signal", "hist_base", "color_state")
26
+ params = (
27
+ ("k_period", 5),
28
+ ("d_period", 3),
29
+ ("slowing", 3),
30
+ ("ma_method", "sma"),
31
+ ("high_level", 60),
32
+ ("low_level", 40),
33
+ )
34
+
35
+ def __init__(self):
36
+ """Set the minimum required bars from K, slowing, and D periods."""
37
+ self.addminperiod(int(self.p.k_period) + int(self.p.slowing) + int(self.p.d_period) + 2)
38
+
39
+ def _fast_k_at(self, i, high_array, low_array, close_array):
40
+ period = max(1, int(self.p.k_period))
41
+ if i - period + 1 < 0:
42
+ return float("nan")
43
+ lowest = min(float(low_array[idx]) for idx in range(i - period + 1, i + 1))
44
+ highest = max(float(high_array[idx]) for idx in range(i - period + 1, i + 1))
45
+ denom = highest - lowest
46
+ return 100.0 * (float(close_array[i]) - lowest) / denom if denom else 50.0
47
+
48
+ def _ma_value(self, values, period, previous=None):
49
+ if not values:
50
+ return float("nan")
51
+ mode = str(self.p.ma_method).strip().lower()
52
+ value = float(values[-1])
53
+ if mode in {"ema", "mode_ema"}:
54
+ if previous is None or previous != previous:
55
+ return value
56
+ alpha = 2.0 / (period + 1.0)
57
+ return previous + alpha * (value - previous)
58
+ if mode in {"smma", "mode_smma"}:
59
+ if previous is None or previous != previous:
60
+ return value
61
+ return ((period - 1.0) * previous + value) / period
62
+ if mode in {"lwma", "wma", "mode_lwma"}:
63
+ weights = list(range(1, len(values) + 1))
64
+ return sum(v * w for v, w in zip(values, weights)) / sum(weights)
65
+ return sum(values) / len(values)
66
+
67
+ def next(self):
68
+ """Compute indicator values for one new bar in Backtrader streaming mode."""
69
+ k_period = max(1, int(self.p.k_period))
70
+ slowing = max(1, int(self.p.slowing))
71
+ d_period = max(1, int(self.p.d_period))
72
+ fast_values = []
73
+ for ago in range(slowing - 1, -1, -1):
74
+ if len(self.data) <= ago + k_period - 1:
75
+ return
76
+ low_values = [float(self.data.low[-ago - shift]) for shift in range(k_period)]
77
+ high_values = [float(self.data.high[-ago - shift]) for shift in range(k_period)]
78
+ lowest = min(low_values)
79
+ highest = max(high_values)
80
+ denom = highest - lowest
81
+ fast_values.append(
82
+ 100.0 * (float(self.data.close[-ago]) - lowest) / denom if denom else 50.0
83
+ )
84
+ prev_main = float(self.lines.main[-1]) if len(self) > 1 else None
85
+ prev_signal = float(self.lines.signal[-1]) if len(self) > 1 else None
86
+ main = self._ma_value(fast_values, slowing, prev_main)
87
+ self.lines.main[0] = main
88
+ signal_values = [
89
+ float(self.lines.main[-ago]) for ago in range(min(len(self), d_period) - 1, 0, -1)
90
+ ]
91
+ signal_values.append(main)
92
+ self.lines.signal[0] = self._ma_value(signal_values, d_period, prev_signal)
93
+ color = 1.0
94
+ if main > float(self.p.high_level):
95
+ color = 0.0
96
+ elif main < float(self.p.low_level):
97
+ color = 2.0
98
+ self.lines.color_state[0] = color
99
+ self.lines.hist_base[0] = 50.0
100
+
101
+ def once(self, start, end):
102
+ """Compute indicator arrays for run-once mode from ``start`` to ``end`` indices."""
103
+ high_array = self.data.high.array
104
+ low_array = self.data.low.array
105
+ close_array = self.data.close.array
106
+ main_line = self.lines.main.array
107
+ signal_line = self.lines.signal.array
108
+ hist_base_line = self.lines.hist_base.array
109
+ color_state_line = self.lines.color_state.array
110
+ for line in (main_line, signal_line, hist_base_line, color_state_line):
111
+ while len(line) < end:
112
+ line.append(float("nan"))
113
+
114
+ slowing = max(1, int(self.p.slowing))
115
+ d_period = max(1, int(self.p.d_period))
116
+ actual_end = min(end, len(high_array), len(low_array), len(close_array))
117
+ fast_values = [
118
+ self._fast_k_at(i, high_array, low_array, close_array) for i in range(actual_end)
119
+ ]
120
+ main_values = []
121
+ signal_values_all = []
122
+ prev_main = None
123
+ prev_signal = None
124
+ for i in range(actual_end):
125
+ main_start = max(0, i - slowing + 1)
126
+ main = self._ma_value(fast_values[main_start : i + 1], slowing, prev_main)
127
+ main_values.append(main)
128
+ prev_main = main
129
+ signal_start = max(0, i - d_period + 1)
130
+ signal = self._ma_value(main_values[signal_start : i + 1], d_period, prev_signal)
131
+ signal_values_all.append(signal)
132
+ prev_signal = signal
133
+ if i < start:
134
+ continue
135
+ main_line[i] = main
136
+ signal_line[i] = signal_values_all[i]
137
+ color = 1.0
138
+ if main > float(self.p.high_level):
139
+ color = 0.0
140
+ elif main < float(self.p.low_level):
141
+ color = 2.0
142
+ color_state_line[i] = color
143
+ hist_base_line[i] = 50.0
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ExponentialMovingAverage,
10
+ Indicator,
11
+ SimpleMovingAverage,
12
+ SmoothedMovingAverage,
13
+ WeightedMovingAverage,
14
+ )
15
+
16
+ __all__ = [
17
+ "T3AlarmIndicator",
18
+ ]
19
+
20
+
21
+ class T3AlarmIndicator(Indicator):
22
+ """Double-smoothed MA slope indicator emitting direction and reversal alarms."""
23
+
24
+ lines = ("ma2", "direction", "buy_sig", "sell_sig")
25
+ params = (
26
+ ("ma_period", 19),
27
+ ("ma_shift", 0),
28
+ ("ma_method", "ema"),
29
+ ("ma_price", "close"),
30
+ )
31
+
32
+ def __init__(self):
33
+ """Build the twice-applied moving average and reset the prior direction."""
34
+ price = self._price_line(self.p.ma_price)
35
+ ma_cls = self._ma_class(self.p.ma_method)
36
+ ma1 = ma_cls(price, period=self.p.ma_period)
37
+ self.lines.ma2 = ma_cls(ma1, period=self.p.ma_period)
38
+ self._ma_shift = int(self.p.ma_shift)
39
+ self._prev_direction = 0
40
+
41
+ def next(self):
42
+ """Update the direction line and raise buy/sell alarms on slope flips."""
43
+ shift = self._ma_shift
44
+ ma2_curr = self.lines.ma2[-shift] if shift > 0 else self.lines.ma2[0]
45
+ ma2_prev = self.lines.ma2[-(shift + 1)] if True else self.lines.ma2[-1]
46
+
47
+ if ma2_curr > ma2_prev:
48
+ direction = 1
49
+ elif ma2_curr < ma2_prev:
50
+ direction = -1
51
+ else:
52
+ direction = self._prev_direction
53
+
54
+ prev_dir = self._prev_direction
55
+ self._prev_direction = direction
56
+ self.lines.direction[0] = float(direction)
57
+ self.lines.buy_sig[0] = 1.0 if (direction == 1 and prev_dir == -1) else 0.0
58
+ self.lines.sell_sig[0] = 1.0 if (direction == -1 and prev_dir == 1) else 0.0
59
+
60
+ def once(self, start, end):
61
+ """Vectorised batch evaluation of direction and alarm lines.
62
+
63
+ Args:
64
+ start: Inclusive start index of the range to fill.
65
+ end: Exclusive end index of the range to fill.
66
+ """
67
+ ma2 = self.lines.ma2.array
68
+ direction_line = self.lines.direction.array
69
+ buy_line = self.lines.buy_sig.array
70
+ sell_line = self.lines.sell_sig.array
71
+ for line in (direction_line, buy_line, sell_line):
72
+ while len(line) < end:
73
+ line.append(float("nan"))
74
+
75
+ shift = self._ma_shift
76
+ prev_direction = 0
77
+ actual_end = min(end, len(ma2))
78
+ for i in range(start, actual_end):
79
+ curr_idx = i - shift if shift > 0 else i
80
+ prev_idx = i - shift - 1
81
+ if curr_idx < 0 or prev_idx < 0:
82
+ direction = prev_direction
83
+ else:
84
+ ma2_curr = ma2[curr_idx]
85
+ ma2_prev = ma2[prev_idx]
86
+ if ma2_curr > ma2_prev:
87
+ direction = 1
88
+ elif ma2_curr < ma2_prev:
89
+ direction = -1
90
+ else:
91
+ direction = prev_direction
92
+
93
+ prev_dir = prev_direction
94
+ prev_direction = direction
95
+ direction_line[i] = float(direction)
96
+ buy_line[i] = 1.0 if (direction == 1 and prev_dir == -1) else 0.0
97
+ sell_line[i] = 1.0 if (direction == -1 and prev_dir == 1) else 0.0
98
+ self._prev_direction = prev_direction
99
+
100
+ def _ma_class(self, method):
101
+ name = str(method).lower()
102
+ mapping = {
103
+ "sma": SimpleMovingAverage,
104
+ "ema": ExponentialMovingAverage,
105
+ "smma": SmoothedMovingAverage,
106
+ "lwma": WeightedMovingAverage,
107
+ "wma": WeightedMovingAverage,
108
+ }
109
+ return mapping.get(name, ExponentialMovingAverage)
110
+
111
+ def _price_line(self, price_name):
112
+ name = str(price_name).lower()
113
+ if name == "open":
114
+ return self.data.open
115
+ if name == "high":
116
+ return self.data.high
117
+ if name == "low":
118
+ return self.data.low
119
+ if name == "median":
120
+ return (self.data.high + self.data.low) / 2.0
121
+ if name == "typical":
122
+ return (self.data.high + self.data.low + self.data.close) / 3.0
123
+ if name == "weighted":
124
+ return (self.data.high + self.data.low + self.data.close + self.data.close) / 4.0
125
+ return self.data.close
@@ -0,0 +1,76 @@
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 backtrader.functions as btfunc
9
+
10
+ from .. import (
11
+ EMA,
12
+ Indicator,
13
+ )
14
+
15
+ __all__ = [
16
+ "T3Average",
17
+ "T3Trix",
18
+ ]
19
+
20
+
21
+ class T3Average(Indicator):
22
+ """Tillson T3 moving average built from a six-stage EMA cascade."""
23
+
24
+ lines = ("t3",)
25
+ params = (
26
+ ("period", 10),
27
+ ("vfactor", 0.7),
28
+ )
29
+
30
+ def __init__(self):
31
+ """Build the six EMA stages and combine them into the T3 line.
32
+
33
+ Side effects:
34
+ Creates the cascade of six EMAs and assigns ``t3`` as the
35
+ volume-factor-weighted combination of the third through sixth stages.
36
+ """
37
+ period = max(int(self.p.period), 1)
38
+ vfactor = min(max(float(self.p.vfactor), 0.0), 1.0)
39
+ e1 = EMA(self.data, period=period)
40
+ e2 = EMA(e1, period=period)
41
+ e3 = EMA(e2, period=period)
42
+ e4 = EMA(e3, period=period)
43
+ e5 = EMA(e4, period=period)
44
+ e6 = EMA(e5, period=period)
45
+
46
+ c1 = -(vfactor**3)
47
+ c2 = 3 * vfactor**2 + 3 * vfactor**3
48
+ c3 = -6 * vfactor**2 - 3 * vfactor - 3 * vfactor**3
49
+ c4 = 1 + 3 * vfactor + vfactor**3 + 3 * vfactor**2
50
+ self.l.t3 = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
51
+
52
+
53
+ class T3Trix(Indicator):
54
+ """TRIX-style oscillator built from fast and slow T3 rate-of-change lines."""
55
+
56
+ lines = ("fast", "slow", "hist")
57
+ params = (
58
+ ("xlength1", 10),
59
+ ("xlength2", 18),
60
+ ("xphase", 70),
61
+ )
62
+
63
+ def __init__(self):
64
+ """Build fast/slow T3 averages and their normalized rate-of-change lines.
65
+
66
+ Side effects:
67
+ Derives the volume factor from ``xphase``, builds the fast and slow
68
+ ``T3Average`` lines, and assigns ``fast``/``slow`` as their per-bar
69
+ relative changes with ``hist`` aliased to ``fast``.
70
+ """
71
+ vfactor = min(max(float(self.p.xphase) / 100.0, 0.0), 1.0)
72
+ fast_t3 = T3Average(self.data.close, period=int(self.p.xlength1), vfactor=vfactor)
73
+ slow_t3 = T3Average(self.data.close, period=int(self.p.xlength2), vfactor=vfactor)
74
+ self.l.fast = btfunc.DivByZero(fast_t3 - fast_t3(-1), fast_t3(-1), zero=0.0)
75
+ self.l.slow = btfunc.DivByZero(slow_t3 - slow_t3(-1), slow_t3(-1), zero=0.0)
76
+ self.l.hist = self.l.fast
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ EMA,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "T3Indicator",
15
+ ]
16
+
17
+
18
+ class T3Indicator(Indicator):
19
+ """Tillson T3 moving average — six cascaded EMAs with volume factor."""
20
+
21
+ lines = ("t3",)
22
+ params = (
23
+ ("period", 4),
24
+ ("vfactor", 0.7),
25
+ )
26
+
27
+ def __init__(self):
28
+ """Build the six cascaded EMAs and the T3 weighted combination line."""
29
+ e1 = EMA(self.data, period=self.p.period)
30
+ e2 = EMA(e1, period=self.p.period)
31
+ e3 = EMA(e2, period=self.p.period)
32
+ e4 = EMA(e3, period=self.p.period)
33
+ e5 = EMA(e4, period=self.p.period)
34
+ e6 = EMA(e5, period=self.p.period)
35
+ v = self.p.vfactor
36
+ c1 = -(v * v * v)
37
+ c2 = 3 * v * v + 3 * v * v * v
38
+ c3 = -6 * v * v - 3 * v - 3 * v * v * v
39
+ c4 = 1 + 3 * v + v * v * v + 3 * v * v
40
+ self.lines.t3 = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ATR,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "The20sV020Signal",
15
+ ]
16
+
17
+
18
+ class The20sV020Signal(Indicator):
19
+ """Reversal signal from prior-bar 20% zones with an ATR-offset entry."""
20
+
21
+ lines = ("sell", "buy")
22
+ params = (
23
+ ("alg", "MODE_1"),
24
+ ("level", 100),
25
+ ("ratio", 0.2),
26
+ ("direct", False),
27
+ ("atr_period", 15),
28
+ ("point", 0.01),
29
+ )
30
+
31
+ def __init__(self):
32
+ """Build the ATR sub-indicator and set the warm-up minimum period."""
33
+ self.atr = ATR(self.data, period=max(int(self.p.atr_period), 1))
34
+ self.addminperiod(max(int(self.p.atr_period), 5) + 6)
35
+
36
+ def next(self):
37
+ """Emit buy/sell signal levels from the prior-bar 20% zone logic.
38
+
39
+ Resets both lines to zero, and once enough bars exist computes the
40
+ prior-bar range, its upper/lower 20% zones, and the ATR. Under MODE_1 it
41
+ flags a reversal when the previous bar spans the band and the current bar
42
+ breaks beyond it by the level threshold; under MODE_2 it uses a three-bar
43
+ expansion-then-inside pattern. The ``direct`` flag optionally swaps the
44
+ buy and sell outputs.
45
+ """
46
+ self.lines.buy[0] = 0.0
47
+ self.lines.sell[0] = 0.0
48
+
49
+ if len(self.data) < 6:
50
+ return
51
+
52
+ dlevel = float(self.p.level) * float(self.p.point)
53
+ last_range = float(self.data.high[-1]) - float(self.data.low[-1])
54
+ top20 = float(self.data.high[-1]) - last_range * float(self.p.ratio)
55
+ bottom20 = float(self.data.low[-1]) + last_range * float(self.p.ratio)
56
+ atr = float(self.atr[0])
57
+
58
+ raw_buy = 0.0
59
+ raw_sell = 0.0
60
+
61
+ if str(self.p.alg) == "MODE_1":
62
+ if (
63
+ float(self.data.open[-1]) >= top20
64
+ and float(self.data.close[-1]) <= bottom20
65
+ and float(self.data.low[0]) <= float(self.data.low[-1]) - dlevel
66
+ ):
67
+ raw_buy = float(self.data.low[0]) - atr * 3.0 / 8.0
68
+ elif (
69
+ float(self.data.open[-1]) <= bottom20
70
+ and float(self.data.close[-1]) >= top20
71
+ and float(self.data.high[0]) >= float(self.data.high[-1]) + dlevel
72
+ ):
73
+ raw_sell = float(self.data.high[0]) + atr * 3.0 / 8.0
74
+ else:
75
+ cond = (
76
+ (float(self.data.high[-4]) - float(self.data.low[-4]) > last_range)
77
+ and (float(self.data.high[-3]) - float(self.data.low[-3]) > last_range)
78
+ and (float(self.data.high[-2]) - float(self.data.low[-2]) > last_range)
79
+ and float(self.data.high[-2]) > float(self.data.high[-1])
80
+ and float(self.data.low[-2]) < float(self.data.low[-1])
81
+ )
82
+ if cond:
83
+ if float(self.data.open[0]) <= bottom20:
84
+ raw_buy = float(self.data.low[0]) - atr * 3.0 / 8.0
85
+ if float(self.data.open[0]) >= top20:
86
+ raw_sell = float(self.data.high[0]) + atr * 3.0 / 8.0
87
+
88
+ if bool(self.p.direct):
89
+ self.lines.buy[0] = raw_buy
90
+ self.lines.sell[0] = raw_sell
91
+ else:
92
+ self.lines.buy[0] = raw_sell
93
+ self.lines.sell[0] = raw_buy
@@ -0,0 +1,70 @@
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
+ "ThreeCandlesIndicator",
12
+ ]
13
+
14
+
15
+ class ThreeCandlesIndicator(Indicator):
16
+ """Indicator producing three-candle reversal signal labels."""
17
+
18
+ lines = ("signal",)
19
+ params = (
20
+ ("max_bar1", 300),
21
+ ("volume_type", "tick"),
22
+ )
23
+
24
+ def __init__(self):
25
+ """Require enough history before the indicator can emit stable signals."""
26
+ self.addminperiod(5)
27
+
28
+ def next(self):
29
+ """Evaluate bullish/bearish setups and emit normalized signal codes."""
30
+ self.lines.signal[0] = 2.0
31
+
32
+ chk_vol = True
33
+ range_points = float(self.data.high[-3] - self.data.low[-3])
34
+ point = float(getattr(self.data, "_point_value", 0.01) or 0.01)
35
+ if point > 0 and range_points / point > float(self.p.max_bar1):
36
+ chk_vol = False
37
+
38
+ bullish_setup = (
39
+ float(self.data.open[-3]) < float(self.data.close[-3])
40
+ and float(self.data.open[-2]) < float(self.data.close[-2])
41
+ and float(self.data.close[-2]) < float(self.data.high[-3])
42
+ and float(self.data.open[-1]) > float(self.data.close[-1])
43
+ and float(self.data.close[-1]) < float(self.data.open[-2])
44
+ )
45
+ bearish_setup = (
46
+ float(self.data.open[-3]) > float(self.data.close[-3])
47
+ and float(self.data.open[-2]) > float(self.data.close[-2])
48
+ and float(self.data.close[-2]) > float(self.data.low[-3])
49
+ and float(self.data.open[-1]) < float(self.data.close[-1])
50
+ and float(self.data.close[-1]) > float(self.data.open[-2])
51
+ )
52
+
53
+ vol_series = self.data.volume
54
+
55
+ def volume_filter_ok():
56
+ if not chk_vol or self.p.volume_type == "none":
57
+ return True
58
+ v3 = float(vol_series[-3])
59
+ v2 = float(vol_series[-2])
60
+ v1 = float(vol_series[-1])
61
+ return v3 < v2 or v1 > v2 or v1 > v3
62
+
63
+ if bullish_setup and volume_filter_ok():
64
+ self.lines.signal[0] = (
65
+ 0.0 if float(self.data.close[0]) < float(self.data.open[0]) else 1.0
66
+ )
67
+ if bearish_setup and volume_filter_ok():
68
+ self.lines.signal[0] = (
69
+ 3.0 if float(self.data.close[0]) < float(self.data.open[0]) else 4.0
70
+ )