65 lines
1.9 KiB
Python
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()
|