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