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.
- back_trader_python-1.4.0.dist-info/METADATA +1491 -0
- back_trader_python-1.4.0.dist-info/RECORD +465 -0
- back_trader_python-1.4.0.dist-info/WHEEL +5 -0
- back_trader_python-1.4.0.dist-info/licenses/LICENSE +674 -0
- back_trader_python-1.4.0.dist-info/top_level.txt +1 -0
- backtrader/__init__.py +148 -0
- backtrader/_cerebro/__init__.py +5 -0
- backtrader/_cerebro/channel.py +382 -0
- backtrader/_cerebro/execution.py +377 -0
- backtrader/_cerebro/lifecycle.py +143 -0
- backtrader/_cerebro/notifications.py +150 -0
- backtrader/_cerebro/presentation.py +230 -0
- backtrader/_cerebro/registry.py +593 -0
- backtrader/_cerebro/runnext.py +551 -0
- backtrader/_cerebro/runonce.py +142 -0
- backtrader/analyzer.py +594 -0
- backtrader/analyzers/__init__.py +50 -0
- backtrader/analyzers/annualreturn.py +226 -0
- backtrader/analyzers/calmar.py +165 -0
- backtrader/analyzers/drawdown.py +287 -0
- backtrader/analyzers/leverage.py +112 -0
- backtrader/analyzers/logreturnsrolling.py +190 -0
- backtrader/analyzers/periodstats.py +153 -0
- backtrader/analyzers/positions.py +119 -0
- backtrader/analyzers/pyfolio.py +470 -0
- backtrader/analyzers/returns.py +192 -0
- backtrader/analyzers/sharpe.py +307 -0
- backtrader/analyzers/sharpe_ratio_stats.py +534 -0
- backtrader/analyzers/sqn.py +112 -0
- backtrader/analyzers/timereturn.py +192 -0
- backtrader/analyzers/total_value.py +75 -0
- backtrader/analyzers/tradeanalyzer.py +278 -0
- backtrader/analyzers/transactions.py +141 -0
- backtrader/analyzers/vwr.py +245 -0
- backtrader/bokeh/__init__.py +155 -0
- backtrader/bokeh/analyzers/__init__.py +13 -0
- backtrader/bokeh/analyzers/plot.py +192 -0
- backtrader/bokeh/analyzers/recorder.py +181 -0
- backtrader/bokeh/app.py +1094 -0
- backtrader/bokeh/live/__init__.py +11 -0
- backtrader/bokeh/live/client.py +352 -0
- backtrader/bokeh/live/datahandler.py +346 -0
- backtrader/bokeh/plot_adapter.py +200 -0
- backtrader/bokeh/schemes/__init__.py +14 -0
- backtrader/bokeh/schemes/blackly.py +76 -0
- backtrader/bokeh/schemes/scheme.py +150 -0
- backtrader/bokeh/schemes/tradimo.py +82 -0
- backtrader/bokeh/tab.py +125 -0
- backtrader/bokeh/tabs/__init__.py +30 -0
- backtrader/bokeh/tabs/analyzer.py +120 -0
- backtrader/bokeh/tabs/config.py +154 -0
- backtrader/bokeh/tabs/live.py +109 -0
- backtrader/bokeh/tabs/log.py +185 -0
- backtrader/bokeh/tabs/metadata.py +182 -0
- backtrader/bokeh/tabs/performance.py +359 -0
- backtrader/bokeh/tabs/source.py +70 -0
- backtrader/bokeh/utils/__init__.py +8 -0
- backtrader/bokeh/utils/helpers.py +167 -0
- backtrader/bokeh/webapp.py +164 -0
- backtrader/broker.py +478 -0
- backtrader/brokers/__init__.py +36 -0
- backtrader/brokers/bbroker.py +2576 -0
- backtrader/brokers/btapibroker.py +8227 -0
- backtrader/brokers/hft/__init__.py +89 -0
- backtrader/brokers/hft/binance_bbo.py +625 -0
- backtrader/brokers/hft/binance_bbo_compare.py +1398 -0
- backtrader/brokers/hft/examples.py +1228 -0
- backtrader/brokers/hft/exchange.py +380 -0
- backtrader/brokers/hft/latency.py +309 -0
- backtrader/brokers/hft/matching_core.py +572 -0
- backtrader/brokers/hft/queue.py +238 -0
- backtrader/brokers/hft/recorder.py +88 -0
- backtrader/brokers/hft/state.py +138 -0
- backtrader/brokers/impact_models.py +118 -0
- backtrader/brokers/mixbroker.py +895 -0
- backtrader/brokers/tickbroker.py +1991 -0
- backtrader/btrun/__init__.py +12 -0
- backtrader/btrun/btrun.py +1218 -0
- backtrader/cerebro.py +828 -0
- backtrader/channel.py +682 -0
- backtrader/channels/__init__.py +23 -0
- backtrader/channels/bridge.py +186 -0
- backtrader/channels/funding.py +248 -0
- backtrader/channels/live_queue.py +216 -0
- backtrader/channels/live_validator.py +294 -0
- backtrader/channels/orderbook.py +257 -0
- backtrader/channels/tick.py +202 -0
- backtrader/comminfo.py +665 -0
- backtrader/commissions/__init__.py +106 -0
- backtrader/commissions/ctpoption.py +993 -0
- backtrader/configs/account_config_example.yaml +8 -0
- backtrader/dataseries.py +379 -0
- backtrader/errors.py +106 -0
- backtrader/events.py +980 -0
- backtrader/feed.py +1523 -0
- backtrader/feeds/__init__.py +75 -0
- backtrader/feeds/barrier.py +2006 -0
- backtrader/feeds/blaze.py +118 -0
- backtrader/feeds/btapifeed.py +1538 -0
- backtrader/feeds/btcsv.py +203 -0
- backtrader/feeds/chainer.py +114 -0
- backtrader/feeds/cryptohftdata.py +164 -0
- backtrader/feeds/csvgeneric.py +1205 -0
- backtrader/feeds/ctpcohort.py +1051 -0
- backtrader/feeds/influxfeed.py +158 -0
- backtrader/feeds/livefeed.py +71 -0
- backtrader/feeds/mixed_channel.py +108 -0
- backtrader/feeds/mt4csv.py +42 -0
- backtrader/feeds/pandafeed.py +381 -0
- backtrader/feeds/quandl.py +256 -0
- backtrader/feeds/rollover.py +229 -0
- backtrader/feeds/sierrachart.py +30 -0
- backtrader/feeds/vchart.py +162 -0
- backtrader/feeds/vchartcsv.py +84 -0
- backtrader/feeds/vchartfile.py +153 -0
- backtrader/feeds/yahoo.py +399 -0
- backtrader/fillers.py +148 -0
- backtrader/filters/__init__.py +34 -0
- backtrader/filters/bsplitter.py +127 -0
- backtrader/filters/calendardays.py +121 -0
- backtrader/filters/datafiller.py +192 -0
- backtrader/filters/datafilter.py +74 -0
- backtrader/filters/daysteps.py +96 -0
- backtrader/filters/heikinashi.py +63 -0
- backtrader/filters/renko.py +164 -0
- backtrader/filters/session.py +289 -0
- backtrader/flt.py +80 -0
- backtrader/functions.py +960 -0
- backtrader/indicator.py +449 -0
- backtrader/indicators/__init__.py +148 -0
- backtrader/indicators/accdecoscillator.py +110 -0
- backtrader/indicators/aroon.py +300 -0
- backtrader/indicators/atr.py +315 -0
- backtrader/indicators/awesomeoscillator.py +122 -0
- backtrader/indicators/basicops.py +834 -0
- backtrader/indicators/bollinger.py +223 -0
- backtrader/indicators/cci.py +89 -0
- backtrader/indicators/channels_ext.py +83 -0
- backtrader/indicators/contrib/__init__.py +228 -0
- backtrader/indicators/contrib/absolutely_no_lag_lwma.py +28 -0
- backtrader/indicators/contrib/absolutely_no_lag_lwma_color.py +44 -0
- backtrader/indicators/contrib/accumulation_distribution_line.py +92 -0
- backtrader/indicators/contrib/adx_cross_hull_style_indicator.py +249 -0
- backtrader/indicators/contrib/adxdmi.py +34 -0
- backtrader/indicators/contrib/ai_acceleration_deceleration_oscillator.py +34 -0
- backtrader/indicators/contrib/altr_trend_signal_v22.py +85 -0
- backtrader/indicators/contrib/anchored_momentum_line.py +115 -0
- backtrader/indicators/contrib/any_range_cld_tail_indicator.py +82 -0
- backtrader/indicators/contrib/aroon_horn_sign_indicator.py +96 -0
- backtrader/indicators/contrib/aroon_oscillator_sign_alert.py +50 -0
- backtrader/indicators/contrib/arrows_curves_indicator.py +112 -0
- backtrader/indicators/contrib/as_ctrend_indicator.py +143 -0
- backtrader/indicators/contrib/asimmetric_stoch_nr_indicator.py +187 -0
- backtrader/indicators/contrib/atr_normalize_histogram.py +118 -0
- backtrader/indicators/contrib/average_change_candle.py +165 -0
- backtrader/indicators/contrib/bb_squeeze_indicator.py +60 -0
- backtrader/indicators/contrib/bezier_st_dev_indicator.py +135 -0
- backtrader/indicators/contrib/binary_wave_indicator.py +233 -0
- backtrader/indicators/contrib/blau_c_momentum_indicator.py +123 -0
- backtrader/indicators/contrib/blau_cmi_indicator.py +141 -0
- backtrader/indicators/contrib/blau_csi.py +76 -0
- backtrader/indicators/contrib/blau_ergodic.py +53 -0
- backtrader/indicators/contrib/blau_t_stoch_i.py +72 -0
- backtrader/indicators/contrib/blau_ts_stochastic.py +85 -0
- backtrader/indicators/contrib/blau_tvi.py +55 -0
- backtrader/indicators/contrib/brain_trend2_indicator.py +128 -0
- backtrader/indicators/contrib/brain_trend_signal_proxy.py +47 -0
- backtrader/indicators/contrib/brake_parb_indicator.py +85 -0
- backtrader/indicators/contrib/breakout_bars_trend_v2.py +121 -0
- backtrader/indicators/contrib/bsi_indicator.py +87 -0
- backtrader/indicators/contrib/bulls_bears_eyes.py +67 -0
- backtrader/indicators/contrib/bulls_power.py +56 -0
- backtrader/indicators/contrib/bw_wise_man1_signal.py +102 -0
- backtrader/indicators/contrib/bykov_trend_indicator.py +85 -0
- backtrader/indicators/contrib/candle_stop_color.py +46 -0
- backtrader/indicators/contrib/candles_x_smoothed_indicator.py +69 -0
- backtrader/indicators/contrib/candlesticks_bw.py +45 -0
- backtrader/indicators/contrib/caudate_x_period_candle_color.py +56 -0
- backtrader/indicators/contrib/cci_histogram_indicator.py +53 -0
- backtrader/indicators/contrib/cci_woodies_indicator.py +80 -0
- backtrader/indicators/contrib/center_of_gravity_candle_indicator.py +83 -0
- backtrader/indicators/contrib/center_of_gravity_indicator.py +70 -0
- backtrader/indicators/contrib/cg_oscillator.py +40 -0
- backtrader/indicators/contrib/close_line_cci.py +38 -0
- backtrader/indicators/contrib/close_price_fractals.py +47 -0
- backtrader/indicators/contrib/color3rd_gen_xma_indicator.py +122 -0
- backtrader/indicators/contrib/color_bb_candles_indicator.py +108 -0
- backtrader/indicators/contrib/color_coppock_indicator.py +157 -0
- backtrader/indicators/contrib/color_hma.py +71 -0
- backtrader/indicators/contrib/color_j_variation_indicator.py +53 -0
- backtrader/indicators/contrib/color_metro_de_marker_indicator.py +78 -0
- backtrader/indicators/contrib/color_metro_stochastic_indicator.py +93 -0
- backtrader/indicators/contrib/color_metro_wpr_indicator.py +85 -0
- backtrader/indicators/contrib/color_schaff_de_marker_trend_cycle.py +92 -0
- backtrader/indicators/contrib/color_schaff_trend_cycle_indicator.py +203 -0
- backtrader/indicators/contrib/color_step_xccx_indicator.py +193 -0
- backtrader/indicators/contrib/color_x2_ma.py +49 -0
- backtrader/indicators/contrib/color_x_derivative.py +63 -0
- backtrader/indicators/contrib/color_zerolag_de_marker.py +84 -0
- backtrader/indicators/contrib/corrected_average_indicator.py +127 -0
- backtrader/indicators/contrib/darvas_boxes_system.py +73 -0
- backtrader/indicators/contrib/dema_range_channel_color.py +42 -0
- backtrader/indicators/contrib/derivative_indicator.py +95 -0
- backtrader/indicators/contrib/digital_ft01_indicator.py +112 -0
- backtrader/indicators/contrib/digital_macd.py +200 -0
- backtrader/indicators/contrib/donchian_channels_system.py +45 -0
- backtrader/indicators/contrib/dots_indicator.py +93 -0
- backtrader/indicators/contrib/ef_distance_indicator.py +82 -0
- backtrader/indicators/contrib/ema_rsi_va.py +80 -0
- backtrader/indicators/contrib/envelopes_jp_alonso.py +32 -0
- backtrader/indicators/contrib/f2a_ao_indicator.py +120 -0
- backtrader/indicators/contrib/fatl_filter.py +179 -0
- backtrader/indicators/contrib/fibo_candles_indicator.py +78 -0
- backtrader/indicators/contrib/fine_tuning_ma.py +100 -0
- backtrader/indicators/contrib/fisher_org_v1.py +102 -0
- backtrader/indicators/contrib/fisher_org_v1_sign.py +118 -0
- backtrader/indicators/contrib/force_index_ema.py +96 -0
- backtrader/indicators/contrib/force_index_ema_2.py +27 -0
- backtrader/indicators/contrib/forecast_oscilator.py +145 -0
- backtrader/indicators/contrib/fractal_amambk.py +81 -0
- backtrader/indicators/contrib/frama_series.py +84 -0
- backtrader/indicators/contrib/frasm_av2_indicator.py +104 -0
- backtrader/indicators/contrib/go_indicator.py +93 -0
- backtrader/indicators/contrib/hlr_indicator.py +95 -0
- backtrader/indicators/contrib/hma.py +50 -0
- backtrader/indicators/contrib/i4_drfv2.py +34 -0
- backtrader/indicators/contrib/i4_drfv3.py +38 -0
- backtrader/indicators/contrib/i_anch_mom_indicator.py +72 -0
- backtrader/indicators/contrib/i_de_marker_sign_indicator.py +64 -0
- backtrader/indicators/contrib/i_gap_indicator.py +45 -0
- backtrader/indicators/contrib/i_stoch_komposter_indicator.py +77 -0
- backtrader/indicators/contrib/i_trend_indicator.py +125 -0
- backtrader/indicators/contrib/iamma_indicator.py +39 -0
- backtrader/indicators/contrib/indexed_moving_average.py +33 -0
- backtrader/indicators/contrib/instantaneous_trend_filter_indicator.py +51 -0
- backtrader/indicators/contrib/inverse_reaction_indicator.py +41 -0
- backtrader/indicators/contrib/irsi_sign_indicator.py +95 -0
- backtrader/indicators/contrib/iwpr_sign_indicator.py +59 -0
- backtrader/indicators/contrib/j_brain_trend1_sig_indicator.py +233 -0
- backtrader/indicators/contrib/j_tpo_proxy.py +32 -0
- backtrader/indicators/contrib/jma_slope_indicator.py +73 -0
- backtrader/indicators/contrib/kalman_filter_indicator.py +119 -0
- backtrader/indicators/contrib/kalman_filter_line.py +127 -0
- backtrader/indicators/contrib/kama_indicator.py +150 -0
- backtrader/indicators/contrib/karacatica_indicator.py +99 -0
- backtrader/indicators/contrib/kdj_indicator.py +59 -0
- backtrader/indicators/contrib/kwan_ccc_indicator.py +195 -0
- backtrader/indicators/contrib/kwan_nrp_indicator.py +113 -0
- backtrader/indicators/contrib/kwan_rdp_indicator.py +192 -0
- backtrader/indicators/contrib/laguerre_adx_indicator.py +85 -0
- backtrader/indicators/contrib/laguerre_filter_indicator.py +66 -0
- backtrader/indicators/contrib/laguerre_plus_di_proxy.py +57 -0
- backtrader/indicators/contrib/laguerre_roc_indicator.py +81 -0
- backtrader/indicators/contrib/le_man_signal_indicator.py +63 -0
- backtrader/indicators/contrib/linear_reg_slope_v2_indicator.py +136 -0
- backtrader/indicators/contrib/loco_indicator.py +88 -0
- backtrader/indicators/contrib/lrma_indicator.py +185 -0
- backtrader/indicators/contrib/lsma_angle_indicator.py +106 -0
- backtrader/indicators/contrib/ma_rounding_channel_indicator.py +149 -0
- backtrader/indicators/contrib/macd2_indicator.py +61 -0
- backtrader/indicators/contrib/macd_candle_indicator.py +80 -0
- backtrader/indicators/contrib/malr_indicator.py +77 -0
- backtrader/indicators/contrib/momentum_candle_sign_indicator.py +51 -0
- backtrader/indicators/contrib/moving_average_fn_indicator.py +139 -0
- backtrader/indicators/contrib/mt5_stochastic_close_close.py +57 -0
- backtrader/indicators/contrib/muv_nor_diff_cloud_indicator.py +107 -0
- backtrader/indicators/contrib/non_lag_dot_indicator.py +124 -0
- backtrader/indicators/contrib/nrtr_extr_indicator.py +95 -0
- backtrader/indicators/contrib/nrtr_indicator.py +95 -0
- backtrader/indicators/contrib/p_channel_system.py +40 -0
- backtrader/indicators/contrib/percent_envelope.py +37 -0
- backtrader/indicators/contrib/percentage_crossover_channel.py +47 -0
- backtrader/indicators/contrib/pivot_zig_zag_proxy.py +47 -0
- backtrader/indicators/contrib/price_channel_stop_indicator.py +104 -0
- backtrader/indicators/contrib/price_extreme_channel.py +35 -0
- backtrader/indicators/contrib/qqe_cloud_indicator.py +129 -0
- backtrader/indicators/contrib/ravi_indicator.py +40 -0
- backtrader/indicators/contrib/raw_close_close_stochastic.py +74 -0
- backtrader/indicators/contrib/rd_trend_trigger_indicator.py +51 -0
- backtrader/indicators/contrib/renko_level.py +85 -0
- backtrader/indicators/contrib/renko_line_break.py +91 -0
- backtrader/indicators/contrib/rftl_indicator.py +41 -0
- backtrader/indicators/contrib/rkd_indicator.py +53 -0
- backtrader/indicators/contrib/roc2_vg_indicator.py +68 -0
- backtrader/indicators/contrib/rsi_histogram_indicator.py +43 -0
- backtrader/indicators/contrib/rsi_slowdown.py +57 -0
- backtrader/indicators/contrib/rsioma_v2.py +41 -0
- backtrader/indicators/contrib/rvi_histogram_indicator.py +107 -0
- backtrader/indicators/contrib/safe_adx.py +89 -0
- backtrader/indicators/contrib/shared_strategy_indicators.py +1651 -0
- backtrader/indicators/contrib/sidus_indicator.py +105 -0
- backtrader/indicators/contrib/silver_trend_indicator.py +79 -0
- backtrader/indicators/contrib/sliding_range_color.py +56 -0
- backtrader/indicators/contrib/slow_stoch.py +42 -0
- backtrader/indicators/contrib/smoothed_adx_indicator.py +86 -0
- backtrader/indicators/contrib/smoothed_rsi.py +31 -0
- backtrader/indicators/contrib/spearman_rank_correlation_histogram.py +60 -0
- backtrader/indicators/contrib/stalin_indicator.py +152 -0
- backtrader/indicators/contrib/starter_laguerre_filter.py +62 -0
- backtrader/indicators/contrib/step_manrtr_indicator.py +137 -0
- backtrader/indicators/contrib/stochastic_histogram_indicator.py +143 -0
- backtrader/indicators/contrib/t3_alarm_indicator.py +125 -0
- backtrader/indicators/contrib/t3_average.py +76 -0
- backtrader/indicators/contrib/t3_indicator.py +40 -0
- backtrader/indicators/contrib/the20s_v020_signal.py +93 -0
- backtrader/indicators/contrib/three_candles_indicator.py +70 -0
- backtrader/indicators/contrib/three_line_break_indicator.py +64 -0
- backtrader/indicators/contrib/time_line.py +57 -0
- backtrader/indicators/contrib/trading_channel_index_proxy.py +48 -0
- backtrader/indicators/contrib/trend_arrows_indicator.py +109 -0
- backtrader/indicators/contrib/trend_continuation_indicator.py +127 -0
- backtrader/indicators/contrib/trend_intensity_index_proxy.py +51 -0
- backtrader/indicators/contrib/trend_manager_indicator.py +39 -0
- backtrader/indicators/contrib/tri_x_candle_indicator.py +51 -0
- backtrader/indicators/contrib/trigger_line.py +66 -0
- backtrader/indicators/contrib/triple_ema_rate.py +34 -0
- backtrader/indicators/contrib/trvi_indicator.py +194 -0
- backtrader/indicators/contrib/two_pb_ideal_xosma_indicator.py +127 -0
- backtrader/indicators/contrib/ultra_absolutely_no_lag_lwma_color.py +92 -0
- backtrader/indicators/contrib/ultra_wpr_indicator.py +173 -0
- backtrader/indicators/contrib/up_down_candle_strength.py +68 -0
- backtrader/indicators/contrib/vinin_i_trend_indicator.py +139 -0
- backtrader/indicators/contrib/volume_weighted_ma_indicator.py +78 -0
- backtrader/indicators/contrib/volume_weighted_ma_st_dev_indicator.py +111 -0
- backtrader/indicators/contrib/vwap_close_indicator.py +65 -0
- backtrader/indicators/contrib/vwma_candle.py +57 -0
- backtrader/indicators/contrib/vwma_digit_system.py +70 -0
- backtrader/indicators/contrib/wami.py +43 -0
- backtrader/indicators/contrib/wprsi_signal_indicator.py +105 -0
- backtrader/indicators/contrib/x_de_marker_histogram_vol_direct_indicator.py +145 -0
- backtrader/indicators/contrib/x_fisher_indicator.py +64 -0
- backtrader/indicators/contrib/xcci_histogram_vol_direct_indicator.py +56 -0
- backtrader/indicators/contrib/xcci_histogram_vol_indicator.py +85 -0
- backtrader/indicators/contrib/xma_ichimoku.py +163 -0
- backtrader/indicators/contrib/xma_ishimoku_channel_indicator.py +65 -0
- backtrader/indicators/contrib/xma_ishimoku_line.py +68 -0
- backtrader/indicators/contrib/xma_range_bands_indicator.py +107 -0
- backtrader/indicators/contrib/xmacd_indicator.py +70 -0
- backtrader/indicators/contrib/xrsi_de_marker_histogram.py +67 -0
- backtrader/indicators/contrib/xrsi_histogram_vol_direct_indicator.py +52 -0
- backtrader/indicators/contrib/xrsi_histogram_vol_indicator.py +81 -0
- backtrader/indicators/contrib/xrvi_indicator.py +130 -0
- backtrader/indicators/contrib/zero_lag_macd.py +36 -0
- backtrader/indicators/contrib/zig_zag_recent_pivot_signal.py +90 -0
- backtrader/indicators/contrib/zpf_indicator.py +115 -0
- backtrader/indicators/crossover.py +337 -0
- backtrader/indicators/dema.py +175 -0
- backtrader/indicators/demarker.py +270 -0
- backtrader/indicators/deviation.py +284 -0
- backtrader/indicators/directionalmove.py +1071 -0
- backtrader/indicators/dma.py +112 -0
- backtrader/indicators/dpo.py +96 -0
- backtrader/indicators/dv2.py +56 -0
- backtrader/indicators/ema.py +145 -0
- backtrader/indicators/envelope.py +475 -0
- backtrader/indicators/hadelta.py +198 -0
- backtrader/indicators/heikinashi.py +153 -0
- backtrader/indicators/hma.py +153 -0
- backtrader/indicators/hurst.py +151 -0
- backtrader/indicators/ichimoku.py +267 -0
- backtrader/indicators/kama.py +181 -0
- backtrader/indicators/kst.py +159 -0
- backtrader/indicators/lrsi.py +125 -0
- backtrader/indicators/mabase.py +147 -0
- backtrader/indicators/macd.py +322 -0
- backtrader/indicators/momentum.py +267 -0
- backtrader/indicators/moneyflow.py +237 -0
- backtrader/indicators/mt5atr.py +124 -0
- backtrader/indicators/myind.py +179 -0
- backtrader/indicators/obv.py +94 -0
- backtrader/indicators/ols.py +265 -0
- backtrader/indicators/oscillator.py +161 -0
- backtrader/indicators/percentchange.py +83 -0
- backtrader/indicators/percentrank.py +46 -0
- backtrader/indicators/pivotpoint.py +469 -0
- backtrader/indicators/prettygoodoscillator.py +113 -0
- backtrader/indicators/priceops_ext.py +123 -0
- backtrader/indicators/priceoscillator.py +262 -0
- backtrader/indicators/psar.py +212 -0
- backtrader/indicators/rmi.py +69 -0
- backtrader/indicators/rsi.py +440 -0
- backtrader/indicators/sma.py +141 -0
- backtrader/indicators/smma.py +116 -0
- backtrader/indicators/spread.py +54 -0
- backtrader/indicators/stochastic.py +263 -0
- backtrader/indicators/supertrend.py +436 -0
- backtrader/indicators/trend_ext.py +105 -0
- backtrader/indicators/trix.py +202 -0
- backtrader/indicators/tsi.py +155 -0
- backtrader/indicators/ultimateoscillator.py +158 -0
- backtrader/indicators/vortex.py +62 -0
- backtrader/indicators/williams.py +194 -0
- backtrader/indicators/wma.py +103 -0
- backtrader/indicators/zlema.py +135 -0
- backtrader/indicators/zlind.py +104 -0
- backtrader/linebuffer.py +3155 -0
- backtrader/lineiterator.py +2911 -0
- backtrader/lineroot.py +1106 -0
- backtrader/lineseries.py +2559 -0
- backtrader/live_trading/__init__.py +31 -0
- backtrader/live_trading/interface.py +404 -0
- backtrader/mathsupport.py +94 -0
- backtrader/metabase.py +1804 -0
- backtrader/mixins/__init__.py +21 -0
- backtrader/mixins/singleton.py +118 -0
- backtrader/observer.py +106 -0
- backtrader/observers/__init__.py +45 -0
- backtrader/observers/benchmark.py +126 -0
- backtrader/observers/broker.py +184 -0
- backtrader/observers/buysell.py +144 -0
- backtrader/observers/drawdown.py +161 -0
- backtrader/observers/logreturns.py +113 -0
- backtrader/observers/timereturn.py +86 -0
- backtrader/observers/trade_logger.py +2972 -0
- backtrader/observers/tradelogger.py +6 -0
- backtrader/observers/trades.py +258 -0
- backtrader/order.py +1114 -0
- backtrader/parameters.py +2345 -0
- backtrader/plot/__init__.py +54 -0
- backtrader/plot/finance.py +1022 -0
- backtrader/plot/formatters.py +200 -0
- backtrader/plot/locator.py +353 -0
- backtrader/plot/multicursor.py +495 -0
- backtrader/plot/plot.py +2500 -0
- backtrader/plot/plot_plotly.py +1351 -0
- backtrader/plot/scheme.py +253 -0
- backtrader/plot/utils.py +104 -0
- backtrader/position.py +290 -0
- backtrader/position_modes.py +132 -0
- backtrader/profiles.py +254 -0
- backtrader/reports/__init__.py +39 -0
- backtrader/reports/charts.py +371 -0
- backtrader/reports/performance.py +620 -0
- backtrader/reports/reporter.py +660 -0
- backtrader/resamplerfilter.py +1001 -0
- backtrader/signal.py +118 -0
- backtrader/signals/__init__.py +17 -0
- backtrader/sizer.py +114 -0
- backtrader/sizers/__init__.py +26 -0
- backtrader/sizers/fixedsize.py +161 -0
- backtrader/sizers/percents_sizer.py +119 -0
- backtrader/store.py +221 -0
- backtrader/stores/__init__.py +33 -0
- backtrader/stores/btapistore.py +15506 -0
- backtrader/stores/livestore.py +137 -0
- backtrader/stores/vchartfile.py +96 -0
- backtrader/strategy.py +3655 -0
- backtrader/talib.py +280 -0
- backtrader/test_helpers.py +96 -0
- backtrader/timer.py +358 -0
- backtrader/trade.py +442 -0
- backtrader/tradingcal.py +361 -0
- backtrader/utils/__init__.py +68 -0
- backtrader/utils/autodict.py +251 -0
- backtrader/utils/date.py +71 -0
- backtrader/utils/dateintern.py +509 -0
- backtrader/utils/flushfile.py +94 -0
- backtrader/utils/fractal.py +101 -0
- backtrader/utils/get_metrics.py +101 -0
- backtrader/utils/load_data.py +209 -0
- backtrader/utils/log_message.py +998 -0
- backtrader/utils/ordereddefaultdict.py +75 -0
- backtrader/utils/py3.py +296 -0
- backtrader/version.py +21 -0
- 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
|