-
Notifications
You must be signed in to change notification settings - Fork 1
/
simple_moving_average.py
43 lines (32 loc) · 1.54 KB
/
simple_moving_average.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from backtesting.strategy import Strategy
from backtesting.event import SignalEvent
class SimpleMovingAverageStrategy(Strategy):
def __init__(self, bars, events, long_window, short_window):
self.bars = bars
self.events = events
self.long_window = long_window
self.short_window = short_window
self.symbol_list = self.bars.symbol_list
self.bought = self._calculate_initial_bought()
def _calculate_initial_bought(self):
bought = {}
for symbol in self.symbol_list:
bought[symbol] = False
return bought
def calculate_signals(self, event):
if event.type == 'MARKET':
for symbol in self.symbol_list:
long_bars = self.bars.get_latest_bars(symbol, self.long_window)
short_bars = self.bars.get_latest_bars(symbol, self.short_window)
if len(long_bars.index) < self.long_window:
continue
long_avg = long_bars['CLOSING PRICE'].mean()
short_avg = short_bars['CLOSING PRICE'].mean()
if short_avg > long_avg and not self.bought[symbol]:
signal = SignalEvent(symbol, long_bars.iloc[-1].name, 'LONG')
self.events.put(signal)
self.bought[symbol] = True
if short_avg < long_avg and self.bought[symbol]:
signal = SignalEvent(symbol, long_bars.iloc[-1].name, 'EXIT')
self.events.put(signal)
self.bought[symbol] = False