github.com/MicahParks/go-rsi@v1.0.7/big.go (about) 1 package rsi 2 3 import ( 4 "math/big" 5 ) 6 7 var ( 8 big1 = big.NewFloat(1) 9 big100 = big.NewFloat(100) 10 ) 11 12 // BigInput represents the averages for a period that are inputted into the RSI algorithm. 13 type BigInput struct { 14 AverageGain *big.Float 15 AverageLoss *big.Float 16 } 17 18 // BigRSI represents the state of a Relative Strength Index (RSI) algorithm. 19 type BigRSI struct { 20 periods *big.Float 21 periodsMinus1 *big.Float 22 previous BigInput 23 } 24 25 // NewBig creates a new RSI data structure and returns the initial result. 26 func NewBig(periods uint, initial BigInput) (r *BigRSI, result *big.Float) { 27 if periods == 0 { 28 periods = DefaultPeriods 29 } 30 31 r = &BigRSI{ 32 periods: big.NewFloat(float64(periods)), 33 previous: initial, 34 } 35 r.periodsMinus1 = new(big.Float).Sub(r.periods, big1) 36 37 result = new(big.Float).Sub(big100, new(big.Float).Quo(big100, new(big.Float).Add(big1, new(big.Float).Quo(new(big.Float).Quo(r.previous.AverageGain, r.periods), new(big.Float).Quo(r.previous.AverageLoss, r.periods))))) 38 39 return r, result 40 } 41 42 // Calculate produces the next RSI result given the next input. 43 func (r *BigRSI) Calculate(next BigInput) (result *big.Float) { 44 r.previous.AverageGain = new(big.Float).Quo(new(big.Float).Add(new(big.Float).Mul(r.previous.AverageGain, r.periodsMinus1), next.AverageGain), r.periods) 45 r.previous.AverageLoss = new(big.Float).Quo(new(big.Float).Add(new(big.Float).Mul(r.previous.AverageLoss, r.periodsMinus1), next.AverageLoss), r.periods) 46 47 result = new(big.Float).Sub(big100, new(big.Float).Quo(big100, new(big.Float).Add(big1, new(big.Float).Quo(r.previous.AverageGain, r.previous.AverageLoss)))) 48 49 return result 50 }