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,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
+ import math
9
+
10
+ from .. import (
11
+ ExponentialMovingAverage,
12
+ Indicator,
13
+ SimpleMovingAverage,
14
+ SmoothedMovingAverage,
15
+ WeightedMovingAverage,
16
+ )
17
+
18
+ __all__ = [
19
+ "GOIndicator",
20
+ ]
21
+
22
+
23
+ class GOIndicator(Indicator):
24
+ """Indicator that derives a GO signal from smoothed OHLC components."""
25
+
26
+ lines = ("go",)
27
+ params = (
28
+ ("period", 174),
29
+ ("ma_method", "SMA"),
30
+ )
31
+
32
+ def __init__(self):
33
+ """Build MA buffers for OHLC input series and warmup period.
34
+
35
+ Args:
36
+ None.
37
+
38
+ Returns:
39
+ None.
40
+
41
+ Side effects:
42
+ Creates ``ma_open``, ``ma_high``, ``ma_low``, ``ma_close`` lines.
43
+ """
44
+ ma_cls = {
45
+ "SMA": SimpleMovingAverage,
46
+ "EMA": ExponentialMovingAverage,
47
+ "SMMA": SmoothedMovingAverage,
48
+ "WMA": WeightedMovingAverage,
49
+ }.get(str(self.p.ma_method).upper(), SimpleMovingAverage)
50
+ self.ma_open = ma_cls(self.data.open, period=self.p.period)
51
+ self.ma_high = ma_cls(self.data.high, period=self.p.period)
52
+ self.ma_low = ma_cls(self.data.low, period=self.p.period)
53
+ self.ma_close = ma_cls(self.data.close, period=self.p.period)
54
+ self.addminperiod(int(self.p.period) + 1)
55
+
56
+ def _calc_go(self, ma_open, ma_high, ma_low, ma_close, volume):
57
+ values = (ma_open, ma_high, ma_low, ma_close, volume)
58
+ if not all(math.isfinite(float(v)) for v in values):
59
+ return 0.0
60
+ return (
61
+ (ma_close - ma_open)
62
+ + (ma_high - ma_open)
63
+ + (ma_low - ma_open)
64
+ + (ma_close - ma_low)
65
+ + (ma_close - ma_high)
66
+ ) * volume
67
+
68
+ def next(self):
69
+ """Compute GO for current bar and publish it to ``lines.go``."""
70
+ self.lines.go[0] = self._calc_go(
71
+ float(self.ma_open[0]),
72
+ float(self.ma_high[0]),
73
+ float(self.ma_low[0]),
74
+ float(self.ma_close[0]),
75
+ float(self.data.volume[0]),
76
+ )
77
+
78
+ def once(self, start, end):
79
+ """Compute GO for buffered bars in run-once mode."""
80
+ ma_open = self.ma_open.array
81
+ ma_high = self.ma_high.array
82
+ ma_low = self.ma_low.array
83
+ ma_close = self.ma_close.array
84
+ volume = self.data.volume.array
85
+ go = self.lines.go.array
86
+ for i in range(start, end):
87
+ go[i] = self._calc_go(
88
+ float(ma_open[i]),
89
+ float(ma_high[i]),
90
+ float(ma_low[i]),
91
+ float(ma_close[i]),
92
+ float(volume[i]),
93
+ )
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ Highest,
10
+ Indicator,
11
+ Lowest,
12
+ )
13
+
14
+ __all__ = [
15
+ "HLRIndicator",
16
+ "ZeroLagHLRIndicator",
17
+ ]
18
+
19
+
20
+ class HLRIndicator(Indicator):
21
+ """Base HLR indicator returning a normalized high-low range position."""
22
+
23
+ lines = ("value",)
24
+ params = (("period", 40),)
25
+
26
+ def __init__(self):
27
+ """Initialize highest/lowest trackers and line averaging setup."""
28
+ period = int(self.p.period)
29
+ self.highest = Highest(self.data.high, period=period)
30
+ self.lowest = Lowest(self.data.low, period=period)
31
+ self.mid = (self.data.high + self.data.low) / 2.0
32
+ self.addminperiod(period + 1)
33
+
34
+ def next(self):
35
+ """Compute the HLR oscillator value for current bar."""
36
+ hh = float(self.highest[0])
37
+ ll = float(self.lowest[0])
38
+ span = hh - ll
39
+ self.l.value[0] = 0.0 if span == 0.0 else 100.0 * ((float(self.mid[0]) - ll) / span)
40
+
41
+
42
+ class ZeroLagHLRIndicator(Indicator):
43
+ """Zero-lag variant of HLR computed from a blended set of HLR periods."""
44
+
45
+ lines = ("fast", "slow")
46
+ params = (
47
+ ("smoothing", 15),
48
+ ("factor1", 0.05),
49
+ ("hlr_period1", 8),
50
+ ("factor2", 0.1),
51
+ ("hlr_period2", 21),
52
+ ("factor3", 0.16),
53
+ ("hlr_period3", 34),
54
+ ("factor4", 0.26),
55
+ ("hlr_period4", 55),
56
+ ("factor5", 0.43),
57
+ ("hlr_period5", 89),
58
+ ("preserve_source_hlr3_weight", True),
59
+ )
60
+
61
+ def __init__(self):
62
+ """Instantiate source HLR components and initialize smoothing state."""
63
+ self.hlr1 = HLRIndicator(self.data, period=int(self.p.hlr_period1))
64
+ self.hlr2 = HLRIndicator(self.data, period=int(self.p.hlr_period2))
65
+ self.hlr3 = HLRIndicator(self.data, period=int(self.p.hlr_period3))
66
+ self.hlr4 = HLRIndicator(self.data, period=int(self.p.hlr_period4))
67
+ self.hlr5 = HLRIndicator(self.data, period=int(self.p.hlr_period5))
68
+ self.smooth_const = (float(self.p.smoothing) - 1.0) / float(self.p.smoothing)
69
+ self.hlr3_weight = float(
70
+ self.p.factor2 if self.p.preserve_source_hlr3_weight else self.p.factor3
71
+ )
72
+ max_period = max(
73
+ int(self.p.hlr_period1),
74
+ int(self.p.hlr_period2),
75
+ int(self.p.hlr_period3),
76
+ int(self.p.hlr_period4),
77
+ int(self.p.hlr_period5),
78
+ )
79
+ self.addminperiod((3 * max_period) + 3)
80
+
81
+ def next(self):
82
+ """Update fast and smoothed slow HLR outputs."""
83
+ fast = (
84
+ float(self.p.factor1) * float(self.hlr1.value[0])
85
+ + float(self.p.factor2) * float(self.hlr2.value[0])
86
+ + self.hlr3_weight * float(self.hlr3.value[0])
87
+ + float(self.p.factor4) * float(self.hlr4.value[0])
88
+ + float(self.p.factor5) * float(self.hlr5.value[0])
89
+ )
90
+ if len(self) <= 1:
91
+ slow = fast / float(self.p.smoothing)
92
+ else:
93
+ slow = (fast / float(self.p.smoothing)) + (float(self.l.slow[-1]) * self.smooth_const)
94
+ self.l.fast[0] = fast
95
+ self.l.slow[0] = slow
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ Indicator,
10
+ WeightedMovingAverage,
11
+ )
12
+
13
+ __all__ = [
14
+ "HMA",
15
+ "OsHMAIndicator",
16
+ ]
17
+
18
+
19
+ class HMA(Indicator):
20
+ """Hull Moving Average indicator used by OsHMA."""
21
+
22
+ lines = ("hma",)
23
+ params = (("period", 13),)
24
+
25
+ def __init__(self):
26
+ """Initialize the HMA with smoothed weighted moving averages."""
27
+ half = max(1, int(self.p.period // 2))
28
+ sqrt_period = max(1, int(self.p.period**0.5))
29
+ wma_half = WeightedMovingAverage(self.data, period=half)
30
+ wma_full = WeightedMovingAverage(self.data, period=int(self.p.period))
31
+ diff = (2.0 * wma_half) - wma_full
32
+ self.lines.hma = WeightedMovingAverage(diff, period=sqrt_period)
33
+ self.addminperiod(int(self.p.period) + sqrt_period + 3)
34
+
35
+
36
+ class OsHMAIndicator(Indicator):
37
+ """Histogram indicator that combines fast and slow HMA lines."""
38
+
39
+ lines = ("hist",)
40
+ params = (
41
+ ("fast_hma", 13),
42
+ ("slow_hma", 26),
43
+ )
44
+
45
+ def __init__(self):
46
+ """Initialize fast and slow HMA sub-indicators and histogram output."""
47
+ fast = HMA(self.data.close, period=self.p.fast_hma)
48
+ slow = HMA(self.data.close, period=self.p.slow_hma)
49
+ self.lines.hist = fast.hma - slow.hma
50
+ self.addminperiod(max(self.p.fast_hma, self.p.slow_hma) + int(self.p.slow_hma**0.5) + 5)
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import Indicator
9
+
10
+ __all__ = [
11
+ "I4DRFV2",
12
+ ]
13
+
14
+
15
+ class I4DRFV2(Indicator):
16
+ """Close-difference indicator producing value and binary color trend state."""
17
+
18
+ lines = ("color", "value")
19
+ params = (("period", 11),)
20
+
21
+ def __init__(self):
22
+ """Initialize the minimum period requirement."""
23
+ self.addminperiod(int(self.p.period) + 2)
24
+
25
+ def next(self):
26
+ """Compute current indicator value and color."""
27
+ total = 0.0
28
+ period = int(self.p.period)
29
+ for i in range(period):
30
+ diff = float(self.data.close[-i]) - float(self.data.close[-(i + 1)])
31
+ total += 1.0 if diff > 0 else -1.0
32
+ value = total / float(period) * 100.0
33
+ self.lines.value[0] = value
34
+ self.lines.color[0] = 1.0 if value > 0 else 0.0
@@ -0,0 +1,38 @@
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
+ "I4DRFV3",
12
+ ]
13
+
14
+
15
+ class I4DRFV3(Indicator):
16
+ """Indicator producing a direction color and synthetic value from highs/lows."""
17
+
18
+ lines = ("color", "value")
19
+ params = (("period", 11),)
20
+
21
+ def __init__(self):
22
+ """Initialize minimum history and derived signal parameters."""
23
+ self.addminperiod(int(self.p.period) + 2)
24
+
25
+ def next(self):
26
+ """Calculate directional value and color for the current bar."""
27
+ total = 0.0
28
+ period = int(self.p.period)
29
+ for i in range(period):
30
+ high_diff = float(self.data.high[-i]) - float(self.data.high[-(i + 1)])
31
+ low_diff = float(self.data.low[-i]) - float(self.data.low[-(i + 1)])
32
+ if high_diff > 0:
33
+ total += 1.0
34
+ if low_diff < 0:
35
+ total -= 1.0
36
+ value = total / float(period) * 100.0
37
+ self.lines.value[0] = value
38
+ self.lines.color[0] = 1.0 if value > 0 else 0.0
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ExponentialMovingAverage,
10
+ Indicator,
11
+ SimpleMovingAverage,
12
+ )
13
+
14
+ __all__ = [
15
+ "IAnchMomIndicator",
16
+ ]
17
+
18
+
19
+ def get_price_line(data, price_mode):
20
+ """Select an applied-price line from a data feed by mode name.
21
+
22
+ Args:
23
+ data: The backtrader data feed providing OHLC lines.
24
+ price_mode: Applied-price mode (e.g. ``'close'``, ``'median'``,
25
+ ``'typical'``, ``'weighted'``); case-insensitive.
26
+
27
+ Returns:
28
+ The selected price line or a derived combination of OHLC lines.
29
+
30
+ Raises:
31
+ ValueError: If ``price_mode`` is not recognised.
32
+ """
33
+ mode = str(price_mode).lower()
34
+ if mode in ("close", "price_close", "price_close_"):
35
+ return data.close
36
+ if mode in ("open", "price_open", "price_open_"):
37
+ return data.open
38
+ if mode in ("high", "price_high", "price_high_"):
39
+ return data.high
40
+ if mode in ("low", "price_low", "price_low_"):
41
+ return data.low
42
+ if mode in ("median", "price_median", "price_median_"):
43
+ return (data.high + data.low) / 2.0
44
+ if mode in ("typical", "price_typical", "price_typical_"):
45
+ return (data.high + data.low + data.close) / 3.0
46
+ if mode in ("weighted", "price_weighted", "price_weighted_"):
47
+ return (data.high + data.low + data.close + data.close) / 4.0
48
+ raise ValueError(f"Unsupported price mode: {price_mode}")
49
+
50
+
51
+ class IAnchMomIndicator(Indicator):
52
+ """Anchored-momentum oscillator: percentage gap of a fast EMA over a slow SMA."""
53
+
54
+ lines = ("value",)
55
+ params = (
56
+ ("sma_period", 34),
57
+ ("ema_period", 20),
58
+ ("price_type", "close"),
59
+ )
60
+
61
+ def __init__(self):
62
+ """Build the SMA and EMA of the applied price and set the warm-up period."""
63
+ price = get_price_line(self.data, self.p.price_type)
64
+ self.sma = SimpleMovingAverage(price, period=int(self.p.sma_period))
65
+ self.ema = ExponentialMovingAverage(price, period=int(self.p.ema_period))
66
+ self.addminperiod(int(self.p.sma_period) + 2)
67
+
68
+ def next(self):
69
+ """Emit the percentage gap ``100 * (ema / sma - 1)`` for the current bar."""
70
+ sma = float(self.sma[0])
71
+ ema = float(self.ema[0])
72
+ self.l.value[0] = 0.0 if sma == 0.0 else 100.0 * ((ema / sma) - 1.0)
@@ -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
+ from .. import (
9
+ ATR,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "IDeMarkerSignIndicator",
15
+ ]
16
+
17
+
18
+ class IDeMarkerSignIndicator(Indicator):
19
+ """DeMarker oscillator that emits buy/sell triggers on level crossings."""
20
+
21
+ lines = ("sell", "buy", "demarker", "atr")
22
+ params = (
23
+ ("atr_period", 14),
24
+ ("demarker_period", 14),
25
+ ("up_level", 0.7),
26
+ ("dn_level", 0.3),
27
+ )
28
+
29
+ def __init__(self):
30
+ """Build the ATR sub-indicator and set the minimum warmup period."""
31
+ self._atr = ATR(self.data, period=int(self.p.atr_period))
32
+ self.addminperiod(max(int(self.p.atr_period), int(self.p.demarker_period) + 1) + 2)
33
+
34
+ def _calc_demarker(self):
35
+ period = int(self.p.demarker_period)
36
+ demax_sum = 0.0
37
+ demin_sum = 0.0
38
+ for i in range(period):
39
+ high0 = float(self.data.high[-i])
40
+ high1 = float(self.data.high[-(i + 1)])
41
+ low0 = float(self.data.low[-i])
42
+ low1 = float(self.data.low[-(i + 1)])
43
+ demax_sum += max(high0 - high1, 0.0)
44
+ demin_sum += max(low1 - low0, 0.0)
45
+ denom = demax_sum + demin_sum
46
+ if denom == 0.0:
47
+ return 0.5
48
+ return demax_sum / denom
49
+
50
+ def next(self):
51
+ """Compute the DeMarker value and set buy/sell triggers on crossings."""
52
+ self.lines.sell[0] = float("nan")
53
+ self.lines.buy[0] = float("nan")
54
+ demarker_now = self._calc_demarker()
55
+ self.lines.demarker[0] = demarker_now
56
+ self.lines.atr[0] = float(self._atr[0])
57
+ if len(self) < 2:
58
+ return
59
+ demarker_prev = float(self.lines.demarker[-1])
60
+ atr_now = float(self._atr[0])
61
+ if demarker_now > float(self.p.dn_level) and demarker_prev <= float(self.p.dn_level):
62
+ self.lines.buy[0] = float(self.data.low[0]) - atr_now * 3.0 / 8.0
63
+ if demarker_now < float(self.p.up_level) and demarker_prev >= float(self.p.up_level):
64
+ self.lines.sell[0] = float(self.data.high[0]) + atr_now * 3.0 / 8.0
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ATR,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "IGapIndicator",
15
+ ]
16
+
17
+
18
+ class IGapIndicator(Indicator):
19
+ """Detect opening gaps and emit ATR-offset buy/sell arrow levels."""
20
+
21
+ lines = ("sell_signal", "buy_signal", "atr_value")
22
+ params = (
23
+ ("size_gap", 5),
24
+ ("point", 0.01),
25
+ ("atr_period", 15),
26
+ )
27
+
28
+ def __init__(self):
29
+ """Set the warm-up period, build the ATR, and cache the gap distance."""
30
+ self.addminperiod(int(self.p.atr_period) + int(self.p.size_gap) + 4)
31
+ self.atr = ATR(self.data, period=int(self.p.atr_period))
32
+ self.gap_distance = float(self.p.size_gap) * float(self.p.point)
33
+
34
+ def next(self):
35
+ """Emit buy/sell arrow levels when the prior close gaps past the open."""
36
+ self.lines.sell_signal[0] = 0.0
37
+ self.lines.buy_signal[0] = 0.0
38
+ atr_value = float(self.atr[0])
39
+ self.lines.atr_value[0] = atr_value
40
+ if len(self.data) < 2:
41
+ return
42
+ if float(self.data.close[-1]) > float(self.data.open[0]) + self.gap_distance:
43
+ self.lines.buy_signal[0] = float(self.data.low[0]) - atr_value * 3.0 / 8.0
44
+ if float(self.data.close[-1]) < float(self.data.open[0]) - self.gap_distance:
45
+ self.lines.sell_signal[0] = float(self.data.high[0]) + atr_value * 3.0 / 8.0
@@ -0,0 +1,77 @@
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
+ "IStochKomposterIndicator",
15
+ ]
16
+
17
+
18
+ class IStochKomposterIndicator(Indicator):
19
+ """Stochastic-and-ATR composite that prints offset buy/sell markers.
20
+
21
+ Emits a buy line below the bar low (and a sell line above the bar high),
22
+ offset by 3/8 of ATR, whenever the slowed %K stochastic crosses up through
23
+ the lower level or down through the upper level respectively.
24
+ """
25
+
26
+ lines = ("sell", "buy", "sto", "atr")
27
+ params = (
28
+ ("atr_period", 14),
29
+ ("k_period", 5),
30
+ ("d_period", 3),
31
+ ("slowing", 3),
32
+ ("up_level", 70),
33
+ ("dn_level", 30),
34
+ )
35
+
36
+ def __init__(self):
37
+ """Build the ATR sub-indicator and set the warm-up minimum period."""
38
+ self._atr = ATR(self.data, period=int(self.p.atr_period))
39
+ self.addminperiod(
40
+ max(
41
+ int(self.p.atr_period),
42
+ int(self.p.k_period) + int(self.p.d_period) + int(self.p.slowing) + 1,
43
+ )
44
+ + 2
45
+ )
46
+
47
+ def _raw_k(self, ago):
48
+ period = int(self.p.k_period)
49
+ highs = [float(self.data.high[-(ago + i)]) for i in range(period)]
50
+ lows = [float(self.data.low[-(ago + i)]) for i in range(period)]
51
+ hh = max(highs)
52
+ ll = min(lows)
53
+ cp = float(self.data.close[-ago])
54
+ if hh == ll:
55
+ return 50.0
56
+ return 100.0 * (cp - ll) / (hh - ll)
57
+
58
+ def _main_stochastic(self):
59
+ slowing = int(self.p.slowing)
60
+ vals = [self._raw_k(i) for i in range(slowing)]
61
+ return sum(vals) / len(vals)
62
+
63
+ def next(self):
64
+ """Compute the slowed stochastic and emit ATR-offset cross markers."""
65
+ self.lines.sell[0] = float("nan")
66
+ self.lines.buy[0] = float("nan")
67
+ sto_now = self._main_stochastic()
68
+ self.lines.sto[0] = sto_now
69
+ self.lines.atr[0] = float(self._atr[0])
70
+ if len(self) < 2:
71
+ return
72
+ sto_prev = float(self.lines.sto[-1])
73
+ atr_now = float(self._atr[0])
74
+ if sto_now > float(self.p.dn_level) and sto_prev <= float(self.p.dn_level):
75
+ self.lines.buy[0] = float(self.data.low[0]) - atr_now * 3.0 / 8.0
76
+ if sto_now < float(self.p.up_level) and sto_prev >= float(self.p.up_level):
77
+ self.lines.sell[0] = float(self.data.high[0]) + atr_now * 3.0 / 8.0