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 )