// Code generated by gen_golden_test.py. DO NOT EDIT.
//
// Value-parity for every one of the 514 Go indicators: the shared golden input
// is replayed through each one and checked bit-for-bit against the Rust
// reference fixtures testdata/golden/g_<Canonical>.csv. Multi-output, profile
// and bar shapes are flattened by reflection so a single comparator covers all
// archetypes. Regenerate with: python bindings/go/gen_golden_test.py

package wickra

import (
	"bufio"
	"math"
	"os"
	"reflect"
	"strings"
	"testing"
)

// readGoldenRaw keeps blank lines (a candle on which no bar closed) so bar rows
// stay aligned to the input; non-bar fixtures contain no blank lines.
func readGoldenRaw(t *testing.T, name string) [][]string {
	t.Helper()
	f, err := os.Open("../../testdata/golden/" + name + ".csv")
	if err != nil {
		t.Fatalf("open %s: %v", name, err)
	}
	defer f.Close()
	var rows [][]string
	sc := bufio.NewScanner(f)
	sc.Buffer(make([]byte, 0, 1024*1024), 1024*1024)
	first := true
	for sc.Scan() {
		line := sc.Text()
		if first {
			first = false
			continue
		}
		if line == "" {
			rows = append(rows, []string{})
			continue
		}
		rows = append(rows, strings.Split(line, ","))
	}
	return rows
}

func nanRow(n int) []float64 {
	r := make([]float64, n)
	for i := range r {
		r[i] = math.NaN()
	}
	return r
}

func reflectRow(out any, ok bool, width int) []float64 {
	if !ok {
		return nanRow(width)
	}
	v := reflect.ValueOf(out)
	row := make([]float64, 0, width)
	for k := 0; k < v.NumField(); k++ {
		row = appendField(row, v.Field(k))
	}
	return row
}

func appendField(row []float64, f reflect.Value) []float64 {
	switch f.Kind() {
	case reflect.Float64, reflect.Float32:
		return append(row, f.Float())
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
		return append(row, float64(f.Int()))
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
		return append(row, float64(f.Uint()))
	case reflect.Slice:
		for j := 0; j < f.Len(); j++ {
			row = appendField(row, f.Index(j))
		}
		return row
	default:
		return row
	}
}

func flattenBars(bars any) []float64 {
	v := reflect.ValueOf(bars)
	row := []float64{}
	for i := 0; i < v.Len(); i++ {
		bar := v.Index(i)
		for k := 0; k < bar.NumField(); k++ {
			row = appendField(row, bar.Field(k))
		}
	}
	return row
}

// Synthetic feeds derived from one OHLCV row, identical to gen_golden's Rust
// construction (DerivativesTick / CrossSection / OrderBook).
func derivFields(r []float64) [11]float64 {
	o, h, l, c, v := r[0], r[1], r[2], r[3], r[4]
	return [11]float64{
		(c - o) / c * 0.01, // funding_rate
		c,                  // mark_price
		c - 0.5,            // index_price
		c + 1.0,            // futures_price
		v * 10.0,           // open_interest
		v * 0.6,            // long_size
		v * 0.4,            // short_size
		v * 0.55,           // taker_buy_volume
		v * 0.45,           // taker_sell_volume
		h - c,              // long_liquidation
		c - l,              // short_liquidation
	}
}

func crossLists(r []float64) ([]float64, []float64, []bool, []bool, []bool, []bool) {
	o, c, v := r[0], r[3], r[4]
	change := make([]float64, 5)
	volume := make([]float64, 5)
	newHigh := make([]bool, 5)
	newLow := make([]bool, 5)
	aboveMa := make([]bool, 5)
	onBuy := make([]bool, 5)
	for j := 0; j < 5; j++ {
		jf := float64(j)
		change[j] = (c - o) + jf
		volume[j] = v + jf*10.0
		newHigh[j] = j%2 == 0
		newLow[j] = j%3 == 0
		aboveMa[j] = j%2 == 0
		onBuy[j] = j%3 == 0
	}
	return change, volume, newHigh, newLow, aboveMa, onBuy
}

func obLists(r []float64) ([]float64, []float64, []float64, []float64) {
	c, v := r[3], r[4]
	bidPx := make([]float64, 5)
	bidSz := make([]float64, 5)
	askPx := make([]float64, 5)
	askSz := make([]float64, 5)
	for k := 0; k < 5; k++ {
		kf := float64(k + 1)
		bidPx[k] = c - 0.1*kf
		bidSz[k] = v / kf
		askPx[k] = c + 0.1*kf
		askSz[k] = v * 0.9 / kf
	}
	return bidPx, bidSz, askPx, askSz
}

func compareGolden(t *testing.T, name string, got [][]float64) {
	t.Helper()
	exp := readGoldenRaw(t, "g_"+name)
	if len(exp) != len(got) {
		t.Fatalf("%s: %d fixture rows vs %d computed", name, len(exp), len(got))
	}
	for i := range exp {
		if len(exp[i]) != len(got[i]) {
			t.Fatalf("%s row %d: arity %d vs %d", name, i, len(got[i]), len(exp[i]))
		}
		for k := range exp[i] {
			want := goldenCell(exp[i][k])
			g := got[i][k]
			if math.IsNaN(want) {
				if !math.IsNaN(g) {
					t.Fatalf("%s row %d col %d: want NaN got %v", name, i, k, g)
				}
				continue
			}
			if math.IsInf(want, 0) {
				if !math.IsInf(g, 0) || (g > 0) != (want > 0) {
					t.Fatalf("%s row %d col %d: want %v got %v", name, i, k, want, g)
				}
				continue
			}
			tol := goldenTol * math.Max(1.0, math.Abs(want))
			if math.Abs(g-want) > tol {
				t.Fatalf("%s row %d col %d: got %v want %v", name, i, k, g, want)
			}
		}
	}
}

