def __init__(self, parameter, *args, **kwargs): Indicator.__init__(self, parameter, *args, **kwargs) self.input = [] self.s_ema = Ema(parameter[0], self.row) self.l_ema = Ema(parameter[1], self.row) self.output = [] # macd self.ema_macd = EmaMacd(parameter[2])
class Macd(Indicator): """ Moving Average Convergence-Divergence (MACD) indicator class input: data = list or tuple of float or integer values parameter = tuple (x, y, z); where x is short term ema, y is long term ema, and z is ema of the macd""" def __init__(self, parameter, *args, **kwargs): Indicator.__init__(self, parameter, *args, **kwargs) self.input = [] self.s_ema = Ema(parameter[0], self.row) self.l_ema = Ema(parameter[1], self.row) self.output = [] # macd self.ema_macd = EmaMacd(parameter[2]) def calculate(self, candle): value = candle[self.row] self.input.append(float(value)) self.s_ema.append(candle) self.l_ema.append(candle) outputvalue = None if len(self.input) >= self.parameter[1]: try: outputvalue = self.s_ema[-1] - self.l_ema[-1] except: self.input = self.input[:-1] self.s_ema = self.s_ema[:-1] self.l_ema = self.l_ema[:-1] raise IndicatorError, 'error calculating macd value; reverting input data back to previous state' self.output.append(outputvalue) ema_macd_candle = None # make fake candle for ema_macd if outputvalue != None: ema_macd_candle = (candle[0], outputvalue, outputvalue, outputvalue, outputvalue, 0) self.ema_macd.append(ema_macd_candle) def revertToPreviousState(self): # remove previous virtual candle Indicator.revertToPreviousState(self) self.input = self.input[:-1] self.output = self.output[:-1] self.s_ema.revertToPreviousState() self.l_ema.revertToPreviousState() self.ema_macd.revertToPreviousState() def validateParameter(self, parameter): if type(parameter) is not tuple: raise IndicatorError, 'invalid parameter for initializing Macd instance, should be an tuple; input: %s' % (self.parameter, ) if len(parameter) != 3: raise IndicatorError, 'invalid parameter for initializing Macd instance, should be an tuple with length 3 (e.g. 4,8,5); input: %s' % (self.parameter, ) if parameter[0] >= parameter[1]: raise IndicatorError, 'invalid parameter for initializing Macd instance, should be an tuple with length 3 (e.g. 4,8,5) and parameter 1 should be smaller than parameter 2; input: %s' % (self.parameter, ) # overrided functions def __str__(self): string = '' for i in xrange(len(self.input)): string+='%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % (i+1, self.times[i], self.input[i], str(self.s_ema[i])[:7], str(self.l_ema[i])[:7], str(self.output[i])[:7], str(self.ema_macd[i])) return 'Macd(%s):\n%s' % (self.parameter, string) def __repr__(self): return 'Macd(%s)' % self.parameter def __len__(self): return len(self.output) def __getitem__(self, offset): return self.output[offset] def __getslice__(self, low, high): return self.output[low:high]
class Macd(Indicator): """ Moving Average Convergence-Divergence (MACD) indicator class input: data = list or tuple of float or integer values parameter = tuple (x, y, z); where x is short term ema, y is long term ema, and z is ema of the macd""" def __init__(self, parameter, *args, **kwargs): Indicator.__init__(self, parameter, *args, **kwargs) self.input = [] self.s_ema = Ema(parameter[0], self.row) self.l_ema = Ema(parameter[1], self.row) self.output = [] # macd self.ema_macd = EmaMacd(parameter[2]) def calculate(self, candle): value = candle[self.row] self.input.append(float(value)) self.s_ema.append(candle) self.l_ema.append(candle) outputvalue = None if len(self.input) >= self.parameter[1]: try: outputvalue = self.s_ema[-1] - self.l_ema[-1] except: self.input = self.input[:-1] self.s_ema = self.s_ema[:-1] self.l_ema = self.l_ema[:-1] raise IndicatorError( 'error calculating macd value; reverting input data back to previous state' ) self.output.append(outputvalue) ema_macd_candle = None # make fake candle for ema_macd if outputvalue != None: ema_macd_candle = (candle[0], outputvalue, outputvalue, outputvalue, outputvalue, 0) self.ema_macd.append(ema_macd_candle) def revertToPreviousState(self): # remove previous virtual candle Indicator.revertToPreviousState(self) self.input = self.input[:-1] self.output = self.output[:-1] self.s_ema.revertToPreviousState() self.l_ema.revertToPreviousState() self.ema_macd.revertToPreviousState() def validateParameter(self, parameter): if type(parameter) is not tuple: raise IndicatorError( 'invalid parameter for initializing Macd instance, should be an tuple; input: %s' % (self.parameter, )) if len(parameter) != 3: raise IndicatorError( 'invalid parameter for initializing Macd instance, should be an tuple with length 3 (e.g. 4,8,5); input: %s' % (self.parameter, )) if parameter[0] >= parameter[1]: raise IndicatorError( 'invalid parameter for initializing Macd instance, should be an tuple with length 3 (e.g. 4,8,5) and parameter 1 should be smaller than parameter 2; input: %s' % (self.parameter, )) # overrided functions def __str__(self): string = '' for i in range(len(self.input)): string += '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % ( i + 1, self.times[i], self.input[i], str(self.s_ema[i])[:7], str(self.l_ema[i])[:7], str( self.output[i])[:7], str(self.ema_macd[i])) return 'Macd(%s):\n%s' % (self.parameter, string) def __repr__(self): return 'Macd(%s)' % self.parameter def __len__(self): return len(self.output) def __getitem__(self, offset): return self.output[offset] def __getslice__(self, low, high): return self.output[low:high]