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,118 @@
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
+ ATR,
12
+ Indicator,
13
+ )
14
+
15
+ __all__ = [
16
+ "FisherOrgV1Sign",
17
+ ]
18
+
19
+
20
+ def _price(data, mode, ago=0):
21
+ """Return a price value from OHLC data based on a mode selector.
22
+
23
+ Parameters
24
+ ----------
25
+ data : DataFeed
26
+ Data feed with open/high/low/close lines.
27
+ mode : int
28
+ Price mode: 2=open, 3=high, 4=low, 5=(h+l)/2, 6=(h+l+c)/3,
29
+ 7=(2c+h+l)/4, 8=(o+c)/2, 9=(o+h+l+c)/4; default returns close.
30
+ ago : int
31
+ Bar offset.
32
+
33
+ Returns
34
+ -------
35
+ float
36
+ Selected price value.
37
+ """
38
+ o = float(data.open[-ago])
39
+ h = float(data.high[-ago])
40
+ low_price = float(data.low[-ago])
41
+ c = float(data.close[-ago])
42
+ if mode == 2:
43
+ return o
44
+ if mode == 3:
45
+ return h
46
+ if mode == 4:
47
+ return low_price
48
+ if mode == 5:
49
+ return (h + low_price) / 2.0
50
+ if mode == 6:
51
+ return (h + low_price + c) / 3.0
52
+ if mode == 7:
53
+ return (2.0 * c + h + low_price) / 4.0
54
+ if mode == 8:
55
+ return (o + c) / 2.0
56
+ if mode == 9:
57
+ return (o + h + low_price + c) / 4.0
58
+ return c
59
+
60
+
61
+ class FisherOrgV1Sign(Indicator):
62
+ """Fisher Transform Org V1 Sign indicator.
63
+
64
+ Normalises price within a highest-high/lowest-low window over `length`
65
+ bars, smooths the normalised position via recursive formula, then applies
66
+ the Fisher Transform (atanh) to produce a near-Gaussian signal. Buy/sell
67
+ trigger lines are set at ATR-scaled price levels on threshold crossovers.
68
+
69
+ Lines
70
+ -----
71
+ sell : float
72
+ Price level for sell signals (high + 3/8 ATR), set on up-cross.
73
+ buy : float
74
+ Price level for buy signals (low - 3/8 ATR), set on down-cross.
75
+ """
76
+
77
+ lines = ("sell", "buy")
78
+ params = (
79
+ ("atr_period", 14),
80
+ ("length", 7),
81
+ ("ipc", 1),
82
+ ("up_level", 1.5),
83
+ ("dn_level", -1.5),
84
+ )
85
+
86
+ def __init__(self):
87
+ """Initialise indicator state: ATR sub-indicator and Fisher smoothing values."""
88
+ self.addminperiod(max(int(self.p.atr_period), int(self.p.length)) + 3)
89
+ self.atr = ATR(self.data, period=int(self.p.atr_period))
90
+ self._value1 = 0.0
91
+ self._fish1 = 0.0
92
+
93
+ def next(self):
94
+ """Compute Fisher Transform values and set buy/sell signal lines."""
95
+ length = int(self.p.length)
96
+ highs = [float(self.data.high[-i]) for i in range(length)]
97
+ lows = [float(self.data.low[-i]) for i in range(length)]
98
+ smax = max(highs)
99
+ smin = min(lows)
100
+ if smax == smin:
101
+ smax += 1e-12
102
+ price = _price(self.data, int(self.p.ipc), 0)
103
+ wpr = (price - smin) / (smax - smin)
104
+ value0 = (wpr - 0.5) + 0.67 * self._value1
105
+ value0 = min(max(value0, -0.999), 0.999)
106
+ res2 = (1.0 + value0) / (1.0 - value0)
107
+ if res2 < 1e-7:
108
+ res2 = 1.0
109
+ fish0 = 0.5 * math.log(res2) + 0.5 * self._fish1
110
+ self.lines.buy[0] = float("nan")
111
+ self.lines.sell[0] = float("nan")
112
+ atr = float(self.atr[0])
113
+ if fish0 > float(self.p.dn_level) and self._fish1 <= float(self.p.dn_level):
114
+ self.lines.buy[0] = float(self.data.low[0]) - atr * 3.0 / 8.0
115
+ if fish0 < float(self.p.up_level) and self._fish1 >= float(self.p.up_level):
116
+ self.lines.sell[0] = float(self.data.high[0]) + atr * 3.0 / 8.0
117
+ self._value1 = value0
118
+ self._fish1 = fish0
@@ -0,0 +1,96 @@
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
+ ATR,
12
+ EMA,
13
+ Indicator,
14
+ )
15
+
16
+ __all__ = [
17
+ "ForceIndexEMA",
18
+ "ForceDiverSign",
19
+ ]
20
+
21
+
22
+ class ForceIndexEMA(Indicator):
23
+ """Indicator producing a smoothed force index."""
24
+
25
+ lines = ("value",)
26
+ params = (("period", 3),)
27
+
28
+ def __init__(self):
29
+ """Compute raw force index then smooth with an EMA."""
30
+ raw = (self.data.close - self.data.close(-1)) * self.data.volume
31
+ self.l.value = EMA(raw, period=max(int(self.p.period), 1))
32
+
33
+
34
+ class ForceDiverSign(Indicator):
35
+ """Divergence signal detector built from two force-index EMAs."""
36
+
37
+ lines = ("sell", "buy")
38
+ params = (
39
+ ("i_period1", 3),
40
+ ("i_period2", 7),
41
+ )
42
+
43
+ def __init__(self):
44
+ """Initialize ATR filter and dual force-index streams."""
45
+ self.atr = ATR(self.data, period=10)
46
+ self.ind1 = ForceIndexEMA(self.data, period=int(self.p.i_period1)).value
47
+ self.ind2 = ForceIndexEMA(self.data, period=int(self.p.i_period2)).value
48
+ self.addminperiod(max(int(self.p.i_period1), int(self.p.i_period2)) * 2 + 10)
49
+
50
+ def next(self):
51
+ """Evaluate candle patterns and divergence confirmation each bar."""
52
+ self.l.sell[0] = float("nan")
53
+ self.l.buy[0] = float("nan")
54
+ if len(self.data) < 6:
55
+ return
56
+
57
+ sell_candle = (
58
+ float(self.data.open[-3]) < float(self.data.close[-3])
59
+ and float(self.data.open[-2]) > float(self.data.close[-2])
60
+ and float(self.data.open[-1]) < float(self.data.close[-1])
61
+ )
62
+ buy_candle = (
63
+ float(self.data.open[-3]) > float(self.data.close[-3])
64
+ and float(self.data.open[-2]) < float(self.data.close[-2])
65
+ and float(self.data.open[-1]) > float(self.data.close[-1])
66
+ )
67
+
68
+ ind1 = [
69
+ float(self.ind1[-4]),
70
+ float(self.ind1[-3]),
71
+ float(self.ind1[-2]),
72
+ float(self.ind1[-1]),
73
+ ]
74
+ ind2 = [
75
+ float(self.ind2[-4]),
76
+ float(self.ind2[-3]),
77
+ float(self.ind2[-2]),
78
+ float(self.ind2[-1]),
79
+ ]
80
+ atr = float(self.atr[0]) if not math.isnan(float(self.atr[0])) else 0.0
81
+
82
+ if sell_candle:
83
+ if ind1[0] < ind1[1] and ind1[1] > ind1[2] and ind1[2] < ind1[3]:
84
+ if ind2[0] < ind2[1] and ind2[1] > ind2[2] and ind2[2] < ind2[3]:
85
+ if (ind1[1] > ind1[3] and ind2[1] < ind2[3]) or (
86
+ ind1[1] < ind1[3] and ind2[1] > ind2[3]
87
+ ):
88
+ self.l.sell[0] = float(self.data.high[0]) + atr * 3.0 / 8.0
89
+
90
+ if buy_candle:
91
+ if ind1[0] > ind1[1] and ind1[1] < ind1[2] and ind1[2] > ind1[3]:
92
+ if ind2[0] > ind2[1] and ind2[1] < ind2[2] and ind2[2] > ind2[3]:
93
+ if (ind1[1] > ind1[3] and ind2[1] < ind2[3]) or (
94
+ ind1[1] < ind1[3] and ind2[1] > ind2[3]
95
+ ):
96
+ self.l.buy[0] = float(self.data.low[0]) - atr * 3.0 / 8.0
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import (
9
+ ExponentialMovingAverage,
10
+ Indicator,
11
+ )
12
+
13
+ __all__ = [
14
+ "ForceIndexEma",
15
+ ]
16
+
17
+
18
+ class ForceIndexEma(Indicator):
19
+ """Force Index (price change times volume) smoothed by an EMA."""
20
+
21
+ lines = ("value",)
22
+ params = (("period", 24),)
23
+
24
+ def __init__(self):
25
+ """Build the raw Force Index and apply the EMA smoothing of length ``period``."""
26
+ raw = (self.data.close - self.data.close(-1)) * self.data.volume
27
+ self.lines.value = ExponentialMovingAverage(raw, period=self.p.period)
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ from .. import Indicator
9
+
10
+ __all__ = [
11
+ "ForecastOscilator",
12
+ ]
13
+
14
+
15
+ def _price_value(data, shift, mode):
16
+ key = str(mode).lower()
17
+ open_ = float(data.open[-shift]) if shift else float(data.open[0])
18
+ high = float(data.high[-shift]) if shift else float(data.high[0])
19
+ low = float(data.low[-shift]) if shift else float(data.low[0])
20
+ close = float(data.close[-shift]) if shift else float(data.close[0])
21
+ if key in ("close", "1", "price_close"):
22
+ return close
23
+ if key in ("open", "2", "price_open"):
24
+ return open_
25
+ if key in ("high", "3", "price_high"):
26
+ return high
27
+ if key in ("low", "4", "price_low"):
28
+ return low
29
+ if key in ("median", "5", "price_median"):
30
+ return (high + low) / 2.0
31
+ if key in ("typical", "6", "price_typical"):
32
+ return (high + low + close) / 3.0
33
+ if key in ("weighted", "7", "price_weighted"):
34
+ return (high + low + close + close) / 4.0
35
+ if key in ("simple", "8", "price_simpl"):
36
+ return (open_ + close) / 2.0
37
+ if key in ("quarter", "9", "price_quarter"):
38
+ return (high + low + open_ + close) / 4.0
39
+ if key in ("trendfollow0", "10", "price_trendfollow0"):
40
+ if close > open_:
41
+ return high
42
+ if close < open_:
43
+ return low
44
+ return close
45
+ if key in ("trendfollow1", "11", "price_trendfollow1"):
46
+ if close > open_:
47
+ return (high + close) / 2.0
48
+ if close < open_:
49
+ return (low + close) / 2.0
50
+ return close
51
+ return close
52
+
53
+
54
+ class ForecastOscilator(Indicator):
55
+ """Forecast Oscillator with T3-smoothed signal and arrow lines.
56
+
57
+ Computes the percentage deviation of price from a linear-regression
58
+ forecast (the raw ``ind`` line), smooths it with a six-stage T3 moving
59
+ average into the ``signal`` line, and emits ``buy``/``sell`` arrow values
60
+ when the oscillator crosses its signal under the configured sign
61
+ conditions.
62
+ """
63
+
64
+ lines = ("ind", "signal", "buy", "sell")
65
+ params = (
66
+ ("length", 15),
67
+ ("t3", 3),
68
+ ("b", 0.7),
69
+ ("ipc", "close"),
70
+ )
71
+
72
+ def __init__(self):
73
+ """Reserve the warm-up window and initialise T3 smoothing state."""
74
+ self.addminperiod(int(self.p.length) + 5)
75
+ self._e1 = 0.0
76
+ self._e2 = 0.0
77
+ self._e3 = 0.0
78
+ self._e4 = 0.0
79
+ self._e5 = 0.0
80
+ self._e6 = 0.0
81
+ self._initialized = False
82
+
83
+ def next(self):
84
+ """Compute the oscillator, T3 signal and arrow lines for this bar."""
85
+ length = max(int(self.p.length), 1)
86
+ t3 = max(int(self.p.t3), 1)
87
+ b = float(self.p.b)
88
+ b2 = b * b
89
+ b3 = b2 * b
90
+ c1 = -b3
91
+ c2 = 3 * (b2 + b3)
92
+ c3 = -3 * (2 * b2 + b + b3)
93
+ c4 = 1 + 3 * b + b3 + 3 * b2
94
+ n = max(1 + 0.5 * (t3 - 1), 1.0)
95
+ w1 = 2.0 / (n + 1.0)
96
+ w2 = 1.0 - w1
97
+ kx = 6.0 / (length * (length + 1.0))
98
+ br = (length + 1.0) / 3.0
99
+
100
+ if len(self.data) <= length + 2:
101
+ price = _price_value(self.data, 0, self.p.ipc)
102
+ self.l.ind[0] = 0.0
103
+ self.l.signal[0] = 0.0
104
+ self.l.buy[0] = float("nan")
105
+ self.l.sell[0] = float("nan")
106
+ if not self._initialized:
107
+ self._e1 = self._e2 = self._e3 = self._e4 = self._e5 = self._e6 = price
108
+ self._initialized = True
109
+ return
110
+
111
+ weighted_sum = 0.0
112
+ for i in range(length, 0, -1):
113
+ tmp = i - br
114
+ weighted_sum += tmp * _price_value(self.data, length - i, self.p.ipc)
115
+ wt = weighted_sum * kx
116
+ price_now = _price_value(self.data, 0, self.p.ipc)
117
+ forecastosc = ((price_now - wt) / wt * 100.0) if wt else 0.0
118
+
119
+ if not self._initialized:
120
+ self._e1 = self._e2 = self._e3 = self._e4 = self._e5 = self._e6 = forecastosc
121
+ self._initialized = True
122
+
123
+ self._e1 = w1 * forecastosc + w2 * self._e1
124
+ self._e2 = w1 * self._e1 + w2 * self._e2
125
+ self._e3 = w1 * self._e2 + w2 * self._e3
126
+ self._e4 = w1 * self._e3 + w2 * self._e4
127
+ self._e5 = w1 * self._e4 + w2 * self._e5
128
+ self._e6 = w1 * self._e5 + w2 * self._e6
129
+ t3_fosc = c1 * self._e6 + c2 * self._e5 + c3 * self._e4 + c4 * self._e3
130
+
131
+ self.l.ind[0] = forecastosc
132
+ self.l.signal[0] = t3_fosc
133
+ self.l.buy[0] = float("nan")
134
+ self.l.sell[0] = float("nan")
135
+
136
+ if len(self.data) >= length + 4:
137
+ ind_prev1 = float(self.l.ind[-1])
138
+ ind_prev2 = float(self.l.ind[-2])
139
+ sig_prev1 = float(self.l.signal[-1])
140
+ sig_prev2 = float(self.l.signal[-2])
141
+ sig_prev3 = float(self.l.signal[-3])
142
+ if ind_prev1 > sig_prev2 and ind_prev2 <= sig_prev3 and sig_prev1 < 0:
143
+ self.l.buy[0] = t3_fosc - 0.05
144
+ if ind_prev1 < sig_prev2 and ind_prev2 >= sig_prev3 and sig_prev1 > 0:
145
+ self.l.sell[0] = t3_fosc + 0.05
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "FractalAMAMBK",
14
+ ]
15
+
16
+
17
+ class FractalAMAMBK(Indicator):
18
+ """FRAMA-style indicator exposing smoothed trend and trigger lines."""
19
+
20
+ lines = ("frama", "trigger")
21
+ params = (
22
+ ("r_period", 16),
23
+ ("multiplier", 4.6),
24
+ ("signal_multiplier", 2.5),
25
+ )
26
+
27
+ def __init__(self):
28
+ """Set minimum period based on FRAMA computation window."""
29
+ self.addminperiod(max(int(self.p.r_period), 2) + 2)
30
+
31
+ def _range(self, high_line, low_line, start_shift, count):
32
+ highs = [
33
+ float(high_line[-shift]) if shift else float(high_line[0])
34
+ for shift in range(start_shift, start_shift + count)
35
+ ]
36
+ lows = [
37
+ float(low_line[-shift]) if shift else float(low_line[0])
38
+ for shift in range(start_shift, start_shift + count)
39
+ ]
40
+ return max(highs) - min(lows)
41
+
42
+ def next(self):
43
+ """Compute FRAMA and trigger values for the current bar."""
44
+ period = max(int(self.p.r_period), 2)
45
+ n = (period // 2) * 2
46
+ n2 = max(n // 2, 1)
47
+ price = float(self.data.close[0])
48
+
49
+ if len(self.data) <= n:
50
+ self.l.frama[0] = price
51
+ self.l.trigger[0] = price
52
+ return
53
+
54
+ r1 = self._range(self.data.high, self.data.low, 0, n2) / n2
55
+ r2 = self._range(self.data.high, self.data.low, n2, n2) / n2
56
+ r3 = self._range(self.data.high, self.data.low, 0, n) / n
57
+
58
+ if r3 <= 0 or (r1 + r2) <= 0:
59
+ dimension_estimate = 1.0
60
+ else:
61
+ dimension_estimate = (math.log(r1 + r2) - math.log(r3)) * 1.442695
62
+
63
+ alpha = math.exp(-float(self.p.multiplier) * (dimension_estimate - 1.0))
64
+ alpha = min(max(alpha, 0.01), 1.0)
65
+ alphas = math.exp(-float(self.p.signal_multiplier) * (dimension_estimate - 1.0))
66
+
67
+ prev_frama = (
68
+ float(self.l.frama[-1])
69
+ if len(self.data) > 1 and math.isfinite(float(self.l.frama[-1]))
70
+ else float(self.data.close[-1])
71
+ )
72
+ prev_trigger = (
73
+ float(self.l.trigger[-1])
74
+ if len(self.data) > 1 and math.isfinite(float(self.l.trigger[-1]))
75
+ else prev_frama
76
+ )
77
+
78
+ frama = alpha * price + (1.0 - alpha) * prev_frama
79
+ trigger = alphas * frama + (1.0 - alphas) * prev_trigger
80
+ self.l.frama[0] = frama
81
+ self.l.trigger[0] = trigger
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "FramaSeries",
14
+ "FramaLinesIndicator",
15
+ ]
16
+
17
+
18
+ class FramaSeries(Indicator):
19
+ """Fractal Adaptive Moving Average (FrAMA) of a single input series."""
20
+
21
+ lines = ("frama",)
22
+ params = (("period", 14),)
23
+
24
+ def __init__(self):
25
+ """Set the minimum period required for the FrAMA computation."""
26
+ self.addminperiod(max(int(self.p.period), 2))
27
+
28
+ def next(self):
29
+ """Compute the adaptive-alpha FrAMA value for the current bar."""
30
+ period = max(int(self.p.period), 2)
31
+ half = max(period // 2, 1)
32
+ window = [float(self.data[-i]) for i in range(period - 1, -1, -1)]
33
+ if len(window) < period:
34
+ self.lines.frama[0] = float(self.data[0])
35
+ return
36
+ first = window[:half]
37
+ second = window[-half:]
38
+ n1 = (max(first) - min(first)) / float(half)
39
+ n2 = (max(second) - min(second)) / float(half)
40
+ n3 = (max(window) - min(window)) / float(period)
41
+ if n1 > 0.0 and n2 > 0.0 and n3 > 0.0:
42
+ dim = (math.log(n1 + n2) - math.log(n3)) / math.log(2.0)
43
+ else:
44
+ dim = 1.0
45
+ alpha = math.exp(-4.6 * (dim - 1.0))
46
+ alpha = min(max(alpha, 0.01), 1.0)
47
+ prev = float(self.lines.frama[-1]) if len(self) > 0 else float(self.data[0])
48
+ self.lines.frama[0] = alpha * float(self.data[0]) + (1.0 - alpha) * prev
49
+
50
+
51
+ class FramaLinesIndicator(Indicator):
52
+ """FrAMA candle indicator emitting smoothed OHLC and a color line."""
53
+
54
+ lines = ("o", "h", "l", "c", "color")
55
+ params = (("period", 14),)
56
+
57
+ def __init__(self):
58
+ """Build FrAMA series for each of the open/high/low/close inputs."""
59
+ self.addminperiod(int(self.p.period) + 2)
60
+ self.frama_open = FramaSeries(self.data.open, period=int(self.p.period))
61
+ self.frama_high = FramaSeries(self.data.high, period=int(self.p.period))
62
+ self.frama_low = FramaSeries(self.data.low, period=int(self.p.period))
63
+ self.frama_close = FramaSeries(self.data.close, period=int(self.p.period))
64
+
65
+ def next(self):
66
+ """Assemble the smoothed FrAMA candle and classify its color."""
67
+ o = float(self.frama_open[0])
68
+ h = float(self.frama_high[0])
69
+ low_price = float(self.frama_low[0])
70
+ c = float(self.frama_close[0])
71
+ mx = max(o, c)
72
+ mn = min(o, c)
73
+ h = max(mx, h)
74
+ low_price = min(mn, low_price)
75
+ color = 1
76
+ if o < c:
77
+ color = 2
78
+ elif o > c:
79
+ color = 0
80
+ self.lines.o[0] = o
81
+ self.lines.h[0] = h
82
+ self.lines.l[0] = low_price
83
+ self.lines.c[0] = c
84
+ self.lines.color[0] = color
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env python
2
+ """Functional-test indicators migrated to contrib.
3
+
4
+ Generated from a single functional strategy module to preserve file-local
5
+ helper functions and constants without cross-test name collisions.
6
+ """
7
+
8
+ import math
9
+
10
+ from .. import Indicator
11
+
12
+ __all__ = [
13
+ "FRASMAv2Indicator",
14
+ ]
15
+
16
+
17
+ def _applied_price(data, price_type, ago=0):
18
+ o = float(data.open[-ago])
19
+ h = float(data.high[-ago])
20
+ low_price = float(data.low[-ago])
21
+ c = float(data.close[-ago])
22
+ if price_type == 0:
23
+ return c
24
+ if price_type == 1:
25
+ return o
26
+ if price_type == 2:
27
+ return h
28
+ if price_type == 3:
29
+ return low_price
30
+ if price_type == 4:
31
+ return (h + low_price) / 2.0
32
+ if price_type == 5:
33
+ return (h + low_price + c) / 3.0
34
+ if price_type == 6:
35
+ return (h + low_price + c + c) / 4.0
36
+ return c
37
+
38
+
39
+ class FRASMAv2Indicator(Indicator):
40
+ """Fractal-adaptive moving average exposing the ``frasma`` line and slope ``color``."""
41
+
42
+ lines = ("frasma", "color")
43
+ params = (
44
+ ("e_period", 30),
45
+ ("normal_speed", 20),
46
+ ("ipc", 0),
47
+ )
48
+
49
+ def __init__(self):
50
+ """Set the minimum warmup period from the estimation and speed windows."""
51
+ self.addminperiod(max(int(self.p.e_period), int(self.p.normal_speed)) + 3)
52
+
53
+ def next(self):
54
+ """Compute the fractal dimension, adapt the averaging speed, and set color.
55
+
56
+ Estimates the fractal dimension of the recent price window, derives an
57
+ adaptive averaging length, writes the resulting value to ``frasma``, and
58
+ encodes its slope into ``color`` (0 rising, 1 flat, 2 falling).
59
+ """
60
+ self.lines.color[0] = 1.0
61
+ need = max(int(self.p.e_period), int(self.p.normal_speed))
62
+ prices = [
63
+ _applied_price(self.data, int(self.p.ipc), i) for i in range(min(need, len(self.data)))
64
+ ]
65
+ e_period = int(self.p.e_period)
66
+ normal_speed = int(self.p.normal_speed)
67
+ g_period_minus_1 = e_period - 1
68
+ if len(prices) < e_period:
69
+ self.lines.frasma[0] = prices[0]
70
+ return
71
+ sample = prices[:e_period]
72
+ price_max = max(sample)
73
+ price_min = min(sample)
74
+ price_range = price_max - price_min
75
+ length = 0.0
76
+ prior_diff = 0.0
77
+ for k in range(g_period_minus_1 + 1):
78
+ if price_range > 0.0:
79
+ diff = (sample[k] - price_min) / price_range
80
+ if k > 0:
81
+ length += math.sqrt((diff - prior_diff) ** 2 + (1.0 / (e_period**2)))
82
+ prior_diff = diff
83
+ if length > 0.0 and g_period_minus_1 > 0:
84
+ fdi = 1.0 + (math.log(length) + math.log(2.0)) / math.log(2.0 * g_period_minus_1)
85
+ else:
86
+ fdi = 0.0
87
+ res = 2.0 - fdi
88
+ if res == 0.0:
89
+ res = 2.0
90
+ trail_dim = 1.0 / res
91
+ alpha = trail_dim / 2.0
92
+ speed = int(min(max(round(normal_speed * alpha), 1), 10000))
93
+ speed = min(speed, len(prices))
94
+ value = sum(prices[:speed]) / float(speed)
95
+ self.lines.frasma[0] = value
96
+ if len(self) < 2:
97
+ return
98
+ prev = float(self.lines.frasma[-1])
99
+ color = 1.0
100
+ if prev < value:
101
+ color = 0.0
102
+ if prev > value:
103
+ color = 2.0
104
+ self.lines.color[0] = color