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,83 @@
1
+ #!/usr/bin/env python
2
+ """Percent Change Indicator Module - Percentage change calculation.
3
+
4
+ This module provides the Percent Change indicator for measuring the
5
+ percentage change in price over a given period.
6
+
7
+ Classes:
8
+ PercentChange: Percentage change indicator (alias: PctChange).
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ # Measure 30-period percent change
14
+ self.pctchange = bt.indicators.PctChange(self.data.close, period=30)
15
+
16
+ def next(self):
17
+ # Buy when percent change is positive
18
+ if self.pctchange[0] > 0:
19
+ self.buy()
20
+ """
21
+
22
+ from . import Indicator
23
+
24
+ __all__ = ["PercentChange", "PctChange"]
25
+
26
+
27
+ class PercentChange(Indicator):
28
+ """
29
+ Measures the percentage change of the current value with respect to that
30
+ of period bars ago
31
+ """
32
+
33
+ alias = ("PctChange",)
34
+ lines = ("pctchange",)
35
+
36
+ # Fancy plotting name
37
+ plotlines = {"pctchange": {"_name": "%change"}}
38
+
39
+ # update value to the standard for Moving Averages
40
+ params = (("period", 30),)
41
+
42
+ def __init__(self):
43
+ """Initialize the Percent Change indicator.
44
+
45
+ Sets minimum period to period + 1 for comparison calculation.
46
+ """
47
+ super().__init__()
48
+ self.addminperiod(self.p.period + 1)
49
+
50
+ def next(self):
51
+ """Calculate percent change for the current bar.
52
+
53
+ Formula: pctchange = (current_value / value_period_ago) - 1.0
54
+ Returns 0.0 if the previous value is 0 to avoid division by zero.
55
+ """
56
+ prev_val = self.data[-self.p.period]
57
+ if prev_val != 0:
58
+ self.lines.pctchange[0] = self.data[0] / prev_val - 1.0
59
+ else:
60
+ self.lines.pctchange[0] = 0.0
61
+
62
+ def once(self, start, end):
63
+ """Calculate percent change in runonce mode.
64
+
65
+ Computes percentage change for each bar relative to the value
66
+ 'period' bars ago.
67
+ """
68
+ darray = self.data.array
69
+ larray = self.lines.pctchange.array
70
+ period = self.p.period
71
+
72
+ while len(larray) < end:
73
+ larray.append(float("nan"))
74
+
75
+ for i in range(period, min(end, len(darray))):
76
+ prev_val = darray[i - period]
77
+ if prev_val != 0:
78
+ larray[i] = darray[i] / prev_val - 1.0
79
+ else:
80
+ larray[i] = 0.0
81
+
82
+
83
+ PctChange = PercentChange
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env python
2
+ """Percent Rank Indicator Module - Percentile ranking.
3
+
4
+ This module provides the Percent Rank indicator for calculating
5
+ the percentile rank of current values within a period.
6
+
7
+ Classes:
8
+ PercentRank: Percent rank indicator (alias: PctRank).
9
+
10
+ Example:
11
+ class MyStrategy(bt.Strategy):
12
+ def __init__(self):
13
+ # Calculate 50-period percent rank
14
+ self.pctrank = bt.indicators.PctRank(self.data.close, period=50)
15
+
16
+ def next(self):
17
+ # Buy when price is in top 20% (percent rank > 0.8)
18
+ if self.pctrank[0] > 0.8:
19
+ self.buy()
20
+ # Sell when price is in bottom 20% (percent rank < 0.2)
21
+ elif self.pctrank[0] < 0.2:
22
+ self.sell()
23
+ """
24
+
25
+ from math import fsum
26
+
27
+ from . import BaseApplyN
28
+
29
+ __all__ = ["PercentRank", "PctRank"]
30
+
31
+
32
+ class PercentRank(BaseApplyN):
33
+ """
34
+ Measures the percent rank of the current value with respect to that of
35
+ period bars ago
36
+ """
37
+
38
+ alias = ("PctRank",)
39
+ lines = ("pctrank",)
40
+ params = (
41
+ ("period", 50),
42
+ ("func", lambda d: fsum(x < d[-1] for x in d) / len(d)),
43
+ )
44
+
45
+
46
+ PctRank = PercentRank
@@ -0,0 +1,469 @@
1
+ #!/usr/bin/env python
2
+ """Pivot Point Indicator Module - Support and resistance levels.
3
+
4
+ This module provides Pivot Point indicators for calculating support
5
+ and resistance levels from previous period price data.
6
+
7
+ Classes:
8
+ PivotPoint: Standard pivot points with 2 support/resistance levels.
9
+ FibonacciPivotPoint: Pivot points with Fibonacci-based levels.
10
+ DemarkPivotPoint: Demark pivot point calculation.
11
+
12
+ Example:
13
+ class MyStrategy(bt.Strategy):
14
+ def __init__(self):
15
+ # Calculate pivot points from resampled data (data1)
16
+ self.pivot = bt.indicators.PivotPoint(self.data1)
17
+
18
+ def next(self):
19
+ # Buy when price breaks above resistance level 1
20
+ if self.data.close[0] > self.pivot.r1[0]:
21
+ self.buy()
22
+ # Sell when price breaks below support level 1
23
+ elif self.data.close[0] < self.pivot.s1[0]:
24
+ self.sell()
25
+ """
26
+
27
+ from . import Indicator
28
+
29
+
30
+ class PivotPoint(Indicator):
31
+ """
32
+ Defines a level of significance by taking into account the average of price
33
+ bar components of the past period of a larger timeframe.
34
+ For example, when
35
+ operating with days, the values are taking from the already "past" month
36
+ fixed prices.
37
+
38
+ Example of using this indicator:
39
+
40
+ data = btfeeds.ADataFeed(dataname=x, timeframe=bt.TimeFrame.Days)
41
+ cerebro.adddata(data)
42
+ cerebro.resampledata(data, timeframe=bt.TimeFrame.Months)
43
+
44
+ In the ``__init__`` method of the strategy:
45
+
46
+ pivotindicator = btind.PivotPoiont(self.data1) # the resampled data
47
+
48
+ The indicator will try to automatically plo to the non-resampled data.
49
+ To
50
+ disable this behavior, use the following during construction:
51
+
52
+ - _autoplot=False
53
+
54
+ Note:
55
+
56
+ The example shows *days* and *months*, but any combination of timeframes
57
+ can be used.
58
+ See the literature for recommended combinations
59
+
60
+ Formula:
61
+ - pivot = (h + l + c) / 3 # variants duplicate close or add open
62
+ - support1 = 2.0 * pivot - high
63
+ - support2 = pivot - (high - low)
64
+ - resistance1 = 2.0 * pivot - low
65
+ - resistance2 = pivot + (high - low)
66
+
67
+ See:
68
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:pivot_points
69
+ - https://en.wikipedia.org/wiki/Pivot_point_(technical_analysis)
70
+ """
71
+
72
+ lines = (
73
+ "p",
74
+ "s1",
75
+ "s2",
76
+ "r1",
77
+ "r2",
78
+ )
79
+ plotinfo = {"subplot": False}
80
+
81
+ params = (
82
+ ("open", False), # add opening price to the pivot point
83
+ ("close", False), # use close twice in the calcs
84
+ ("_autoplot", True), # attempt to plot on real target data
85
+ )
86
+
87
+ def _plotinit(self):
88
+ """Initialize plot settings for Pivot Point.
89
+
90
+ Attempts to plot on the actual timeframe master data
91
+ rather than the resampled data.
92
+ """
93
+ # Try to plot to the actual timeframe master
94
+ if self.p._autoplot:
95
+ if hasattr(self.data, "data"):
96
+ self.plotinfo.plotmaster = self.data.data
97
+
98
+ def __init__(self):
99
+ """Initialize the Pivot Point indicator.
100
+
101
+ Sets up coupler to follow real object if autoplot is enabled.
102
+ """
103
+ super().__init__() # enable coopertive inheritance
104
+
105
+ if self.p._autoplot:
106
+ self.plotinfo.plot = False # disable own plotting
107
+ self() # Coupler to follow a real object
108
+
109
+ def next(self):
110
+ """Calculate pivot point and support/resistance levels.
111
+
112
+ Standard formula: p = (h + l + c) / 3
113
+ Support/Resistance levels derived from pivot and high-low range.
114
+ """
115
+ o = self.data.open[0]
116
+ h = self.data.high[0]
117
+ low = self.data.low[0]
118
+ c = self.data.close[0]
119
+
120
+ if self.p.close:
121
+ p = (h + low + 2.0 * c) / 4.0
122
+ elif self.p.open:
123
+ p = (h + low + c + o) / 4.0
124
+ else:
125
+ p = (h + low + c) / 3.0
126
+
127
+ self.lines.p[0] = p
128
+ self.lines.s1[0] = 2.0 * p - h
129
+ self.lines.r1[0] = 2.0 * p - low
130
+ self.lines.s2[0] = p - (h - low)
131
+ self.lines.r2[0] = p + (h - low)
132
+
133
+ def once(self, start, end):
134
+ """Calculate pivot point levels in runonce mode.
135
+
136
+ Computes pivot, support, and resistance levels across all bars.
137
+ """
138
+ o_array = self.data.open.array
139
+ h_array = self.data.high.array
140
+ l_array = self.data.low.array
141
+ c_array = self.data.close.array
142
+ p_array = self.lines.p.array
143
+ s1_array = self.lines.s1.array
144
+ s2_array = self.lines.s2.array
145
+ r1_array = self.lines.r1.array
146
+ r2_array = self.lines.r2.array
147
+
148
+ for arr in [p_array, s1_array, s2_array, r1_array, r2_array]:
149
+ while len(arr) < end:
150
+ arr.append(float("nan"))
151
+
152
+ use_close = self.p.close
153
+ use_open = self.p.open
154
+
155
+ for i in range(start, min(end, len(h_array), len(l_array), len(c_array))):
156
+ o = o_array[i] if i < len(o_array) else 0.0
157
+ h = h_array[i] if i < len(h_array) else 0.0
158
+ low = l_array[i] if i < len(l_array) else 0.0
159
+ c = c_array[i] if i < len(c_array) else 0.0
160
+
161
+ if use_close:
162
+ p = (h + low + 2.0 * c) / 4.0
163
+ elif use_open:
164
+ p = (h + low + c + o) / 4.0
165
+ else:
166
+ p = (h + low + c) / 3.0
167
+
168
+ p_array[i] = p
169
+ s1_array[i] = 2.0 * p - h
170
+ r1_array[i] = 2.0 * p - low
171
+ s2_array[i] = p - (h - low)
172
+ r2_array[i] = p + (h - low)
173
+
174
+
175
+ class FibonacciPivotPoint(Indicator):
176
+ """
177
+ Defines a level of significance by taking into account the average of price
178
+ bar components of the past period of a larger timeframe.
179
+ For example, when
180
+ operating with days, the values are taking from the already "past" month
181
+ fixed prices.
182
+
183
+ Fibonacci levels (configurable) are used to define the support/resistance levels
184
+
185
+ Example of using this indicator:
186
+
187
+ data = btfeeds.ADataFeed(dataname=x, timeframe=bt.TimeFrame.Days)
188
+ cerebro.adddata(data)
189
+ cerebro.resampledata(data, timeframe=bt.TimeFrame.Months)
190
+
191
+ In the ``__init__`` method of the strategy:
192
+
193
+ pivotindicator = btind.FibonacciPivotPoiont(self.data1) # the resampled data
194
+
195
+ The indicator will try to automatically plo to the non-resampled data.
196
+ To
197
+ disable this behavior, use the following during construction:
198
+
199
+ - _autoplot=False
200
+
201
+ Note:
202
+
203
+ The example shows *days* and *months*, but any combination of timeframes
204
+ can be used.
205
+ See the literature for recommended combinations
206
+
207
+ Formula:
208
+ - pivot = (h + l + c) / 3 # variants duplicate close or add open
209
+ - support1 = p - level1 * (high - low) # level1 0.382
210
+ - support2 = p - level2 * (high - low) # level2 0.618
211
+ - support3 = p - level3 * (high - low) # level3 1.000
212
+ - resistance1 = p + level1 * (high - low) # level1 0.382
213
+ - resistance2 = p + level2 * (high - low) # level2 0.618
214
+ - resistance3 = p + level3 * (high - low) # level3 1.000
215
+
216
+ See:
217
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:pivot_points
218
+ """
219
+
220
+ lines = ("p", "s1", "s2", "s3", "r1", "r2", "r3")
221
+ plotinfo = {"subplot": False}
222
+ params = (
223
+ ("open", False), # add opening price to the pivot point
224
+ ("close", False), # use close twice in the calcs
225
+ ("_autoplot", True), # attempt to plot on real target data
226
+ ("level1", 0.382),
227
+ ("level2", 0.618),
228
+ ("level3", 1.0),
229
+ )
230
+
231
+ def _plotinit(self):
232
+ """Initialize plot settings for Fibonacci Pivot Point.
233
+
234
+ Attempts to plot on the actual timeframe master data
235
+ rather than the resampled data.
236
+ """
237
+ # Try to plot to the actual timeframe master
238
+ if self.p._autoplot:
239
+ if hasattr(self.data, "data"):
240
+ self.plotinfo.plotmaster = self.data.data
241
+
242
+ def __init__(self):
243
+ """Initialize the Fibonacci Pivot Point indicator.
244
+
245
+ Sets up coupler to follow real object if autoplot is enabled.
246
+ """
247
+ super().__init__()
248
+
249
+ if self.p._autoplot:
250
+ self.plotinfo.plot = False # disable own plotting
251
+ self() # Coupler to follow a real object
252
+
253
+ def next(self):
254
+ """Calculate Fibonacci pivot point and support/resistance levels.
255
+
256
+ Uses Fibonacci ratios (0.382, 0.618, 1.0) to calculate
257
+ support/resistance levels from pivot point.
258
+ """
259
+ o = self.data.open[0]
260
+ h = self.data.high[0]
261
+ low = self.data.low[0]
262
+ c = self.data.close[0]
263
+
264
+ if self.p.close:
265
+ p = (h + low + 2.0 * c) / 4.0
266
+ elif self.p.open:
267
+ p = (h + low + c + o) / 4.0
268
+ else:
269
+ p = (h + low + c) / 3.0
270
+
271
+ hl_range = h - low
272
+ self.lines.p[0] = p
273
+ self.lines.s1[0] = p - self.p.level1 * hl_range
274
+ self.lines.s2[0] = p - self.p.level2 * hl_range
275
+ self.lines.s3[0] = p - self.p.level3 * hl_range
276
+ self.lines.r1[0] = p + self.p.level1 * hl_range
277
+ self.lines.r2[0] = p + self.p.level2 * hl_range
278
+ self.lines.r3[0] = p + self.p.level3 * hl_range
279
+
280
+ def once(self, start, end):
281
+ """Calculate Fibonacci pivot point levels in runonce mode.
282
+
283
+ Computes pivot and Fibonacci-based support/resistance levels
284
+ across all bars.
285
+ """
286
+ o_array = self.data.open.array
287
+ h_array = self.data.high.array
288
+ l_array = self.data.low.array
289
+ c_array = self.data.close.array
290
+ p_array = self.lines.p.array
291
+ s1_array = self.lines.s1.array
292
+ s2_array = self.lines.s2.array
293
+ s3_array = self.lines.s3.array
294
+ r1_array = self.lines.r1.array
295
+ r2_array = self.lines.r2.array
296
+ r3_array = self.lines.r3.array
297
+
298
+ for arr in [p_array, s1_array, s2_array, s3_array, r1_array, r2_array, r3_array]:
299
+ while len(arr) < end:
300
+ arr.append(float("nan"))
301
+
302
+ use_close = self.p.close
303
+ use_open = self.p.open
304
+ level1 = self.p.level1
305
+ level2 = self.p.level2
306
+ level3 = self.p.level3
307
+
308
+ for i in range(start, min(end, len(h_array), len(l_array), len(c_array))):
309
+ o = o_array[i] if i < len(o_array) else 0.0
310
+ h = h_array[i] if i < len(h_array) else 0.0
311
+ low = l_array[i] if i < len(l_array) else 0.0
312
+ c = c_array[i] if i < len(c_array) else 0.0
313
+
314
+ if use_close:
315
+ p = (h + low + 2.0 * c) / 4.0
316
+ elif use_open:
317
+ p = (h + low + c + o) / 4.0
318
+ else:
319
+ p = (h + low + c) / 3.0
320
+
321
+ hl_range = h - low
322
+ p_array[i] = p
323
+ s1_array[i] = p - level1 * hl_range
324
+ s2_array[i] = p - level2 * hl_range
325
+ s3_array[i] = p - level3 * hl_range
326
+ r1_array[i] = p + level1 * hl_range
327
+ r2_array[i] = p + level2 * hl_range
328
+ r3_array[i] = p + level3 * hl_range
329
+
330
+
331
+ class DemarkPivotPoint(Indicator):
332
+ """
333
+ Defines a level of significance by taking into account the average of price
334
+ bar components of the past period of a larger timeframe.
335
+ For example, when
336
+ operating with days, the values are taking from the already "past" month
337
+ fixed prices.
338
+
339
+ Example of using this indicator:
340
+
341
+ data = btfeeds.ADataFeed(dataname=x, timeframe=bt.TimeFrame.Days)
342
+ cerebro.adddata(data)
343
+ cerebro.resampledata(data, timeframe=bt.TimeFrame.Months)
344
+
345
+ In the ``__init__`` method of the strategy:
346
+
347
+ pivotindicator = btind.DemarkPivotPoiont(self.data1) # the resampled data
348
+
349
+ The indicator will try to automatically plo to the non-resampled data.
350
+ To
351
+ disable this behavior, use the following during construction:
352
+
353
+ - _autoplot=False
354
+
355
+ Note:
356
+
357
+ The example shows *days* and *months*, but any combination of timeframes
358
+ can be used.
359
+ See the literature for recommended combinations
360
+
361
+ Formula:
362
+ - if close < open x = high + (2 x low) + close
363
+
364
+ - If close > open x = (2 x high) + low + close
365
+
366
+ - If Close == open x = high + low + (2 x close)
367
+
368
+ - P = x / 4
369
+
370
+ - Support1 = x / 2 - high
371
+ - resistance1 = x / 2 - low
372
+
373
+ See:
374
+ - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:pivot_points
375
+ """
376
+
377
+ lines = (
378
+ "p",
379
+ "s1",
380
+ "r1",
381
+ )
382
+ plotinfo = {"subplot": False}
383
+ params = (
384
+ ("open", False), # add opening price to the pivot point
385
+ ("close", False), # use close twice in the calcs
386
+ ("_autoplot", True), # attempt to plot on real target data
387
+ ("level1", 0.382),
388
+ ("level2", 0.618),
389
+ ("level3", 1.0),
390
+ )
391
+
392
+ def _plotinit(self):
393
+ """Initialize plot settings for Demark Pivot Point.
394
+
395
+ Attempts to plot on the actual timeframe master data
396
+ rather than the resampled data.
397
+ """
398
+ # Try to plot to the actual timeframe master
399
+ if self.p._autoplot:
400
+ if hasattr(self.data, "data"):
401
+ self.plotinfo.plotmaster = self.data.data
402
+
403
+ def __init__(self):
404
+ """Initialize the Demark Pivot Point indicator.
405
+
406
+ Sets up coupler to follow real object if autoplot is enabled.
407
+ """
408
+ super().__init__()
409
+
410
+ if self.p._autoplot:
411
+ self.plotinfo.plot = False # disable own plotting
412
+ self() # Coupler to follow a real object
413
+
414
+ def next(self):
415
+ """Calculate Demark pivot point and support/resistance levels.
416
+
417
+ Demark formula uses relationship between open and close
418
+ to determine the calculation method.
419
+ """
420
+ h = self.data.high[0]
421
+ low = self.data.low[0]
422
+ o = self.data.open[0]
423
+ c = self.data.close[0]
424
+
425
+ if c < o:
426
+ x = h + 2.0 * low + c
427
+ elif c > o:
428
+ x = 2.0 * h + low + c
429
+ else:
430
+ x = h + low + 2.0 * c
431
+
432
+ self.lines.p[0] = x / 4.0
433
+ self.lines.s1[0] = x / 2.0 - h
434
+ self.lines.r1[0] = x / 2.0 - low
435
+
436
+ def once(self, start, end):
437
+ """Calculate Demark pivot point levels in runonce mode.
438
+
439
+ Computes Demark-style pivot, support, and resistance levels
440
+ across all bars.
441
+ """
442
+ o_array = self.data.open.array
443
+ h_array = self.data.high.array
444
+ l_array = self.data.low.array
445
+ c_array = self.data.close.array
446
+ p_array = self.lines.p.array
447
+ s1_array = self.lines.s1.array
448
+ r1_array = self.lines.r1.array
449
+
450
+ for arr in [p_array, s1_array, r1_array]:
451
+ while len(arr) < end:
452
+ arr.append(float("nan"))
453
+
454
+ for i in range(start, min(end, len(h_array), len(l_array), len(c_array), len(o_array))):
455
+ o = o_array[i] if i < len(o_array) else 0.0
456
+ h = h_array[i] if i < len(h_array) else 0.0
457
+ low = l_array[i] if i < len(l_array) else 0.0
458
+ c = c_array[i] if i < len(c_array) else 0.0
459
+
460
+ if c < o:
461
+ x = h + 2.0 * low + c
462
+ elif c > o:
463
+ x = 2.0 * h + low + c
464
+ else:
465
+ x = h + low + 2.0 * c
466
+
467
+ p_array[i] = x / 4.0
468
+ s1_array[i] = x / 2.0 - h
469
+ r1_array[i] = x / 2.0 - low
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env python
2
+ """Pretty Good Oscillator Module - PGO indicator.
3
+
4
+ This module provides the Pretty Good Oscillator (PGO) developed
5
+ by Mark Johnson for measuring price distance from moving average
6
+ in terms of ATR.
7
+
8
+ Classes:
9
+ PrettyGoodOscillator: PGO indicator (aliases: PGO, PrettyGoodOsc).
10
+
11
+ Example:
12
+ class MyStrategy(bt.Strategy):
13
+ def __init__(self):
14
+ # Calculate Pretty Good Oscillator with 14-period
15
+ self.pgo = bt.indicators.PrettyGoodOscillator(self.data, period=14)
16
+
17
+ def next(self):
18
+ # Buy when PGO rises above 3.0 (breakout signal)
19
+ if self.pgo[0] > 3.0:
20
+ self.buy()
21
+ # Sell short when PGO falls below -3.0
22
+ elif self.pgo[0] < -3.0:
23
+ self.sell()
24
+ # Exit positions when returning to zero
25
+ elif len(self.position) > 0 and abs(self.pgo[0]) < 0.5:
26
+ self.close()
27
+ """
28
+
29
+ import math
30
+
31
+ from . import ATR, Indicator, MovAv
32
+
33
+
34
+ class PrettyGoodOscillator(Indicator):
35
+ """
36
+ The "Pretty Good Oscillator" (PGO) by Mark Johnson measures the distance of
37
+ the current close from its simple moving average of period
38
+ Average), expressed in terms of an average true range (see Average True
39
+ Range) over a similar period.
40
+
41
+ So for instance a PGO value of +2.5 would mean the current close is 2.5
42
+ average days' range above the SMA.
43
+
44
+ Johnson's approach was to use it as a breakout system for longer term
45
+ trades. If the PGO rises above 3.0 then go long, or below -3.0 then go
46
+ short, and in both cases exit on returning to zero (which is a close back
47
+ at the SMA).
48
+
49
+ Formula:
50
+ - pgo = (data.close - sma(data, period)) / atr(data, period)
51
+
52
+ See also:
53
+ - http://user42.tuxfamily.org/chart/manual/Pretty-Good-Oscillator.html
54
+
55
+ """
56
+
57
+ alias = (
58
+ "PGO",
59
+ "PrettyGoodOsc",
60
+ )
61
+ lines = ("pgo",)
62
+
63
+ params = (
64
+ ("period", 14),
65
+ ("_movav", MovAv.Simple),
66
+ )
67
+
68
+ def __init__(self):
69
+ """Initialize the Pretty Good Oscillator.
70
+
71
+ Creates moving average and ATR sub-indicators.
72
+ """
73
+ super().__init__()
74
+ self.movav = self.p._movav(self.data, period=self.p.period)
75
+ self.atr = ATR(self.data, period=self.p.period)
76
+
77
+ def next(self):
78
+ """Calculate PGO for the current bar.
79
+
80
+ Formula: PGO = (price - MA) / ATR
81
+ """
82
+ atr_val = self.atr[0]
83
+ if atr_val != 0:
84
+ self.lines.pgo[0] = (self.data[0] - self.movav[0]) / atr_val
85
+ else:
86
+ self.lines.pgo[0] = 0.0
87
+
88
+ def once(self, start, end):
89
+ """Calculate PGO in runonce mode."""
90
+ darray = self.data.array
91
+ ma_array = self.movav.lines[0].array
92
+ atr_array = self.atr.lines[0].array
93
+ larray = self.lines.pgo.array
94
+
95
+ while len(larray) < end:
96
+ larray.append(float("nan"))
97
+
98
+ for i in range(start, min(end, len(darray), len(ma_array), len(atr_array))):
99
+ data_val = darray[i] if i < len(darray) else 0.0
100
+ ma_val = ma_array[i] if i < len(ma_array) else 0.0
101
+ atr_val = atr_array[i] if i < len(atr_array) else 0.0
102
+
103
+ if (
104
+ isinstance(ma_val, float)
105
+ and math.isnan(ma_val)
106
+ or isinstance(atr_val, float)
107
+ and math.isnan(atr_val)
108
+ ):
109
+ larray[i] = float("nan")
110
+ elif atr_val != 0:
111
+ larray[i] = (data_val - ma_val) / atr_val
112
+ else:
113
+ larray[i] = 0.0