package indicator import ( "encoding/json" "math" "testing" "git.qtrade.icu/lychiyu/qbtrade/pkg/fixedpoint" "git.qtrade.icu/lychiyu/qbtrade/pkg/types" ) // generated from: // 2020/12/05 10:25 // curl -s 'https://www.binance.com/api/v3/klines?symbol=ETHUSDT&interval=5m&endTime=1607135400000&limit=1000' | jq '. | map({ closePrice: (.[4] | tonumber), openTime: .[0] })' // curl -s 'https://www.binance.com/api/v3/klines?symbol=ETHUSDT&interval=5m&endTime=1607135400000&limit=1000' | jq '. | map(.[4] | tonumber)' var ethusdt5m = []byte(`[ 614.36, 613.62, 611.68, 614.7, 607.69, 606.82, 602.91, 606.35, 606.04, 603.94, 607.37, 599.72, 597.77, 594.36, 595.18, 592.65, 595.44, 595.08, 595.82, 596.31, 592.47, 594.19, 590.71, 586.77, 589.74, 592.33, 593.44, 594.34, 593.89, 594, 590.81, 595.51, 594.08, 596.58, 592.97, 593.3, 590.89, 591.9, 589.67, 590.25, 592.53, 594.01, 591.46, 588.5, 591.34, 589.24, 592, 594.57, 593.98, 593.93, 593.46, 594.22, 595.57, 595.81, 595.44, 599.65, 600.3, 599.5, 601, 598.24, 596.56, 596.55, 595.61, 596.91, 593.49, 592.03, 592.56, 592.95, 593.56, 593.78, 594.69, 594.17, 595.62, 596.06, 595.83, 598.51, 598.29, 596.94, 597.87, 598.02, 595.13, 594.87, 597, 599.89, 599.49, 599.32, 598.82, 597.26, 597.46, 593.32, 592.69, 589.42, 590.39, 589.91, 586.83, 586.53, 588.85, 589.44, 584.95, 584.06, 588.99, 588.75, 588.62, 589.61, 589.27, 585.26, 582.06, 577.06, 583.13, 588.01, 589.25, 589.42, 591.03, 590.99, 592.33, 593.86, 592.12, 593.21, 592.4, 590.86, 590.1, 592.32, 590.79, 592.01, 592.07, 596.66, 595.63, 595.76, 594.8, 594.21, 592.58, 592.19, 592.6, 591.29, 591.89, 590.03, 590.33, 588.53, 589.26, 587.18, 589.03, 587.49, 590.83, 590.63, 587.13, 584.86, 584.86, 584, 587.95, 589.48, 589.31, 586.96, 584.29, 585.68, 587.57, 582.19, 580.7, 580.01, 580.83, 578.84, 578.97, 582.23, 581.45, 582, 582.69, 582.68, 581.54, 581.32, 584.95, 582.57, 580.75, 579.58, 580.13, 582.42, 582.85, 585.5, 584.87, 586.1, 585.39, 587.32, 587.83, 590.11, 589.84, 589.78, 592.13, 590.5, 589.54, 589.01, 590.7, 592.73, 593.54, 591.56, 591.32, 590.49, 590.64, 591.43, 591.94, 593.12, 593.97, 595.47, 596.23, 597.63, 595.06, 595, 594.88, 597.61, 596.67, 600.23, 599.22, 596.36, 597.75, 596.34, 596.05, 595.9, 595.8, 596.33, 597.31, 598.82, 603.56, 602.33, 599.58, 598.7, 598.41, 596.14, 596.21, 595.13, 596.47, 595.81, 594.36, 595.78, 594.66, 596, 597.95, 597.77, 597.57, 598.43, 597.99, 598.4, 600.05, 597.81, 596.52, 597.04, 598.86, 600.16, 601.05, 600.3, 599.6, 597.42, 598.49, 598.62, 589.69, 591.62, 592.73, 593.15, 593.62, 593.77, 592.34, 592.54, 588.71, 591.31, 593.5, 593.36, 593.49, 593.63, 593.62, 593.37, 596.52, 597.04, 597.59, 596.94, 596.09, 595.51, 595.13, 593.1, 594.48, 594.61, 596.8, 595.36, 593.32, 593.58, 593, 591.84, 590.61, 592.27, 591.81, 590.27, 587.59, 587.96, 591.07, 591.86, 589.61, 588.16, 588.08, 585.46, 586.69, 588.21, 588.7, 589.51, 585.28, 586.27, 589.88, 590.97, 590.92, 590.7, 590.09, 589.38, 588.51, 586.69, 585.33, 584.32, 585.42, 586.3, 586.08, 587.32, 587.55, 587.31, 587.07, 587.57, 587.44, 588.56, 588.91, 589.13, 591.17, 594.2, 593.36, 595.75, 596.29, 596.78, 596.82, 596.39, 596.31, 595.77, 595.95, 594.09, 596.86, 595.64, 595.41, 592.67, 594, 594.42, 594.92, 595, 596.46, 596.5, 596.98, 596.57, 599.27, 596.93, 596.47, 596.59, 595.8, 596.01, 596.38, 598.19, 598.72, 598.13, 596.83, 596.36, 597.12, 597.95, 596.02, 596, 596.33, 594.97, 595.82, 596.58, 596.37, 597.88, 598.5, 598.06, 599.71, 599.97, 600.7, 601.44, 599.72, 597.62, 597.24, 597.7, 597.67, 599.85, 599.43, 596.28, 596.21, 597.68, 597.75, 597.35, 598.18, 598.39, 598.54, 599.73, 600.1, 598.7, 597.96, 596.89, 598.8, 599.57, 598.4, 598.12, 597.39, 597.64, 594.69, 595.61, 595.82, 595.97, 596.71, 596, 592.87, 592.94, 591.5, 591.81, 592.02, 593.01, 591.34, 590.34, 590.27, 591.48, 591.92, 591.87, 592.07, 592.43, 592.79, 592.25, 591.28, 591.18, 592, 592.73, 593.61, 592.93, 592.61, 592.68, 593.84, 594.28, 595.41, 595.17, 594.8, 594.67, 595.99, 596.16, 597.58, 596.63, 596.06, 595.24, 595.17, 595.69, 596.51, 596.5, 595.56, 594.47, 593.49, 593.47, 593.81, 593.93, 594, 592.85, 593.04, 593.88, 593.78, 593.16, 594.9, 594.99, 593.91, 591.28, 588.23, 589.01, 589.12, 588.28, 589.36, 589.94, 589.6, 589.77, 590.36, 590.85, 590.18, 590.01, 590.77, 589.97, 590.78, 590.99, 588.95, 588.9, 588.02, 590.51, 592.01, 591.8, 596.14, 595.68, 595.72, 598.47, 598.1, 598.47, 597.27, 595.94, 596.43, 602.8, 607.08, 606.03, 605.98, 603.91, 604.5, 604.19, 604.98, 605.25, 606.41, 599.67, 601.87, 603.85, 603.18, 602.31, 602.5, 603.02, 603.84, 605.19, 605.29, 606.56, 605.54, 605.36, 605.11, 609.64, 608.82, 610.79, 609.74, 612.51, 614.67, 614.8, 613.42, 612.79, 614.4, 610.96, 610.57, 612.19, 613.22, 614.24, 612.67, 612.4, 611.6, 610.69, 611.5, 613.6, 610.99, 611.22, 610.54, 607.53, 608.7, 608.98, 608.4, 608.72, 609.35, 609.84, 608.5, 609.27, 611.71, 610.67, 611.18, 610.87, 612.38, 611.53, 610.7, 610.08, 609, 609.51, 608.16, 609.17, 611.02, 612.63, 612.25, 612.71, 613.27, 612.47, 611.12, 611.34, 611.14, 610.58, 610.01, 610.64, 610.07, 609.73, 610.85, 611.75, 612.76, 612.51, 613.12, 613.03, 614.49, 615.24, 617.37, 618.92, 621.61, 618.66, 608.37, 609.37, 612.48, 614.14, 616.23, 615.57, 615.53, 613.25, 614.73, 614.2, 615.19, 612.99, 609.91, 610.28, 611.5, 612.55, 613.21, 612.74, 611.8, 612.18, 612.2, 612.56, 614.05, 614.67, 614.45, 614.46, 614.16, 614.22, 615.62, 614.73, 614.56, 613.89, 613.38, 614.12, 612.24, 612.39, 611.83, 611.83, 611.24, 611.62, 611.44, 612.21, 612.12, 613.14, 613.53, 613.76, 613.38, 612.76, 613.31, 613.19, 613.71, 613.89, 613.52, 612.32, 611.39, 610.82, 611.03, 611.33, 611.52, 612.69, 612.63, 612.9, 613.25, 612.92, 613.35, 614.23, 614.66, 615.71, 615.39, 614.95, 614.74, 614.84, 615.27, 615.41, 615.74, 615.99, 615.22, 615.22, 614.99, 614.43, 614.7, 616.13, 616.78, 618.41, 618.35, 618.02, 615.89, 616.52, 617.12, 617.46, 616.88, 616.67, 616.9, 615.85, 614.86, 614.16, 614.95, 615.19, 615.17, 615.61, 617.79, 619.39, 618.27, 618.25, 617.81, 617.36, 617.22, 614.3, 613.67, 613.7, 613.79, 614.07, 612.17, 613.29, 612.94, 612.8, 613.1, 611.32, 612.93, 612.42, 611.86, 611.16, 609.93, 610.95, 610.16, 603.83, 606.02, 606.72, 604.39, 604.26, 607, 606.84, 607.84, 607.8, 605.64, 604.26, 605.22, 605.08, 606.01, 605.48, 604.73, 602.64, 604.64, 605.7, 605.58, 605.68, 606.05, 606.2, 606.62, 606.16, 607.36, 606.38, 605.48, 606.12, 607.16, 607.51, 607.4, 607.27, 606.66, 607.21, 606.1, 606.66, 605.73, 605.29, 603.52, 603.46, 604.73, 605.57, 606.04, 606.05, 607.02, 608.31, 607.69, 607.68, 607.45, 607.36, 607.18, 606.89, 605.9, 605.03, 604.85, 604.16, 604.49, 604.43, 604.94, 606.74, 606.51, 606.44, 605.03, 604.28, 606.71, 608.23, 609.64, 611.5, 611.6, 612.57, 611.81, 612.12, 611.87, 610.47, 611.22, 610.86, 609.75, 609.76, 609.06, 609.52, 607.76, 608.81, 609.2, 608.17, 607.88, 608.37, 609.27, 608.69, 608.33, 603.37, 600.33, 592.31, 592.43, 592.5, 591.56, 592.21, 594.3, 594.29, 593.4, 593.25, 594.53, 594.85, 597.23, 596.2, 595.5, 593.74, 591.08, 594.12, 595, 591.83, 590.93, 585.57, 588.02, 587.75, 584.22, 583.38, 586.86, 587.51, 589.39, 589.98, 591.01, 590.7, 591.73, 592.09, 590.98, 591.22, 591.04, 590.08, 588.41, 590.28, 590.95, 589.63, 591.09, 591.04, 590.03, 590.92, 589.92, 589.77, 587.7, 589.1, 591.42, 595.3, 594.44, 593.91, 593.85, 593.08, 592.17, 591.94, 592.46, 591.24, 590.66, 590.42, 590.24, 589.58, 589.38, 590.48, 590, 589.55, 589.3, 586.89, 584.95, 588.32, 583.45, 586.51, 586.6, 586.03, 584.14, 583.92, 585.94, 584.76, 587.6, 588.47, 589.39, 588.17, 588.99, 588.52, 589.23, 589.61, 590.62, 589.68, 589.88, 590.22, 589.78, 589.34, 588.11, 588.63, 588.27, 588.8, 587.96, 589.45, 589.99, 591, 590.82, 591.62, 591.17, 591.14, 590.68, 590.78, 591.87, 591.02, 590.61, 589.85, 589.66, 589.83, 591.09, 589.6, 590.89, 590.83, 589.29, 588.84, 588.51, 588.56, 588.26, 588.83, 587.95, 587.32, 588.3, 588.96, 588.54, 588.87, 589.12, 589.01, 587.54, 585.49, 584.81, 584.11, 584.77, 584.68, 585.07, 582.69, 580.38, 580.83, 580.53, 577.67, 582.09, 579.3, 578.17, 575.88, 576.2, 577.53, 572.94, 572.63, 570.55, 569.16, 573.56, 573.78, 574.3, 574.69, 575.85, 575.59, 574.36, 571.4, 571.9, 569.9, 571.62, 567.24, 563.9, 564.1, 565.2, 567.49, 567.81, 568.34, 570.68, 571.31, 570.79, 571.36, 572.66, 571.79, 570.58, 570.63, 572.96, 572.04, 571.64, 570.91, 570.17, 570.94, 572.12, 572.18, 569.6, 567.31, 568.21, 570.32, 572.85, 572.21, 572.63, 572.74 ]`) func buildKLines(prices []fixedpoint.Value) (klines []types.KLine) { for _, p := range prices { klines = append(klines, types.KLine{Close: p}) } return klines } func Test_calculateEWMA(t *testing.T) { type args struct { allKLines []types.KLine priceF types.KLineValueMapper window int } var input []fixedpoint.Value if err := json.Unmarshal(ethusdt5m, &input); err != nil { panic(err) } tests := []struct { name string args args want float64 }{ { name: "ETHUSDT EMA 7", args: args{ allKLines: buildKLines(input), priceF: types.KLineClosePriceMapper, window: 7, }, want: 571.72, // with open price, binance desktop returns 571.45, trading view returns 570.8957, for close price, binance mobile returns 571.72 }, { name: "ETHUSDT EMA 25", args: args{ allKLines: buildKLines(input), priceF: types.KLineClosePriceMapper, window: 25, }, want: 571.30, }, { name: "ETHUSDT EMA 99", args: args{ allKLines: buildKLines(input), priceF: types.KLineClosePriceMapper, window: 99, }, want: 577.62, // binance mobile uses 577.58 }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := CalculateKLinesEMA(tt.args.allKLines, tt.args.priceF, tt.args.window) got = math.Trunc(got*100.0) / 100.0 if got != tt.want { t.Errorf("CalculateKLinesEMA() = %v, want %v", got, tt.want) } }) } }