示例#1
0
文件: factory.py 项目: wcy/vectorbt
    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)
示例#2
0
    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)