mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-01 06:49:24 +08:00
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
"""
|
|
Transformations for common technical indicators.
|
|
TODO: add MACD transform
|
|
TODO: add trailing stop
|
|
|
|
"""
|
|
import datetime
|
|
from qsim.core import BaseTransform
|
|
import qsim.util as qutil
|
|
|
|
class MovingAverage(BaseTransform):
|
|
"""
|
|
Calculate a unweighted moving average for props['sid'] security
|
|
TODO: add sid -> mvavg dict.
|
|
"""
|
|
|
|
def __init__(self, name, days):
|
|
BaseTransform.__init__(self, name)
|
|
self.events = []
|
|
self.current_total = 0
|
|
self.window = datetime.timedelta(days = days)
|
|
|
|
def transform(self, event):
|
|
"""Update the moving average with the latest data point."""
|
|
|
|
self.events.append(event)
|
|
self.current_total += event['price']
|
|
event_date = qutil.parse_date(event['dt'])
|
|
|
|
index = 0
|
|
for cur_event in self.events:
|
|
cur_date = qutil.parse_date(cur_event['dt'])
|
|
if(cur_date - event_date):
|
|
self.events.pop(index)
|
|
self.current_total -= cur_event['price']
|
|
index += 1
|
|
else:
|
|
break
|
|
|
|
if(len(self.events) == 0):
|
|
return 0.0
|
|
|
|
self.average = self.current_total/len(self.events)
|
|
|
|
self.state['value'] = self.average
|
|
return self.state
|
|
|