实例代码如下:

__init__学习笔记里面的策略方法我们发现如下:

def __init__(self):
    ...
    self.ma1 = bt.indicators.SMA(self.datas[0],
                                   period=self.p.period
                                  )
    self.ma2 = bt.indicators.SMA(self.datas[1],
                                   period=self.p.period
                                  )

这里没什么好争论的(风格是非常个人化的东西,我不会碰它)

next策略的方法中,以下是买卖的逻辑决策。

...
# 还没有......如果......我们可能会购买
if (self.ma1[0]-self.ma1[-1])/self.ma1[-1]>(self.ma2[0]-self.ma2[-1])/self.ma2[-1]:
...

...
# 已经在市场上......我们可能会出售
if (self.ma1[0]-self.ma1[-1])/self.ma1[-1]<=(self.ma2[0]-self.ma2[-1])/self.ma2[-1]:
...

这两个逻辑块实际上可以做得更好,这也将增加可读性、可维护性和调整(如果需要)

与其对移动平均线(当前点0和前一点-1)进行比较,然后进行一些划分,让我们看看如何为我们预先计算它。

让我们调整__init__,看看会不会有更优秀的表达方法:

def __init__(self):
    ...

    # Let's create the moving averages as before
    ma1 = bt.ind.SMA(self.data0, period=self.p.period)
    ma2 = bt.ind.SMA(self.data1, period=self.p.period)

    # Use line delay notation (-x) to get a ref to the -1 point
    ma1_pct = ma1 / ma1(-1) - 1.0  # The ma1 percentage part
    ma2_pct = ma2 / ma2(-1) - 1.0  # The ma2 percentage part

    self.buy_sig = ma1_pct > ma2_pct  # buy signal
    self.sell_sig = ma1_pct <= ma2_pct  # sell signal

我们现在可以将它带到next方法中并执行以下操作:

def next(self):
    ...
    # 还没有......如果......我们可能会购买
    if self.buy_sig:
    ...

    ...
    # 已经在市场上......我们可能会出售
    if self.sell_sig:
    ...

请注意,我们甚至不必使用self.buy_sig[0],因为布尔测试 makeif self.buy_sig已经被backtrader 机器翻译为检查[0]

恕我直言,一种更简洁的方法,其中__init__使用标准算术和逻辑运算(并使用行延迟符号 (-x))定义逻辑使代码更好。

在任何情况下,对于结束语,也可以尝试使用内置 PercentChange指示器(又名PctChange

顾名思义,它确实已经计算了给定时间段内的百分比变化。中的代码__init__现在看起来像这样

def __init__(self):
    ...

    # Let's create the moving averages as before
    ma1 = bt.ind.SMA(self.data0, period=self.p.period)
    ma2 = bt.ind.SMA(self.data1, period=self.p.period)

    ma1_pct = bt.ind.PctChange(ma1, period=1)  # The ma1 percentage part
    ma2_pct = bt.ind.PctChange(ma2, period=1)  # The ma2 percentage part

    self.buy_sig = ma1_pct > ma2_pct  # buy signal
    self.sell_sig = ma1_pct <= ma2_pct  # sell signal

在这种情况下它并没有太大的区别,但是如果计算更大更复杂,它肯定可以为您省去很多麻烦。

评论被关闭。