Backtrader量化&回测11——策略信号Indicator

对于程序来讲,该有的代码一行都不会少,但是把代码分块就可以很直观的阅读或修改代码。使用Indicator可以将策略的信号从策略类Strategy中脱离出来,方便策略进行协调与控制

文章目录

策略信号

官网中对于Indicator的解释是:https://www.backtrader.com/docu/induse/

比如下面就是一个Indicator类,和策略一样:

  • def __init__:初始化的一些函数,可生成一些交易信号
  • def next(self):与Strategy类中的next用法一致,每一个模拟的交易日,都会先执行Indicator类,然后才会执行这个交易日的策略类中的next()方法
class BuySignalIndicator(bt.Indicator):
    lines = ("",)

    def __init__(self):
        self.should_buy = False

    def next(self):
        if self.datas[0].close[0] > self.datas[0].open[0]:
            self.should_buy = True
        else:
            self.should_buy = False

注意:在Indicator类中是没有self.datetime方法的,因此在信号类中其实是无法直接读取当天的日期的

示例代码

import backtrader as bt

class BuySignalIndicator(bt.Indicator):
    lines = ("",)

    def __init__(self):
        self.should_buy = False

    def next(self):
        if self.datas[0].close[0] > self.datas[0].open[0]:
            self.should_buy = True
        else:
            self.should_buy = False


class TestStrategy(bt.Strategy):  # 策略
    def __init__(self):
        self.close_price = self.datas[0].close  # 这里加一个数据引用,方便后续操作
        self.my_indicator = BuySignalIndicator()

    def next(self):
        if self.my_indicator.should_buy:
            self.buy(size=500, price=self.data.close[0])
        else:
            if self.position:
                self.sell(size=500, price=self.data.close[0])

这样,在执行策略时,执行顺序是:

  1. 在策略类Strategy中,执行初始化 def __init__()
  2. 在信号类Indicator中,执行初始化 def __init__()
  3. 在信号类Indicator中,执行next()函数
  4. 在策略类Strategy中,执行next()函数

猜你喜欢

转载自blog.csdn.net/weixin_35757704/article/details/129472501