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  }