github.com/influxdata/influxdb/v2@v2.7.6/influxql/query/internal/gota/trix.go (about)

     1  package gota
     2  
     3  // Trix - TRIple Exponential average (http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:trix)
     4  type TRIX struct {
     5  	ema1  EMA
     6  	ema2  EMA
     7  	ema3  EMA
     8  	last  float64
     9  	count int
    10  }
    11  
    12  // NewTRIX constructs a new TRIX.
    13  func NewTRIX(inTimePeriod int, warmType WarmupType) *TRIX {
    14  	ema1 := NewEMA(inTimePeriod, warmType)
    15  	ema2 := NewEMA(inTimePeriod, warmType)
    16  	ema3 := NewEMA(inTimePeriod, warmType)
    17  	return &TRIX{
    18  		ema1: *ema1,
    19  		ema2: *ema2,
    20  		ema3: *ema3,
    21  	}
    22  }
    23  
    24  // Add adds a new sample value to the algorithm and returns the computed value.
    25  func (trix *TRIX) Add(v float64) float64 {
    26  	cur := trix.ema1.Add(v)
    27  	if trix.ema1.Warmed() || trix.ema1.warmType == WarmEMA {
    28  		cur = trix.ema2.Add(cur)
    29  		if trix.ema2.Warmed() || trix.ema2.warmType == WarmEMA {
    30  			cur = trix.ema3.Add(cur)
    31  		}
    32  	}
    33  
    34  	rate := ((cur / trix.last) - 1) * 100
    35  	trix.last = cur
    36  	if !trix.Warmed() && trix.ema3.Warmed() {
    37  		trix.count++
    38  	}
    39  	return rate
    40  }
    41  
    42  // WarmCount returns the number of samples that must be provided for the algorithm to be fully "warmed".
    43  func (trix *TRIX) WarmCount() int {
    44  	if trix.ema1.warmType == WarmEMA {
    45  		return trix.ema1.WarmCount() + 1
    46  	}
    47  	return trix.ema1.WarmCount()*3 + 1
    48  }
    49  
    50  // Warmed indicates whether the algorithm has enough data to generate accurate results.
    51  func (trix *TRIX) Warmed() bool {
    52  	return trix.count == 2
    53  }