Backtrader: обратная позиция в кроссовере MA - PullRequest
0 голосов
/ 09 марта 2019

Я начал работать над кодом, взятым из фрагментов чужого кода для стратегии SMA Crossover. То, что я пытаюсь сделать, это: Давайте предположим, что сигнал пересечения (пересечение вверх) произошел и вошел в длинную позицию. Цена выросла, но некоторые тяжелые продажи происходят позже, вызвав еще один сигнал кроссовера (пересечение вниз). Я хотел бы закрыть позицию LONG и на следующий день ввести позицию SHORT. Когда происходит следующее событие кроссовера (пересечение вверх), я бы хотел закрыть позицию SHORT, а на следующий день ввести позицию LONG.

Вот код:

# parameters
    params = (
        # period for the fast Moving Average
        ('fast', 20),
        # period for the slow moving average
        ('slow', 200),
        # Exit Bar entry delay for flipped position
        ('exitbars', 1),
        # moving average to use
        ('_movav', bt.ind.MovAv.SMA)
    )

# Indicators
    sma_fast = self.p._movav(period=self.p.fast)
    sma_slow = self.p._movav(period=self.p.slow)

    self.buysig = bt.ind.CrossOver(sma_fast, sma_slow)
    self.sellsig = bt.ind.CrossOver(sma_slow, sma_fast)

# order logic        
    if not self.position:

        # buy signal
        if self.buysig > 0:
            # BUY
            self.log('BUY CREATE, %.2f' % self.dataclose[0])
            # Keep track of the created order to avoid a 2nd order
            self.order = self.buy()
        elif self.sellsig > 0:
            #if len(self) >= (self.bar_executed + self.params.exitbars):
                # Sell
            self.log('SELL CREATE, %.2f' % self.dataclose[0])
                # Keep track of the created order to avoid a 2nd order
            self.order = self.sell(size=1000)
            #else:
                #return
        else:
            return
    else:    # in a position        
        if self.buysig < 0:
            # Buy Closed
            self.log('BUY CLOSE, %.2f' % self.dataclose[0])
            self.order = self.close()
        # elif ignore zero case
        elif self.sellsig < 0:
            # Sell Closed
            self.log('SELL CLOSE, %.2f' % self.dataclose[0])
            self.order = self.close()
        else:
            return
...