def generate_stop_loss_exits(self, ts, stops, trailing=False, first=True, keys=None, broadcast_kwargs={}): """See `vectorbt.signals.nb.generate_stop_loss_exits_nb`. Arguments will be broadcasted using `vectorbt.base.reshape_fns.broadcast` with `broadcast_kwargs`. Argument `stops` can be either a single number, an array of numbers, or a 3D array, where each matrix corresponds to a single configuration. Use `keys` as the outermost level. Example: For each entry in `sig`, set stop loss for 10% and 20% below the entry price: ```python-repl >>> ts = pd.Series([1, 2, 3, 2, 1]) >>> print(sig.vbt.signals.generate_stop_loss_exits(ts, [0.1, 0.5])) stop_loss 0.1 0.5 a b c a b c 2020-01-01 False False False False False False 2020-01-02 False False False False False False 2020-01-03 False False False False False False 2020-01-04 False True True False False False 2020-01-05 False False False False False True >>> print(sig.vbt.signals.generate_stop_loss_exits(ts, [0.1, 0.5], trailing=True)) trail_stop 0.1 0.5 a b c a b c 2020-01-01 False False False False False False 2020-01-02 False False False False False False 2020-01-03 False False False False False False 2020-01-04 True True True False False False 2020-01-05 False False False True False True ```""" entries = self._obj checks.assert_type(ts, (pd.Series, pd.DataFrame)) entries, ts = reshape_fns.broadcast(entries, ts, **broadcast_kwargs, writeable=True) stops = reshape_fns.broadcast_to_array_of(stops, entries.vbt.to_2d_array()) exits = nb.generate_stop_loss_exits_nb(entries.vbt.to_2d_array(), ts.vbt.to_2d_array(), stops, trailing=trailing, first=first) # Build column hierarchy if keys is not None: param_columns = keys else: name = 'trail_stop' if trailing else 'stop_loss' param_columns = index_fns.index_from_values(stops, name=name) columns = index_fns.combine_indexes(param_columns, entries.vbt.columns) return entries.vbt.wrap(exits, columns=columns)
def generate_take_profit_exits(self, ts, stops, first=True, iteratively=False, keys=None, broadcast_kwargs={}): """Generate take profit exits. See `vectorbt.signals.nb.generate_tp_ex_iter_nb` if `iteratively` is `True`, otherwise see `vectorbt.signals.nb.generate_tp_ex_nb`. Arguments will be broadcasted using `vectorbt.base.reshape_fns.broadcast` with `broadcast_kwargs`. Argument `stops` can be either a single number, an array of numbers, or a 3D array, where each matrix corresponds to a single configuration. Use `keys` as the outermost level. Example: For each entry in `sig`, set take profit for 10% and 20% above the entry price: ```python-repl >>> ts = pd.Series([1, 2, 3, 4, 5]) >>> sig.vbt.signals.generate_take_profit_exits(ts, [0.1, 0.5]) take_profit 0.1 0.5 a b c a b c 2020-01-01 False False False False False False 2020-01-02 True True False True True False 2020-01-03 False False False False False False 2020-01-04 False True True False False False 2020-01-05 False False False False False True ```""" entries = self._obj checks.assert_type(ts, (pd.Series, pd.DataFrame)) broadcast_kwargs = merge_kwargs(dict(require_kwargs=dict(requirements='W')), broadcast_kwargs) entries, ts = reshape_fns.broadcast(entries, ts, **broadcast_kwargs) stops = reshape_fns.broadcast_to_array_of(stops, entries.vbt.to_2d_array()) # Build column hierarchy if keys is not None: param_columns = keys else: param_columns = index_fns.index_from_values(stops, name='take_profit') columns = index_fns.combine_indexes(param_columns, entries.vbt.columns) # Perform generation if iteratively: new_entries, exits = nb.generate_tp_ex_iter_nb( entries.vbt.to_2d_array(), ts.vbt.to_2d_array(), stops) return entries.vbt.wrap(new_entries, columns=columns), entries.vbt.wrap(exits, columns=columns) else: exits = nb.generate_tp_ex_nb( entries.vbt.to_2d_array(), ts.vbt.to_2d_array(), stops, first=first) return entries.vbt.wrap(exits, columns=columns)