Я начал работать над кодом, взятым из фрагментов чужого кода для стратегии 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