func TestGoldenAll(t *testing.T) {
	rows := goldenInput(t)

	t.Run("AbandonedBaby", func(t *testing.T) {
		ind, err := NewAbandonedBaby()
		if err != nil {
			t.Fatalf("new AbandonedBaby: %v", err)
		}
		if n := ind.Name(); n != "AbandonedBaby" {
			t.Errorf("name: got %q want %q", n, "AbandonedBaby")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AbandonedBaby", got)
	})
	t.Run("Abcd", func(t *testing.T) {
		ind, err := NewAbcd()
		if err != nil {
			t.Fatalf("new Abcd: %v", err)
		}
		if n := ind.Name(); n != "Abcd" {
			t.Errorf("name: got %q want %q", n, "Abcd")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Abcd", got)
	})
	t.Run("AbsoluteBreadthIndex", func(t *testing.T) {
		ind, err := NewAbsoluteBreadthIndex()
		if err != nil {
			t.Fatalf("new AbsoluteBreadthIndex: %v", err)
		}
		if n := ind.Name(); n != "AbsoluteBreadthIndex" {
			t.Errorf("name: got %q want %q", n, "AbsoluteBreadthIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "AbsoluteBreadthIndex", got)
	})
	t.Run("AccelerationBands", func(t *testing.T) {
		ind, err := NewAccelerationBands(14, 2.0)
		if err != nil {
			t.Fatalf("new AccelerationBands: %v", err)
		}
		if n := ind.Name(); n != "AccelerationBands" {
			t.Errorf("name: got %q want %q", n, "AccelerationBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "AccelerationBands", got)
	})
	t.Run("AcceleratorOscillator", func(t *testing.T) {
		ind, err := NewAcceleratorOscillator(3, 7, 14)
		if err != nil {
			t.Fatalf("new AcceleratorOscillator: %v", err)
		}
		if n := ind.Name(); n != "AcceleratorOscillator" {
			t.Errorf("name: got %q want %q", n, "AcceleratorOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AcceleratorOscillator", got)
	})
	t.Run("AdOscillator", func(t *testing.T) {
		ind, err := NewAdOscillator()
		if err != nil {
			t.Fatalf("new AdOscillator: %v", err)
		}
		if n := ind.Name(); n != "ADOSC" {
			t.Errorf("name: got %q want %q", n, "ADOSC")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AdOscillator", got)
	})
	t.Run("AdVolumeLine", func(t *testing.T) {
		ind, err := NewAdVolumeLine()
		if err != nil {
			t.Fatalf("new AdVolumeLine: %v", err)
		}
		if n := ind.Name(); n != "AdVolumeLine" {
			t.Errorf("name: got %q want %q", n, "AdVolumeLine")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "AdVolumeLine", got)
	})
	t.Run("AdaptiveCci", func(t *testing.T) {
		ind, err := NewAdaptiveCci(14)
		if err != nil {
			t.Fatalf("new AdaptiveCci: %v", err)
		}
		if n := ind.Name(); n != "AdaptiveCci" {
			t.Errorf("name: got %q want %q", n, "AdaptiveCci")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AdaptiveCci", got)
	})
	t.Run("AdaptiveCycle", func(t *testing.T) {
		ind, err := NewAdaptiveCycle()
		if err != nil {
			t.Fatalf("new AdaptiveCycle: %v", err)
		}
		if n := ind.Name(); n != "AdaptiveCycle" {
			t.Errorf("name: got %q want %q", n, "AdaptiveCycle")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "AdaptiveCycle", got)
	})
	t.Run("AdaptiveLaguerreFilter", func(t *testing.T) {
		ind, err := NewAdaptiveLaguerreFilter(20)
		if err != nil {
			t.Fatalf("new AdaptiveLaguerreFilter: %v", err)
		}
		if n := ind.Name(); n != "AdaptiveLaguerre" {
			t.Errorf("name: got %q want %q", n, "AdaptiveLaguerre")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "AdaptiveLaguerreFilter", got)
	})
	t.Run("AdaptiveRsi", func(t *testing.T) {
		ind, err := NewAdaptiveRsi(14)
		if err != nil {
			t.Fatalf("new AdaptiveRsi: %v", err)
		}
		if n := ind.Name(); n != "AdaptiveRsi" {
			t.Errorf("name: got %q want %q", n, "AdaptiveRsi")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "AdaptiveRsi", got)
	})
	t.Run("Adl", func(t *testing.T) {
		ind, err := NewAdl()
		if err != nil {
			t.Fatalf("new Adl: %v", err)
		}
		if n := ind.Name(); n != "ADL" {
			t.Errorf("name: got %q want %q", n, "ADL")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Adl", got)
	})
	t.Run("AdvanceBlock", func(t *testing.T) {
		ind, err := NewAdvanceBlock()
		if err != nil {
			t.Fatalf("new AdvanceBlock: %v", err)
		}
		if n := ind.Name(); n != "AdvanceBlock" {
			t.Errorf("name: got %q want %q", n, "AdvanceBlock")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AdvanceBlock", got)
	})
	t.Run("AdvanceDecline", func(t *testing.T) {
		ind, err := NewAdvanceDecline()
		if err != nil {
			t.Fatalf("new AdvanceDecline: %v", err)
		}
		if n := ind.Name(); n != "AdvanceDecline" {
			t.Errorf("name: got %q want %q", n, "AdvanceDecline")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "AdvanceDecline", got)
	})
	t.Run("AdvanceDeclineRatio", func(t *testing.T) {
		ind, err := NewAdvanceDeclineRatio()
		if err != nil {
			t.Fatalf("new AdvanceDeclineRatio: %v", err)
		}
		if n := ind.Name(); n != "AdvanceDeclineRatio" {
			t.Errorf("name: got %q want %q", n, "AdvanceDeclineRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "AdvanceDeclineRatio", got)
	})
	t.Run("Adx", func(t *testing.T) {
		ind, err := NewAdx(14)
		if err != nil {
			t.Fatalf("new Adx: %v", err)
		}
		if n := ind.Name(); n != "ADX" {
			t.Errorf("name: got %q want %q", n, "ADX")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "Adx", got)
	})
	t.Run("Adxr", func(t *testing.T) {
		ind, err := NewAdxr(14)
		if err != nil {
			t.Fatalf("new Adxr: %v", err)
		}
		if n := ind.Name(); n != "ADXR" {
			t.Errorf("name: got %q want %q", n, "ADXR")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Adxr", got)
	})
	t.Run("Alligator", func(t *testing.T) {
		ind, err := NewAlligator(3, 7, 14)
		if err != nil {
			t.Fatalf("new Alligator: %v", err)
		}
		if n := ind.Name(); n != "Alligator" {
			t.Errorf("name: got %q want %q", n, "Alligator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "Alligator", got)
	})
	t.Run("Alma", func(t *testing.T) {
		ind, err := NewAlma(9, 0.85, 6.0)
		if err != nil {
			t.Fatalf("new Alma: %v", err)
		}
		if n := ind.Name(); n != "ALMA" {
			t.Errorf("name: got %q want %q", n, "ALMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Alma", got)
	})
	t.Run("Alpha", func(t *testing.T) {
		ind, err := NewAlpha(14, 2.0)
		if err != nil {
			t.Fatalf("new Alpha: %v", err)
		}
		if n := ind.Name(); n != "Alpha" {
			t.Errorf("name: got %q want %q", n, "Alpha")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "Alpha", got)
	})
	t.Run("AmihudIlliquidity", func(t *testing.T) {
		ind, err := NewAmihudIlliquidity(20)
		if err != nil {
			t.Fatalf("new AmihudIlliquidity: %v", err)
		}
		if n := ind.Name(); n != "AmihudIlliquidity" {
			t.Errorf("name: got %q want %q", n, "AmihudIlliquidity")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i))}
		}
		compareGolden(t, "AmihudIlliquidity", got)
	})
	t.Run("AnchoredRsi", func(t *testing.T) {
		ind, err := NewAnchoredRsi()
		if err != nil {
			t.Fatalf("new AnchoredRsi: %v", err)
		}
		if n := ind.Name(); n != "AnchoredRSI" {
			t.Errorf("name: got %q want %q", n, "AnchoredRSI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "AnchoredRsi", got)
	})
	t.Run("AnchoredVwap", func(t *testing.T) {
		ind, err := NewAnchoredVwap()
		if err != nil {
			t.Fatalf("new AnchoredVwap: %v", err)
		}
		if n := ind.Name(); n != "AnchoredVWAP" {
			t.Errorf("name: got %q want %q", n, "AnchoredVWAP")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AnchoredVwap", got)
	})
	t.Run("AndrewsPitchfork", func(t *testing.T) {
		ind, err := NewAndrewsPitchfork(14)
		if err != nil {
			t.Fatalf("new AndrewsPitchfork: %v", err)
		}
		if n := ind.Name(); n != "AndrewsPitchfork" {
			t.Errorf("name: got %q want %q", n, "AndrewsPitchfork")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "AndrewsPitchfork", got)
	})
	t.Run("Apo", func(t *testing.T) {
		ind, err := NewApo(3, 7)
		if err != nil {
			t.Fatalf("new Apo: %v", err)
		}
		if n := ind.Name(); n != "APO" {
			t.Errorf("name: got %q want %q", n, "APO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Apo", got)
	})
	t.Run("Aroon", func(t *testing.T) {
		ind, err := NewAroon(14)
		if err != nil {
			t.Fatalf("new Aroon: %v", err)
		}
		if n := ind.Name(); n != "Aroon" {
			t.Errorf("name: got %q want %q", n, "Aroon")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Aroon", got)
	})
	t.Run("AroonOscillator", func(t *testing.T) {
		ind, err := NewAroonOscillator(14)
		if err != nil {
			t.Fatalf("new AroonOscillator: %v", err)
		}
		if n := ind.Name(); n != "AroonOscillator" {
			t.Errorf("name: got %q want %q", n, "AroonOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AroonOscillator", got)
	})
	t.Run("Atr", func(t *testing.T) {
		ind, err := NewAtr(14)
		if err != nil {
			t.Fatalf("new Atr: %v", err)
		}
		if n := ind.Name(); n != "ATR" {
			t.Errorf("name: got %q want %q", n, "ATR")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Atr", got)
	})
	t.Run("AtrBands", func(t *testing.T) {
		ind, err := NewAtrBands(14, 2.0)
		if err != nil {
			t.Fatalf("new AtrBands: %v", err)
		}
		if n := ind.Name(); n != "AtrBands" {
			t.Errorf("name: got %q want %q", n, "AtrBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "AtrBands", got)
	})
	t.Run("AtrRatchet", func(t *testing.T) {
		ind, err := NewAtrRatchet(14, 2.0, 0.5)
		if err != nil {
			t.Fatalf("new AtrRatchet: %v", err)
		}
		if n := ind.Name(); n != "AtrRatchet" {
			t.Errorf("name: got %q want %q", n, "AtrRatchet")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "AtrRatchet", got)
	})
	t.Run("AtrTrailingStop", func(t *testing.T) {
		ind, err := NewAtrTrailingStop(14, 2.0)
		if err != nil {
			t.Fatalf("new AtrTrailingStop: %v", err)
		}
		if n := ind.Name(); n != "AtrTrailingStop" {
			t.Errorf("name: got %q want %q", n, "AtrTrailingStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AtrTrailingStop", got)
	})
	t.Run("AutoFib", func(t *testing.T) {
		ind, err := NewAutoFib()
		if err != nil {
			t.Fatalf("new AutoFib: %v", err)
		}
		if n := ind.Name(); n != "AutoFib" {
			t.Errorf("name: got %q want %q", n, "AutoFib")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 7)
		}
		compareGolden(t, "AutoFib", got)
	})
	t.Run("Autocorrelation", func(t *testing.T) {
		ind, err := NewAutocorrelation(10, 1)
		if err != nil {
			t.Fatalf("new Autocorrelation: %v", err)
		}
		if n := ind.Name(); n != "Autocorrelation" {
			t.Errorf("name: got %q want %q", n, "Autocorrelation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Autocorrelation", got)
	})
	t.Run("AutocorrelationPeriodogram", func(t *testing.T) {
		ind, err := NewAutocorrelationPeriodogram(10, 48)
		if err != nil {
			t.Fatalf("new AutocorrelationPeriodogram: %v", err)
		}
		if n := ind.Name(); n != "AutocorrelationPeriodogram" {
			t.Errorf("name: got %q want %q", n, "AutocorrelationPeriodogram")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "AutocorrelationPeriodogram", got)
	})
	t.Run("AverageDailyRange", func(t *testing.T) {
		ind, err := NewAverageDailyRange(14, 0)
		if err != nil {
			t.Fatalf("new AverageDailyRange: %v", err)
		}
		if n := ind.Name(); n != "AverageDailyRange" {
			t.Errorf("name: got %q want %q", n, "AverageDailyRange")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AverageDailyRange", got)
	})
	t.Run("AverageDrawdown", func(t *testing.T) {
		ind, err := NewAverageDrawdown(14)
		if err != nil {
			t.Fatalf("new AverageDrawdown: %v", err)
		}
		if n := ind.Name(); n != "AverageDrawdown" {
			t.Errorf("name: got %q want %q", n, "AverageDrawdown")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "AverageDrawdown", got)
	})
	t.Run("AvgPrice", func(t *testing.T) {
		ind, err := NewAvgPrice()
		if err != nil {
			t.Fatalf("new AvgPrice: %v", err)
		}
		if n := ind.Name(); n != "AVGPRICE" {
			t.Errorf("name: got %q want %q", n, "AVGPRICE")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AvgPrice", got)
	})
	t.Run("AwesomeOscillator", func(t *testing.T) {
		ind, err := NewAwesomeOscillator(3, 7)
		if err != nil {
			t.Fatalf("new AwesomeOscillator: %v", err)
		}
		if n := ind.Name(); n != "AwesomeOscillator" {
			t.Errorf("name: got %q want %q", n, "AwesomeOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AwesomeOscillator", got)
	})
	t.Run("AwesomeOscillatorHistogram", func(t *testing.T) {
		ind, err := NewAwesomeOscillatorHistogram(3, 7, 14)
		if err != nil {
			t.Fatalf("new AwesomeOscillatorHistogram: %v", err)
		}
		if n := ind.Name(); n != "AwesomeOscillatorHistogram" {
			t.Errorf("name: got %q want %q", n, "AwesomeOscillatorHistogram")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "AwesomeOscillatorHistogram", got)
	})
	t.Run("BalanceOfPower", func(t *testing.T) {
		ind, err := NewBalanceOfPower()
		if err != nil {
			t.Fatalf("new BalanceOfPower: %v", err)
		}
		if n := ind.Name(); n != "BalanceOfPower" {
			t.Errorf("name: got %q want %q", n, "BalanceOfPower")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "BalanceOfPower", got)
	})
	t.Run("BandpassFilter", func(t *testing.T) {
		ind, err := NewBandpassFilter(20, 0.3)
		if err != nil {
			t.Fatalf("new BandpassFilter: %v", err)
		}
		if n := ind.Name(); n != "BandpassFilter" {
			t.Errorf("name: got %q want %q", n, "BandpassFilter")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "BandpassFilter", got)
	})
	t.Run("Bat", func(t *testing.T) {
		ind, err := NewBat()
		if err != nil {
			t.Fatalf("new Bat: %v", err)
		}
		if n := ind.Name(); n != "Bat" {
			t.Errorf("name: got %q want %q", n, "Bat")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Bat", got)
	})
	t.Run("BeltHold", func(t *testing.T) {
		ind, err := NewBeltHold()
		if err != nil {
			t.Fatalf("new BeltHold: %v", err)
		}
		if n := ind.Name(); n != "BeltHold" {
			t.Errorf("name: got %q want %q", n, "BeltHold")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "BeltHold", got)
	})
	t.Run("Beta", func(t *testing.T) {
		ind, err := NewBeta(14)
		if err != nil {
			t.Fatalf("new Beta: %v", err)
		}
		if n := ind.Name(); n != "Beta" {
			t.Errorf("name: got %q want %q", n, "Beta")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "Beta", got)
	})
	t.Run("BetaNeutralSpread", func(t *testing.T) {
		ind, err := NewBetaNeutralSpread(14)
		if err != nil {
			t.Fatalf("new BetaNeutralSpread: %v", err)
		}
		if n := ind.Name(); n != "BetaNeutralSpread" {
			t.Errorf("name: got %q want %q", n, "BetaNeutralSpread")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "BetaNeutralSpread", got)
	})
	t.Run("BetterVolume", func(t *testing.T) {
		ind, err := NewBetterVolume(14)
		if err != nil {
			t.Fatalf("new BetterVolume: %v", err)
		}
		if n := ind.Name(); n != "BetterVolume" {
			t.Errorf("name: got %q want %q", n, "BetterVolume")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "BetterVolume", got)
	})
	t.Run("BipowerVariation", func(t *testing.T) {
		ind, err := NewBipowerVariation(14)
		if err != nil {
			t.Fatalf("new BipowerVariation: %v", err)
		}
		if n := ind.Name(); n != "BipowerVariation" {
			t.Errorf("name: got %q want %q", n, "BipowerVariation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "BipowerVariation", got)
	})
	t.Run("BodySizePct", func(t *testing.T) {
		ind, err := NewBodySizePct()
		if err != nil {
			t.Fatalf("new BodySizePct: %v", err)
		}
		if n := ind.Name(); n != "BodySizePct" {
			t.Errorf("name: got %q want %q", n, "BodySizePct")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "BodySizePct", got)
	})
	t.Run("BollingerBands", func(t *testing.T) {
		ind, err := NewBollingerBands(20, 2.0)
		if err != nil {
			t.Fatalf("new BollingerBands: %v", err)
		}
		if n := ind.Name(); n != "BollingerBands" {
			t.Errorf("name: got %q want %q", n, "BollingerBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 4)
		}
		compareGolden(t, "BollingerBands", got)
	})
	t.Run("BollingerBandwidth", func(t *testing.T) {
		ind, err := NewBollingerBandwidth(14, 2.0)
		if err != nil {
			t.Fatalf("new BollingerBandwidth: %v", err)
		}
		if n := ind.Name(); n != "BollingerBandwidth" {
			t.Errorf("name: got %q want %q", n, "BollingerBandwidth")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "BollingerBandwidth", got)
	})
	t.Run("BomarBands", func(t *testing.T) {
		ind, err := NewBomarBands(4, 0.85)
		if err != nil {
			t.Fatalf("new BomarBands: %v", err)
		}
		if n := ind.Name(); n != "BomarBands" {
			t.Errorf("name: got %q want %q", n, "BomarBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "BomarBands", got)
	})
	t.Run("BreadthThrust", func(t *testing.T) {
		ind, err := NewBreadthThrust(10)
		if err != nil {
			t.Fatalf("new BreadthThrust: %v", err)
		}
		if n := ind.Name(); n != "BreadthThrust" {
			t.Errorf("name: got %q want %q", n, "BreadthThrust")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "BreadthThrust", got)
	})
	t.Run("Breakaway", func(t *testing.T) {
		ind, err := NewBreakaway()
		if err != nil {
			t.Fatalf("new Breakaway: %v", err)
		}
		if n := ind.Name(); n != "Breakaway" {
			t.Errorf("name: got %q want %q", n, "Breakaway")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Breakaway", got)
	})
	t.Run("BullishPercentIndex", func(t *testing.T) {
		ind, err := NewBullishPercentIndex()
		if err != nil {
			t.Fatalf("new BullishPercentIndex: %v", err)
		}
		if n := ind.Name(); n != "BullishPercentIndex" {
			t.Errorf("name: got %q want %q", n, "BullishPercentIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "BullishPercentIndex", got)
	})
	t.Run("BurkeRatio", func(t *testing.T) {
		ind, err := NewBurkeRatio(14)
		if err != nil {
			t.Fatalf("new BurkeRatio: %v", err)
		}
		if n := ind.Name(); n != "BurkeRatio" {
			t.Errorf("name: got %q want %q", n, "BurkeRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "BurkeRatio", got)
	})
	t.Run("Butterfly", func(t *testing.T) {
		ind, err := NewButterfly()
		if err != nil {
			t.Fatalf("new Butterfly: %v", err)
		}
		if n := ind.Name(); n != "Butterfly" {
			t.Errorf("name: got %q want %q", n, "Butterfly")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Butterfly", got)
	})
	t.Run("CalendarSpread", func(t *testing.T) {
		ind, err := NewCalendarSpread()
		if err != nil {
			t.Fatalf("new CalendarSpread: %v", err)
		}
		if n := ind.Name(); n != "CalendarSpread" {
			t.Errorf("name: got %q want %q", n, "CalendarSpread")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "CalendarSpread", got)
	})
	t.Run("CalmarRatio", func(t *testing.T) {
		ind, err := NewCalmarRatio(14)
		if err != nil {
			t.Fatalf("new CalmarRatio: %v", err)
		}
		if n := ind.Name(); n != "CalmarRatio" {
			t.Errorf("name: got %q want %q", n, "CalmarRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "CalmarRatio", got)
	})
	t.Run("Camarilla", func(t *testing.T) {
		ind, err := NewCamarilla()
		if err != nil {
			t.Fatalf("new Camarilla: %v", err)
		}
		if n := ind.Name(); n != "Camarilla" {
			t.Errorf("name: got %q want %q", n, "Camarilla")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 9)
		}
		compareGolden(t, "Camarilla", got)
	})
	t.Run("CandleVolume", func(t *testing.T) {
		ind, err := NewCandleVolume(14)
		if err != nil {
			t.Fatalf("new CandleVolume: %v", err)
		}
		if n := ind.Name(); n != "CandleVolume" {
			t.Errorf("name: got %q want %q", n, "CandleVolume")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "CandleVolume", got)
	})
	t.Run("Cci", func(t *testing.T) {
		ind, err := NewCci(14)
		if err != nil {
			t.Fatalf("new Cci: %v", err)
		}
		if n := ind.Name(); n != "CCI" {
			t.Errorf("name: got %q want %q", n, "CCI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Cci", got)
	})
	t.Run("CenterOfGravity", func(t *testing.T) {
		ind, err := NewCenterOfGravity(14)
		if err != nil {
			t.Fatalf("new CenterOfGravity: %v", err)
		}
		if n := ind.Name(); n != "CenterOfGravity" {
			t.Errorf("name: got %q want %q", n, "CenterOfGravity")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "CenterOfGravity", got)
	})
	t.Run("CentralPivotRange", func(t *testing.T) {
		ind, err := NewCentralPivotRange()
		if err != nil {
			t.Fatalf("new CentralPivotRange: %v", err)
		}
		if n := ind.Name(); n != "CentralPivotRange" {
			t.Errorf("name: got %q want %q", n, "CentralPivotRange")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "CentralPivotRange", got)
	})
	t.Run("Cfo", func(t *testing.T) {
		ind, err := NewCfo(14)
		if err != nil {
			t.Fatalf("new Cfo: %v", err)
		}
		if n := ind.Name(); n != "CFO" {
			t.Errorf("name: got %q want %q", n, "CFO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Cfo", got)
	})
	t.Run("ChaikinMoneyFlow", func(t *testing.T) {
		ind, err := NewChaikinMoneyFlow(20)
		if err != nil {
			t.Fatalf("new ChaikinMoneyFlow: %v", err)
		}
		if n := ind.Name(); n != "CMF" {
			t.Errorf("name: got %q want %q", n, "CMF")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ChaikinMoneyFlow", got)
	})
	t.Run("ChaikinOscillator", func(t *testing.T) {
		ind, err := NewChaikinOscillator(3, 7)
		if err != nil {
			t.Fatalf("new ChaikinOscillator: %v", err)
		}
		if n := ind.Name(); n != "ChaikinOscillator" {
			t.Errorf("name: got %q want %q", n, "ChaikinOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ChaikinOscillator", got)
	})
	t.Run("ChaikinVolatility", func(t *testing.T) {
		ind, err := NewChaikinVolatility(3, 7)
		if err != nil {
			t.Fatalf("new ChaikinVolatility: %v", err)
		}
		if n := ind.Name(); n != "ChaikinVolatility" {
			t.Errorf("name: got %q want %q", n, "ChaikinVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ChaikinVolatility", got)
	})
	t.Run("ChandeKrollStop", func(t *testing.T) {
		ind, err := NewChandeKrollStop(3, 2.0, 7)
		if err != nil {
			t.Fatalf("new ChandeKrollStop: %v", err)
		}
		if n := ind.Name(); n != "ChandeKrollStop" {
			t.Errorf("name: got %q want %q", n, "ChandeKrollStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "ChandeKrollStop", got)
	})
	t.Run("ChandelierExit", func(t *testing.T) {
		ind, err := NewChandelierExit(14, 2.0)
		if err != nil {
			t.Fatalf("new ChandelierExit: %v", err)
		}
		if n := ind.Name(); n != "ChandelierExit" {
			t.Errorf("name: got %q want %q", n, "ChandelierExit")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "ChandelierExit", got)
	})
	t.Run("ChoppinessIndex", func(t *testing.T) {
		ind, err := NewChoppinessIndex(14)
		if err != nil {
			t.Fatalf("new ChoppinessIndex: %v", err)
		}
		if n := ind.Name(); n != "ChoppinessIndex" {
			t.Errorf("name: got %q want %q", n, "ChoppinessIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ChoppinessIndex", got)
	})
	t.Run("ClassicPivots", func(t *testing.T) {
		ind, err := NewClassicPivots()
		if err != nil {
			t.Fatalf("new ClassicPivots: %v", err)
		}
		if n := ind.Name(); n != "ClassicPivots" {
			t.Errorf("name: got %q want %q", n, "ClassicPivots")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 7)
		}
		compareGolden(t, "ClassicPivots", got)
	})
	t.Run("CloseVsOpen", func(t *testing.T) {
		ind, err := NewCloseVsOpen()
		if err != nil {
			t.Fatalf("new CloseVsOpen: %v", err)
		}
		if n := ind.Name(); n != "CloseVsOpen" {
			t.Errorf("name: got %q want %q", n, "CloseVsOpen")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "CloseVsOpen", got)
	})
	t.Run("ClosingMarubozu", func(t *testing.T) {
		ind, err := NewClosingMarubozu()
		if err != nil {
			t.Fatalf("new ClosingMarubozu: %v", err)
		}
		if n := ind.Name(); n != "ClosingMarubozu" {
			t.Errorf("name: got %q want %q", n, "ClosingMarubozu")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ClosingMarubozu", got)
	})
	t.Run("Cmo", func(t *testing.T) {
		ind, err := NewCmo(14)
		if err != nil {
			t.Fatalf("new Cmo: %v", err)
		}
		if n := ind.Name(); n != "CMO" {
			t.Errorf("name: got %q want %q", n, "CMO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Cmo", got)
	})
	t.Run("CoefficientOfVariation", func(t *testing.T) {
		ind, err := NewCoefficientOfVariation(14)
		if err != nil {
			t.Fatalf("new CoefficientOfVariation: %v", err)
		}
		if n := ind.Name(); n != "CoefficientOfVariation" {
			t.Errorf("name: got %q want %q", n, "CoefficientOfVariation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "CoefficientOfVariation", got)
	})
	t.Run("Cointegration", func(t *testing.T) {
		ind, err := NewCointegration(40, 1)
		if err != nil {
			t.Fatalf("new Cointegration: %v", err)
		}
		if n := ind.Name(); n != "Cointegration" {
			t.Errorf("name: got %q want %q", n, "Cointegration")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3], r[0])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "Cointegration", got)
	})
	t.Run("CommonSenseRatio", func(t *testing.T) {
		ind, err := NewCommonSenseRatio(14)
		if err != nil {
			t.Fatalf("new CommonSenseRatio: %v", err)
		}
		if n := ind.Name(); n != "CommonSenseRatio" {
			t.Errorf("name: got %q want %q", n, "CommonSenseRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "CommonSenseRatio", got)
	})
	t.Run("CompositeProfile", func(t *testing.T) {
		ind, err := NewCompositeProfile(20, 24, 0.7)
		if err != nil {
			t.Fatalf("new CompositeProfile: %v", err)
		}
		if n := ind.Name(); n != "CompositeProfile" {
			t.Errorf("name: got %q want %q", n, "CompositeProfile")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "CompositeProfile", got)
	})
	t.Run("ConcealingBabySwallow", func(t *testing.T) {
		ind, err := NewConcealingBabySwallow()
		if err != nil {
			t.Fatalf("new ConcealingBabySwallow: %v", err)
		}
		if n := ind.Name(); n != "ConcealingBabySwallow" {
			t.Errorf("name: got %q want %q", n, "ConcealingBabySwallow")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ConcealingBabySwallow", got)
	})
	t.Run("ConditionalValueAtRisk", func(t *testing.T) {
		ind, err := NewConditionalValueAtRisk(20, 0.95)
		if err != nil {
			t.Fatalf("new ConditionalValueAtRisk: %v", err)
		}
		if n := ind.Name(); n != "ConditionalValueAtRisk" {
			t.Errorf("name: got %q want %q", n, "ConditionalValueAtRisk")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "ConditionalValueAtRisk", got)
	})
	t.Run("ConnorsRsi", func(t *testing.T) {
		ind, err := NewConnorsRsi(3, 7, 14)
		if err != nil {
			t.Fatalf("new ConnorsRsi: %v", err)
		}
		if n := ind.Name(); n != "ConnorsRSI" {
			t.Errorf("name: got %q want %q", n, "ConnorsRSI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "ConnorsRsi", got)
	})
	t.Run("Coppock", func(t *testing.T) {
		ind, err := NewCoppock(3, 7, 14)
		if err != nil {
			t.Fatalf("new Coppock: %v", err)
		}
		if n := ind.Name(); n != "Coppock" {
			t.Errorf("name: got %q want %q", n, "Coppock")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Coppock", got)
	})
	t.Run("CorrelationTrendIndicator", func(t *testing.T) {
		ind, err := NewCorrelationTrendIndicator(14)
		if err != nil {
			t.Fatalf("new CorrelationTrendIndicator: %v", err)
		}
		if n := ind.Name(); n != "CorrelationTrendIndicator" {
			t.Errorf("name: got %q want %q", n, "CorrelationTrendIndicator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "CorrelationTrendIndicator", got)
	})
	t.Run("Counterattack", func(t *testing.T) {
		ind, err := NewCounterattack()
		if err != nil {
			t.Fatalf("new Counterattack: %v", err)
		}
		if n := ind.Name(); n != "Counterattack" {
			t.Errorf("name: got %q want %q", n, "Counterattack")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Counterattack", got)
	})
	t.Run("Crab", func(t *testing.T) {
		ind, err := NewCrab()
		if err != nil {
			t.Fatalf("new Crab: %v", err)
		}
		if n := ind.Name(); n != "Crab" {
			t.Errorf("name: got %q want %q", n, "Crab")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Crab", got)
	})
	t.Run("CumulativeVolumeDelta", func(t *testing.T) {
		ind, err := NewCumulativeVolumeDelta()
		if err != nil {
			t.Fatalf("new CumulativeVolumeDelta: %v", err)
		}
		if n := ind.Name(); n != "CumulativeVolumeDelta" {
			t.Errorf("name: got %q want %q", n, "CumulativeVolumeDelta")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i))}
		}
		compareGolden(t, "CumulativeVolumeDelta", got)
	})
	t.Run("CumulativeVolumeIndex", func(t *testing.T) {
		ind, err := NewCumulativeVolumeIndex()
		if err != nil {
			t.Fatalf("new CumulativeVolumeIndex: %v", err)
		}
		if n := ind.Name(); n != "CumulativeVolumeIndex" {
			t.Errorf("name: got %q want %q", n, "CumulativeVolumeIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "CumulativeVolumeIndex", got)
	})
	t.Run("CupAndHandle", func(t *testing.T) {
		ind, err := NewCupAndHandle()
		if err != nil {
			t.Fatalf("new CupAndHandle: %v", err)
		}
		if n := ind.Name(); n != "CupAndHandle" {
			t.Errorf("name: got %q want %q", n, "CupAndHandle")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "CupAndHandle", got)
	})
	t.Run("CyberneticCycle", func(t *testing.T) {
		ind, err := NewCyberneticCycle(14)
		if err != nil {
			t.Fatalf("new CyberneticCycle: %v", err)
		}
		if n := ind.Name(); n != "CyberneticCycle" {
			t.Errorf("name: got %q want %q", n, "CyberneticCycle")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "CyberneticCycle", got)
	})
	t.Run("Cypher", func(t *testing.T) {
		ind, err := NewCypher()
		if err != nil {
			t.Fatalf("new Cypher: %v", err)
		}
		if n := ind.Name(); n != "Cypher" {
			t.Errorf("name: got %q want %q", n, "Cypher")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Cypher", got)
	})
	t.Run("DayOfWeekProfile", func(t *testing.T) {
		ind, err := NewDayOfWeekProfile(0)
		if err != nil {
			t.Fatalf("new DayOfWeekProfile: %v", err)
		}
		if n := ind.Name(); n != "DayOfWeekProfile" {
			t.Errorf("name: got %q want %q", n, "DayOfWeekProfile")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bins, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			if ok {
				got[i] = bins
			} else {
				got[i] = nanRow(7)
			}
		}
		compareGolden(t, "DayOfWeekProfile", got)
	})
	t.Run("Decycler", func(t *testing.T) {
		ind, err := NewDecycler(14)
		if err != nil {
			t.Fatalf("new Decycler: %v", err)
		}
		if n := ind.Name(); n != "Decycler" {
			t.Errorf("name: got %q want %q", n, "Decycler")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Decycler", got)
	})
	t.Run("DecyclerOscillator", func(t *testing.T) {
		ind, err := NewDecyclerOscillator(3, 7)
		if err != nil {
			t.Fatalf("new DecyclerOscillator: %v", err)
		}
		if n := ind.Name(); n != "DecyclerOscillator" {
			t.Errorf("name: got %q want %q", n, "DecyclerOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "DecyclerOscillator", got)
	})
	t.Run("Dema", func(t *testing.T) {
		ind, err := NewDema(14)
		if err != nil {
			t.Fatalf("new Dema: %v", err)
		}
		if n := ind.Name(); n != "DEMA" {
			t.Errorf("name: got %q want %q", n, "DEMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Dema", got)
	})
	t.Run("DemandIndex", func(t *testing.T) {
		ind, err := NewDemandIndex(14)
		if err != nil {
			t.Fatalf("new DemandIndex: %v", err)
		}
		if n := ind.Name(); n != "DemandIndex" {
			t.Errorf("name: got %q want %q", n, "DemandIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "DemandIndex", got)
	})
	t.Run("DemarkPivots", func(t *testing.T) {
		ind, err := NewDemarkPivots()
		if err != nil {
			t.Fatalf("new DemarkPivots: %v", err)
		}
		if n := ind.Name(); n != "DemarkPivots" {
			t.Errorf("name: got %q want %q", n, "DemarkPivots")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "DemarkPivots", got)
	})
	t.Run("DepthSlope", func(t *testing.T) {
		ind, err := NewDepthSlope()
		if err != nil {
			t.Fatalf("new DepthSlope: %v", err)
		}
		if n := ind.Name(); n != "DepthSlope" {
			t.Errorf("name: got %q want %q", n, "DepthSlope")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bp, bs, ap, as_ := obLists(r)
			got[i] = []float64{ind.Update(bp, bs, ap, as_)}
		}
		compareGolden(t, "DepthSlope", got)
	})
	t.Run("DerivativeOscillator", func(t *testing.T) {
		ind, err := NewDerivativeOscillator(3, 7, 14, 28)
		if err != nil {
			t.Fatalf("new DerivativeOscillator: %v", err)
		}
		if n := ind.Name(); n != "DerivativeOscillator" {
			t.Errorf("name: got %q want %q", n, "DerivativeOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "DerivativeOscillator", got)
	})
	t.Run("DetrendedStdDev", func(t *testing.T) {
		ind, err := NewDetrendedStdDev(14)
		if err != nil {
			t.Fatalf("new DetrendedStdDev: %v", err)
		}
		if n := ind.Name(); n != "DetrendedStdDev" {
			t.Errorf("name: got %q want %q", n, "DetrendedStdDev")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "DetrendedStdDev", got)
	})
	t.Run("DisparityIndex", func(t *testing.T) {
		ind, err := NewDisparityIndex(14)
		if err != nil {
			t.Fatalf("new DisparityIndex: %v", err)
		}
		if n := ind.Name(); n != "DisparityIndex" {
			t.Errorf("name: got %q want %q", n, "DisparityIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "DisparityIndex", got)
	})
	t.Run("DistanceSsd", func(t *testing.T) {
		ind, err := NewDistanceSsd(14)
		if err != nil {
			t.Fatalf("new DistanceSsd: %v", err)
		}
		if n := ind.Name(); n != "DistanceSsd" {
			t.Errorf("name: got %q want %q", n, "DistanceSsd")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "DistanceSsd", got)
	})
	t.Run("Doji", func(t *testing.T) {
		ind, err := NewDoji()
		if err != nil {
			t.Fatalf("new Doji: %v", err)
		}
		if n := ind.Name(); n != "Doji" {
			t.Errorf("name: got %q want %q", n, "Doji")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Doji", got)
	})
	t.Run("DojiStar", func(t *testing.T) {
		ind, err := NewDojiStar()
		if err != nil {
			t.Fatalf("new DojiStar: %v", err)
		}
		if n := ind.Name(); n != "DojiStar" {
			t.Errorf("name: got %q want %q", n, "DojiStar")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "DojiStar", got)
	})
	t.Run("DollarBars", func(t *testing.T) {
		ind, err := NewDollarBars(50000.0)
		if err != nil {
			t.Fatalf("new DollarBars: %v", err)
		}
		if n := ind.Name(); n != "DollarBars" {
			t.Errorf("name: got %q want %q", n, "DollarBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[0], r[1], r[2], r[3], r[4], 0))
		}
		compareGolden(t, "DollarBars", got)
	})
	t.Run("Donchian", func(t *testing.T) {
		ind, err := NewDonchian(14)
		if err != nil {
			t.Fatalf("new Donchian: %v", err)
		}
		if n := ind.Name(); n != "DonchianChannels" {
			t.Errorf("name: got %q want %q", n, "DonchianChannels")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "Donchian", got)
	})
	t.Run("DonchianStop", func(t *testing.T) {
		ind, err := NewDonchianStop(14)
		if err != nil {
			t.Fatalf("new DonchianStop: %v", err)
		}
		if n := ind.Name(); n != "DonchianStop" {
			t.Errorf("name: got %q want %q", n, "DonchianStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "DonchianStop", got)
	})
	t.Run("DoubleBollinger", func(t *testing.T) {
		ind, err := NewDoubleBollinger(20, 1.0, 2.0)
		if err != nil {
			t.Fatalf("new DoubleBollinger: %v", err)
		}
		if n := ind.Name(); n != "DoubleBollinger" {
			t.Errorf("name: got %q want %q", n, "DoubleBollinger")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 5)
		}
		compareGolden(t, "DoubleBollinger", got)
	})
	t.Run("DoubleTopBottom", func(t *testing.T) {
		ind, err := NewDoubleTopBottom()
		if err != nil {
			t.Fatalf("new DoubleTopBottom: %v", err)
		}
		if n := ind.Name(); n != "DoubleTopBottom" {
			t.Errorf("name: got %q want %q", n, "DoubleTopBottom")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "DoubleTopBottom", got)
	})
	t.Run("DownsideGapThreeMethods", func(t *testing.T) {
		ind, err := NewDownsideGapThreeMethods()
		if err != nil {
			t.Fatalf("new DownsideGapThreeMethods: %v", err)
		}
		if n := ind.Name(); n != "DownsideGapThreeMethods" {
			t.Errorf("name: got %q want %q", n, "DownsideGapThreeMethods")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "DownsideGapThreeMethods", got)
	})
	t.Run("Dpo", func(t *testing.T) {
		ind, err := NewDpo(14)
		if err != nil {
			t.Fatalf("new Dpo: %v", err)
		}
		if n := ind.Name(); n != "DPO" {
			t.Errorf("name: got %q want %q", n, "DPO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Dpo", got)
	})
	t.Run("DragonflyDoji", func(t *testing.T) {
		ind, err := NewDragonflyDoji()
		if err != nil {
			t.Fatalf("new DragonflyDoji: %v", err)
		}
		if n := ind.Name(); n != "DragonflyDoji" {
			t.Errorf("name: got %q want %q", n, "DragonflyDoji")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "DragonflyDoji", got)
	})
	t.Run("DrawdownDuration", func(t *testing.T) {
		ind, err := NewDrawdownDuration()
		if err != nil {
			t.Fatalf("new DrawdownDuration: %v", err)
		}
		if n := ind.Name(); n != "DrawdownDuration" {
			t.Errorf("name: got %q want %q", n, "DrawdownDuration")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "DrawdownDuration", got)
	})
	t.Run("DumplingTop", func(t *testing.T) {
		ind, err := NewDumplingTop(14)
		if err != nil {
			t.Fatalf("new DumplingTop: %v", err)
		}
		if n := ind.Name(); n != "DumplingTop" {
			t.Errorf("name: got %q want %q", n, "DumplingTop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "DumplingTop", got)
	})
	t.Run("Dx", func(t *testing.T) {
		ind, err := NewDx(14)
		if err != nil {
			t.Fatalf("new Dx: %v", err)
		}
		if n := ind.Name(); n != "DX" {
			t.Errorf("name: got %q want %q", n, "DX")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Dx", got)
	})
	t.Run("DynamicMomentumIndex", func(t *testing.T) {
		ind, err := NewDynamicMomentumIndex(14)
		if err != nil {
			t.Fatalf("new DynamicMomentumIndex: %v", err)
		}
		if n := ind.Name(); n != "DynamicMomentumIndex" {
			t.Errorf("name: got %q want %q", n, "DynamicMomentumIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "DynamicMomentumIndex", got)
	})
	t.Run("EaseOfMovement", func(t *testing.T) {
		ind, err := NewEaseOfMovement(14)
		if err != nil {
			t.Fatalf("new EaseOfMovement: %v", err)
		}
		if n := ind.Name(); n != "EaseOfMovement" {
			t.Errorf("name: got %q want %q", n, "EaseOfMovement")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "EaseOfMovement", got)
	})
	t.Run("EffectiveSpread", func(t *testing.T) {
		ind, err := NewEffectiveSpread()
		if err != nil {
			t.Fatalf("new EffectiveSpread: %v", err)
		}
		if n := ind.Name(); n != "EffectiveSpread" {
			t.Errorf("name: got %q want %q", n, "EffectiveSpread")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i), (r[1]+r[2])/2)}
		}
		compareGolden(t, "EffectiveSpread", got)
	})
	t.Run("EhlersStochastic", func(t *testing.T) {
		ind, err := NewEhlersStochastic(14)
		if err != nil {
			t.Fatalf("new EhlersStochastic: %v", err)
		}
		if n := ind.Name(); n != "EhlersStochastic" {
			t.Errorf("name: got %q want %q", n, "EhlersStochastic")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "EhlersStochastic", got)
	})
	t.Run("Ehma", func(t *testing.T) {
		ind, err := NewEhma(14)
		if err != nil {
			t.Fatalf("new Ehma: %v", err)
		}
		if n := ind.Name(); n != "EHMA" {
			t.Errorf("name: got %q want %q", n, "EHMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Ehma", got)
	})
	t.Run("ElderImpulse", func(t *testing.T) {
		ind, err := NewElderImpulse(3, 7, 14, 28)
		if err != nil {
			t.Fatalf("new ElderImpulse: %v", err)
		}
		if n := ind.Name(); n != "ElderImpulse" {
			t.Errorf("name: got %q want %q", n, "ElderImpulse")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "ElderImpulse", got)
	})
	t.Run("ElderRay", func(t *testing.T) {
		ind, err := NewElderRay(14)
		if err != nil {
			t.Fatalf("new ElderRay: %v", err)
		}
		if n := ind.Name(); n != "ElderRay" {
			t.Errorf("name: got %q want %q", n, "ElderRay")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "ElderRay", got)
	})
	t.Run("ElderSafeZone", func(t *testing.T) {
		ind, err := NewElderSafeZone(10, 2.0)
		if err != nil {
			t.Fatalf("new ElderSafeZone: %v", err)
		}
		if n := ind.Name(); n != "ElderSafeZone" {
			t.Errorf("name: got %q want %q", n, "ElderSafeZone")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "ElderSafeZone", got)
	})
	t.Run("Ema", func(t *testing.T) {
		ind, err := NewEma(14)
		if err != nil {
			t.Fatalf("new Ema: %v", err)
		}
		if n := ind.Name(); n != "EMA" {
			t.Errorf("name: got %q want %q", n, "EMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Ema", got)
	})
	t.Run("EmpiricalModeDecomposition", func(t *testing.T) {
		ind, err := NewEmpiricalModeDecomposition(20, 0.1)
		if err != nil {
			t.Fatalf("new EmpiricalModeDecomposition: %v", err)
		}
		if n := ind.Name(); n != "EmpiricalModeDecomposition" {
			t.Errorf("name: got %q want %q", n, "EmpiricalModeDecomposition")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "EmpiricalModeDecomposition", got)
	})
	t.Run("Engulfing", func(t *testing.T) {
		ind, err := NewEngulfing()
		if err != nil {
			t.Fatalf("new Engulfing: %v", err)
		}
		if n := ind.Name(); n != "Engulfing" {
			t.Errorf("name: got %q want %q", n, "Engulfing")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Engulfing", got)
	})
	t.Run("Equivolume", func(t *testing.T) {
		ind, err := NewEquivolume(14)
		if err != nil {
			t.Fatalf("new Equivolume: %v", err)
		}
		if n := ind.Name(); n != "Equivolume" {
			t.Errorf("name: got %q want %q", n, "Equivolume")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Equivolume", got)
	})
	t.Run("EstimatedLeverageRatio", func(t *testing.T) {
		ind, err := NewEstimatedLeverageRatio()
		if err != nil {
			t.Fatalf("new EstimatedLeverageRatio: %v", err)
		}
		if n := ind.Name(); n != "EstimatedLeverageRatio" {
			t.Errorf("name: got %q want %q", n, "EstimatedLeverageRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "EstimatedLeverageRatio", got)
	})
	t.Run("EvenBetterSinewave", func(t *testing.T) {
		ind, err := NewEvenBetterSinewave(40, 10)
		if err != nil {
			t.Fatalf("new EvenBetterSinewave: %v", err)
		}
		if n := ind.Name(); n != "EvenBetterSinewave" {
			t.Errorf("name: got %q want %q", n, "EvenBetterSinewave")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "EvenBetterSinewave", got)
	})
	t.Run("EveningDojiStar", func(t *testing.T) {
		ind, err := NewEveningDojiStar()
		if err != nil {
			t.Fatalf("new EveningDojiStar: %v", err)
		}
		if n := ind.Name(); n != "EveningDojiStar" {
			t.Errorf("name: got %q want %q", n, "EveningDojiStar")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "EveningDojiStar", got)
	})
	t.Run("Evwma", func(t *testing.T) {
		ind, err := NewEvwma(14)
		if err != nil {
			t.Fatalf("new Evwma: %v", err)
		}
		if n := ind.Name(); n != "EVWMA" {
			t.Errorf("name: got %q want %q", n, "EVWMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Evwma", got)
	})
	t.Run("EwmaVolatility", func(t *testing.T) {
		ind, err := NewEwmaVolatility(0.94)
		if err != nil {
			t.Fatalf("new EwmaVolatility: %v", err)
		}
		if n := ind.Name(); n != "EwmaVolatility" {
			t.Errorf("name: got %q want %q", n, "EwmaVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "EwmaVolatility", got)
	})
	t.Run("Expectancy", func(t *testing.T) {
		ind, err := NewExpectancy(14)
		if err != nil {
			t.Fatalf("new Expectancy: %v", err)
		}
		if n := ind.Name(); n != "Expectancy" {
			t.Errorf("name: got %q want %q", n, "Expectancy")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Expectancy", got)
	})
	t.Run("FallingThreeMethods", func(t *testing.T) {
		ind, err := NewFallingThreeMethods()
		if err != nil {
			t.Fatalf("new FallingThreeMethods: %v", err)
		}
		if n := ind.Name(); n != "FallingThreeMethods" {
			t.Errorf("name: got %q want %q", n, "FallingThreeMethods")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "FallingThreeMethods", got)
	})
	t.Run("Fama", func(t *testing.T) {
		ind, err := NewFama(0.5, 0.05)
		if err != nil {
			t.Fatalf("new Fama: %v", err)
		}
		if n := ind.Name(); n != "FAMA" {
			t.Errorf("name: got %q want %q", n, "FAMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Fama", got)
	})
	t.Run("FibArcs", func(t *testing.T) {
		ind, err := NewFibArcs()
		if err != nil {
			t.Fatalf("new FibArcs: %v", err)
		}
		if n := ind.Name(); n != "FibArcs" {
			t.Errorf("name: got %q want %q", n, "FibArcs")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "FibArcs", got)
	})
	t.Run("FibChannel", func(t *testing.T) {
		ind, err := NewFibChannel()
		if err != nil {
			t.Fatalf("new FibChannel: %v", err)
		}
		if n := ind.Name(); n != "FibChannel" {
			t.Errorf("name: got %q want %q", n, "FibChannel")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 4)
		}
		compareGolden(t, "FibChannel", got)
	})
	t.Run("FibConfluence", func(t *testing.T) {
		ind, err := NewFibConfluence()
		if err != nil {
			t.Fatalf("new FibConfluence: %v", err)
		}
		if n := ind.Name(); n != "FibConfluence" {
			t.Errorf("name: got %q want %q", n, "FibConfluence")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "FibConfluence", got)
	})
	t.Run("FibExtension", func(t *testing.T) {
		ind, err := NewFibExtension()
		if err != nil {
			t.Fatalf("new FibExtension: %v", err)
		}
		if n := ind.Name(); n != "FibExtension" {
			t.Errorf("name: got %q want %q", n, "FibExtension")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 5)
		}
		compareGolden(t, "FibExtension", got)
	})
	t.Run("FibFan", func(t *testing.T) {
		ind, err := NewFibFan()
		if err != nil {
			t.Fatalf("new FibFan: %v", err)
		}
		if n := ind.Name(); n != "FibFan" {
			t.Errorf("name: got %q want %q", n, "FibFan")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "FibFan", got)
	})
	t.Run("FibProjection", func(t *testing.T) {
		ind, err := NewFibProjection()
		if err != nil {
			t.Fatalf("new FibProjection: %v", err)
		}
		if n := ind.Name(); n != "FibProjection" {
			t.Errorf("name: got %q want %q", n, "FibProjection")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 4)
		}
		compareGolden(t, "FibProjection", got)
	})
	t.Run("FibRetracement", func(t *testing.T) {
		ind, err := NewFibRetracement()
		if err != nil {
			t.Fatalf("new FibRetracement: %v", err)
		}
		if n := ind.Name(); n != "FibRetracement" {
			t.Errorf("name: got %q want %q", n, "FibRetracement")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 7)
		}
		compareGolden(t, "FibRetracement", got)
	})
	t.Run("FibTimeZones", func(t *testing.T) {
		ind, err := NewFibTimeZones()
		if err != nil {
			t.Fatalf("new FibTimeZones: %v", err)
		}
		if n := ind.Name(); n != "FibTimeZones" {
			t.Errorf("name: got %q want %q", n, "FibTimeZones")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "FibTimeZones", got)
	})
	t.Run("FibonacciPivots", func(t *testing.T) {
		ind, err := NewFibonacciPivots()
		if err != nil {
			t.Fatalf("new FibonacciPivots: %v", err)
		}
		if n := ind.Name(); n != "FibonacciPivots" {
			t.Errorf("name: got %q want %q", n, "FibonacciPivots")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 7)
		}
		compareGolden(t, "FibonacciPivots", got)
	})
	t.Run("FisherRsi", func(t *testing.T) {
		ind, err := NewFisherRsi(14)
		if err != nil {
			t.Fatalf("new FisherRsi: %v", err)
		}
		if n := ind.Name(); n != "FisherRSI" {
			t.Errorf("name: got %q want %q", n, "FisherRSI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "FisherRsi", got)
	})
	t.Run("FisherTransform", func(t *testing.T) {
		ind, err := NewFisherTransform(14)
		if err != nil {
			t.Fatalf("new FisherTransform: %v", err)
		}
		if n := ind.Name(); n != "FisherTransform" {
			t.Errorf("name: got %q want %q", n, "FisherTransform")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "FisherTransform", got)
	})
	t.Run("FlagPennant", func(t *testing.T) {
		ind, err := NewFlagPennant()
		if err != nil {
			t.Fatalf("new FlagPennant: %v", err)
		}
		if n := ind.Name(); n != "FlagPennant" {
			t.Errorf("name: got %q want %q", n, "FlagPennant")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "FlagPennant", got)
	})
	t.Run("Footprint", func(t *testing.T) {
		ind, err := NewFootprint(1.0)
		if err != nil {
			t.Fatalf("new Footprint: %v", err)
		}
		if n := ind.Name(); n != "Footprint" {
			t.Errorf("name: got %q want %q", n, "Footprint")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[3], r[4], r[3] >= r[0], int64(i)))
		}
		compareGolden(t, "Footprint", got)
	})
	t.Run("ForceIndex", func(t *testing.T) {
		ind, err := NewForceIndex(14)
		if err != nil {
			t.Fatalf("new ForceIndex: %v", err)
		}
		if n := ind.Name(); n != "ForceIndex" {
			t.Errorf("name: got %q want %q", n, "ForceIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ForceIndex", got)
	})
	t.Run("FractalChaosBands", func(t *testing.T) {
		ind, err := NewFractalChaosBands(14)
		if err != nil {
			t.Fatalf("new FractalChaosBands: %v", err)
		}
		if n := ind.Name(); n != "FractalChaosBands" {
			t.Errorf("name: got %q want %q", n, "FractalChaosBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "FractalChaosBands", got)
	})
	t.Run("Frama", func(t *testing.T) {
		ind, err := NewFrama(14)
		if err != nil {
			t.Fatalf("new Frama: %v", err)
		}
		if n := ind.Name(); n != "FRAMA" {
			t.Errorf("name: got %q want %q", n, "FRAMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Frama", got)
	})
	t.Run("FryPanBottom", func(t *testing.T) {
		ind, err := NewFryPanBottom(14)
		if err != nil {
			t.Fatalf("new FryPanBottom: %v", err)
		}
		if n := ind.Name(); n != "FryPanBottom" {
			t.Errorf("name: got %q want %q", n, "FryPanBottom")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "FryPanBottom", got)
	})
	t.Run("FundingBasis", func(t *testing.T) {
		ind, err := NewFundingBasis()
		if err != nil {
			t.Fatalf("new FundingBasis: %v", err)
		}
		if n := ind.Name(); n != "FundingBasis" {
			t.Errorf("name: got %q want %q", n, "FundingBasis")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "FundingBasis", got)
	})
	t.Run("FundingImpliedApr", func(t *testing.T) {
		ind, err := NewFundingImpliedApr(1095.0)
		if err != nil {
			t.Fatalf("new FundingImpliedApr: %v", err)
		}
		if n := ind.Name(); n != "FundingImpliedApr" {
			t.Errorf("name: got %q want %q", n, "FundingImpliedApr")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "FundingImpliedApr", got)
	})
	t.Run("FundingRate", func(t *testing.T) {
		ind, err := NewFundingRate()
		if err != nil {
			t.Fatalf("new FundingRate: %v", err)
		}
		if n := ind.Name(); n != "FundingRate" {
			t.Errorf("name: got %q want %q", n, "FundingRate")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "FundingRate", got)
	})
	t.Run("FundingRateMean", func(t *testing.T) {
		ind, err := NewFundingRateMean(20)
		if err != nil {
			t.Fatalf("new FundingRateMean: %v", err)
		}
		if n := ind.Name(); n != "FundingRateMean" {
			t.Errorf("name: got %q want %q", n, "FundingRateMean")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "FundingRateMean", got)
	})
	t.Run("FundingRateZScore", func(t *testing.T) {
		ind, err := NewFundingRateZScore(20)
		if err != nil {
			t.Fatalf("new FundingRateZScore: %v", err)
		}
		if n := ind.Name(); n != "FundingRateZScore" {
			t.Errorf("name: got %q want %q", n, "FundingRateZScore")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "FundingRateZScore", got)
	})
	t.Run("GainLossRatio", func(t *testing.T) {
		ind, err := NewGainLossRatio(14)
		if err != nil {
			t.Fatalf("new GainLossRatio: %v", err)
		}
		if n := ind.Name(); n != "GainLossRatio" {
			t.Errorf("name: got %q want %q", n, "GainLossRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "GainLossRatio", got)
	})
	t.Run("GainToPainRatio", func(t *testing.T) {
		ind, err := NewGainToPainRatio(14)
		if err != nil {
			t.Fatalf("new GainToPainRatio: %v", err)
		}
		if n := ind.Name(); n != "GainToPainRatio" {
			t.Errorf("name: got %q want %q", n, "GainToPainRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "GainToPainRatio", got)
	})
	t.Run("GapSideBySideWhite", func(t *testing.T) {
		ind, err := NewGapSideBySideWhite()
		if err != nil {
			t.Fatalf("new GapSideBySideWhite: %v", err)
		}
		if n := ind.Name(); n != "GapSideBySideWhite" {
			t.Errorf("name: got %q want %q", n, "GapSideBySideWhite")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "GapSideBySideWhite", got)
	})
	t.Run("Garch11", func(t *testing.T) {
		ind, err := NewGarch11(2e-06, 0.1, 0.88)
		if err != nil {
			t.Fatalf("new Garch11: %v", err)
		}
		if n := ind.Name(); n != "Garch11" {
			t.Errorf("name: got %q want %q", n, "Garch11")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Garch11", got)
	})
	t.Run("GarmanKlassVolatility", func(t *testing.T) {
		ind, err := NewGarmanKlassVolatility(20, 252)
		if err != nil {
			t.Fatalf("new GarmanKlassVolatility: %v", err)
		}
		if n := ind.Name(); n != "GarmanKlassVolatility" {
			t.Errorf("name: got %q want %q", n, "GarmanKlassVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "GarmanKlassVolatility", got)
	})
	t.Run("Gartley", func(t *testing.T) {
		ind, err := NewGartley()
		if err != nil {
			t.Fatalf("new Gartley: %v", err)
		}
		if n := ind.Name(); n != "Gartley" {
			t.Errorf("name: got %q want %q", n, "Gartley")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Gartley", got)
	})
	t.Run("GatorOscillator", func(t *testing.T) {
		ind, err := NewGatorOscillator(3, 7, 14)
		if err != nil {
			t.Fatalf("new GatorOscillator: %v", err)
		}
		if n := ind.Name(); n != "GatorOscillator" {
			t.Errorf("name: got %q want %q", n, "GatorOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "GatorOscillator", got)
	})
	t.Run("GeneralizedDema", func(t *testing.T) {
		ind, err := NewGeneralizedDema(5, 0.7)
		if err != nil {
			t.Fatalf("new GeneralizedDema: %v", err)
		}
		if n := ind.Name(); n != "GD" {
			t.Errorf("name: got %q want %q", n, "GD")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "GeneralizedDema", got)
	})
	t.Run("GeometricMa", func(t *testing.T) {
		ind, err := NewGeometricMa(14)
		if err != nil {
			t.Fatalf("new GeometricMa: %v", err)
		}
		if n := ind.Name(); n != "GMA" {
			t.Errorf("name: got %q want %q", n, "GMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "GeometricMa", got)
	})
	t.Run("GoldenPocket", func(t *testing.T) {
		ind, err := NewGoldenPocket()
		if err != nil {
			t.Fatalf("new GoldenPocket: %v", err)
		}
		if n := ind.Name(); n != "GoldenPocket" {
			t.Errorf("name: got %q want %q", n, "GoldenPocket")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "GoldenPocket", got)
	})
	t.Run("GrangerCausality", func(t *testing.T) {
		ind, err := NewGrangerCausality(60, 1)
		if err != nil {
			t.Fatalf("new GrangerCausality: %v", err)
		}
		if n := ind.Name(); n != "GrangerCausality" {
			t.Errorf("name: got %q want %q", n, "GrangerCausality")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "GrangerCausality", got)
	})
	t.Run("GravestoneDoji", func(t *testing.T) {
		ind, err := NewGravestoneDoji()
		if err != nil {
			t.Fatalf("new GravestoneDoji: %v", err)
		}
		if n := ind.Name(); n != "GravestoneDoji" {
			t.Errorf("name: got %q want %q", n, "GravestoneDoji")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "GravestoneDoji", got)
	})
	t.Run("Hammer", func(t *testing.T) {
		ind, err := NewHammer()
		if err != nil {
			t.Fatalf("new Hammer: %v", err)
		}
		if n := ind.Name(); n != "Hammer" {
			t.Errorf("name: got %q want %q", n, "Hammer")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Hammer", got)
	})
	t.Run("HangingMan", func(t *testing.T) {
		ind, err := NewHangingMan()
		if err != nil {
			t.Fatalf("new HangingMan: %v", err)
		}
		if n := ind.Name(); n != "HangingMan" {
			t.Errorf("name: got %q want %q", n, "HangingMan")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HangingMan", got)
	})
	t.Run("Harami", func(t *testing.T) {
		ind, err := NewHarami()
		if err != nil {
			t.Fatalf("new Harami: %v", err)
		}
		if n := ind.Name(); n != "Harami" {
			t.Errorf("name: got %q want %q", n, "Harami")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Harami", got)
	})
	t.Run("HaramiCross", func(t *testing.T) {
		ind, err := NewHaramiCross()
		if err != nil {
			t.Fatalf("new HaramiCross: %v", err)
		}
		if n := ind.Name(); n != "HaramiCross" {
			t.Errorf("name: got %q want %q", n, "HaramiCross")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HaramiCross", got)
	})
	t.Run("HasbrouckInformationShare", func(t *testing.T) {
		ind, err := NewHasbrouckInformationShare(14)
		if err != nil {
			t.Fatalf("new HasbrouckInformationShare: %v", err)
		}
		if n := ind.Name(); n != "HasbrouckInformationShare" {
			t.Errorf("name: got %q want %q", n, "HasbrouckInformationShare")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "HasbrouckInformationShare", got)
	})
	t.Run("HeadAndShoulders", func(t *testing.T) {
		ind, err := NewHeadAndShoulders()
		if err != nil {
			t.Fatalf("new HeadAndShoulders: %v", err)
		}
		if n := ind.Name(); n != "HeadAndShoulders" {
			t.Errorf("name: got %q want %q", n, "HeadAndShoulders")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HeadAndShoulders", got)
	})
	t.Run("HeikinAshi", func(t *testing.T) {
		ind, err := NewHeikinAshi()
		if err != nil {
			t.Fatalf("new HeikinAshi: %v", err)
		}
		if n := ind.Name(); n != "HeikinAshi" {
			t.Errorf("name: got %q want %q", n, "HeikinAshi")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 4)
		}
		compareGolden(t, "HeikinAshi", got)
	})
	t.Run("HeikinAshiOscillator", func(t *testing.T) {
		ind, err := NewHeikinAshiOscillator(14)
		if err != nil {
			t.Fatalf("new HeikinAshiOscillator: %v", err)
		}
		if n := ind.Name(); n != "HeikinAshiOscillator" {
			t.Errorf("name: got %q want %q", n, "HeikinAshiOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HeikinAshiOscillator", got)
	})
	t.Run("HiLoActivator", func(t *testing.T) {
		ind, err := NewHiLoActivator(14)
		if err != nil {
			t.Fatalf("new HiLoActivator: %v", err)
		}
		if n := ind.Name(); n != "HiLoActivator" {
			t.Errorf("name: got %q want %q", n, "HiLoActivator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HiLoActivator", got)
	})
	t.Run("HighLowIndex", func(t *testing.T) {
		ind, err := NewHighLowIndex(10)
		if err != nil {
			t.Fatalf("new HighLowIndex: %v", err)
		}
		if n := ind.Name(); n != "HighLowIndex" {
			t.Errorf("name: got %q want %q", n, "HighLowIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "HighLowIndex", got)
	})
	t.Run("HighLowRange", func(t *testing.T) {
		ind, err := NewHighLowRange()
		if err != nil {
			t.Fatalf("new HighLowRange: %v", err)
		}
		if n := ind.Name(); n != "HighLowRange" {
			t.Errorf("name: got %q want %q", n, "HighLowRange")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HighLowRange", got)
	})
	t.Run("HighLowVolumeNodes", func(t *testing.T) {
		ind, err := NewHighLowVolumeNodes(3, 7)
		if err != nil {
			t.Fatalf("new HighLowVolumeNodes: %v", err)
		}
		if n := ind.Name(); n != "HighLowVolumeNodes" {
			t.Errorf("name: got %q want %q", n, "HighLowVolumeNodes")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "HighLowVolumeNodes", got)
	})
	t.Run("HighWave", func(t *testing.T) {
		ind, err := NewHighWave()
		if err != nil {
			t.Fatalf("new HighWave: %v", err)
		}
		if n := ind.Name(); n != "HighWave" {
			t.Errorf("name: got %q want %q", n, "HighWave")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HighWave", got)
	})
	t.Run("HighpassFilter", func(t *testing.T) {
		ind, err := NewHighpassFilter(14)
		if err != nil {
			t.Fatalf("new HighpassFilter: %v", err)
		}
		if n := ind.Name(); n != "HighpassFilter" {
			t.Errorf("name: got %q want %q", n, "HighpassFilter")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "HighpassFilter", got)
	})
	t.Run("Hikkake", func(t *testing.T) {
		ind, err := NewHikkake()
		if err != nil {
			t.Fatalf("new Hikkake: %v", err)
		}
		if n := ind.Name(); n != "Hikkake" {
			t.Errorf("name: got %q want %q", n, "Hikkake")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Hikkake", got)
	})
	t.Run("HikkakeModified", func(t *testing.T) {
		ind, err := NewHikkakeModified()
		if err != nil {
			t.Fatalf("new HikkakeModified: %v", err)
		}
		if n := ind.Name(); n != "HikkakeModified" {
			t.Errorf("name: got %q want %q", n, "HikkakeModified")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HikkakeModified", got)
	})
	t.Run("HilbertDominantCycle", func(t *testing.T) {
		ind, err := NewHilbertDominantCycle()
		if err != nil {
			t.Fatalf("new HilbertDominantCycle: %v", err)
		}
		if n := ind.Name(); n != "HilbertDominantCycle" {
			t.Errorf("name: got %q want %q", n, "HilbertDominantCycle")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "HilbertDominantCycle", got)
	})
	t.Run("HistoricalVolatility", func(t *testing.T) {
		ind, err := NewHistoricalVolatility(3, 7)
		if err != nil {
			t.Fatalf("new HistoricalVolatility: %v", err)
		}
		if n := ind.Name(); n != "HistoricalVolatility" {
			t.Errorf("name: got %q want %q", n, "HistoricalVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "HistoricalVolatility", got)
	})
	t.Run("Hma", func(t *testing.T) {
		ind, err := NewHma(14)
		if err != nil {
			t.Fatalf("new Hma: %v", err)
		}
		if n := ind.Name(); n != "HMA" {
			t.Errorf("name: got %q want %q", n, "HMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Hma", got)
	})
	t.Run("HoltWinters", func(t *testing.T) {
		ind, err := NewHoltWinters(0.5, 0.1)
		if err != nil {
			t.Fatalf("new HoltWinters: %v", err)
		}
		if n := ind.Name(); n != "HoltWinters" {
			t.Errorf("name: got %q want %q", n, "HoltWinters")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "HoltWinters", got)
	})
	t.Run("HomingPigeon", func(t *testing.T) {
		ind, err := NewHomingPigeon()
		if err != nil {
			t.Fatalf("new HomingPigeon: %v", err)
		}
		if n := ind.Name(); n != "HomingPigeon" {
			t.Errorf("name: got %q want %q", n, "HomingPigeon")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "HomingPigeon", got)
	})
	t.Run("HtDcPhase", func(t *testing.T) {
		ind, err := NewHtDcPhase()
		if err != nil {
			t.Fatalf("new HtDcPhase: %v", err)
		}
		if n := ind.Name(); n != "HT_DCPHASE" {
			t.Errorf("name: got %q want %q", n, "HT_DCPHASE")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "HtDcPhase", got)
	})
	t.Run("HtPhasor", func(t *testing.T) {
		ind, err := NewHtPhasor()
		if err != nil {
			t.Fatalf("new HtPhasor: %v", err)
		}
		if n := ind.Name(); n != "HT_PHASOR" {
			t.Errorf("name: got %q want %q", n, "HT_PHASOR")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "HtPhasor", got)
	})
	t.Run("HtTrendMode", func(t *testing.T) {
		ind, err := NewHtTrendMode()
		if err != nil {
			t.Fatalf("new HtTrendMode: %v", err)
		}
		if n := ind.Name(); n != "HT_TRENDMODE" {
			t.Errorf("name: got %q want %q", n, "HT_TRENDMODE")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "HtTrendMode", got)
	})
	t.Run("HurstChannel", func(t *testing.T) {
		ind, err := NewHurstChannel(14, 2.0)
		if err != nil {
			t.Fatalf("new HurstChannel: %v", err)
		}
		if n := ind.Name(); n != "HurstChannel" {
			t.Errorf("name: got %q want %q", n, "HurstChannel")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "HurstChannel", got)
	})
	t.Run("HurstExponent", func(t *testing.T) {
		ind, err := NewHurstExponent(100, 4)
		if err != nil {
			t.Fatalf("new HurstExponent: %v", err)
		}
		if n := ind.Name(); n != "HurstExponent" {
			t.Errorf("name: got %q want %q", n, "HurstExponent")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "HurstExponent", got)
	})
	t.Run("Ichimoku", func(t *testing.T) {
		ind, err := NewIchimoku(9, 26, 52, 26)
		if err != nil {
			t.Fatalf("new Ichimoku: %v", err)
		}
		if n := ind.Name(); n != "Ichimoku" {
			t.Errorf("name: got %q want %q", n, "Ichimoku")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 5)
		}
		compareGolden(t, "Ichimoku", got)
	})
	t.Run("IdenticalThreeCrows", func(t *testing.T) {
		ind, err := NewIdenticalThreeCrows()
		if err != nil {
			t.Fatalf("new IdenticalThreeCrows: %v", err)
		}
		if n := ind.Name(); n != "IdenticalThreeCrows" {
			t.Errorf("name: got %q want %q", n, "IdenticalThreeCrows")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "IdenticalThreeCrows", got)
	})
	t.Run("ImbalanceBars", func(t *testing.T) {
		ind, err := NewImbalanceBars(5.0)
		if err != nil {
			t.Fatalf("new ImbalanceBars: %v", err)
		}
		if n := ind.Name(); n != "ImbalanceBars" {
			t.Errorf("name: got %q want %q", n, "ImbalanceBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[0], r[1], r[2], r[3], 1.0, 0))
		}
		compareGolden(t, "ImbalanceBars", got)
	})
	t.Run("InNeck", func(t *testing.T) {
		ind, err := NewInNeck()
		if err != nil {
			t.Fatalf("new InNeck: %v", err)
		}
		if n := ind.Name(); n != "InNeck" {
			t.Errorf("name: got %q want %q", n, "InNeck")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "InNeck", got)
	})
	t.Run("Inertia", func(t *testing.T) {
		ind, err := NewInertia(3, 7)
		if err != nil {
			t.Fatalf("new Inertia: %v", err)
		}
		if n := ind.Name(); n != "Inertia" {
			t.Errorf("name: got %q want %q", n, "Inertia")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Inertia", got)
	})
	t.Run("InformationRatio", func(t *testing.T) {
		ind, err := NewInformationRatio(14)
		if err != nil {
			t.Fatalf("new InformationRatio: %v", err)
		}
		if n := ind.Name(); n != "InformationRatio" {
			t.Errorf("name: got %q want %q", n, "InformationRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "InformationRatio", got)
	})
	t.Run("InitialBalance", func(t *testing.T) {
		ind, err := NewInitialBalance(14)
		if err != nil {
			t.Fatalf("new InitialBalance: %v", err)
		}
		if n := ind.Name(); n != "InitialBalance" {
			t.Errorf("name: got %q want %q", n, "InitialBalance")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "InitialBalance", got)
	})
	t.Run("InstantaneousTrendline", func(t *testing.T) {
		ind, err := NewInstantaneousTrendline(14)
		if err != nil {
			t.Fatalf("new InstantaneousTrendline: %v", err)
		}
		if n := ind.Name(); n != "InstantaneousTrendline" {
			t.Errorf("name: got %q want %q", n, "InstantaneousTrendline")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "InstantaneousTrendline", got)
	})
	t.Run("IntradayIntensity", func(t *testing.T) {
		ind, err := NewIntradayIntensity()
		if err != nil {
			t.Fatalf("new IntradayIntensity: %v", err)
		}
		if n := ind.Name(); n != "IntradayIntensity" {
			t.Errorf("name: got %q want %q", n, "IntradayIntensity")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "IntradayIntensity", got)
	})
	t.Run("IntradayMomentumIndex", func(t *testing.T) {
		ind, err := NewIntradayMomentumIndex(14)
		if err != nil {
			t.Fatalf("new IntradayMomentumIndex: %v", err)
		}
		if n := ind.Name(); n != "IMI" {
			t.Errorf("name: got %q want %q", n, "IMI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "IntradayMomentumIndex", got)
	})
	t.Run("IntradayVolatilityProfile", func(t *testing.T) {
		ind, err := NewIntradayVolatilityProfile(24, 0)
		if err != nil {
			t.Fatalf("new IntradayVolatilityProfile: %v", err)
		}
		if n := ind.Name(); n != "IntradayVolatilityProfile" {
			t.Errorf("name: got %q want %q", n, "IntradayVolatilityProfile")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bins, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			if ok {
				got[i] = bins
			} else {
				got[i] = nanRow(24)
			}
		}
		compareGolden(t, "IntradayVolatilityProfile", got)
	})
	t.Run("InverseFisherTransform", func(t *testing.T) {
		ind, err := NewInverseFisherTransform(2.0)
		if err != nil {
			t.Fatalf("new InverseFisherTransform: %v", err)
		}
		if n := ind.Name(); n != "InverseFisherTransform" {
			t.Errorf("name: got %q want %q", n, "InverseFisherTransform")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "InverseFisherTransform", got)
	})
	t.Run("InvertedHammer", func(t *testing.T) {
		ind, err := NewInvertedHammer()
		if err != nil {
			t.Fatalf("new InvertedHammer: %v", err)
		}
		if n := ind.Name(); n != "InvertedHammer" {
			t.Errorf("name: got %q want %q", n, "InvertedHammer")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "InvertedHammer", got)
	})
	t.Run("JarqueBera", func(t *testing.T) {
		ind, err := NewJarqueBera(14)
		if err != nil {
			t.Fatalf("new JarqueBera: %v", err)
		}
		if n := ind.Name(); n != "JarqueBera" {
			t.Errorf("name: got %q want %q", n, "JarqueBera")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "JarqueBera", got)
	})
	t.Run("Jma", func(t *testing.T) {
		ind, err := NewJma(7, 0.0, 2.0)
		if err != nil {
			t.Fatalf("new Jma: %v", err)
		}
		if n := ind.Name(); n != "JMA" {
			t.Errorf("name: got %q want %q", n, "JMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Jma", got)
	})
	t.Run("JumpIndicator", func(t *testing.T) {
		ind, err := NewJumpIndicator(14, 2.0)
		if err != nil {
			t.Fatalf("new JumpIndicator: %v", err)
		}
		if n := ind.Name(); n != "JumpIndicator" {
			t.Errorf("name: got %q want %q", n, "JumpIndicator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "JumpIndicator", got)
	})
	t.Run("KRatio", func(t *testing.T) {
		ind, err := NewKRatio(14)
		if err != nil {
			t.Fatalf("new KRatio: %v", err)
		}
		if n := ind.Name(); n != "KRatio" {
			t.Errorf("name: got %q want %q", n, "KRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "KRatio", got)
	})
	t.Run("KagiBars", func(t *testing.T) {
		ind, err := NewKagiBars(2.0)
		if err != nil {
			t.Fatalf("new KagiBars: %v", err)
		}
		if n := ind.Name(); n != "KagiBars" {
			t.Errorf("name: got %q want %q", n, "KagiBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[3], r[3], r[3], r[3], 1.0, 0))
		}
		compareGolden(t, "KagiBars", got)
	})
	t.Run("KalmanHedgeRatio", func(t *testing.T) {
		ind, err := NewKalmanHedgeRatio(0.01, 0.001)
		if err != nil {
			t.Fatalf("new KalmanHedgeRatio: %v", err)
		}
		if n := ind.Name(); n != "KalmanHedgeRatio" {
			t.Errorf("name: got %q want %q", n, "KalmanHedgeRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3], r[0])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "KalmanHedgeRatio", got)
	})
	t.Run("Kama", func(t *testing.T) {
		ind, err := NewKama(3, 7, 14)
		if err != nil {
			t.Fatalf("new Kama: %v", err)
		}
		if n := ind.Name(); n != "KAMA" {
			t.Errorf("name: got %q want %q", n, "KAMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Kama", got)
	})
	t.Run("KaseDevStop", func(t *testing.T) {
		ind, err := NewKaseDevStop(14, 2.0)
		if err != nil {
			t.Fatalf("new KaseDevStop: %v", err)
		}
		if n := ind.Name(); n != "KaseDevStop" {
			t.Errorf("name: got %q want %q", n, "KaseDevStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "KaseDevStop", got)
	})
	t.Run("KasePermissionStochastic", func(t *testing.T) {
		ind, err := NewKasePermissionStochastic(3, 7)
		if err != nil {
			t.Fatalf("new KasePermissionStochastic: %v", err)
		}
		if n := ind.Name(); n != "KasePermissionStochastic" {
			t.Errorf("name: got %q want %q", n, "KasePermissionStochastic")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "KasePermissionStochastic", got)
	})
	t.Run("KellyCriterion", func(t *testing.T) {
		ind, err := NewKellyCriterion(14)
		if err != nil {
			t.Fatalf("new KellyCriterion: %v", err)
		}
		if n := ind.Name(); n != "KellyCriterion" {
			t.Errorf("name: got %q want %q", n, "KellyCriterion")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "KellyCriterion", got)
	})
	t.Run("Keltner", func(t *testing.T) {
		ind, err := NewKeltner(3, 7, 2.0)
		if err != nil {
			t.Fatalf("new Keltner: %v", err)
		}
		if n := ind.Name(); n != "KeltnerChannels" {
			t.Errorf("name: got %q want %q", n, "KeltnerChannels")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "Keltner", got)
	})
	t.Run("KendallTau", func(t *testing.T) {
		ind, err := NewKendallTau(14)
		if err != nil {
			t.Fatalf("new KendallTau: %v", err)
		}
		if n := ind.Name(); n != "KendallTau" {
			t.Errorf("name: got %q want %q", n, "KendallTau")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "KendallTau", got)
	})
	t.Run("Kicking", func(t *testing.T) {
		ind, err := NewKicking()
		if err != nil {
			t.Fatalf("new Kicking: %v", err)
		}
		if n := ind.Name(); n != "Kicking" {
			t.Errorf("name: got %q want %q", n, "Kicking")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Kicking", got)
	})
	t.Run("KickingByLength", func(t *testing.T) {
		ind, err := NewKickingByLength()
		if err != nil {
			t.Fatalf("new KickingByLength: %v", err)
		}
		if n := ind.Name(); n != "KickingByLength" {
			t.Errorf("name: got %q want %q", n, "KickingByLength")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "KickingByLength", got)
	})
	t.Run("Kst", func(t *testing.T) {
		ind, err := NewKst(3, 7, 14, 28, 35, 42, 56, 63, 70)
		if err != nil {
			t.Fatalf("new Kst: %v", err)
		}
		if n := ind.Name(); n != "KST" {
			t.Errorf("name: got %q want %q", n, "KST")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Kst", got)
	})
	t.Run("Kurtosis", func(t *testing.T) {
		ind, err := NewKurtosis(14)
		if err != nil {
			t.Fatalf("new Kurtosis: %v", err)
		}
		if n := ind.Name(); n != "Kurtosis" {
			t.Errorf("name: got %q want %q", n, "Kurtosis")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Kurtosis", got)
	})
	t.Run("Kvo", func(t *testing.T) {
		ind, err := NewKvo(3, 7)
		if err != nil {
			t.Fatalf("new Kvo: %v", err)
		}
		if n := ind.Name(); n != "KVO" {
			t.Errorf("name: got %q want %q", n, "KVO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Kvo", got)
	})
	t.Run("KylesLambda", func(t *testing.T) {
		ind, err := NewKylesLambda(20)
		if err != nil {
			t.Fatalf("new KylesLambda: %v", err)
		}
		if n := ind.Name(); n != "KylesLambda" {
			t.Errorf("name: got %q want %q", n, "KylesLambda")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i), (r[1]+r[2])/2)}
		}
		compareGolden(t, "KylesLambda", got)
	})
	t.Run("LadderBottom", func(t *testing.T) {
		ind, err := NewLadderBottom()
		if err != nil {
			t.Fatalf("new LadderBottom: %v", err)
		}
		if n := ind.Name(); n != "LadderBottom" {
			t.Errorf("name: got %q want %q", n, "LadderBottom")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "LadderBottom", got)
	})
	t.Run("LaguerreRsi", func(t *testing.T) {
		ind, err := NewLaguerreRsi(0.5)
		if err != nil {
			t.Fatalf("new LaguerreRsi: %v", err)
		}
		if n := ind.Name(); n != "LaguerreRSI" {
			t.Errorf("name: got %q want %q", n, "LaguerreRSI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "LaguerreRsi", got)
	})
	t.Run("LeadLagCrossCorrelation", func(t *testing.T) {
		ind, err := NewLeadLagCrossCorrelation(20, 10)
		if err != nil {
			t.Fatalf("new LeadLagCrossCorrelation: %v", err)
		}
		if n := ind.Name(); n != "LeadLagCrossCorrelation" {
			t.Errorf("name: got %q want %q", n, "LeadLagCrossCorrelation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3], r[0])
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "LeadLagCrossCorrelation", got)
	})
	t.Run("LinRegAngle", func(t *testing.T) {
		ind, err := NewLinRegAngle(14)
		if err != nil {
			t.Fatalf("new LinRegAngle: %v", err)
		}
		if n := ind.Name(); n != "LinRegAngle" {
			t.Errorf("name: got %q want %q", n, "LinRegAngle")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "LinRegAngle", got)
	})
	t.Run("LinRegChannel", func(t *testing.T) {
		ind, err := NewLinRegChannel(14, 2.0)
		if err != nil {
			t.Fatalf("new LinRegChannel: %v", err)
		}
		if n := ind.Name(); n != "LinRegChannel" {
			t.Errorf("name: got %q want %q", n, "LinRegChannel")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "LinRegChannel", got)
	})
	t.Run("LinRegIntercept", func(t *testing.T) {
		ind, err := NewLinRegIntercept(14)
		if err != nil {
			t.Fatalf("new LinRegIntercept: %v", err)
		}
		if n := ind.Name(); n != "LINEARREG_INTERCEPT" {
			t.Errorf("name: got %q want %q", n, "LINEARREG_INTERCEPT")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "LinRegIntercept", got)
	})
	t.Run("LinRegSlope", func(t *testing.T) {
		ind, err := NewLinRegSlope(14)
		if err != nil {
			t.Fatalf("new LinRegSlope: %v", err)
		}
		if n := ind.Name(); n != "LinRegSlope" {
			t.Errorf("name: got %q want %q", n, "LinRegSlope")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "LinRegSlope", got)
	})
	t.Run("LinearRegression", func(t *testing.T) {
		ind, err := NewLinearRegression(14)
		if err != nil {
			t.Fatalf("new LinearRegression: %v", err)
		}
		if n := ind.Name(); n != "LinearRegression" {
			t.Errorf("name: got %q want %q", n, "LinearRegression")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "LinearRegression", got)
	})
	t.Run("LiquidationFeatures", func(t *testing.T) {
		ind, err := NewLiquidationFeatures()
		if err != nil {
			t.Fatalf("new LiquidationFeatures: %v", err)
		}
		if n := ind.Name(); n != "LiquidationFeatures" {
			t.Errorf("name: got %q want %q", n, "LiquidationFeatures")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			out, ok := ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))
			got[i] = reflectRow(out, ok, 5)
		}
		compareGolden(t, "LiquidationFeatures", got)
	})
	t.Run("LogReturn", func(t *testing.T) {
		ind, err := NewLogReturn(14)
		if err != nil {
			t.Fatalf("new LogReturn: %v", err)
		}
		if n := ind.Name(); n != "LogReturn" {
			t.Errorf("name: got %q want %q", n, "LogReturn")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "LogReturn", got)
	})
	t.Run("LongLeggedDoji", func(t *testing.T) {
		ind, err := NewLongLeggedDoji()
		if err != nil {
			t.Fatalf("new LongLeggedDoji: %v", err)
		}
		if n := ind.Name(); n != "LongLeggedDoji" {
			t.Errorf("name: got %q want %q", n, "LongLeggedDoji")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "LongLeggedDoji", got)
	})
	t.Run("LongLine", func(t *testing.T) {
		ind, err := NewLongLine()
		if err != nil {
			t.Fatalf("new LongLine: %v", err)
		}
		if n := ind.Name(); n != "LongLine" {
			t.Errorf("name: got %q want %q", n, "LongLine")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "LongLine", got)
	})
	t.Run("LongShortRatio", func(t *testing.T) {
		ind, err := NewLongShortRatio()
		if err != nil {
			t.Fatalf("new LongShortRatio: %v", err)
		}
		if n := ind.Name(); n != "LongShortRatio" {
			t.Errorf("name: got %q want %q", n, "LongShortRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "LongShortRatio", got)
	})
	t.Run("M2Measure", func(t *testing.T) {
		ind, err := NewM2Measure(14, 2.0, 0.5)
		if err != nil {
			t.Fatalf("new M2Measure: %v", err)
		}
		if n := ind.Name(); n != "M2Measure" {
			t.Errorf("name: got %q want %q", n, "M2Measure")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "M2Measure", got)
	})
	t.Run("MaEnvelope", func(t *testing.T) {
		ind, err := NewMaEnvelope(14, 2.0)
		if err != nil {
			t.Fatalf("new MaEnvelope: %v", err)
		}
		if n := ind.Name(); n != "MaEnvelope" {
			t.Errorf("name: got %q want %q", n, "MaEnvelope")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "MaEnvelope", got)
	})
	t.Run("MacdExt", func(t *testing.T) {
		ind, err := NewMacdExt(12, 0.0, 26, 0.0, 9, 0.0)
		if err != nil {
			t.Fatalf("new MacdExt: %v", err)
		}
		if n := ind.Name(); n != "MACDEXT" {
			t.Errorf("name: got %q want %q", n, "MACDEXT")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "MacdExt", got)
	})
	t.Run("MacdFix", func(t *testing.T) {
		ind, err := NewMacdFix(9)
		if err != nil {
			t.Fatalf("new MacdFix: %v", err)
		}
		if n := ind.Name(); n != "MACDFIX" {
			t.Errorf("name: got %q want %q", n, "MACDFIX")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "MacdFix", got)
	})
	t.Run("MacdHistogram", func(t *testing.T) {
		ind, err := NewMacdHistogram(3, 7, 14)
		if err != nil {
			t.Fatalf("new MacdHistogram: %v", err)
		}
		if n := ind.Name(); n != "MacdHistogram" {
			t.Errorf("name: got %q want %q", n, "MacdHistogram")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "MacdHistogram", got)
	})
	t.Run("MacdIndicator", func(t *testing.T) {
		ind, err := NewMacdIndicator(12, 26, 9)
		if err != nil {
			t.Fatalf("new MacdIndicator: %v", err)
		}
		if n := ind.Name(); n != "MACD" {
			t.Errorf("name: got %q want %q", n, "MACD")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "MacdIndicator", got)
	})
	t.Run("Mama", func(t *testing.T) {
		ind, err := NewMama(0.5, 0.05)
		if err != nil {
			t.Fatalf("new Mama: %v", err)
		}
		if n := ind.Name(); n != "MAMA" {
			t.Errorf("name: got %q want %q", n, "MAMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Mama", got)
	})
	t.Run("MarketFacilitationIndex", func(t *testing.T) {
		ind, err := NewMarketFacilitationIndex()
		if err != nil {
			t.Fatalf("new MarketFacilitationIndex: %v", err)
		}
		if n := ind.Name(); n != "MarketFacilitationIndex" {
			t.Errorf("name: got %q want %q", n, "MarketFacilitationIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MarketFacilitationIndex", got)
	})
	t.Run("MartinRatio", func(t *testing.T) {
		ind, err := NewMartinRatio(14)
		if err != nil {
			t.Fatalf("new MartinRatio: %v", err)
		}
		if n := ind.Name(); n != "MartinRatio" {
			t.Errorf("name: got %q want %q", n, "MartinRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "MartinRatio", got)
	})
	t.Run("Marubozu", func(t *testing.T) {
		ind, err := NewMarubozu()
		if err != nil {
			t.Fatalf("new Marubozu: %v", err)
		}
		if n := ind.Name(); n != "Marubozu" {
			t.Errorf("name: got %q want %q", n, "Marubozu")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Marubozu", got)
	})
	t.Run("MassIndex", func(t *testing.T) {
		ind, err := NewMassIndex(3, 7)
		if err != nil {
			t.Fatalf("new MassIndex: %v", err)
		}
		if n := ind.Name(); n != "MassIndex" {
			t.Errorf("name: got %q want %q", n, "MassIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MassIndex", got)
	})
	t.Run("MatHold", func(t *testing.T) {
		ind, err := NewMatHold()
		if err != nil {
			t.Fatalf("new MatHold: %v", err)
		}
		if n := ind.Name(); n != "MatHold" {
			t.Errorf("name: got %q want %q", n, "MatHold")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MatHold", got)
	})
	t.Run("MatchingLow", func(t *testing.T) {
		ind, err := NewMatchingLow()
		if err != nil {
			t.Fatalf("new MatchingLow: %v", err)
		}
		if n := ind.Name(); n != "MatchingLow" {
			t.Errorf("name: got %q want %q", n, "MatchingLow")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MatchingLow", got)
	})
	t.Run("MaxDrawdown", func(t *testing.T) {
		ind, err := NewMaxDrawdown(14)
		if err != nil {
			t.Fatalf("new MaxDrawdown: %v", err)
		}
		if n := ind.Name(); n != "MaxDrawdown" {
			t.Errorf("name: got %q want %q", n, "MaxDrawdown")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "MaxDrawdown", got)
	})
	t.Run("McClellanOscillator", func(t *testing.T) {
		ind, err := NewMcClellanOscillator()
		if err != nil {
			t.Fatalf("new McClellanOscillator: %v", err)
		}
		if n := ind.Name(); n != "McClellanOscillator" {
			t.Errorf("name: got %q want %q", n, "McClellanOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "McClellanOscillator", got)
	})
	t.Run("McClellanSummationIndex", func(t *testing.T) {
		ind, err := NewMcClellanSummationIndex()
		if err != nil {
			t.Fatalf("new McClellanSummationIndex: %v", err)
		}
		if n := ind.Name(); n != "McClellanSummationIndex" {
			t.Errorf("name: got %q want %q", n, "McClellanSummationIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "McClellanSummationIndex", got)
	})
	t.Run("McGinleyDynamic", func(t *testing.T) {
		ind, err := NewMcGinleyDynamic(14)
		if err != nil {
			t.Fatalf("new McGinleyDynamic: %v", err)
		}
		if n := ind.Name(); n != "McGinleyDynamic" {
			t.Errorf("name: got %q want %q", n, "McGinleyDynamic")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "McGinleyDynamic", got)
	})
	t.Run("MedianAbsoluteDeviation", func(t *testing.T) {
		ind, err := NewMedianAbsoluteDeviation(14)
		if err != nil {
			t.Fatalf("new MedianAbsoluteDeviation: %v", err)
		}
		if n := ind.Name(); n != "MedianAbsoluteDeviation" {
			t.Errorf("name: got %q want %q", n, "MedianAbsoluteDeviation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "MedianAbsoluteDeviation", got)
	})
	t.Run("MedianChannel", func(t *testing.T) {
		ind, err := NewMedianChannel(14, 2.0)
		if err != nil {
			t.Fatalf("new MedianChannel: %v", err)
		}
		if n := ind.Name(); n != "MedianChannel" {
			t.Errorf("name: got %q want %q", n, "MedianChannel")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "MedianChannel", got)
	})
	t.Run("MedianMa", func(t *testing.T) {
		ind, err := NewMedianMa(14)
		if err != nil {
			t.Fatalf("new MedianMa: %v", err)
		}
		if n := ind.Name(); n != "MedianMA" {
			t.Errorf("name: got %q want %q", n, "MedianMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "MedianMa", got)
	})
	t.Run("MedianPrice", func(t *testing.T) {
		ind, err := NewMedianPrice()
		if err != nil {
			t.Fatalf("new MedianPrice: %v", err)
		}
		if n := ind.Name(); n != "MedianPrice" {
			t.Errorf("name: got %q want %q", n, "MedianPrice")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MedianPrice", got)
	})
	t.Run("Mfi", func(t *testing.T) {
		ind, err := NewMfi(14)
		if err != nil {
			t.Fatalf("new Mfi: %v", err)
		}
		if n := ind.Name(); n != "MFI" {
			t.Errorf("name: got %q want %q", n, "MFI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Mfi", got)
	})
	t.Run("Microprice", func(t *testing.T) {
		ind, err := NewMicroprice()
		if err != nil {
			t.Fatalf("new Microprice: %v", err)
		}
		if n := ind.Name(); n != "Microprice" {
			t.Errorf("name: got %q want %q", n, "Microprice")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bp, bs, ap, as_ := obLists(r)
			got[i] = []float64{ind.Update(bp, bs, ap, as_)}
		}
		compareGolden(t, "Microprice", got)
	})
	t.Run("MidPoint", func(t *testing.T) {
		ind, err := NewMidPoint(14)
		if err != nil {
			t.Fatalf("new MidPoint: %v", err)
		}
		if n := ind.Name(); n != "MIDPOINT" {
			t.Errorf("name: got %q want %q", n, "MIDPOINT")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "MidPoint", got)
	})
	t.Run("MidPrice", func(t *testing.T) {
		ind, err := NewMidPrice(14)
		if err != nil {
			t.Fatalf("new MidPrice: %v", err)
		}
		if n := ind.Name(); n != "MIDPRICE" {
			t.Errorf("name: got %q want %q", n, "MIDPRICE")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MidPrice", got)
	})
	t.Run("MinusDi", func(t *testing.T) {
		ind, err := NewMinusDi(14)
		if err != nil {
			t.Fatalf("new MinusDi: %v", err)
		}
		if n := ind.Name(); n != "MINUS_DI" {
			t.Errorf("name: got %q want %q", n, "MINUS_DI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MinusDi", got)
	})
	t.Run("MinusDm", func(t *testing.T) {
		ind, err := NewMinusDm(14)
		if err != nil {
			t.Fatalf("new MinusDm: %v", err)
		}
		if n := ind.Name(); n != "MINUS_DM" {
			t.Errorf("name: got %q want %q", n, "MINUS_DM")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MinusDm", got)
	})
	t.Run("ModifiedMaStop", func(t *testing.T) {
		ind, err := NewModifiedMaStop(14)
		if err != nil {
			t.Fatalf("new ModifiedMaStop: %v", err)
		}
		if n := ind.Name(); n != "ModifiedMaStop" {
			t.Errorf("name: got %q want %q", n, "ModifiedMaStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "ModifiedMaStop", got)
	})
	t.Run("Mom", func(t *testing.T) {
		ind, err := NewMom(14)
		if err != nil {
			t.Fatalf("new Mom: %v", err)
		}
		if n := ind.Name(); n != "MOM" {
			t.Errorf("name: got %q want %q", n, "MOM")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Mom", got)
	})
	t.Run("MorningDojiStar", func(t *testing.T) {
		ind, err := NewMorningDojiStar()
		if err != nil {
			t.Fatalf("new MorningDojiStar: %v", err)
		}
		if n := ind.Name(); n != "MorningDojiStar" {
			t.Errorf("name: got %q want %q", n, "MorningDojiStar")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MorningDojiStar", got)
	})
	t.Run("MorningEveningStar", func(t *testing.T) {
		ind, err := NewMorningEveningStar()
		if err != nil {
			t.Fatalf("new MorningEveningStar: %v", err)
		}
		if n := ind.Name(); n != "MorningEveningStar" {
			t.Errorf("name: got %q want %q", n, "MorningEveningStar")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "MorningEveningStar", got)
	})
	t.Run("MurreyMathLines", func(t *testing.T) {
		ind, err := NewMurreyMathLines(14)
		if err != nil {
			t.Fatalf("new MurreyMathLines: %v", err)
		}
		if n := ind.Name(); n != "MurreyMathLines" {
			t.Errorf("name: got %q want %q", n, "MurreyMathLines")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 9)
		}
		compareGolden(t, "MurreyMathLines", got)
	})
	t.Run("NakedPoc", func(t *testing.T) {
		ind, err := NewNakedPoc(3, 7)
		if err != nil {
			t.Fatalf("new NakedPoc: %v", err)
		}
		if n := ind.Name(); n != "NakedPoc" {
			t.Errorf("name: got %q want %q", n, "NakedPoc")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "NakedPoc", got)
	})
	t.Run("Natr", func(t *testing.T) {
		ind, err := NewNatr(14)
		if err != nil {
			t.Fatalf("new Natr: %v", err)
		}
		if n := ind.Name(); n != "NATR" {
			t.Errorf("name: got %q want %q", n, "NATR")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Natr", got)
	})
	t.Run("NewHighsNewLows", func(t *testing.T) {
		ind, err := NewNewHighsNewLows()
		if err != nil {
			t.Fatalf("new NewHighsNewLows: %v", err)
		}
		if n := ind.Name(); n != "NewHighsNewLows" {
			t.Errorf("name: got %q want %q", n, "NewHighsNewLows")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "NewHighsNewLows", got)
	})
	t.Run("NewPriceLines", func(t *testing.T) {
		ind, err := NewNewPriceLines(14)
		if err != nil {
			t.Fatalf("new NewPriceLines: %v", err)
		}
		if n := ind.Name(); n != "NewPriceLines" {
			t.Errorf("name: got %q want %q", n, "NewPriceLines")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "NewPriceLines", got)
	})
	t.Run("Nrtr", func(t *testing.T) {
		ind, err := NewNrtr(2.0)
		if err != nil {
			t.Fatalf("new Nrtr: %v", err)
		}
		if n := ind.Name(); n != "Nrtr" {
			t.Errorf("name: got %q want %q", n, "Nrtr")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Nrtr", got)
	})
	t.Run("Nvi", func(t *testing.T) {
		ind, err := NewNvi()
		if err != nil {
			t.Fatalf("new Nvi: %v", err)
		}
		if n := ind.Name(); n != "NVI" {
			t.Errorf("name: got %q want %q", n, "NVI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Nvi", got)
	})
	t.Run("OIPriceDivergence", func(t *testing.T) {
		ind, err := NewOIPriceDivergence(20)
		if err != nil {
			t.Fatalf("new OIPriceDivergence: %v", err)
		}
		if n := ind.Name(); n != "OIPriceDivergence" {
			t.Errorf("name: got %q want %q", n, "OIPriceDivergence")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "OIPriceDivergence", got)
	})
	t.Run("OIWeighted", func(t *testing.T) {
		ind, err := NewOIWeighted()
		if err != nil {
			t.Fatalf("new OIWeighted: %v", err)
		}
		if n := ind.Name(); n != "OIWeighted" {
			t.Errorf("name: got %q want %q", n, "OIWeighted")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "OIWeighted", got)
	})
	t.Run("Obv", func(t *testing.T) {
		ind, err := NewObv()
		if err != nil {
			t.Fatalf("new Obv: %v", err)
		}
		if n := ind.Name(); n != "OBV" {
			t.Errorf("name: got %q want %q", n, "OBV")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Obv", got)
	})
	t.Run("OiToVolumeRatio", func(t *testing.T) {
		ind, err := NewOiToVolumeRatio()
		if err != nil {
			t.Fatalf("new OiToVolumeRatio: %v", err)
		}
		if n := ind.Name(); n != "OiToVolumeRatio" {
			t.Errorf("name: got %q want %q", n, "OiToVolumeRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "OiToVolumeRatio", got)
	})
	t.Run("OmegaRatio", func(t *testing.T) {
		ind, err := NewOmegaRatio(14, 2.0)
		if err != nil {
			t.Fatalf("new OmegaRatio: %v", err)
		}
		if n := ind.Name(); n != "OmegaRatio" {
			t.Errorf("name: got %q want %q", n, "OmegaRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "OmegaRatio", got)
	})
	t.Run("OnNeck", func(t *testing.T) {
		ind, err := NewOnNeck()
		if err != nil {
			t.Fatalf("new OnNeck: %v", err)
		}
		if n := ind.Name(); n != "OnNeck" {
			t.Errorf("name: got %q want %q", n, "OnNeck")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "OnNeck", got)
	})
	t.Run("OpenInterestDelta", func(t *testing.T) {
		ind, err := NewOpenInterestDelta()
		if err != nil {
			t.Fatalf("new OpenInterestDelta: %v", err)
		}
		if n := ind.Name(); n != "OpenInterestDelta" {
			t.Errorf("name: got %q want %q", n, "OpenInterestDelta")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "OpenInterestDelta", got)
	})
	t.Run("OpenInterestMomentum", func(t *testing.T) {
		ind, err := NewOpenInterestMomentum(10)
		if err != nil {
			t.Fatalf("new OpenInterestMomentum: %v", err)
		}
		if n := ind.Name(); n != "OpenInterestMomentum" {
			t.Errorf("name: got %q want %q", n, "OpenInterestMomentum")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "OpenInterestMomentum", got)
	})
	t.Run("OpeningMarubozu", func(t *testing.T) {
		ind, err := NewOpeningMarubozu()
		if err != nil {
			t.Fatalf("new OpeningMarubozu: %v", err)
		}
		if n := ind.Name(); n != "OpeningMarubozu" {
			t.Errorf("name: got %q want %q", n, "OpeningMarubozu")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "OpeningMarubozu", got)
	})
	t.Run("OpeningRange", func(t *testing.T) {
		ind, err := NewOpeningRange(14)
		if err != nil {
			t.Fatalf("new OpeningRange: %v", err)
		}
		if n := ind.Name(); n != "OpeningRange" {
			t.Errorf("name: got %q want %q", n, "OpeningRange")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "OpeningRange", got)
	})
	t.Run("OrderBookImbalanceFull", func(t *testing.T) {
		ind, err := NewOrderBookImbalanceFull()
		if err != nil {
			t.Fatalf("new OrderBookImbalanceFull: %v", err)
		}
		if n := ind.Name(); n != "OrderBookImbalanceFull" {
			t.Errorf("name: got %q want %q", n, "OrderBookImbalanceFull")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bp, bs, ap, as_ := obLists(r)
			got[i] = []float64{ind.Update(bp, bs, ap, as_)}
		}
		compareGolden(t, "OrderBookImbalanceFull", got)
	})
	t.Run("OrderBookImbalanceTop1", func(t *testing.T) {
		ind, err := NewOrderBookImbalanceTop1()
		if err != nil {
			t.Fatalf("new OrderBookImbalanceTop1: %v", err)
		}
		if n := ind.Name(); n != "OrderBookImbalanceTop1" {
			t.Errorf("name: got %q want %q", n, "OrderBookImbalanceTop1")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bp, bs, ap, as_ := obLists(r)
			got[i] = []float64{ind.Update(bp, bs, ap, as_)}
		}
		compareGolden(t, "OrderBookImbalanceTop1", got)
	})
	t.Run("OrderBookImbalanceTopN", func(t *testing.T) {
		ind, err := NewOrderBookImbalanceTopN(5)
		if err != nil {
			t.Fatalf("new OrderBookImbalanceTopN: %v", err)
		}
		if n := ind.Name(); n != "OrderBookImbalanceTopN" {
			t.Errorf("name: got %q want %q", n, "OrderBookImbalanceTopN")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bp, bs, ap, as_ := obLists(r)
			got[i] = []float64{ind.Update(bp, bs, ap, as_)}
		}
		compareGolden(t, "OrderBookImbalanceTopN", got)
	})
	t.Run("OrderFlowImbalance", func(t *testing.T) {
		ind, err := NewOrderFlowImbalance(20)
		if err != nil {
			t.Fatalf("new OrderFlowImbalance: %v", err)
		}
		if n := ind.Name(); n != "OrderFlowImbalance" {
			t.Errorf("name: got %q want %q", n, "OrderFlowImbalance")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bp, bs, ap, as_ := obLists(r)
			got[i] = []float64{ind.Update(bp, bs, ap, as_)}
		}
		compareGolden(t, "OrderFlowImbalance", got)
	})
	t.Run("OuHalfLife", func(t *testing.T) {
		ind, err := NewOuHalfLife(14)
		if err != nil {
			t.Fatalf("new OuHalfLife: %v", err)
		}
		if n := ind.Name(); n != "OuHalfLife" {
			t.Errorf("name: got %q want %q", n, "OuHalfLife")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "OuHalfLife", got)
	})
	t.Run("OvernightGap", func(t *testing.T) {
		ind, err := NewOvernightGap(0)
		if err != nil {
			t.Fatalf("new OvernightGap: %v", err)
		}
		if n := ind.Name(); n != "OvernightGap" {
			t.Errorf("name: got %q want %q", n, "OvernightGap")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "OvernightGap", got)
	})
	t.Run("OvernightIntradayReturn", func(t *testing.T) {
		ind, err := NewOvernightIntradayReturn(14)
		if err != nil {
			t.Fatalf("new OvernightIntradayReturn: %v", err)
		}
		if n := ind.Name(); n != "OvernightIntradayReturn" {
			t.Errorf("name: got %q want %q", n, "OvernightIntradayReturn")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "OvernightIntradayReturn", got)
	})
	t.Run("PainIndex", func(t *testing.T) {
		ind, err := NewPainIndex(14)
		if err != nil {
			t.Fatalf("new PainIndex: %v", err)
		}
		if n := ind.Name(); n != "PainIndex" {
			t.Errorf("name: got %q want %q", n, "PainIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "PainIndex", got)
	})
	t.Run("PairSpreadZScore", func(t *testing.T) {
		ind, err := NewPairSpreadZScore(20, 20)
		if err != nil {
			t.Fatalf("new PairSpreadZScore: %v", err)
		}
		if n := ind.Name(); n != "PairSpreadZScore" {
			t.Errorf("name: got %q want %q", n, "PairSpreadZScore")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "PairSpreadZScore", got)
	})
	t.Run("PairwiseBeta", func(t *testing.T) {
		ind, err := NewPairwiseBeta(14)
		if err != nil {
			t.Fatalf("new PairwiseBeta: %v", err)
		}
		if n := ind.Name(); n != "PairwiseBeta" {
			t.Errorf("name: got %q want %q", n, "PairwiseBeta")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "PairwiseBeta", got)
	})
	t.Run("ParkinsonVolatility", func(t *testing.T) {
		ind, err := NewParkinsonVolatility(20, 252)
		if err != nil {
			t.Fatalf("new ParkinsonVolatility: %v", err)
		}
		if n := ind.Name(); n != "ParkinsonVolatility" {
			t.Errorf("name: got %q want %q", n, "ParkinsonVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ParkinsonVolatility", got)
	})
	t.Run("PearsonCorrelation", func(t *testing.T) {
		ind, err := NewPearsonCorrelation(14)
		if err != nil {
			t.Fatalf("new PearsonCorrelation: %v", err)
		}
		if n := ind.Name(); n != "PearsonCorrelation" {
			t.Errorf("name: got %q want %q", n, "PearsonCorrelation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "PearsonCorrelation", got)
	})
	t.Run("PercentAboveMa", func(t *testing.T) {
		ind, err := NewPercentAboveMa()
		if err != nil {
			t.Fatalf("new PercentAboveMa: %v", err)
		}
		if n := ind.Name(); n != "PercentAboveMa" {
			t.Errorf("name: got %q want %q", n, "PercentAboveMa")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "PercentAboveMa", got)
	})
	t.Run("PercentB", func(t *testing.T) {
		ind, err := NewPercentB(14, 2.0)
		if err != nil {
			t.Fatalf("new PercentB: %v", err)
		}
		if n := ind.Name(); n != "PercentB" {
			t.Errorf("name: got %q want %q", n, "PercentB")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "PercentB", got)
	})
	t.Run("PercentageTrailingStop", func(t *testing.T) {
		ind, err := NewPercentageTrailingStop(2.0)
		if err != nil {
			t.Fatalf("new PercentageTrailingStop: %v", err)
		}
		if n := ind.Name(); n != "PercentageTrailingStop" {
			t.Errorf("name: got %q want %q", n, "PercentageTrailingStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "PercentageTrailingStop", got)
	})
	t.Run("PerpetualPremiumIndex", func(t *testing.T) {
		ind, err := NewPerpetualPremiumIndex()
		if err != nil {
			t.Fatalf("new PerpetualPremiumIndex: %v", err)
		}
		if n := ind.Name(); n != "PerpetualPremiumIndex" {
			t.Errorf("name: got %q want %q", n, "PerpetualPremiumIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "PerpetualPremiumIndex", got)
	})
	t.Run("Pgo", func(t *testing.T) {
		ind, err := NewPgo(14)
		if err != nil {
			t.Fatalf("new Pgo: %v", err)
		}
		if n := ind.Name(); n != "PGO" {
			t.Errorf("name: got %q want %q", n, "PGO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Pgo", got)
	})
	t.Run("PiercingDarkCloud", func(t *testing.T) {
		ind, err := NewPiercingDarkCloud()
		if err != nil {
			t.Fatalf("new PiercingDarkCloud: %v", err)
		}
		if n := ind.Name(); n != "PiercingDarkCloud" {
			t.Errorf("name: got %q want %q", n, "PiercingDarkCloud")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "PiercingDarkCloud", got)
	})
	t.Run("Pin", func(t *testing.T) {
		ind, err := NewPin(20)
		if err != nil {
			t.Fatalf("new Pin: %v", err)
		}
		if n := ind.Name(); n != "PIN" {
			t.Errorf("name: got %q want %q", n, "PIN")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i))}
		}
		compareGolden(t, "Pin", got)
	})
	t.Run("PivotReversal", func(t *testing.T) {
		ind, err := NewPivotReversal(3, 7)
		if err != nil {
			t.Fatalf("new PivotReversal: %v", err)
		}
		if n := ind.Name(); n != "PivotReversal" {
			t.Errorf("name: got %q want %q", n, "PivotReversal")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "PivotReversal", got)
	})
	t.Run("PlusDi", func(t *testing.T) {
		ind, err := NewPlusDi(14)
		if err != nil {
			t.Fatalf("new PlusDi: %v", err)
		}
		if n := ind.Name(); n != "PLUS_DI" {
			t.Errorf("name: got %q want %q", n, "PLUS_DI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "PlusDi", got)
	})
	t.Run("PlusDm", func(t *testing.T) {
		ind, err := NewPlusDm(14)
		if err != nil {
			t.Fatalf("new PlusDm: %v", err)
		}
		if n := ind.Name(); n != "PLUS_DM" {
			t.Errorf("name: got %q want %q", n, "PLUS_DM")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "PlusDm", got)
	})
	t.Run("Pmo", func(t *testing.T) {
		ind, err := NewPmo(3, 7)
		if err != nil {
			t.Fatalf("new Pmo: %v", err)
		}
		if n := ind.Name(); n != "PMO" {
			t.Errorf("name: got %q want %q", n, "PMO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Pmo", got)
	})
	t.Run("PointAndFigureBars", func(t *testing.T) {
		ind, err := NewPointAndFigureBars(2.0, 3)
		if err != nil {
			t.Fatalf("new PointAndFigureBars: %v", err)
		}
		if n := ind.Name(); n != "PointAndFigureBars" {
			t.Errorf("name: got %q want %q", n, "PointAndFigureBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[3], r[3], r[3], r[3], 1.0, 0))
		}
		compareGolden(t, "PointAndFigureBars", got)
	})
	t.Run("PolarizedFractalEfficiency", func(t *testing.T) {
		ind, err := NewPolarizedFractalEfficiency(10, 5)
		if err != nil {
			t.Fatalf("new PolarizedFractalEfficiency: %v", err)
		}
		if n := ind.Name(); n != "PolarizedFractalEfficiency" {
			t.Errorf("name: got %q want %q", n, "PolarizedFractalEfficiency")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "PolarizedFractalEfficiency", got)
	})
	t.Run("Ppo", func(t *testing.T) {
		ind, err := NewPpo(3, 7)
		if err != nil {
			t.Fatalf("new Ppo: %v", err)
		}
		if n := ind.Name(); n != "PPO" {
			t.Errorf("name: got %q want %q", n, "PPO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Ppo", got)
	})
	t.Run("PpoHistogram", func(t *testing.T) {
		ind, err := NewPpoHistogram(3, 7, 14)
		if err != nil {
			t.Fatalf("new PpoHistogram: %v", err)
		}
		if n := ind.Name(); n != "PpoHistogram" {
			t.Errorf("name: got %q want %q", n, "PpoHistogram")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "PpoHistogram", got)
	})
	t.Run("ProfileShape", func(t *testing.T) {
		ind, err := NewProfileShape(3, 7)
		if err != nil {
			t.Fatalf("new ProfileShape: %v", err)
		}
		if n := ind.Name(); n != "ProfileShape" {
			t.Errorf("name: got %q want %q", n, "ProfileShape")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ProfileShape", got)
	})
	t.Run("ProfitFactor", func(t *testing.T) {
		ind, err := NewProfitFactor(14)
		if err != nil {
			t.Fatalf("new ProfitFactor: %v", err)
		}
		if n := ind.Name(); n != "ProfitFactor" {
			t.Errorf("name: got %q want %q", n, "ProfitFactor")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "ProfitFactor", got)
	})
	t.Run("ProjectionBands", func(t *testing.T) {
		ind, err := NewProjectionBands(14)
		if err != nil {
			t.Fatalf("new ProjectionBands: %v", err)
		}
		if n := ind.Name(); n != "ProjectionBands" {
			t.Errorf("name: got %q want %q", n, "ProjectionBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "ProjectionBands", got)
	})
	t.Run("ProjectionOscillator", func(t *testing.T) {
		ind, err := NewProjectionOscillator(14)
		if err != nil {
			t.Fatalf("new ProjectionOscillator: %v", err)
		}
		if n := ind.Name(); n != "ProjectionOscillator" {
			t.Errorf("name: got %q want %q", n, "ProjectionOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ProjectionOscillator", got)
	})
	t.Run("Psar", func(t *testing.T) {
		ind, err := NewPsar(0.02, 0.02, 0.2)
		if err != nil {
			t.Fatalf("new Psar: %v", err)
		}
		if n := ind.Name(); n != "PSAR" {
			t.Errorf("name: got %q want %q", n, "PSAR")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Psar", got)
	})
	t.Run("Pvi", func(t *testing.T) {
		ind, err := NewPvi()
		if err != nil {
			t.Fatalf("new Pvi: %v", err)
		}
		if n := ind.Name(); n != "PVI" {
			t.Errorf("name: got %q want %q", n, "PVI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Pvi", got)
	})
	t.Run("Qqe", func(t *testing.T) {
		ind, err := NewQqe(3, 7, 2.0)
		if err != nil {
			t.Fatalf("new Qqe: %v", err)
		}
		if n := ind.Name(); n != "QQE" {
			t.Errorf("name: got %q want %q", n, "QQE")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Qqe", got)
	})
	t.Run("Qstick", func(t *testing.T) {
		ind, err := NewQstick(14)
		if err != nil {
			t.Fatalf("new Qstick: %v", err)
		}
		if n := ind.Name(); n != "Qstick" {
			t.Errorf("name: got %q want %q", n, "Qstick")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Qstick", got)
	})
	t.Run("QuartileBands", func(t *testing.T) {
		ind, err := NewQuartileBands(14)
		if err != nil {
			t.Fatalf("new QuartileBands: %v", err)
		}
		if n := ind.Name(); n != "QuartileBands" {
			t.Errorf("name: got %q want %q", n, "QuartileBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "QuartileBands", got)
	})
	t.Run("QuotedSpread", func(t *testing.T) {
		ind, err := NewQuotedSpread()
		if err != nil {
			t.Fatalf("new QuotedSpread: %v", err)
		}
		if n := ind.Name(); n != "QuotedSpread" {
			t.Errorf("name: got %q want %q", n, "QuotedSpread")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bp, bs, ap, as_ := obLists(r)
			got[i] = []float64{ind.Update(bp, bs, ap, as_)}
		}
		compareGolden(t, "QuotedSpread", got)
	})
	t.Run("RSquared", func(t *testing.T) {
		ind, err := NewRSquared(14)
		if err != nil {
			t.Fatalf("new RSquared: %v", err)
		}
		if n := ind.Name(); n != "RSquared" {
			t.Errorf("name: got %q want %q", n, "RSquared")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RSquared", got)
	})
	t.Run("RangeBars", func(t *testing.T) {
		ind, err := NewRangeBars(2.0)
		if err != nil {
			t.Fatalf("new RangeBars: %v", err)
		}
		if n := ind.Name(); n != "RangeBars" {
			t.Errorf("name: got %q want %q", n, "RangeBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[3], r[3], r[3], r[3], 1.0, 0))
		}
		compareGolden(t, "RangeBars", got)
	})
	t.Run("RealizedSpread", func(t *testing.T) {
		ind, err := NewRealizedSpread(20)
		if err != nil {
			t.Fatalf("new RealizedSpread: %v", err)
		}
		if n := ind.Name(); n != "RealizedSpread" {
			t.Errorf("name: got %q want %q", n, "RealizedSpread")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i), (r[1]+r[2])/2)}
		}
		compareGolden(t, "RealizedSpread", got)
	})
	t.Run("RealizedVolatility", func(t *testing.T) {
		ind, err := NewRealizedVolatility(14)
		if err != nil {
			t.Fatalf("new RealizedVolatility: %v", err)
		}
		if n := ind.Name(); n != "RealizedVolatility" {
			t.Errorf("name: got %q want %q", n, "RealizedVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RealizedVolatility", got)
	})
	t.Run("RecoveryFactor", func(t *testing.T) {
		ind, err := NewRecoveryFactor()
		if err != nil {
			t.Fatalf("new RecoveryFactor: %v", err)
		}
		if n := ind.Name(); n != "RecoveryFactor" {
			t.Errorf("name: got %q want %q", n, "RecoveryFactor")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RecoveryFactor", got)
	})
	t.Run("RectangleRange", func(t *testing.T) {
		ind, err := NewRectangleRange()
		if err != nil {
			t.Fatalf("new RectangleRange: %v", err)
		}
		if n := ind.Name(); n != "RectangleRange" {
			t.Errorf("name: got %q want %q", n, "RectangleRange")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "RectangleRange", got)
	})
	t.Run("Reflex", func(t *testing.T) {
		ind, err := NewReflex(14)
		if err != nil {
			t.Fatalf("new Reflex: %v", err)
		}
		if n := ind.Name(); n != "Reflex" {
			t.Errorf("name: got %q want %q", n, "Reflex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Reflex", got)
	})
	t.Run("RegimeLabel", func(t *testing.T) {
		ind, err := NewRegimeLabel(3, 7)
		if err != nil {
			t.Fatalf("new RegimeLabel: %v", err)
		}
		if n := ind.Name(); n != "RegimeLabel" {
			t.Errorf("name: got %q want %q", n, "RegimeLabel")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RegimeLabel", got)
	})
	t.Run("RelativeStrengthAB", func(t *testing.T) {
		ind, err := NewRelativeStrengthAB(14, 14)
		if err != nil {
			t.Fatalf("new RelativeStrengthAB: %v", err)
		}
		if n := ind.Name(); n != "RelativeStrengthAB" {
			t.Errorf("name: got %q want %q", n, "RelativeStrengthAB")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3], r[0])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "RelativeStrengthAB", got)
	})
	t.Run("RenkoBars", func(t *testing.T) {
		ind, err := NewRenkoBars(2.0)
		if err != nil {
			t.Fatalf("new RenkoBars: %v", err)
		}
		if n := ind.Name(); n != "RenkoBars" {
			t.Errorf("name: got %q want %q", n, "RenkoBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[3], r[3], r[3], r[3], 1.0, 0))
		}
		compareGolden(t, "RenkoBars", got)
	})
	t.Run("RenkoTrailingStop", func(t *testing.T) {
		ind, err := NewRenkoTrailingStop(2.0)
		if err != nil {
			t.Fatalf("new RenkoTrailingStop: %v", err)
		}
		if n := ind.Name(); n != "RenkoTrailingStop" {
			t.Errorf("name: got %q want %q", n, "RenkoTrailingStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RenkoTrailingStop", got)
	})
	t.Run("RickshawMan", func(t *testing.T) {
		ind, err := NewRickshawMan()
		if err != nil {
			t.Fatalf("new RickshawMan: %v", err)
		}
		if n := ind.Name(); n != "RickshawMan" {
			t.Errorf("name: got %q want %q", n, "RickshawMan")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "RickshawMan", got)
	})
	t.Run("RisingThreeMethods", func(t *testing.T) {
		ind, err := NewRisingThreeMethods()
		if err != nil {
			t.Fatalf("new RisingThreeMethods: %v", err)
		}
		if n := ind.Name(); n != "RisingThreeMethods" {
			t.Errorf("name: got %q want %q", n, "RisingThreeMethods")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "RisingThreeMethods", got)
	})
	t.Run("Rmi", func(t *testing.T) {
		ind, err := NewRmi(3, 7)
		if err != nil {
			t.Fatalf("new Rmi: %v", err)
		}
		if n := ind.Name(); n != "RMI" {
			t.Errorf("name: got %q want %q", n, "RMI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Rmi", got)
	})
	t.Run("Roc", func(t *testing.T) {
		ind, err := NewRoc(14)
		if err != nil {
			t.Fatalf("new Roc: %v", err)
		}
		if n := ind.Name(); n != "ROC" {
			t.Errorf("name: got %q want %q", n, "ROC")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Roc", got)
	})
	t.Run("Rocp", func(t *testing.T) {
		ind, err := NewRocp(14)
		if err != nil {
			t.Fatalf("new Rocp: %v", err)
		}
		if n := ind.Name(); n != "ROCP" {
			t.Errorf("name: got %q want %q", n, "ROCP")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Rocp", got)
	})
	t.Run("Rocr", func(t *testing.T) {
		ind, err := NewRocr(14)
		if err != nil {
			t.Fatalf("new Rocr: %v", err)
		}
		if n := ind.Name(); n != "ROCR" {
			t.Errorf("name: got %q want %q", n, "ROCR")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Rocr", got)
	})
	t.Run("Rocr100", func(t *testing.T) {
		ind, err := NewRocr100(14)
		if err != nil {
			t.Fatalf("new Rocr100: %v", err)
		}
		if n := ind.Name(); n != "ROCR100" {
			t.Errorf("name: got %q want %q", n, "ROCR100")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Rocr100", got)
	})
	t.Run("RogersSatchellVolatility", func(t *testing.T) {
		ind, err := NewRogersSatchellVolatility(20, 252)
		if err != nil {
			t.Fatalf("new RogersSatchellVolatility: %v", err)
		}
		if n := ind.Name(); n != "RogersSatchellVolatility" {
			t.Errorf("name: got %q want %q", n, "RogersSatchellVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "RogersSatchellVolatility", got)
	})
	t.Run("RollMeasure", func(t *testing.T) {
		ind, err := NewRollMeasure(20)
		if err != nil {
			t.Fatalf("new RollMeasure: %v", err)
		}
		if n := ind.Name(); n != "RollMeasure" {
			t.Errorf("name: got %q want %q", n, "RollMeasure")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i))}
		}
		compareGolden(t, "RollMeasure", got)
	})
	t.Run("RollingCorrelation", func(t *testing.T) {
		ind, err := NewRollingCorrelation(14)
		if err != nil {
			t.Fatalf("new RollingCorrelation: %v", err)
		}
		if n := ind.Name(); n != "RollingCorrelation" {
			t.Errorf("name: got %q want %q", n, "RollingCorrelation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "RollingCorrelation", got)
	})
	t.Run("RollingCovariance", func(t *testing.T) {
		ind, err := NewRollingCovariance(14)
		if err != nil {
			t.Fatalf("new RollingCovariance: %v", err)
		}
		if n := ind.Name(); n != "RollingCovariance" {
			t.Errorf("name: got %q want %q", n, "RollingCovariance")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "RollingCovariance", got)
	})
	t.Run("RollingIqr", func(t *testing.T) {
		ind, err := NewRollingIqr(14)
		if err != nil {
			t.Fatalf("new RollingIqr: %v", err)
		}
		if n := ind.Name(); n != "RollingIqr" {
			t.Errorf("name: got %q want %q", n, "RollingIqr")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RollingIqr", got)
	})
	t.Run("RollingMinMaxScaler", func(t *testing.T) {
		ind, err := NewRollingMinMaxScaler(14)
		if err != nil {
			t.Fatalf("new RollingMinMaxScaler: %v", err)
		}
		if n := ind.Name(); n != "RollingMinMaxScaler" {
			t.Errorf("name: got %q want %q", n, "RollingMinMaxScaler")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RollingMinMaxScaler", got)
	})
	t.Run("RollingPercentileRank", func(t *testing.T) {
		ind, err := NewRollingPercentileRank(14)
		if err != nil {
			t.Fatalf("new RollingPercentileRank: %v", err)
		}
		if n := ind.Name(); n != "RollingPercentileRank" {
			t.Errorf("name: got %q want %q", n, "RollingPercentileRank")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RollingPercentileRank", got)
	})
	t.Run("RollingQuantile", func(t *testing.T) {
		ind, err := NewRollingQuantile(20, 0.5)
		if err != nil {
			t.Fatalf("new RollingQuantile: %v", err)
		}
		if n := ind.Name(); n != "RollingQuantile" {
			t.Errorf("name: got %q want %q", n, "RollingQuantile")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RollingQuantile", got)
	})
	t.Run("RollingVwap", func(t *testing.T) {
		ind, err := NewRollingVwap(14)
		if err != nil {
			t.Fatalf("new RollingVwap: %v", err)
		}
		if n := ind.Name(); n != "RollingVWAP" {
			t.Errorf("name: got %q want %q", n, "RollingVWAP")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "RollingVwap", got)
	})
	t.Run("RoofingFilter", func(t *testing.T) {
		ind, err := NewRoofingFilter(3, 7)
		if err != nil {
			t.Fatalf("new RoofingFilter: %v", err)
		}
		if n := ind.Name(); n != "RoofingFilter" {
			t.Errorf("name: got %q want %q", n, "RoofingFilter")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RoofingFilter", got)
	})
	t.Run("Rsi", func(t *testing.T) {
		ind, err := NewRsi(14)
		if err != nil {
			t.Fatalf("new Rsi: %v", err)
		}
		if n := ind.Name(); n != "RSI" {
			t.Errorf("name: got %q want %q", n, "RSI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Rsi", got)
	})
	t.Run("Rsx", func(t *testing.T) {
		ind, err := NewRsx(14)
		if err != nil {
			t.Fatalf("new Rsx: %v", err)
		}
		if n := ind.Name(); n != "RSX" {
			t.Errorf("name: got %q want %q", n, "RSX")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Rsx", got)
	})
	t.Run("RunBars", func(t *testing.T) {
		ind, err := NewRunBars(3)
		if err != nil {
			t.Fatalf("new RunBars: %v", err)
		}
		if n := ind.Name(); n != "RunBars" {
			t.Errorf("name: got %q want %q", n, "RunBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[0], r[1], r[2], r[3], 1.0, 0))
		}
		compareGolden(t, "RunBars", got)
	})
	t.Run("Rvi", func(t *testing.T) {
		ind, err := NewRvi(14)
		if err != nil {
			t.Fatalf("new Rvi: %v", err)
		}
		if n := ind.Name(); n != "RVI" {
			t.Errorf("name: got %q want %q", n, "RVI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Rvi", got)
	})
	t.Run("RviVolatility", func(t *testing.T) {
		ind, err := NewRviVolatility(14)
		if err != nil {
			t.Fatalf("new RviVolatility: %v", err)
		}
		if n := ind.Name(); n != "RVIVolatility" {
			t.Errorf("name: got %q want %q", n, "RVIVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "RviVolatility", got)
	})
	t.Run("Rwi", func(t *testing.T) {
		ind, err := NewRwi(14)
		if err != nil {
			t.Fatalf("new Rwi: %v", err)
		}
		if n := ind.Name(); n != "RWI" {
			t.Errorf("name: got %q want %q", n, "RWI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Rwi", got)
	})
	t.Run("SampleEntropy", func(t *testing.T) {
		ind, err := NewSampleEntropy(20, 2, 0.2)
		if err != nil {
			t.Fatalf("new SampleEntropy: %v", err)
		}
		if n := ind.Name(); n != "SampleEntropy" {
			t.Errorf("name: got %q want %q", n, "SampleEntropy")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "SampleEntropy", got)
	})
	t.Run("SarExt", func(t *testing.T) {
		ind, err := NewSarExt(2.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5)
		if err != nil {
			t.Fatalf("new SarExt: %v", err)
		}
		if n := ind.Name(); n != "SAREXT" {
			t.Errorf("name: got %q want %q", n, "SAREXT")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "SarExt", got)
	})
	t.Run("SeasonalZScore", func(t *testing.T) {
		ind, err := NewSeasonalZScore(14)
		if err != nil {
			t.Fatalf("new SeasonalZScore: %v", err)
		}
		if n := ind.Name(); n != "SeasonalZScore" {
			t.Errorf("name: got %q want %q", n, "SeasonalZScore")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "SeasonalZScore", got)
	})
	t.Run("SeparatingLines", func(t *testing.T) {
		ind, err := NewSeparatingLines()
		if err != nil {
			t.Fatalf("new SeparatingLines: %v", err)
		}
		if n := ind.Name(); n != "SeparatingLines" {
			t.Errorf("name: got %q want %q", n, "SeparatingLines")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "SeparatingLines", got)
	})
	t.Run("SessionHighLow", func(t *testing.T) {
		ind, err := NewSessionHighLow(14)
		if err != nil {
			t.Fatalf("new SessionHighLow: %v", err)
		}
		if n := ind.Name(); n != "SessionHighLow" {
			t.Errorf("name: got %q want %q", n, "SessionHighLow")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "SessionHighLow", got)
	})
	t.Run("SessionRange", func(t *testing.T) {
		ind, err := NewSessionRange(14)
		if err != nil {
			t.Fatalf("new SessionRange: %v", err)
		}
		if n := ind.Name(); n != "SessionRange" {
			t.Errorf("name: got %q want %q", n, "SessionRange")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "SessionRange", got)
	})
	t.Run("SessionVwap", func(t *testing.T) {
		ind, err := NewSessionVwap(14)
		if err != nil {
			t.Fatalf("new SessionVwap: %v", err)
		}
		if n := ind.Name(); n != "SessionVwap" {
			t.Errorf("name: got %q want %q", n, "SessionVwap")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "SessionVwap", got)
	})
	t.Run("ShannonEntropy", func(t *testing.T) {
		ind, err := NewShannonEntropy(3, 7)
		if err != nil {
			t.Fatalf("new ShannonEntropy: %v", err)
		}
		if n := ind.Name(); n != "ShannonEntropy" {
			t.Errorf("name: got %q want %q", n, "ShannonEntropy")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "ShannonEntropy", got)
	})
	t.Run("Shark", func(t *testing.T) {
		ind, err := NewShark()
		if err != nil {
			t.Fatalf("new Shark: %v", err)
		}
		if n := ind.Name(); n != "Shark" {
			t.Errorf("name: got %q want %q", n, "Shark")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Shark", got)
	})
	t.Run("SharpeRatio", func(t *testing.T) {
		ind, err := NewSharpeRatio(14, 2.0)
		if err != nil {
			t.Fatalf("new SharpeRatio: %v", err)
		}
		if n := ind.Name(); n != "SharpeRatio" {
			t.Errorf("name: got %q want %q", n, "SharpeRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "SharpeRatio", got)
	})
	t.Run("ShootingStar", func(t *testing.T) {
		ind, err := NewShootingStar()
		if err != nil {
			t.Fatalf("new ShootingStar: %v", err)
		}
		if n := ind.Name(); n != "ShootingStar" {
			t.Errorf("name: got %q want %q", n, "ShootingStar")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ShootingStar", got)
	})
	t.Run("ShortLine", func(t *testing.T) {
		ind, err := NewShortLine()
		if err != nil {
			t.Fatalf("new ShortLine: %v", err)
		}
		if n := ind.Name(); n != "ShortLine" {
			t.Errorf("name: got %q want %q", n, "ShortLine")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ShortLine", got)
	})
	t.Run("SignedVolume", func(t *testing.T) {
		ind, err := NewSignedVolume()
		if err != nil {
			t.Fatalf("new SignedVolume: %v", err)
		}
		if n := ind.Name(); n != "SignedVolume" {
			t.Errorf("name: got %q want %q", n, "SignedVolume")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i))}
		}
		compareGolden(t, "SignedVolume", got)
	})
	t.Run("SineWave", func(t *testing.T) {
		ind, err := NewSineWave()
		if err != nil {
			t.Fatalf("new SineWave: %v", err)
		}
		if n := ind.Name(); n != "SineWave" {
			t.Errorf("name: got %q want %q", n, "SineWave")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "SineWave", got)
	})
	t.Run("SineWeightedMa", func(t *testing.T) {
		ind, err := NewSineWeightedMa(14)
		if err != nil {
			t.Fatalf("new SineWeightedMa: %v", err)
		}
		if n := ind.Name(); n != "SWMA" {
			t.Errorf("name: got %q want %q", n, "SWMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "SineWeightedMa", got)
	})
	t.Run("SinglePrints", func(t *testing.T) {
		ind, err := NewSinglePrints(3, 7)
		if err != nil {
			t.Fatalf("new SinglePrints: %v", err)
		}
		if n := ind.Name(); n != "SinglePrints" {
			t.Errorf("name: got %q want %q", n, "SinglePrints")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "SinglePrints", got)
	})
	t.Run("Skewness", func(t *testing.T) {
		ind, err := NewSkewness(14)
		if err != nil {
			t.Fatalf("new Skewness: %v", err)
		}
		if n := ind.Name(); n != "Skewness" {
			t.Errorf("name: got %q want %q", n, "Skewness")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Skewness", got)
	})
	t.Run("Sma", func(t *testing.T) {
		ind, err := NewSma(14)
		if err != nil {
			t.Fatalf("new Sma: %v", err)
		}
		if n := ind.Name(); n != "SMA" {
			t.Errorf("name: got %q want %q", n, "SMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Sma", got)
	})
	t.Run("Smi", func(t *testing.T) {
		ind, err := NewSmi(3, 7, 14)
		if err != nil {
			t.Fatalf("new Smi: %v", err)
		}
		if n := ind.Name(); n != "SMI" {
			t.Errorf("name: got %q want %q", n, "SMI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Smi", got)
	})
	t.Run("Smma", func(t *testing.T) {
		ind, err := NewSmma(14)
		if err != nil {
			t.Fatalf("new Smma: %v", err)
		}
		if n := ind.Name(); n != "SMMA" {
			t.Errorf("name: got %q want %q", n, "SMMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Smma", got)
	})
	t.Run("SmoothedHeikinAshi", func(t *testing.T) {
		ind, err := NewSmoothedHeikinAshi(14)
		if err != nil {
			t.Fatalf("new SmoothedHeikinAshi: %v", err)
		}
		if n := ind.Name(); n != "SmoothedHeikinAshi" {
			t.Errorf("name: got %q want %q", n, "SmoothedHeikinAshi")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 4)
		}
		compareGolden(t, "SmoothedHeikinAshi", got)
	})
	t.Run("SortinoRatio", func(t *testing.T) {
		ind, err := NewSortinoRatio(14, 2.0)
		if err != nil {
			t.Fatalf("new SortinoRatio: %v", err)
		}
		if n := ind.Name(); n != "SortinoRatio" {
			t.Errorf("name: got %q want %q", n, "SortinoRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "SortinoRatio", got)
	})
	t.Run("SpearmanCorrelation", func(t *testing.T) {
		ind, err := NewSpearmanCorrelation(14)
		if err != nil {
			t.Fatalf("new SpearmanCorrelation: %v", err)
		}
		if n := ind.Name(); n != "SpearmanCorrelation" {
			t.Errorf("name: got %q want %q", n, "SpearmanCorrelation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "SpearmanCorrelation", got)
	})
	t.Run("SpinningTop", func(t *testing.T) {
		ind, err := NewSpinningTop()
		if err != nil {
			t.Fatalf("new SpinningTop: %v", err)
		}
		if n := ind.Name(); n != "SpinningTop" {
			t.Errorf("name: got %q want %q", n, "SpinningTop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "SpinningTop", got)
	})
	t.Run("SpreadAr1Coefficient", func(t *testing.T) {
		ind, err := NewSpreadAr1Coefficient(14)
		if err != nil {
			t.Fatalf("new SpreadAr1Coefficient: %v", err)
		}
		if n := ind.Name(); n != "SpreadAr1Coefficient" {
			t.Errorf("name: got %q want %q", n, "SpreadAr1Coefficient")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "SpreadAr1Coefficient", got)
	})
	t.Run("SpreadBollingerBands", func(t *testing.T) {
		ind, err := NewSpreadBollingerBands(14, 2.0)
		if err != nil {
			t.Fatalf("new SpreadBollingerBands: %v", err)
		}
		if n := ind.Name(); n != "SpreadBollingerBands" {
			t.Errorf("name: got %q want %q", n, "SpreadBollingerBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3], r[0])
			got[i] = reflectRow(out, ok, 4)
		}
		compareGolden(t, "SpreadBollingerBands", got)
	})
	t.Run("SpreadHurst", func(t *testing.T) {
		ind, err := NewSpreadHurst(14)
		if err != nil {
			t.Fatalf("new SpreadHurst: %v", err)
		}
		if n := ind.Name(); n != "SpreadHurst" {
			t.Errorf("name: got %q want %q", n, "SpreadHurst")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "SpreadHurst", got)
	})
	t.Run("StalledPattern", func(t *testing.T) {
		ind, err := NewStalledPattern()
		if err != nil {
			t.Fatalf("new StalledPattern: %v", err)
		}
		if n := ind.Name(); n != "StalledPattern" {
			t.Errorf("name: got %q want %q", n, "StalledPattern")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "StalledPattern", got)
	})
	t.Run("StandardError", func(t *testing.T) {
		ind, err := NewStandardError(14)
		if err != nil {
			t.Fatalf("new StandardError: %v", err)
		}
		if n := ind.Name(); n != "StandardError" {
			t.Errorf("name: got %q want %q", n, "StandardError")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "StandardError", got)
	})
	t.Run("StandardErrorBands", func(t *testing.T) {
		ind, err := NewStandardErrorBands(14, 2.0)
		if err != nil {
			t.Fatalf("new StandardErrorBands: %v", err)
		}
		if n := ind.Name(); n != "StandardErrorBands" {
			t.Errorf("name: got %q want %q", n, "StandardErrorBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "StandardErrorBands", got)
	})
	t.Run("StarcBands", func(t *testing.T) {
		ind, err := NewStarcBands(3, 7, 2.0)
		if err != nil {
			t.Fatalf("new StarcBands: %v", err)
		}
		if n := ind.Name(); n != "StarcBands" {
			t.Errorf("name: got %q want %q", n, "StarcBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "StarcBands", got)
	})
	t.Run("Stc", func(t *testing.T) {
		ind, err := NewStc(10, 23, 10, 0.5)
		if err != nil {
			t.Fatalf("new Stc: %v", err)
		}
		if n := ind.Name(); n != "STC" {
			t.Errorf("name: got %q want %q", n, "STC")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Stc", got)
	})
	t.Run("StdDev", func(t *testing.T) {
		ind, err := NewStdDev(14)
		if err != nil {
			t.Fatalf("new StdDev: %v", err)
		}
		if n := ind.Name(); n != "StdDev" {
			t.Errorf("name: got %q want %q", n, "StdDev")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "StdDev", got)
	})
	t.Run("StepTrailingStop", func(t *testing.T) {
		ind, err := NewStepTrailingStop(2.0)
		if err != nil {
			t.Fatalf("new StepTrailingStop: %v", err)
		}
		if n := ind.Name(); n != "StepTrailingStop" {
			t.Errorf("name: got %q want %q", n, "StepTrailingStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "StepTrailingStop", got)
	})
	t.Run("SterlingRatio", func(t *testing.T) {
		ind, err := NewSterlingRatio(14)
		if err != nil {
			t.Fatalf("new SterlingRatio: %v", err)
		}
		if n := ind.Name(); n != "SterlingRatio" {
			t.Errorf("name: got %q want %q", n, "SterlingRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "SterlingRatio", got)
	})
	t.Run("StickSandwich", func(t *testing.T) {
		ind, err := NewStickSandwich()
		if err != nil {
			t.Fatalf("new StickSandwich: %v", err)
		}
		if n := ind.Name(); n != "StickSandwich" {
			t.Errorf("name: got %q want %q", n, "StickSandwich")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "StickSandwich", got)
	})
	t.Run("StochRsi", func(t *testing.T) {
		ind, err := NewStochRsi(3, 7)
		if err != nil {
			t.Fatalf("new StochRsi: %v", err)
		}
		if n := ind.Name(); n != "StochRSI" {
			t.Errorf("name: got %q want %q", n, "StochRSI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "StochRsi", got)
	})
	t.Run("Stochastic", func(t *testing.T) {
		ind, err := NewStochastic(3, 7)
		if err != nil {
			t.Fatalf("new Stochastic: %v", err)
		}
		if n := ind.Name(); n != "Stochastic" {
			t.Errorf("name: got %q want %q", n, "Stochastic")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Stochastic", got)
	})
	t.Run("StochasticCci", func(t *testing.T) {
		ind, err := NewStochasticCci(14)
		if err != nil {
			t.Fatalf("new StochasticCci: %v", err)
		}
		if n := ind.Name(); n != "StochasticCCI" {
			t.Errorf("name: got %q want %q", n, "StochasticCCI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "StochasticCci", got)
	})
	t.Run("SuperSmoother", func(t *testing.T) {
		ind, err := NewSuperSmoother(14)
		if err != nil {
			t.Fatalf("new SuperSmoother: %v", err)
		}
		if n := ind.Name(); n != "SuperSmoother" {
			t.Errorf("name: got %q want %q", n, "SuperSmoother")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "SuperSmoother", got)
	})
	t.Run("SuperTrend", func(t *testing.T) {
		ind, err := NewSuperTrend(14, 2.0)
		if err != nil {
			t.Fatalf("new SuperTrend: %v", err)
		}
		if n := ind.Name(); n != "SuperTrend" {
			t.Errorf("name: got %q want %q", n, "SuperTrend")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "SuperTrend", got)
	})
	t.Run("T3", func(t *testing.T) {
		ind, err := NewT3(5, 0.7)
		if err != nil {
			t.Fatalf("new T3: %v", err)
		}
		if n := ind.Name(); n != "T3" {
			t.Errorf("name: got %q want %q", n, "T3")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "T3", got)
	})
	t.Run("TailRatio", func(t *testing.T) {
		ind, err := NewTailRatio(14)
		if err != nil {
			t.Fatalf("new TailRatio: %v", err)
		}
		if n := ind.Name(); n != "TailRatio" {
			t.Errorf("name: got %q want %q", n, "TailRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "TailRatio", got)
	})
	t.Run("TakerBuySellRatio", func(t *testing.T) {
		ind, err := NewTakerBuySellRatio()
		if err != nil {
			t.Fatalf("new TakerBuySellRatio: %v", err)
		}
		if n := ind.Name(); n != "TakerBuySellRatio" {
			t.Errorf("name: got %q want %q", n, "TakerBuySellRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "TakerBuySellRatio", got)
	})
	t.Run("Takuri", func(t *testing.T) {
		ind, err := NewTakuri()
		if err != nil {
			t.Fatalf("new Takuri: %v", err)
		}
		if n := ind.Name(); n != "Takuri" {
			t.Errorf("name: got %q want %q", n, "Takuri")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Takuri", got)
	})
	t.Run("TasukiGap", func(t *testing.T) {
		ind, err := NewTasukiGap()
		if err != nil {
			t.Fatalf("new TasukiGap: %v", err)
		}
		if n := ind.Name(); n != "TasukiGap" {
			t.Errorf("name: got %q want %q", n, "TasukiGap")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TasukiGap", got)
	})
	t.Run("TdCamouflage", func(t *testing.T) {
		ind, err := NewTdCamouflage()
		if err != nil {
			t.Fatalf("new TdCamouflage: %v", err)
		}
		if n := ind.Name(); n != "TDCamouflage" {
			t.Errorf("name: got %q want %q", n, "TDCamouflage")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdCamouflage", got)
	})
	t.Run("TdClop", func(t *testing.T) {
		ind, err := NewTdClop()
		if err != nil {
			t.Fatalf("new TdClop: %v", err)
		}
		if n := ind.Name(); n != "TDClop" {
			t.Errorf("name: got %q want %q", n, "TDClop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdClop", got)
	})
	t.Run("TdClopwin", func(t *testing.T) {
		ind, err := NewTdClopwin()
		if err != nil {
			t.Fatalf("new TdClopwin: %v", err)
		}
		if n := ind.Name(); n != "TDClopwin" {
			t.Errorf("name: got %q want %q", n, "TDClopwin")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdClopwin", got)
	})
	t.Run("TdCombo", func(t *testing.T) {
		ind, err := NewTdCombo(3, 7, 14, 28)
		if err != nil {
			t.Fatalf("new TdCombo: %v", err)
		}
		if n := ind.Name(); n != "TDCombo" {
			t.Errorf("name: got %q want %q", n, "TDCombo")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdCombo", got)
	})
	t.Run("TdCountdown", func(t *testing.T) {
		ind, err := NewTdCountdown(3, 7, 14, 28)
		if err != nil {
			t.Fatalf("new TdCountdown: %v", err)
		}
		if n := ind.Name(); n != "TDCountdown" {
			t.Errorf("name: got %q want %q", n, "TDCountdown")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdCountdown", got)
	})
	t.Run("TdDWave", func(t *testing.T) {
		ind, err := NewTdDWave(2)
		if err != nil {
			t.Fatalf("new TdDWave: %v", err)
		}
		if n := ind.Name(); n != "TDDWave" {
			t.Errorf("name: got %q want %q", n, "TDDWave")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdDWave", got)
	})
	t.Run("TdDeMarker", func(t *testing.T) {
		ind, err := NewTdDeMarker(14)
		if err != nil {
			t.Fatalf("new TdDeMarker: %v", err)
		}
		if n := ind.Name(); n != "TDDeMarker" {
			t.Errorf("name: got %q want %q", n, "TDDeMarker")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdDeMarker", got)
	})
	t.Run("TdDifferential", func(t *testing.T) {
		ind, err := NewTdDifferential()
		if err != nil {
			t.Fatalf("new TdDifferential: %v", err)
		}
		if n := ind.Name(); n != "TDDifferential" {
			t.Errorf("name: got %q want %q", n, "TDDifferential")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdDifferential", got)
	})
	t.Run("TdLines", func(t *testing.T) {
		ind, err := NewTdLines(3, 7)
		if err != nil {
			t.Fatalf("new TdLines: %v", err)
		}
		if n := ind.Name(); n != "TDLines" {
			t.Errorf("name: got %q want %q", n, "TDLines")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "TdLines", got)
	})
	t.Run("TdMovingAverage", func(t *testing.T) {
		ind, err := NewTdMovingAverage(3, 7)
		if err != nil {
			t.Fatalf("new TdMovingAverage: %v", err)
		}
		if n := ind.Name(); n != "TDMovingAverage" {
			t.Errorf("name: got %q want %q", n, "TDMovingAverage")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "TdMovingAverage", got)
	})
	t.Run("TdOpen", func(t *testing.T) {
		ind, err := NewTdOpen()
		if err != nil {
			t.Fatalf("new TdOpen: %v", err)
		}
		if n := ind.Name(); n != "TDOpen" {
			t.Errorf("name: got %q want %q", n, "TDOpen")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdOpen", got)
	})
	t.Run("TdPressure", func(t *testing.T) {
		ind, err := NewTdPressure(14)
		if err != nil {
			t.Fatalf("new TdPressure: %v", err)
		}
		if n := ind.Name(); n != "TDPressure" {
			t.Errorf("name: got %q want %q", n, "TDPressure")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdPressure", got)
	})
	t.Run("TdPropulsion", func(t *testing.T) {
		ind, err := NewTdPropulsion()
		if err != nil {
			t.Fatalf("new TdPropulsion: %v", err)
		}
		if n := ind.Name(); n != "TDPropulsion" {
			t.Errorf("name: got %q want %q", n, "TDPropulsion")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdPropulsion", got)
	})
	t.Run("TdRangeProjection", func(t *testing.T) {
		ind, err := NewTdRangeProjection()
		if err != nil {
			t.Fatalf("new TdRangeProjection: %v", err)
		}
		if n := ind.Name(); n != "TDRangeProjection" {
			t.Errorf("name: got %q want %q", n, "TDRangeProjection")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "TdRangeProjection", got)
	})
	t.Run("TdRei", func(t *testing.T) {
		ind, err := NewTdRei(14)
		if err != nil {
			t.Fatalf("new TdRei: %v", err)
		}
		if n := ind.Name(); n != "TDREI" {
			t.Errorf("name: got %q want %q", n, "TDREI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdRei", got)
	})
	t.Run("TdRiskLevel", func(t *testing.T) {
		ind, err := NewTdRiskLevel(3, 7)
		if err != nil {
			t.Fatalf("new TdRiskLevel: %v", err)
		}
		if n := ind.Name(); n != "TDRiskLevel" {
			t.Errorf("name: got %q want %q", n, "TDRiskLevel")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "TdRiskLevel", got)
	})
	t.Run("TdSequential", func(t *testing.T) {
		ind, err := NewTdSequential(3, 7, 14, 28)
		if err != nil {
			t.Fatalf("new TdSequential: %v", err)
		}
		if n := ind.Name(); n != "TDSequential" {
			t.Errorf("name: got %q want %q", n, "TDSequential")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "TdSequential", got)
	})
	t.Run("TdSetup", func(t *testing.T) {
		ind, err := NewTdSetup(3, 7)
		if err != nil {
			t.Fatalf("new TdSetup: %v", err)
		}
		if n := ind.Name(); n != "TDSetup" {
			t.Errorf("name: got %q want %q", n, "TDSetup")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdSetup", got)
	})
	t.Run("TdTrap", func(t *testing.T) {
		ind, err := NewTdTrap()
		if err != nil {
			t.Fatalf("new TdTrap: %v", err)
		}
		if n := ind.Name(); n != "TDTrap" {
			t.Errorf("name: got %q want %q", n, "TDTrap")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TdTrap", got)
	})
	t.Run("Tema", func(t *testing.T) {
		ind, err := NewTema(14)
		if err != nil {
			t.Fatalf("new Tema: %v", err)
		}
		if n := ind.Name(); n != "TEMA" {
			t.Errorf("name: got %q want %q", n, "TEMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Tema", got)
	})
	t.Run("TermStructureBasis", func(t *testing.T) {
		ind, err := NewTermStructureBasis()
		if err != nil {
			t.Fatalf("new TermStructureBasis: %v", err)
		}
		if n := ind.Name(); n != "TermStructureBasis" {
			t.Errorf("name: got %q want %q", n, "TermStructureBasis")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			d := derivFields(r)
			got[i] = []float64{ind.Update(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], int64(i))}
		}
		compareGolden(t, "TermStructureBasis", got)
	})
	t.Run("ThreeDrives", func(t *testing.T) {
		ind, err := NewThreeDrives()
		if err != nil {
			t.Fatalf("new ThreeDrives: %v", err)
		}
		if n := ind.Name(); n != "ThreeDrives" {
			t.Errorf("name: got %q want %q", n, "ThreeDrives")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ThreeDrives", got)
	})
	t.Run("ThreeInside", func(t *testing.T) {
		ind, err := NewThreeInside()
		if err != nil {
			t.Fatalf("new ThreeInside: %v", err)
		}
		if n := ind.Name(); n != "ThreeInside" {
			t.Errorf("name: got %q want %q", n, "ThreeInside")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ThreeInside", got)
	})
	t.Run("ThreeLineBreak", func(t *testing.T) {
		ind, err := NewThreeLineBreak(14)
		if err != nil {
			t.Fatalf("new ThreeLineBreak: %v", err)
		}
		if n := ind.Name(); n != "ThreeLineBreak" {
			t.Errorf("name: got %q want %q", n, "ThreeLineBreak")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ThreeLineBreak", got)
	})
	t.Run("ThreeLineBreakBars", func(t *testing.T) {
		ind, err := NewThreeLineBreakBars(3)
		if err != nil {
			t.Fatalf("new ThreeLineBreakBars: %v", err)
		}
		if n := ind.Name(); n != "ThreeLineBreakBars" {
			t.Errorf("name: got %q want %q", n, "ThreeLineBreakBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[3], r[3], r[3], r[3], 1.0, 0))
		}
		compareGolden(t, "ThreeLineBreakBars", got)
	})
	t.Run("ThreeLineStrike", func(t *testing.T) {
		ind, err := NewThreeLineStrike()
		if err != nil {
			t.Fatalf("new ThreeLineStrike: %v", err)
		}
		if n := ind.Name(); n != "ThreeLineStrike" {
			t.Errorf("name: got %q want %q", n, "ThreeLineStrike")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ThreeLineStrike", got)
	})
	t.Run("ThreeOutside", func(t *testing.T) {
		ind, err := NewThreeOutside()
		if err != nil {
			t.Fatalf("new ThreeOutside: %v", err)
		}
		if n := ind.Name(); n != "ThreeOutside" {
			t.Errorf("name: got %q want %q", n, "ThreeOutside")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ThreeOutside", got)
	})
	t.Run("ThreeSoldiersOrCrows", func(t *testing.T) {
		ind, err := NewThreeSoldiersOrCrows()
		if err != nil {
			t.Fatalf("new ThreeSoldiersOrCrows: %v", err)
		}
		if n := ind.Name(); n != "ThreeSoldiersOrCrows" {
			t.Errorf("name: got %q want %q", n, "ThreeSoldiersOrCrows")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ThreeSoldiersOrCrows", got)
	})
	t.Run("ThreeStarsInSouth", func(t *testing.T) {
		ind, err := NewThreeStarsInSouth()
		if err != nil {
			t.Fatalf("new ThreeStarsInSouth: %v", err)
		}
		if n := ind.Name(); n != "ThreeStarsInSouth" {
			t.Errorf("name: got %q want %q", n, "ThreeStarsInSouth")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "ThreeStarsInSouth", got)
	})
	t.Run("Thrusting", func(t *testing.T) {
		ind, err := NewThrusting()
		if err != nil {
			t.Fatalf("new Thrusting: %v", err)
		}
		if n := ind.Name(); n != "Thrusting" {
			t.Errorf("name: got %q want %q", n, "Thrusting")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Thrusting", got)
	})
	t.Run("TickBars", func(t *testing.T) {
		ind, err := NewTickBars(2)
		if err != nil {
			t.Fatalf("new TickBars: %v", err)
		}
		if n := ind.Name(); n != "TickBars" {
			t.Errorf("name: got %q want %q", n, "TickBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[0], r[1], r[2], r[3], r[4], 0))
		}
		compareGolden(t, "TickBars", got)
	})
	t.Run("TickIndex", func(t *testing.T) {
		ind, err := NewTickIndex()
		if err != nil {
			t.Fatalf("new TickIndex: %v", err)
		}
		if n := ind.Name(); n != "TickIndex" {
			t.Errorf("name: got %q want %q", n, "TickIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "TickIndex", got)
	})
	t.Run("Tii", func(t *testing.T) {
		ind, err := NewTii(3, 7)
		if err != nil {
			t.Fatalf("new Tii: %v", err)
		}
		if n := ind.Name(); n != "TII" {
			t.Errorf("name: got %q want %q", n, "TII")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Tii", got)
	})
	t.Run("TimeBasedStop", func(t *testing.T) {
		ind, err := NewTimeBasedStop(14)
		if err != nil {
			t.Fatalf("new TimeBasedStop: %v", err)
		}
		if n := ind.Name(); n != "TimeBasedStop" {
			t.Errorf("name: got %q want %q", n, "TimeBasedStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TimeBasedStop", got)
	})
	t.Run("TimeOfDayReturnProfile", func(t *testing.T) {
		ind, err := NewTimeOfDayReturnProfile(24, 0)
		if err != nil {
			t.Fatalf("new TimeOfDayReturnProfile: %v", err)
		}
		if n := ind.Name(); n != "TimeOfDayReturnProfile" {
			t.Errorf("name: got %q want %q", n, "TimeOfDayReturnProfile")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bins, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			if ok {
				got[i] = bins
			} else {
				got[i] = nanRow(24)
			}
		}
		compareGolden(t, "TimeOfDayReturnProfile", got)
	})
	t.Run("TowerTopBottom", func(t *testing.T) {
		ind, err := NewTowerTopBottom()
		if err != nil {
			t.Fatalf("new TowerTopBottom: %v", err)
		}
		if n := ind.Name(); n != "TowerTopBottom" {
			t.Errorf("name: got %q want %q", n, "TowerTopBottom")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TowerTopBottom", got)
	})
	t.Run("TpoProfile", func(t *testing.T) {
		ind, err := NewTpoProfile(30, 50)
		if err != nil {
			t.Fatalf("new TpoProfile: %v", err)
		}
		if n := ind.Name(); n != "TpoProfile" {
			t.Errorf("name: got %q want %q", n, "TpoProfile")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 52)
		}
		compareGolden(t, "TpoProfile", got)
	})
	t.Run("TradeImbalance", func(t *testing.T) {
		ind, err := NewTradeImbalance(20)
		if err != nil {
			t.Fatalf("new TradeImbalance: %v", err)
		}
		if n := ind.Name(); n != "TradeImbalance" {
			t.Errorf("name: got %q want %q", n, "TradeImbalance")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i))}
		}
		compareGolden(t, "TradeImbalance", got)
	})
	t.Run("TradeSignAutocorrelation", func(t *testing.T) {
		ind, err := NewTradeSignAutocorrelation(20)
		if err != nil {
			t.Fatalf("new TradeSignAutocorrelation: %v", err)
		}
		if n := ind.Name(); n != "TradeSignAutocorrelation" {
			t.Errorf("name: got %q want %q", n, "TradeSignAutocorrelation")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i))}
		}
		compareGolden(t, "TradeSignAutocorrelation", got)
	})
	t.Run("TradeVolumeIndex", func(t *testing.T) {
		ind, err := NewTradeVolumeIndex(2.0)
		if err != nil {
			t.Fatalf("new TradeVolumeIndex: %v", err)
		}
		if n := ind.Name(); n != "TradeVolumeIndex" {
			t.Errorf("name: got %q want %q", n, "TradeVolumeIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TradeVolumeIndex", got)
	})
	t.Run("TrendLabel", func(t *testing.T) {
		ind, err := NewTrendLabel(14)
		if err != nil {
			t.Fatalf("new TrendLabel: %v", err)
		}
		if n := ind.Name(); n != "TrendLabel" {
			t.Errorf("name: got %q want %q", n, "TrendLabel")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "TrendLabel", got)
	})
	t.Run("TrendStrengthIndex", func(t *testing.T) {
		ind, err := NewTrendStrengthIndex(14)
		if err != nil {
			t.Fatalf("new TrendStrengthIndex: %v", err)
		}
		if n := ind.Name(); n != "TrendStrengthIndex" {
			t.Errorf("name: got %q want %q", n, "TrendStrengthIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "TrendStrengthIndex", got)
	})
	t.Run("Trendflex", func(t *testing.T) {
		ind, err := NewTrendflex(14)
		if err != nil {
			t.Fatalf("new Trendflex: %v", err)
		}
		if n := ind.Name(); n != "Trendflex" {
			t.Errorf("name: got %q want %q", n, "Trendflex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Trendflex", got)
	})
	t.Run("TreynorRatio", func(t *testing.T) {
		ind, err := NewTreynorRatio(14, 2.0)
		if err != nil {
			t.Fatalf("new TreynorRatio: %v", err)
		}
		if n := ind.Name(); n != "TreynorRatio" {
			t.Errorf("name: got %q want %q", n, "TreynorRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "TreynorRatio", got)
	})
	t.Run("Triangle", func(t *testing.T) {
		ind, err := NewTriangle()
		if err != nil {
			t.Fatalf("new Triangle: %v", err)
		}
		if n := ind.Name(); n != "Triangle" {
			t.Errorf("name: got %q want %q", n, "Triangle")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Triangle", got)
	})
	t.Run("Trima", func(t *testing.T) {
		ind, err := NewTrima(14)
		if err != nil {
			t.Fatalf("new Trima: %v", err)
		}
		if n := ind.Name(); n != "TRIMA" {
			t.Errorf("name: got %q want %q", n, "TRIMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Trima", got)
	})
	t.Run("Trin", func(t *testing.T) {
		ind, err := NewTrin()
		if err != nil {
			t.Fatalf("new Trin: %v", err)
		}
		if n := ind.Name(); n != "Trin" {
			t.Errorf("name: got %q want %q", n, "Trin")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "Trin", got)
	})
	t.Run("TripleTopBottom", func(t *testing.T) {
		ind, err := NewTripleTopBottom()
		if err != nil {
			t.Fatalf("new TripleTopBottom: %v", err)
		}
		if n := ind.Name(); n != "TripleTopBottom" {
			t.Errorf("name: got %q want %q", n, "TripleTopBottom")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TripleTopBottom", got)
	})
	t.Run("Tristar", func(t *testing.T) {
		ind, err := NewTristar()
		if err != nil {
			t.Fatalf("new Tristar: %v", err)
		}
		if n := ind.Name(); n != "Tristar" {
			t.Errorf("name: got %q want %q", n, "Tristar")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Tristar", got)
	})
	t.Run("Trix", func(t *testing.T) {
		ind, err := NewTrix(14)
		if err != nil {
			t.Fatalf("new Trix: %v", err)
		}
		if n := ind.Name(); n != "TRIX" {
			t.Errorf("name: got %q want %q", n, "TRIX")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Trix", got)
	})
	t.Run("TrueRange", func(t *testing.T) {
		ind, err := NewTrueRange()
		if err != nil {
			t.Fatalf("new TrueRange: %v", err)
		}
		if n := ind.Name(); n != "TrueRange" {
			t.Errorf("name: got %q want %q", n, "TrueRange")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TrueRange", got)
	})
	t.Run("Tsf", func(t *testing.T) {
		ind, err := NewTsf(14)
		if err != nil {
			t.Fatalf("new Tsf: %v", err)
		}
		if n := ind.Name(); n != "TSF" {
			t.Errorf("name: got %q want %q", n, "TSF")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Tsf", got)
	})
	t.Run("TsfOscillator", func(t *testing.T) {
		ind, err := NewTsfOscillator(14)
		if err != nil {
			t.Fatalf("new TsfOscillator: %v", err)
		}
		if n := ind.Name(); n != "TsfOscillator" {
			t.Errorf("name: got %q want %q", n, "TsfOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "TsfOscillator", got)
	})
	t.Run("Tsi", func(t *testing.T) {
		ind, err := NewTsi(3, 7)
		if err != nil {
			t.Fatalf("new Tsi: %v", err)
		}
		if n := ind.Name(); n != "TSI" {
			t.Errorf("name: got %q want %q", n, "TSI")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Tsi", got)
	})
	t.Run("Tsv", func(t *testing.T) {
		ind, err := NewTsv(14)
		if err != nil {
			t.Fatalf("new Tsv: %v", err)
		}
		if n := ind.Name(); n != "TSV" {
			t.Errorf("name: got %q want %q", n, "TSV")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Tsv", got)
	})
	t.Run("TtmSqueeze", func(t *testing.T) {
		ind, err := NewTtmSqueeze(14, 2.0, 0.5)
		if err != nil {
			t.Fatalf("new TtmSqueeze: %v", err)
		}
		if n := ind.Name(); n != "TtmSqueeze" {
			t.Errorf("name: got %q want %q", n, "TtmSqueeze")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "TtmSqueeze", got)
	})
	t.Run("TtmTrend", func(t *testing.T) {
		ind, err := NewTtmTrend(14)
		if err != nil {
			t.Fatalf("new TtmTrend: %v", err)
		}
		if n := ind.Name(); n != "TtmTrend" {
			t.Errorf("name: got %q want %q", n, "TtmTrend")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TtmTrend", got)
	})
	t.Run("TurnOfMonth", func(t *testing.T) {
		ind, err := NewTurnOfMonth(3.0, 3.0, 0)
		if err != nil {
			t.Fatalf("new TurnOfMonth: %v", err)
		}
		if n := ind.Name(); n != "TurnOfMonth" {
			t.Errorf("name: got %q want %q", n, "TurnOfMonth")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TurnOfMonth", got)
	})
	t.Run("Tweezer", func(t *testing.T) {
		ind, err := NewTweezer()
		if err != nil {
			t.Fatalf("new Tweezer: %v", err)
		}
		if n := ind.Name(); n != "Tweezer" {
			t.Errorf("name: got %q want %q", n, "Tweezer")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Tweezer", got)
	})
	t.Run("TwiggsMoneyFlow", func(t *testing.T) {
		ind, err := NewTwiggsMoneyFlow(14)
		if err != nil {
			t.Fatalf("new TwiggsMoneyFlow: %v", err)
		}
		if n := ind.Name(); n != "TwiggsMoneyFlow" {
			t.Errorf("name: got %q want %q", n, "TwiggsMoneyFlow")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TwiggsMoneyFlow", got)
	})
	t.Run("TwoCrows", func(t *testing.T) {
		ind, err := NewTwoCrows()
		if err != nil {
			t.Fatalf("new TwoCrows: %v", err)
		}
		if n := ind.Name(); n != "TwoCrows" {
			t.Errorf("name: got %q want %q", n, "TwoCrows")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TwoCrows", got)
	})
	t.Run("TypicalPrice", func(t *testing.T) {
		ind, err := NewTypicalPrice()
		if err != nil {
			t.Fatalf("new TypicalPrice: %v", err)
		}
		if n := ind.Name(); n != "TypicalPrice" {
			t.Errorf("name: got %q want %q", n, "TypicalPrice")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "TypicalPrice", got)
	})
	t.Run("UlcerIndex", func(t *testing.T) {
		ind, err := NewUlcerIndex(14)
		if err != nil {
			t.Fatalf("new UlcerIndex: %v", err)
		}
		if n := ind.Name(); n != "UlcerIndex" {
			t.Errorf("name: got %q want %q", n, "UlcerIndex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "UlcerIndex", got)
	})
	t.Run("UltimateOscillator", func(t *testing.T) {
		ind, err := NewUltimateOscillator(3, 7, 14)
		if err != nil {
			t.Fatalf("new UltimateOscillator: %v", err)
		}
		if n := ind.Name(); n != "UltimateOscillator" {
			t.Errorf("name: got %q want %q", n, "UltimateOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "UltimateOscillator", got)
	})
	t.Run("UniqueThreeRiver", func(t *testing.T) {
		ind, err := NewUniqueThreeRiver()
		if err != nil {
			t.Fatalf("new UniqueThreeRiver: %v", err)
		}
		if n := ind.Name(); n != "UniqueThreeRiver" {
			t.Errorf("name: got %q want %q", n, "UniqueThreeRiver")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "UniqueThreeRiver", got)
	})
	t.Run("UniversalOscillator", func(t *testing.T) {
		ind, err := NewUniversalOscillator(14)
		if err != nil {
			t.Fatalf("new UniversalOscillator: %v", err)
		}
		if n := ind.Name(); n != "UniversalOscillator" {
			t.Errorf("name: got %q want %q", n, "UniversalOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "UniversalOscillator", got)
	})
	t.Run("UpDownVolumeRatio", func(t *testing.T) {
		ind, err := NewUpDownVolumeRatio()
		if err != nil {
			t.Fatalf("new UpDownVolumeRatio: %v", err)
		}
		if n := ind.Name(); n != "UpDownVolumeRatio" {
			t.Errorf("name: got %q want %q", n, "UpDownVolumeRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			ch, vo, nh, nl, am, ob_ := crossLists(r)
			got[i] = []float64{ind.Update(ch, vo, nh, nl, am, ob_, int64(i))}
		}
		compareGolden(t, "UpDownVolumeRatio", got)
	})
	t.Run("UpsideGapThreeMethods", func(t *testing.T) {
		ind, err := NewUpsideGapThreeMethods()
		if err != nil {
			t.Fatalf("new UpsideGapThreeMethods: %v", err)
		}
		if n := ind.Name(); n != "UpsideGapThreeMethods" {
			t.Errorf("name: got %q want %q", n, "UpsideGapThreeMethods")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "UpsideGapThreeMethods", got)
	})
	t.Run("UpsideGapTwoCrows", func(t *testing.T) {
		ind, err := NewUpsideGapTwoCrows()
		if err != nil {
			t.Fatalf("new UpsideGapTwoCrows: %v", err)
		}
		if n := ind.Name(); n != "UpsideGapTwoCrows" {
			t.Errorf("name: got %q want %q", n, "UpsideGapTwoCrows")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "UpsideGapTwoCrows", got)
	})
	t.Run("UpsidePotentialRatio", func(t *testing.T) {
		ind, err := NewUpsidePotentialRatio(14, 2.0)
		if err != nil {
			t.Fatalf("new UpsidePotentialRatio: %v", err)
		}
		if n := ind.Name(); n != "UpsidePotentialRatio" {
			t.Errorf("name: got %q want %q", n, "UpsidePotentialRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "UpsidePotentialRatio", got)
	})
	t.Run("ValueArea", func(t *testing.T) {
		ind, err := NewValueArea(20, 50, 0.7)
		if err != nil {
			t.Fatalf("new ValueArea: %v", err)
		}
		if n := ind.Name(); n != "ValueArea" {
			t.Errorf("name: got %q want %q", n, "ValueArea")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "ValueArea", got)
	})
	t.Run("ValueAtRisk", func(t *testing.T) {
		ind, err := NewValueAtRisk(20, 0.95)
		if err != nil {
			t.Fatalf("new ValueAtRisk: %v", err)
		}
		if n := ind.Name(); n != "ValueAtRisk" {
			t.Errorf("name: got %q want %q", n, "ValueAtRisk")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "ValueAtRisk", got)
	})
	t.Run("Variance", func(t *testing.T) {
		ind, err := NewVariance(14)
		if err != nil {
			t.Fatalf("new Variance: %v", err)
		}
		if n := ind.Name(); n != "Variance" {
			t.Errorf("name: got %q want %q", n, "Variance")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Variance", got)
	})
	t.Run("VarianceRatio", func(t *testing.T) {
		ind, err := NewVarianceRatio(60, 2)
		if err != nil {
			t.Fatalf("new VarianceRatio: %v", err)
		}
		if n := ind.Name(); n != "VarianceRatio" {
			t.Errorf("name: got %q want %q", n, "VarianceRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[0])}
		}
		compareGolden(t, "VarianceRatio", got)
	})
	t.Run("VerticalHorizontalFilter", func(t *testing.T) {
		ind, err := NewVerticalHorizontalFilter(14)
		if err != nil {
			t.Fatalf("new VerticalHorizontalFilter: %v", err)
		}
		if n := ind.Name(); n != "VerticalHorizontalFilter" {
			t.Errorf("name: got %q want %q", n, "VerticalHorizontalFilter")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "VerticalHorizontalFilter", got)
	})
	t.Run("Vidya", func(t *testing.T) {
		ind, err := NewVidya(3, 7)
		if err != nil {
			t.Fatalf("new Vidya: %v", err)
		}
		if n := ind.Name(); n != "VIDYA" {
			t.Errorf("name: got %q want %q", n, "VIDYA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Vidya", got)
	})
	t.Run("VolatilityCone", func(t *testing.T) {
		ind, err := NewVolatilityCone(3, 7)
		if err != nil {
			t.Fatalf("new VolatilityCone: %v", err)
		}
		if n := ind.Name(); n != "VolatilityCone" {
			t.Errorf("name: got %q want %q", n, "VolatilityCone")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 5)
		}
		compareGolden(t, "VolatilityCone", got)
	})
	t.Run("VolatilityOfVolatility", func(t *testing.T) {
		ind, err := NewVolatilityOfVolatility(3, 7)
		if err != nil {
			t.Fatalf("new VolatilityOfVolatility: %v", err)
		}
		if n := ind.Name(); n != "VolatilityOfVolatility" {
			t.Errorf("name: got %q want %q", n, "VolatilityOfVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "VolatilityOfVolatility", got)
	})
	t.Run("VolatilityRatio", func(t *testing.T) {
		ind, err := NewVolatilityRatio(14)
		if err != nil {
			t.Fatalf("new VolatilityRatio: %v", err)
		}
		if n := ind.Name(); n != "VolatilityRatio" {
			t.Errorf("name: got %q want %q", n, "VolatilityRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "VolatilityRatio", got)
	})
	t.Run("VoltyStop", func(t *testing.T) {
		ind, err := NewVoltyStop(14, 2.0)
		if err != nil {
			t.Fatalf("new VoltyStop: %v", err)
		}
		if n := ind.Name(); n != "VoltyStop" {
			t.Errorf("name: got %q want %q", n, "VoltyStop")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "VoltyStop", got)
	})
	t.Run("VolumeBars", func(t *testing.T) {
		ind, err := NewVolumeBars(500.0)
		if err != nil {
			t.Fatalf("new VolumeBars: %v", err)
		}
		if n := ind.Name(); n != "VolumeBars" {
			t.Errorf("name: got %q want %q", n, "VolumeBars")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = flattenBars(ind.Update(r[0], r[1], r[2], r[3], r[4], 0))
		}
		compareGolden(t, "VolumeBars", got)
	})
	t.Run("VolumeByTimeProfile", func(t *testing.T) {
		ind, err := NewVolumeByTimeProfile(24, 0)
		if err != nil {
			t.Fatalf("new VolumeByTimeProfile: %v", err)
		}
		if n := ind.Name(); n != "VolumeByTimeProfile" {
			t.Errorf("name: got %q want %q", n, "VolumeByTimeProfile")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			bins, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			if ok {
				got[i] = bins
			} else {
				got[i] = nanRow(24)
			}
		}
		compareGolden(t, "VolumeByTimeProfile", got)
	})
	t.Run("VolumeOscillator", func(t *testing.T) {
		ind, err := NewVolumeOscillator(3, 7)
		if err != nil {
			t.Fatalf("new VolumeOscillator: %v", err)
		}
		if n := ind.Name(); n != "VolumeOscillator" {
			t.Errorf("name: got %q want %q", n, "VolumeOscillator")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "VolumeOscillator", got)
	})
	t.Run("VolumePriceTrend", func(t *testing.T) {
		ind, err := NewVolumePriceTrend()
		if err != nil {
			t.Fatalf("new VolumePriceTrend: %v", err)
		}
		if n := ind.Name(); n != "VPT" {
			t.Errorf("name: got %q want %q", n, "VPT")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "VolumePriceTrend", got)
	})
	t.Run("VolumeProfile", func(t *testing.T) {
		ind, err := NewVolumeProfile(20, 50)
		if err != nil {
			t.Fatalf("new VolumeProfile: %v", err)
		}
		if n := ind.Name(); n != "VolumeProfile" {
			t.Errorf("name: got %q want %q", n, "VolumeProfile")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 52)
		}
		compareGolden(t, "VolumeProfile", got)
	})
	t.Run("VolumeRsi", func(t *testing.T) {
		ind, err := NewVolumeRsi(14)
		if err != nil {
			t.Fatalf("new VolumeRsi: %v", err)
		}
		if n := ind.Name(); n != "VolumeRsi" {
			t.Errorf("name: got %q want %q", n, "VolumeRsi")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "VolumeRsi", got)
	})
	t.Run("VolumeWeightedMacd", func(t *testing.T) {
		ind, err := NewVolumeWeightedMacd(3, 7, 14)
		if err != nil {
			t.Fatalf("new VolumeWeightedMacd: %v", err)
		}
		if n := ind.Name(); n != "VolumeWeightedMacd" {
			t.Errorf("name: got %q want %q", n, "VolumeWeightedMacd")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "VolumeWeightedMacd", got)
	})
	t.Run("VolumeWeightedSr", func(t *testing.T) {
		ind, err := NewVolumeWeightedSr(14)
		if err != nil {
			t.Fatalf("new VolumeWeightedSr: %v", err)
		}
		if n := ind.Name(); n != "VolumeWeightedSr" {
			t.Errorf("name: got %q want %q", n, "VolumeWeightedSr")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "VolumeWeightedSr", got)
	})
	t.Run("Vortex", func(t *testing.T) {
		ind, err := NewVortex(14)
		if err != nil {
			t.Fatalf("new Vortex: %v", err)
		}
		if n := ind.Name(); n != "Vortex" {
			t.Errorf("name: got %q want %q", n, "Vortex")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "Vortex", got)
	})
	t.Run("Vpin", func(t *testing.T) {
		ind, err := NewVpin(5000.0, 10)
		if err != nil {
			t.Fatalf("new Vpin: %v", err)
		}
		if n := ind.Name(); n != "Vpin" {
			t.Errorf("name: got %q want %q", n, "Vpin")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3], r[4], r[3] >= r[0], int64(i))}
		}
		compareGolden(t, "Vpin", got)
	})
	t.Run("Vwap", func(t *testing.T) {
		ind, err := NewVwap()
		if err != nil {
			t.Fatalf("new Vwap: %v", err)
		}
		if n := ind.Name(); n != "VWAP" {
			t.Errorf("name: got %q want %q", n, "VWAP")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Vwap", got)
	})
	t.Run("VwapStdDevBands", func(t *testing.T) {
		ind, err := NewVwapStdDevBands(2.0)
		if err != nil {
			t.Fatalf("new VwapStdDevBands: %v", err)
		}
		if n := ind.Name(); n != "VwapStdDevBands" {
			t.Errorf("name: got %q want %q", n, "VwapStdDevBands")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 4)
		}
		compareGolden(t, "VwapStdDevBands", got)
	})
	t.Run("Vwma", func(t *testing.T) {
		ind, err := NewVwma(14)
		if err != nil {
			t.Fatalf("new Vwma: %v", err)
		}
		if n := ind.Name(); n != "VWMA" {
			t.Errorf("name: got %q want %q", n, "VWMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Vwma", got)
	})
	t.Run("Vzo", func(t *testing.T) {
		ind, err := NewVzo(14)
		if err != nil {
			t.Fatalf("new Vzo: %v", err)
		}
		if n := ind.Name(); n != "VZO" {
			t.Errorf("name: got %q want %q", n, "VZO")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Vzo", got)
	})
	t.Run("Wad", func(t *testing.T) {
		ind, err := NewWad()
		if err != nil {
			t.Fatalf("new Wad: %v", err)
		}
		if n := ind.Name(); n != "Wad" {
			t.Errorf("name: got %q want %q", n, "Wad")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Wad", got)
	})
	t.Run("WavePm", func(t *testing.T) {
		ind, err := NewWavePm(3, 7)
		if err != nil {
			t.Fatalf("new WavePm: %v", err)
		}
		if n := ind.Name(); n != "WavePm" {
			t.Errorf("name: got %q want %q", n, "WavePm")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "WavePm", got)
	})
	t.Run("WaveTrend", func(t *testing.T) {
		ind, err := NewWaveTrend(3, 7, 14)
		if err != nil {
			t.Fatalf("new WaveTrend: %v", err)
		}
		if n := ind.Name(); n != "WaveTrend" {
			t.Errorf("name: got %q want %q", n, "WaveTrend")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "WaveTrend", got)
	})
	t.Run("Wedge", func(t *testing.T) {
		ind, err := NewWedge()
		if err != nil {
			t.Fatalf("new Wedge: %v", err)
		}
		if n := ind.Name(); n != "Wedge" {
			t.Errorf("name: got %q want %q", n, "Wedge")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "Wedge", got)
	})
	t.Run("WeightedClose", func(t *testing.T) {
		ind, err := NewWeightedClose()
		if err != nil {
			t.Fatalf("new WeightedClose: %v", err)
		}
		if n := ind.Name(); n != "WeightedClose" {
			t.Errorf("name: got %q want %q", n, "WeightedClose")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "WeightedClose", got)
	})
	t.Run("WickRatio", func(t *testing.T) {
		ind, err := NewWickRatio()
		if err != nil {
			t.Fatalf("new WickRatio: %v", err)
		}
		if n := ind.Name(); n != "WickRatio" {
			t.Errorf("name: got %q want %q", n, "WickRatio")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "WickRatio", got)
	})
	t.Run("WilliamsFractals", func(t *testing.T) {
		ind, err := NewWilliamsFractals()
		if err != nil {
			t.Fatalf("new WilliamsFractals: %v", err)
		}
		if n := ind.Name(); n != "WilliamsFractals" {
			t.Errorf("name: got %q want %q", n, "WilliamsFractals")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "WilliamsFractals", got)
	})
	t.Run("WilliamsR", func(t *testing.T) {
		ind, err := NewWilliamsR(14)
		if err != nil {
			t.Fatalf("new WilliamsR: %v", err)
		}
		if n := ind.Name(); n != "WilliamsR" {
			t.Errorf("name: got %q want %q", n, "WilliamsR")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "WilliamsR", got)
	})
	t.Run("WinRate", func(t *testing.T) {
		ind, err := NewWinRate(14)
		if err != nil {
			t.Fatalf("new WinRate: %v", err)
		}
		if n := ind.Name(); n != "WinRate" {
			t.Errorf("name: got %q want %q", n, "WinRate")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "WinRate", got)
	})
	t.Run("Wma", func(t *testing.T) {
		ind, err := NewWma(14)
		if err != nil {
			t.Fatalf("new Wma: %v", err)
		}
		if n := ind.Name(); n != "WMA" {
			t.Errorf("name: got %q want %q", n, "WMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Wma", got)
	})
	t.Run("WoodiePivots", func(t *testing.T) {
		ind, err := NewWoodiePivots()
		if err != nil {
			t.Fatalf("new WoodiePivots: %v", err)
		}
		if n := ind.Name(); n != "WoodiePivots" {
			t.Errorf("name: got %q want %q", n, "WoodiePivots")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 5)
		}
		compareGolden(t, "WoodiePivots", got)
	})
	t.Run("YangZhangVolatility", func(t *testing.T) {
		ind, err := NewYangZhangVolatility(20, 252)
		if err != nil {
			t.Fatalf("new YangZhangVolatility: %v", err)
		}
		if n := ind.Name(); n != "YangZhangVolatility" {
			t.Errorf("name: got %q want %q", n, "YangZhangVolatility")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "YangZhangVolatility", got)
	})
	t.Run("YoyoExit", func(t *testing.T) {
		ind, err := NewYoyoExit(14, 2.0)
		if err != nil {
			t.Fatalf("new YoyoExit: %v", err)
		}
		if n := ind.Name(); n != "YoyoExit" {
			t.Errorf("name: got %q want %q", n, "YoyoExit")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))}
		}
		compareGolden(t, "YoyoExit", got)
	})
	t.Run("ZScore", func(t *testing.T) {
		ind, err := NewZScore(14)
		if err != nil {
			t.Fatalf("new ZScore: %v", err)
		}
		if n := ind.Name(); n != "ZScore" {
			t.Errorf("name: got %q want %q", n, "ZScore")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "ZScore", got)
	})
	t.Run("ZeroLagMacd", func(t *testing.T) {
		ind, err := NewZeroLagMacd(3, 7, 14)
		if err != nil {
			t.Fatalf("new ZeroLagMacd: %v", err)
		}
		if n := ind.Name(); n != "ZeroLagMACD" {
			t.Errorf("name: got %q want %q", n, "ZeroLagMACD")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[3])
			got[i] = reflectRow(out, ok, 3)
		}
		compareGolden(t, "ZeroLagMacd", got)
	})
	t.Run("ZigZag", func(t *testing.T) {
		ind, err := NewZigZag(0.02)
		if err != nil {
			t.Fatalf("new ZigZag: %v", err)
		}
		if n := ind.Name(); n != "ZigZag" {
			t.Errorf("name: got %q want %q", n, "ZigZag")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			out, ok := ind.Update(r[0], r[1], r[2], r[3], r[4], int64(i))
			got[i] = reflectRow(out, ok, 2)
		}
		compareGolden(t, "ZigZag", got)
	})
	t.Run("Zlema", func(t *testing.T) {
		ind, err := NewZlema(14)
		if err != nil {
			t.Fatalf("new Zlema: %v", err)
		}
		if n := ind.Name(); n != "ZLEMA" {
			t.Errorf("name: got %q want %q", n, "ZLEMA")
		}
		got := make([][]float64, len(rows))
		for i, r := range rows {
			got[i] = []float64{ind.Update(r[3])}
		}
		compareGolden(t, "Zlema", got)
	})
}
