def __init__(self, *args, class_name='CustomSignals', input_names=None, attr_settings=None, exit_only=False, iteratively=False, **kwargs): if input_names is None: input_names = [] if attr_settings is None: attr_settings = {} if iteratively: exit_only = True if exit_only: if len(input_names) > 0: if input_names[0] != 'entries': input_names = ['entries'] + input_names else: input_names = ['entries'] output_names = ['exits'] if iteratively: output_names = ['new_entries'] + output_names attr_settings['new_entries'] = dict(dtype=np.bool) else: output_names = ['entries', 'exits'] attr_settings['entries'] = dict(dtype=np.bool) attr_settings['exits'] = dict(dtype=np.bool) IndicatorFactory.__init__( self, *args, class_name=class_name, input_names=input_names, output_names=output_names, attr_settings=attr_settings, **kwargs ) self.exit_only = exit_only self.iteratively = iteratively def plot(_self, entry_y=None, exit_y=None, entry_types=None, exit_types=None, entry_trace_kwargs=None, exit_trace_kwargs=None, fig=None, **kwargs): # pragma: no cover if _self.wrapper.ndim > 1: raise TypeError("Select a column first. Use indexing.") if entry_trace_kwargs is None: entry_trace_kwargs = {} if exit_trace_kwargs is None: exit_trace_kwargs = {} if entry_types is not None: entry_trace_kwargs = merge_dicts(dict( customdata=entry_types, hovertemplate="(%{x}, %{y})<br>Type: %{customdata}" ), entry_trace_kwargs) if exit_types is not None: exit_trace_kwargs = merge_dicts(dict( customdata=exit_types, hovertemplate="(%{x}, %{y})<br>Type: %{customdata}" ), exit_trace_kwargs) if exit_only and iteratively: entries = _self.new_entries else: entries = _self.entries exits = _self.exits fig = entries.vbt.signals.plot_as_entry_markers( y=entry_y, trace_kwargs=entry_trace_kwargs, fig=fig, **kwargs) fig = exits.vbt.signals.plot_as_exit_markers( y=exit_y, trace_kwargs=exit_trace_kwargs, fig=fig, **kwargs) return fig plot.__doc__ = """Plot `{0}.{1}` and `{0}.exits`. Args: entry_y (array_like): Y-axis values to plot entry markers on. exit_y (array_like): Y-axis values to plot exit markers on. entry_types (array_like): Entry types in string format. exit_types (array_like): Exit types in string format. entry_trace_kwargs (dict): Keyword arguments passed to \ `vectorbt.signals.accessors.SignalsSRAccessor.plot_as_entry_markers` for `{0}.{1}`. exit_trace_kwargs (dict): Keyword arguments passed to \ `vectorbt.signals.accessors.SignalsSRAccessor.plot_as_exit_markers` for `{0}.exits`. fig (plotly.graph_objects.Figure): Figure to add traces to. **kwargs: Keyword arguments passed to `vectorbt.signals.accessors.SignalsSRAccessor.plot_as_markers`. """.format( class_name, 'new_entries' if exit_only and iteratively else 'entries' ) setattr(self.CustomIndicator, 'plot', plot)
def __init__(self, *args, mode: tp.Union[str, int] = FactoryMode.Both, input_names: tp.Optional[tp.Sequence[str]] = None, attr_settings: tp.KwargsLike = None, **kwargs) -> None: mode = map_enum_fields(mode, FactoryMode) if input_names is None: input_names = [] else: input_names = list(input_names) if attr_settings is None: attr_settings = {} if 'entries' in input_names: raise ValueError("entries cannot be used in input_names") if 'exits' in input_names: raise ValueError("exits cannot be used in input_names") if mode == FactoryMode.Entries: output_names = ['entries'] elif mode == FactoryMode.Exits: input_names = ['entries'] + input_names output_names = ['exits'] elif mode == FactoryMode.Both: output_names = ['entries', 'exits'] else: input_names = ['entries'] + input_names output_names = ['new_entries', 'exits'] if 'entries' in input_names: attr_settings['entries'] = dict(dtype=np.bool_) for output_name in output_names: attr_settings[output_name] = dict(dtype=np.bool_) IndicatorFactory.__init__(self, *args, input_names=input_names, output_names=output_names, attr_settings=attr_settings, **kwargs) self.mode = mode def plot(_self, entry_y: tp.Optional[tp.ArrayLike] = None, exit_y: tp.Optional[tp.ArrayLike] = None, entry_types: tp.Optional[tp.ArrayLikeSequence] = None, exit_types: tp.Optional[tp.ArrayLikeSequence] = None, entry_trace_kwargs: tp.KwargsLike = None, exit_trace_kwargs: tp.KwargsLike = None, fig: tp.Optional[tp.BaseFigure] = None, **kwargs) -> tp.BaseFigure: # pragma: no cover if _self.wrapper.ndim > 1: raise TypeError("Select a column first. Use indexing.") if entry_trace_kwargs is None: entry_trace_kwargs = {} if exit_trace_kwargs is None: exit_trace_kwargs = {} entry_trace_kwargs = merge_dicts( dict(name="New Entry" if mode == FactoryMode.Chain else "Entry"), entry_trace_kwargs) exit_trace_kwargs = merge_dicts(dict(name="Exit"), exit_trace_kwargs) if entry_types is not None: entry_types = np.asarray(entry_types) entry_trace_kwargs = merge_dicts( dict(customdata=entry_types, hovertemplate="(%{x}, %{y})<br>Type: %{customdata}"), entry_trace_kwargs) if exit_types is not None: exit_types = np.asarray(exit_types) exit_trace_kwargs = merge_dicts( dict(customdata=exit_types, hovertemplate="(%{x}, %{y})<br>Type: %{customdata}"), exit_trace_kwargs) if mode == FactoryMode.Entries: fig = _self.entries.vbt.signals.plot_as_entry_markers( y=entry_y, trace_kwargs=entry_trace_kwargs, fig=fig, **kwargs) elif mode == FactoryMode.Exits: fig = _self.entries.vbt.signals.plot_as_entry_markers( y=entry_y, trace_kwargs=entry_trace_kwargs, fig=fig, **kwargs) fig = _self.exits.vbt.signals.plot_as_exit_markers( y=exit_y, trace_kwargs=exit_trace_kwargs, fig=fig, **kwargs) elif mode == FactoryMode.Both: fig = _self.entries.vbt.signals.plot_as_entry_markers( y=entry_y, trace_kwargs=entry_trace_kwargs, fig=fig, **kwargs) fig = _self.exits.vbt.signals.plot_as_exit_markers( y=exit_y, trace_kwargs=exit_trace_kwargs, fig=fig, **kwargs) else: fig = _self.new_entries.vbt.signals.plot_as_entry_markers( y=entry_y, trace_kwargs=entry_trace_kwargs, fig=fig, **kwargs) fig = _self.exits.vbt.signals.plot_as_exit_markers( y=exit_y, trace_kwargs=exit_trace_kwargs, fig=fig, **kwargs) return fig plot.__doc__ = """Plot `{0}.{1}` and `{0}.exits`. Args: entry_y (array_like): Y-axis values to plot entry markers on. exit_y (array_like): Y-axis values to plot exit markers on. entry_types (array_like): Entry types in string format. exit_types (array_like): Exit types in string format. entry_trace_kwargs (dict): Keyword arguments passed to \ `vectorbt.signals.accessors.SignalsSRAccessor.plot_as_entry_markers` for `{0}.{1}`. exit_trace_kwargs (dict): Keyword arguments passed to \ `vectorbt.signals.accessors.SignalsSRAccessor.plot_as_exit_markers` for `{0}.exits`. fig (Figure or FigureWidget): Figure to add traces to. **kwargs: Keyword arguments passed to `vectorbt.signals.accessors.SignalsSRAccessor.plot_as_markers`. """.format(self.class_name, 'new_entries' if mode == FactoryMode.Chain else 'entries') setattr(self.Indicator, 'plot', plot)