2026-07-22 15:40:16 +09:00
package talib
import "log/slog"
2026-07-22 17:18:22 +09:00
// Add - Vector arithmetic addition. Outputs the element-wise sum of two input series.
2026-07-22 15:40:16 +09:00
//
// outReal[i] = inReal0[i] + inReal1[i]
2026-07-22 17:18:22 +09:00
func Add ( inReal0 , inReal1 [] float64 ) [] float64 {
2026-07-22 15:40:16 +09:00
var (
2026-07-22 17:18:22 +09:00
startIdx int32
endIdx = int32 ( len ( inReal0 ) - 1 )
outBegIdx int32
outNBElement int32
2026-07-22 15:40:16 +09:00
outReal = make ([] float64 , len ( inReal0 ))
)
if retCode := add (
startIdx ,
endIdx ,
inReal0 ,
inReal1 ,
& outBegIdx ,
& outNBElement ,
outReal ,
); SUCCESS != taResult ( retCode ) {
2026-07-22 17:18:22 +09:00
slog . Debug ( "Add" , "result" , retCode )
2026-07-22 15:40:16 +09:00
return nil
}
2026-07-22 17:18:22 +09:00
return outReal
}
// Div - Element-wise division of two input series. Computes the quotient of corresponding values from two real inputs.
//
// outReal[i] = inReal0[i] / inReal1[i]
func Div ( inReal0 , inReal1 [] float64 ) [] float64 {
var (
startIdx int32
endIdx = int32 ( len ( inReal0 ) - 1 )
outBegIdx int32
outNBElement int32
outReal = make ([] float64 , len ( inReal0 ))
)
if retCode := div (
startIdx ,
endIdx ,
inReal0 ,
inReal1 ,
& outBegIdx ,
& outNBElement ,
outReal ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "Div" , "result" , retCode )
return nil
}
return outReal
}
// Max - Highest input value over a rolling window of the last optInTimePeriod bars. A moving-window maximum.
func Max ( inReal [] float64 , optInTimePeriod int ) [] float64 {
var (
startIdx int32
endIdx = int32 ( len ( inReal ) - 1 )
outBegIdx int32
outNBElement int32
outReal = make ([] float64 , len ( inReal ))
)
if retCode := max (
startIdx ,
endIdx ,
inReal ,
int32 ( optInTimePeriod ),
& outBegIdx ,
& outNBElement ,
outReal ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "Max" , "result" , retCode )
return nil
}
return outReal
}
// MaxIndex - Returns the index of the highest input value within a rolling window of optInTimePeriod bars.
// Same as Max but outputs the location instead of the value.
//
// outInteger[i] = argmax_{j in [i-optInTimePeriod+1, i]} inReal[j]
func MaxIndex ( inReal [] float64 , optInTimePeriod int ) [] int32 {
var (
startIdx int32
endIdx = int32 ( len ( inReal ) - 1 )
outBegIdx int32
outNBElement int32
outInteger = make ([] int32 , len ( inReal ))
)
if retCode := maxIndex (
startIdx ,
endIdx ,
inReal ,
int32 ( optInTimePeriod ),
& outBegIdx ,
& outNBElement ,
outInteger ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "MaxIndex" , "result" , retCode )
return nil
}
return outInteger
}
// Min - Rolling minimum: the lowest input value over the trailing period.
//
// outReal[i] = min(inReal[i-optInTimePeriod+1 .. i])
func Min ( inReal [] float64 , optInTimePeriod int ) [] float64 {
var (
startIdx int32
endIdx = int32 ( len ( inReal ) - 1 )
outBegIdx int32
outNBElement int32
outReal = make ([] float64 , len ( inReal ))
)
if retCode := min (
startIdx ,
endIdx ,
inReal ,
int32 ( optInTimePeriod ),
& outBegIdx ,
& outNBElement ,
outReal ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "Min" , "result" , retCode )
return nil
}
return outReal
}
// MinIndex - Returns the absolute index of the lowest value within a rolling window of the given period.
// Same scan as Min but outputs the position of the minimum rather than its value.
//
// outInteger[t] = argmin_{t-period+1 <= i <= t} inReal[i] (absolute index into inReal)
func MinIndex ( inReal [] float64 , optInTimePeriod int ) [] int32 {
var (
startIdx int32
endIdx = int32 ( len ( inReal ) - 1 )
outBegIdx int32
outNBElement int32
outInteger = make ([] int32 , len ( inReal ))
)
if retCode := minIndex (
startIdx ,
endIdx ,
inReal ,
int32 ( optInTimePeriod ),
& outBegIdx ,
& outNBElement ,
outInteger ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "MinIndex" , "result" , retCode )
return nil
}
return outInteger
}
// MinMax - Returns both the lowest and highest values of the input over a rolling window of the last optInTimePeriod bars.
// An overlap-study companion to Min and Max that computes both extrema in one pass.
// @param inReal The input data series.
// @param optInTimePeriod The number of bars (or periods) to look back for the lowest and highest values.
// @return Two slices: the first contains the rolling minimum values, and the second contains the rolling maximum values.
func MinMax ( inReal [] float64 , optInTimePeriod int ) ([] float64 , [] float64 ) {
var (
startIdx int32
endIdx = int32 ( len ( inReal ) - 1 )
outBegIdx int32
outNBElement int32
outMin = make ([] float64 , len ( inReal ))
outMax = make ([] float64 , len ( inReal ))
)
if retCode := minMax (
startIdx ,
endIdx ,
inReal ,
int32 ( optInTimePeriod ),
& outBegIdx ,
& outNBElement ,
outMin ,
outMax ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "MinMax" , "result" , retCode )
return nil , nil
}
return outMin , outMax
}
// MinMaxIndex - Returns the absolute input indices of the lowest and highest values within each rolling window of optInTimePeriod bars. Index variant of MinMax.
//
// For each t: outMaxIdx[t] = argmax_{i in [t-N+1, t]} inReal[i]; outMinIdx[t] = argmin over the same window (N = optInTimePeriod).
func MinMaxIndex ( inReal [] float64 , optInTimePeriod int ) ([] int32 , [] int32 ) {
var (
startIdx int32
endIdx = int32 ( len ( inReal ) - 1 )
outBegIdx int32
outNBElement int32
outMinIndex = make ([] int32 , len ( inReal ))
outMaxIndex = make ([] int32 , len ( inReal ))
)
if retCode := minMaxIndex (
startIdx ,
endIdx ,
inReal ,
int32 ( optInTimePeriod ),
& outBegIdx ,
& outNBElement ,
outMinIndex ,
outMaxIndex ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "MinMaxIndex" , "result" , retCode )
return nil , nil
}
return outMinIndex , outMaxIndex
}
// Mult - Element-wise multiplication of two input series.
// Produces outReal[i] = inReal0[i] * inReal1[i].
func Mult ( inReal0 , inReal1 [] float64 ) [] float64 {
var (
startIdx int32
endIdx = int32 ( len ( inReal0 ) - 1 )
outBegIdx int32
outNBElement int32
outReal = make ([] float64 , len ( inReal0 ))
)
if retCode := mult (
startIdx ,
endIdx ,
inReal0 ,
inReal1 ,
& outBegIdx ,
& outNBElement ,
outReal ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "Mult" , "result" , retCode )
return nil
}
return outReal
}
// Sub - Element-wise vector subtraction of two input series. Outputs inReal0 minus inReal1 at each index.
//
// outReal[i] = inReal0[i] - inReal1[i]
func Sub ( inReal0 , inReal1 [] float64 ) [] float64 {
var (
startIdx int32
endIdx = int32 ( len ( inReal0 ) - 1 )
outBegIdx int32
outNBElement int32
outReal = make ([] float64 , len ( inReal0 ))
)
if retCode := sub (
startIdx ,
endIdx ,
inReal0 ,
inReal1 ,
& outBegIdx ,
& outNBElement ,
outReal ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "Sub" , "result" , retCode )
return nil
}
return outReal
}
// Sum - Rolling sum of the input over a fixed period.
// Each output is the sum of the most recent optInTimePeriod input values.
func Sum ( inReal [] float64 , optInTimePeriod int ) [] float64 {
var (
startIdx int32
endIdx = int32 ( len ( inReal ) - 1 )
outBegIdx int32
outNBElement int32
outReal = make ([] float64 , len ( inReal ))
)
if retCode := sum (
startIdx ,
endIdx ,
inReal ,
int32 ( optInTimePeriod ),
& outBegIdx ,
& outNBElement ,
outReal ,
); SUCCESS != taResult ( retCode ) {
slog . Debug ( "Sum" , "result" , retCode )
return nil
}
return outReal
2026-07-22 15:40:16 +09:00
}