You are here:  Home » 量化交易与机器学习 » backtrader » 动态指示符 – backtrader中文教程

动态Indicator

Indicators难以野兽。不是因为他们很难在编写一般情况下,但主要是因为这个名字有误导之嫌,人们有不同的期望以什么的指标is.

Let的尝试至少定义什么的Indicator里面的backtraderecosystem.

It是一个对象,其限定至少一个输出line,可限定影响其行为,并采取一个或多个数据输入参数input.

In为​​了保持指标尽可能通用以下的设计原则选择:

  • 的输入数据馈送可以是任何东西看起来像数据馈送,这带来了直接的好处:因为其他指标看起来像数据饲料,可以通过指标作为输入到其它indicators
  • Nodatetime line的有效载荷中携带。之所以如此,是因为输入可能没有datetime有效载荷本身同步到。和同步的一般系统宽datetime可能是不正确的,因为指标可以用数据来工作从weekly时间表而系统时间可能中滴答seconds,因为这是几个数据的最低分辨率一个滋生bears.
  • Operations已经为幂等,即:如果用相同的输入调用两次并且没有在参数变化时,输出必须是same.

    Take虑的指示符可以被要求执行操作几次在同一时间点以相同的输入。虽然这似乎没有必要,这是如果系统支持data replaying(即:建设从较小的时间内实时更大的时间框架)

  • 最后:一个Indicator它的输出值写入到当前时刻的时间,即:指数0。如果不是会名为Study。一个Study将寻找模式,并在past.

    See例如Backtrader社区写输出值 – ZigZag

Once定义(在backtrader生态系统)是明确的,让我们试着看看我们如何能够实际编写了dynamic指标。这似乎是我们不能,因为观察上述设计原则,操作指示器的过程是或多或少…非mutable.

The最高高… …以来

它通常放置在运动的一个指标是Highest(别名MaxN),以获得highest东西在给定的时间。作为in

import backtrader as bt

class MyStrategy(bt.Strategy)
    def __init__(self):
        self.the_highest_high_15 = bt.ind.Highest(self.data.high, period=15)

    def next(self):
        if self.the_highest_high_15 > X:
            print("ABOUT TO DO SOMETHING")

In这个片段中,我们实例化Highest跟踪最高的高沿着过去的15个周期。是最高价大于X什么将done.

The捕这里:

  • `的period固定为15

使其成为dynamic

Sometimes,我们需要该指标是动态的,并改变其行为反应实时情况。见例如在这个问题backtrader社区:由于排名最高的高点是opened

We当然不知道什么时候的位置将被打开/关闭,并设置period为固定值等15将毫无意义。让我们看看我们如何能做到这一点,包装在indicator

Dynamic params

We’ll一切使用我们的生命过程中不断变化的参数是第一指标,实现与it.

import backtrader as bt

class DynamicHighest(bt.Indicator):
    lines = ("dyn_highest",)
    params = dict(tradeopen=False)

    def next(self):
        if self.p.tradeopen:
            self.lines.dyn_highest[0] = max(self.data[0], self.dyn_highest[-1])

class MyStrategy(bt.Strategy)
    def __init__(self):
        self.dyn_highest = DynamicHighest(self.data.high)

    def notify_trade(self, trade):
        self.dyn_highest.p.tradeopen = trade.isopen

    def next(self):
        if self.dyn_highest > X:
            print("ABOUT TO DO SOMETHING")

Et活力瞧!我们拥有它,我们至今未破奠定了我们的规则指标。让我们来看看indicator

  • It定义输出line命名dyn_highest
  • 它有一个参数tradeopen=False
  • (是的,它需要的数据源,只是因为它的子类Indicator
  • 如果我们调用next总是以相同的输入,它总是会返回相同的value

The唯一:

  • 如果参数变化时,输出变化值(上述规则说的输出保持不变,只要参数不改变)

我们notify_trade影响使用我们的DynamicHighest

  • 我们使用的值isopen通报trade作为一个标志知道我们要记录输入的最高点data
  • When的trade关闭的isopenFalse我们将停止录制最高value

For参考请参见:Backtrader文档Trade

Easy!

使用method

Some会有人反对的param是部分修改该指标的申报,只应在设置instantiation.

Ok,让我们去method.

import backtrader as bt

class DynamicHighest(bt.Indicator):
    lines = ("dyn_highest",)

    def __init__(self):
        self._tradeopen = False

    def tradeopen(self, yesno):
        self._tradeopen = yesno

    def next(self):
        if self._tradeopen:
            self.lines.dyn_highest[0] = max(self.data[0], self.dyn_highest[-1])

class MyStrategy(bt.Strategy)
    def __init__(self):
        self.dyn_highest = DynamicHighest(self.data.high)

    def notify_trade(self, trade):
        self.dyn_highest.tradeopen(trade.isopen)

    def next(self):
        if self.dyn_highest > X:
            print("ABOUT TO DO SOMETHING")

Not的巨大差异,但现在的指标有一些额外的样板与__init__和方法tradeopen(self, yesno)。但动态我们DynamicHighest是same.

Bonus:让我们把它一般purpose

Let的恢复params并做出可以将指标一不同的功能不仅max

import backtrader as bt

class DynamicFn(bt.Indicator):
    lines = ("dyn_highest",)
    params = dict(fn=None)

    def __init__(self):
        self._tradeopen = False
        # Safeguard for not set function
        self._fn = self.p.fn or lambda x, y: x

    def tradeopen(self, yesno):
        self._tradeopen = yesno

    def next(self):
        if self._tradeopen:
            self.lines.dyn_highest[0] = self._fn(self.data[0], self.dyn_highest[-1])

class MyStrategy(bt.Strategy)
    def __init__(self):
        self.dyn_highest = DynamicHighest(self.data.high, fn=max)

    def notify_trade(self, trade):
        self.dyn_highest.tradeopen(trade.isopen)

    def next(self):
        if self.dyn_highest > X:
            print("ABOUT TO DO SOMETHING")

说的和做!我们说:

  • params=dict(fn=None)

    要收集的功能,最终用户希望use

  • A维护使用占位符的功能,如果用户没有通过具体的功能:
    # Safeguard for not set function
    self._fn = self.p.fn or lambda x, y: x
    
  • 而且我们使用的计算功能(或占位符):
    self.lines.dyn_highest[0] = self._fn(self.data[0], self.dyn_highest[-1])
    
  • 陈述中的调用我们的(现名为)DynamicFn该指标功能我们想用…max(这里没有惊喜):
    self.dyn_highest = DynamicHighest(self.data.high, fn=max)
    

没有更多的左今天…享受它!

评论被关闭。