github.com/MicahParks/go-rsi@v1.0.7/rsi_test.go (about)

     1  package rsi_test
     2  
     3  import (
     4  	"log"
     5  	"math/big"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/MicahParks/go-rsi"
    10  )
    11  
    12  func BenchmarkBigRSI_Calculate(b *testing.B) {
    13  	avgGain := avg(avgGains[0:rsi.DefaultPeriods])
    14  	avgLoss := avg(avgLosses[0:rsi.DefaultPeriods])
    15  
    16  	r, _ := rsi.NewBig(0, rsi.BigInput{
    17  		AverageGain: big.NewFloat(avgGain),
    18  		AverageLoss: big.NewFloat(avgLoss),
    19  	})
    20  
    21  	for i := rsi.DefaultPeriods; i < len(bigAvgGains); i++ {
    22  		avgGain, _ = bigAvgGains[i].Float64()
    23  		avgLoss, _ = bigAvgLosses[i].Float64()
    24  		_ = r.Calculate(rsi.BigInput{
    25  			AverageGain: big.NewFloat(avgGain),
    26  			AverageLoss: big.NewFloat(avgLoss),
    27  		})
    28  	}
    29  }
    30  
    31  func BenchmarkRSI_Calculate(b *testing.B) {
    32  	avgGain := avg(avgGains[0:rsi.DefaultPeriods])
    33  	avgLoss := avg(avgLosses[0:rsi.DefaultPeriods])
    34  
    35  	r, _ := rsi.New(0, rsi.Input{
    36  		AverageGain: avgGain,
    37  		AverageLoss: avgLoss,
    38  	})
    39  
    40  	for i := rsi.DefaultPeriods; i < len(avgGains); i++ {
    41  		avgGain = avgGains[i]
    42  		avgLoss = avgLosses[i]
    43  		_ = r.Calculate(rsi.Input{
    44  			AverageGain: avgGain,
    45  			AverageLoss: avgLoss,
    46  		})
    47  	}
    48  }
    49  
    50  func ExampleRSI_Calculate() {
    51  	// Create a logger.
    52  	logger := log.New(os.Stdout, "", 0)
    53  
    54  	// Gather some data.
    55  	//
    56  	// For production systems, it'd be best to gather test data asynchronously.
    57  	avgGains, avgLosses = avgGains, avgLosses
    58  
    59  	// Determine the number of periods for the initial inputs. Defaults to 14.
    60  	periods := rsi.DefaultPeriods
    61  
    62  	// Average the gains and losses over the given period.
    63  	avgGain := avg(avgGains[0:periods])
    64  	avgLoss := avg(avgLosses[0:periods])
    65  	initialInput := rsi.Input{
    66  		AverageGain: avgGain,
    67  		AverageLoss: avgLoss,
    68  	}
    69  
    70  	// Create the RSI data structure and get the first result.
    71  	//
    72  	// If the first argument, the initial periods is 0, the default value, 14, will be used.
    73  	r, result := rsi.New(uint(periods), initialInput)
    74  	logger.Printf("Period index: %d\nAverage gain: %.2f\nAverage loss: %.2f\nRSI: %.2f", periods-1, avgGain, avgLoss, result)
    75  
    76  	// Use the remaining data to generate the RSI for each period.
    77  	for i := periods; i < len(avgGains); i++ {
    78  		avgGain = avgGains[i]
    79  		avgLoss = avgLosses[i]
    80  		result = r.Calculate(rsi.Input{
    81  			AverageGain: avgGain,
    82  			AverageLoss: avgLoss,
    83  		})
    84  	}
    85  	logger.Printf("Period index: %d\nAverage gain: %.2f\nAverage loss: %.2f\nRSI: %.2f", len(avgGains)-1, avgGain, avgLoss, result)
    86  	// Output: Period index: 13
    87  	// Average gain: -0.11
    88  	// Average loss: -0.11
    89  	// RSI: 50.37
    90  	// Period index: 99
    91  	// Average gain: 0.35
    92  	// Average loss: 0.00
    93  	// RSI: 271.62
    94  }
    95  
    96  func TestBigRSI_Calculate(t *testing.T) {
    97  	avgGain := avg(avgGains[0:rsi.DefaultPeriods])
    98  	avgLoss := avg(avgLosses[0:rsi.DefaultPeriods])
    99  
   100  	r, result := rsi.NewBig(0, rsi.BigInput{
   101  		AverageGain: big.NewFloat(avgGain),
   102  		AverageLoss: big.NewFloat(avgLoss),
   103  	})
   104  
   105  	res, _ := result.Float64()
   106  	if res != results[0] {
   107  		t.FailNow()
   108  	}
   109  
   110  	for i := rsi.DefaultPeriods; i < len(bigAvgGains); i++ {
   111  		avgGain, _ = bigAvgGains[i].Float64()
   112  		avgLoss, _ = bigAvgLosses[i].Float64()
   113  		result = r.Calculate(rsi.BigInput{
   114  			AverageGain: big.NewFloat(avgGain),
   115  			AverageLoss: big.NewFloat(avgLoss),
   116  		})
   117  		res, _ = result.Float64()
   118  		if res != results[i-rsi.DefaultPeriods+1] {
   119  			t.FailNow()
   120  		}
   121  	}
   122  }
   123  
   124  func TestRSI_Calculate(t *testing.T) {
   125  	avgGain := avg(avgGains[0:rsi.DefaultPeriods])
   126  	avgLoss := avg(avgLosses[0:rsi.DefaultPeriods])
   127  
   128  	r, result := rsi.New(0, rsi.Input{
   129  		AverageGain: avgGain,
   130  		AverageLoss: avgLoss,
   131  	})
   132  	if results[0] != result {
   133  		t.FailNow()
   134  	}
   135  
   136  	for i := rsi.DefaultPeriods; i < len(avgGains); i++ {
   137  		avgGain = avgGains[i]
   138  		avgLoss = avgLosses[i]
   139  		result = r.Calculate(rsi.Input{
   140  			AverageGain: avgGain,
   141  			AverageLoss: avgLoss,
   142  		})
   143  		if results[i-rsi.DefaultPeriods+1] != result {
   144  			t.FailNow()
   145  		}
   146  	}
   147  }
   148  
   149  func avg(s []float64) (avg float64) {
   150  	for _, v := range s {
   151  		avg += v
   152  	}
   153  	avg /= float64(len(s))
   154  	return avg
   155  }
   156  
   157  func floatToBig(s []float64) (b []*big.Float) {
   158  	l := len(s)
   159  	b = make([]*big.Float, l)
   160  	for i := 0; i < l; i++ {
   161  		b[i] = big.NewFloat(s[i])
   162  	}
   163  	return b
   164  }
   165  
   166  var (
   167  	avgGains = []float64{
   168  		-0.6046602879796196,
   169  		0,
   170  		0,
   171  		0.30091186058528707,
   172  		0.21426387258237492,
   173  		0.4688898449024232,
   174  		-0.6790846759202163,
   175  		-0.360871416856906,
   176  		0,
   177  		0.2065826619136986,
   178  		-0.5238203060500009,
   179  		-0.6072534395455154,
   180  		0,
   181  		0,
   182  		0,
   183  		0,
   184  		-0.7886049150193449,
   185  		0,
   186  		-0.9769168685862624,
   187  		0,
   188  		0,
   189  		0.7302314772948083,
   190  		-0.8969919575618727,
   191  		-0.9222122589217269,
   192  		0.9269868035744142,
   193  		-0.6908388315056789,
   194  		0,
   195  		0.40380328579570035,
   196  		0.8963417453962161,
   197  		-0.6445397825093294,
   198  		-0.6227283173637045,
   199  		0,
   200  		0,
   201  		-0.41032284435628247,
   202  		0,
   203  		0.8305339189948062,
   204  		0,
   205  		0,
   206  		0,
   207  		-0.559392449071014,
   208  		0,
   209  		0.8458327872480417,
   210  		0,
   211  		-0.8143945509670211,
   212  		0.539210105890946,
   213  		0,
   214  		0,
   215  		-0.6278346050000227,
   216  		0,
   217  		0.9296116354490302,
   218  		-0.4117626883450162,
   219  		0,
   220  		0,
   221  		0,
   222  		-0.09838378898573259,
   223  		-0.15184340208190175,
   224  		-0.15965092146489504,
   225  		0.5390745170394794,
   226  		0,
   227  		0,
   228  		0.012825909106361078,
   229  		0,
   230  		0.3443150177263606,
   231  		0,
   232  		0,
   233  		0,
   234  		0.411540363220476,
   235  		-0.09211762444074219,
   236  		0.2507622754291802,
   237  		-0.21256094905031958,
   238  		0,
   239  		0,
   240  		0,
   241  		0.9498832061012532,
   242  		0.4004323171418129,
   243  		0.42868843006993296,
   244  		0,
   245  		0,
   246  		0.07244835679235131,
   247  		0,
   248  		0.24784452318699535,
   249  		0,
   250  		0,
   251  		-0.5838347418625311,
   252  		0.6491884165984236,
   253  		0.33205608571906026,
   254  		0.31051027622482125,
   255  		-0.8332418155281546,
   256  		-0.4173258421903824,
   257  		-0.8958032677441458,
   258  		0.7916723090820832,
   259  		0.43269824007906393,
   260  		-0.0429216421763342,
   261  		0,
   262  		-0.12436351859954159,
   263  		-0.3148047959559753,
   264  		-0.37026753645051064,
   265  		-0.7698890899830834,
   266  		0.34686388037925503,
   267  		0.3511342996652132,
   268  	}
   269  	avgLosses = []float64{
   270  		0,
   271  		-0.4377141871869802,
   272  		0.06563701921747622,
   273  		0,
   274  		0,
   275  		0,
   276  		0,
   277  		0,
   278  		-0.29311424455385804,
   279  		0,
   280  		0,
   281  		0,
   282  		-0.5948085976830626,
   283  		-0.30152268100656,
   284  		-0.544155573000885,
   285  		-0.5305857153507052,
   286  		0,
   287  		-0.2971122606397708,
   288  		0,
   289  		0.6810783123925709,
   290  		-0.932846428518434,
   291  		0,
   292  		0,
   293  		0,
   294  		0,
   295  		0,
   296  		0.6494894605929404,
   297  		0,
   298  		0,
   299  		0,
   300  		0,
   301  		0.5352818906344061,
   302  		0.6280981712183633,
   303  		0,
   304  		-0.5501469205077233,
   305  		0,
   306  		-0.39998376285699544,
   307  		-0.40961827788499267,
   308  		-0.0028430411748625642,
   309  		0,
   310  		0.4584424785756506,
   311  		0,
   312  		0.24746660783662855,
   313  		0,
   314  		0,
   315  		0.2940063127950149,
   316  		-0.35576726540923664,
   317  		0,
   318  		-0.02519395979489504,
   319  		0,
   320  		0,
   321  		-0.9579539135375136,
   322  		0.7830349733960021,
   323  		0.19003276633920804,
   324  		0,
   325  		0,
   326  		0,
   327  		0,
   328  		0.6841751300974551,
   329  		0.654270134424146,
   330  		0,
   331  		0.3691117091643448,
   332  		0,
   333  		0.5550021356347942,
   334  		0.16867966833433606,
   335  		-0.7002878731458151,
   336  		0,
   337  		0,
   338  		0,
   339  		0,
   340  		-0.09297015549992493,
   341  		-0.44846436394045647,
   342  		-0.6718291062346395,
   343  		0,
   344  		0,
   345  		0,
   346  		-0.23632747430436052,
   347  		0.7275772560415229,
   348  		0,
   349  		-0.9777634773577185,
   350  		0,
   351  		0.8351038011543529,
   352  		-0.6320034337887998,
   353  		0,
   354  		0,
   355  		0,
   356  		0,
   357  		0,
   358  		0,
   359  		0,
   360  		0,
   361  		0,
   362  		0,
   363  		0.5034867900486911,
   364  		0,
   365  		0,
   366  		0,
   367  		0,
   368  		0,
   369  		0,
   370  	}
   371  	results = []float64{
   372  		50.37372814979006,
   373  		42.46506760316381,
   374  		36.455074343328356,
   375  		48.19141056422313,
   376  		44.83183826881235,
   377  		55.75402991428148,
   378  		65.48845086614251,
   379  		52.076954832425926,
   380  		42.07698338873929,
   381  		54.6070966669469,
   382  		63.378465750456634,
   383  		53.692072030084134,
   384  		61.801030904080655,
   385  		75.11905942769799,
   386  		70.9237382460841,
   387  		51.289847633279685,
   388  		68.01512283852966,
   389  		76.43427216113786,
   390  		101.05867776981523,
   391  		170.44976443141798,
   392  		147.5025543564119,
   393  		100.32043640017389,
   394  		100.66763898515933,
   395  		64.4492758322958,
   396  		46.140995751088376,
   397  		46.043230662096285,
   398  		62.76192062871468,
   399  		86.38582878645303,
   400  		45.99829305988126,
   401  		704.430625812193,
   402  		111.6841364461389,
   403  		138.8495600143825,
   404  		-380.17885329730524,
   405  		98.20564701629775,
   406  		99.47091158198144,
   407  		96.52941068543409,
   408  		119.82433081203759,
   409  		90.99612399563593,
   410  		19.597066891868494,
   411  		63.3598555296549,
   412  		152.17608602794462,
   413  		129.2868718557359,
   414  		116.9371564551939,
   415  		111.4636377754057,
   416  		34.54439777560913,
   417  		3.396369035345714,
   418  		1.761056575962911,
   419  		2.7495938316288004,
   420  		2.0959460333819067,
   421  		20.96946935887337,
   422  		15.711724254181803,
   423  		14.520112354584882,
   424  		21.969737016580808,
   425  		41.09598649610068,
   426  		37.3970532079977,
   427  		47.13001378882817,
   428  		38.38541994784097,
   429  		41.62856720991248,
   430  		74.19151021942693,
   431  		-283.21016850672277,
   432  		160.4912184098133,
   433  		139.64945134065763,
   434  		128.37722956290588,
   435  		154.44495974399064,
   436  		92.30336997284398,
   437  		92.62171505950914,
   438  		232.22566829566225,
   439  		193.680855227925,
   440  		94.12119307931962,
   441  		161.98418317624737,
   442  		319.25770441319946,
   443  		154.2936541595806,
   444  		138.38531290124757,
   445  		129.63956633323778,
   446  		186.7752541101841,
   447  		-2083.6051319263383,
   448  		64.48372074758835,
   449  		-457.18970525464147,
   450  		172.87708240856972,
   451  		182.89002322956657,
   452  		66.85383721821556,
   453  		60.12399884284471,
   454  		10.695418395042864,
   455  		256.6490063935015,
   456  		121.85686796662169,
   457  		137.52227459653716,
   458  		271.6187142609139,
   459  	}
   460  	bigAvgGains  = floatToBig(avgGains)
   461  	bigAvgLosses = floatToBig(avgLosses)
   462  )