kraken-bot/kraken_bot/MovingAverageCrossOver.py
2024-12-12 13:57:42 -05:00

65 lines
1.9 KiB
Python

import backtrader
class MA_CrossOver(backtrader.Strategy):
'''This is a long-only strategy which operates on a moving average cross
Note:
- Although the default
Buy Logic:
- No position is open on the data
- The ``fast`` moving averagecrosses over the ``slow`` strategy to the
upside.
Sell Logic:
- A position exists on the data
- The ``fast`` moving average crosses over the ``slow`` strategy to the
downside
Order Execution Type:
- Market
'''
alias = ('SMA_CrossOver',)
params = (
# period for the fast Moving Average
('fast', 24),
# period for the slow moving average
('slow', 72),
# moving average to use
('_movav', backtrader.ind.MovAv.SMA)
)
def __init__(self):
sma_fast = self.p._movav(period=self.p.fast)
sma_slow = self.p._movav(period=self.p.slow)
self.buysig = backtrader.ind.CrossOver(sma_fast, sma_slow)
def log(self, txt, dt=None):
''' Logging function fot this strategy'''
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
return
if order.status in [order.Completed]:
if order.isbuy():
self.log('BUY EXECUTED, %.6f' % order.executed.price)
elif order.issell():
self.log('SELL EXECUTED, %.6f' % order.executed.price)
self.bar_executed = len(self)
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('Order Canceled/Margin/Rejected')
self.order = None
def next(self):
if self.position.size:
if self.buysig < 0:
self.sell()
elif self.buysig > 0:
self.buy()