feat: add momentum indicators and expand function coverage

Add a full Momentum Indicators category (momentum_indicators.go) with
26 new wrapped functions:

  ADX, ADXR, APO, AROON, AROONOSC, BOP, CCI, CMO, DX, IMI,
  MACD, MACDEXT, MACDFIX, MFI, MOM, MINUS_DI, MINUS_DM,
  PLUS_DI, PLUS_DM, PPO, ROC, ROCP, ROCR, ROCR100, RSI,
  STOCH, STOCHF, STOCHRSI, TRIX, ULTOSC, WILLR

- Register all new native symbols in Load() (loader.go)
- Declare corresponding native function variables in functions.go
- Add MAType enum (ta_ma_type.go) for MA-type parameters (SMA, EMA,
  WMA, DEMA, TEMA, TRIMA, KAMA, MAMA, T3)
- Add taResult constants (ta_result.go) mirroring TA-Lib return codes
- Each wrapper includes a doc comment with formula, interpretation, and
  known behavioral edge-case notes
This commit is contained in:
2026-07-24 13:37:34 +09:00
parent e77cd88cd9
commit 4b07e7c741
5 changed files with 1529 additions and 1 deletions
+9
View File
@@ -23,6 +23,13 @@ This project currently exposes a small subset of TA-Lib functions:
- Exponential/Logarithmic: `Exp`, `Ln`, `Log10` - Exponential/Logarithmic: `Exp`, `Ln`, `Log10`
- Rounding: `Ceil`, `Floor`, `Sqrt` - Rounding: `Ceil`, `Floor`, `Sqrt`
**Momentum Indicators**
- Directional Movement: `ADX`, `ADXR`, `DX`, `MINUS_DI`, `MINUS_DM`, `PLUS_DI`, `PLUS_DM`
- Oscillators: `APO`, `AROON`, `AROONOSC`, `BOP`, `CCI`, `CMO`, `IMI`, `MFI`, `MOM`, `PPO`, `RSI`, `TRIX`, `WILLR`, `ULTOSC`
- Rate of Change: `ROC`, `ROCP`, `ROCR`, `ROCR100`
- MACD family: `MACD`, `MACDEXT`, `MACDFIX`
- Stochastic family: `STOCH`, `STOCHF`, `STOCHRSI`
## Requirements ## Requirements
- Go `1.26` - Go `1.26`
@@ -107,6 +114,8 @@ func main() {
- Indicator functions return `nil` when the underlying TA-Lib call fails. - Indicator functions return `nil` when the underlying TA-Lib call fails.
- Native TA-Lib functions are exposed with Go-style exported names such as `Add`, `Div`, `Max`, and `Sum`. - Native TA-Lib functions are exposed with Go-style exported names such as `Add`, `Div`, `Max`, and `Sum`.
- Functions accepting a moving-average type use the `MAType` constant (`SMA`, `EMA`, `WMA`, `DEMA`, `TEMA`, `TRIMA`, `KAMA`, `MAMA`, `T3`).
- Functions returning two outputs (e.g. `AROON`, `MACD`, `STOCH`) return multiple slices; all are `nil` on failure.
## Project status ## Project status
+372
View File
@@ -298,4 +298,376 @@ var (
outNBElement *int32, outNBElement *int32,
outReal []float64, outReal []float64,
) int32 ) int32
adx func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
adxr func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
apo func(
startIdx int32,
endIdx int32,
inReal []float64,
optInFastPeriod int32,
optInSlowPeriod int32,
optInMAType int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
aroon func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outAroonDown []float64,
outAroonUp []float64,
) int32
aroonosc func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
bop func(
startIdx int32,
endIdx int32,
inOpen []float64,
inHigh []float64,
inLow []float64,
inClose []float64,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
cci func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
cmo func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
dx func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
imi func(
startIdx int32,
endIdx int32,
inOpen []float64,
inClose []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
macd func(
startIdx int32,
endIdx int32,
inReal []float64,
optInFastPeriod int32,
optInSlowPeriod int32,
optInSignalPeriod int32,
outBegIdx *int32,
outNBElement *int32,
outMACD []float64,
outMACDSignal []float64,
outMACDHist []float64,
) int32
macdext func(
startIdx int32,
endIdx int32,
inReal []float64,
optInFastPeriod int32,
optInFastMAType int32,
optInSlowPeriod int32,
optInSlowMAType int32,
optInSignalPeriod int32,
optInSignalMAType int32,
outBegIdx *int32,
outNBElement *int32,
outMACD []float64,
outMACDSignal []float64,
outMACDHist []float64,
) int32
macdfix func(
startIdx int32,
endIdx int32,
inReal []float64,
optInSignalPeriod int32,
outBegIdx *int32,
outNBElement *int32,
outMACD []float64,
outMACDSignal []float64,
outMACDHist []float64,
) int32
mfi func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
inVolume []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
mom func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
minus_di func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
minus_dm func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
plus_di func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
plus_dm func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
ppo func(
startIdx int32,
endIdx int32,
inReal []float64,
optInFastPeriod int32,
optInSlowPeriod int32,
optInMAType int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
roc func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
rocp func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
rocr func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
rocr100 func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
rsi func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
stoch func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInFastKPeriod int32,
optInSlowKPeriod int32,
optInSlowKMAType int32,
optInSlowDPeriod int32,
optInSlowDMAType int32,
outBegIdx *int32,
outNBElement *int32,
outSlowK []float64,
outSlowD []float64,
) int32
stochf func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInFastKPeriod int32,
optInFastDPeriod int32,
optInFastDMAType int32,
outBegIdx *int32,
outNBElement *int32,
outFastK []float64,
outFastD []float64,
) int32
stochrsi func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
optInFastKPeriod int32,
optInFastDPeriod int32,
optInFastDMAType int32,
outBegIdx *int32,
outNBElement *int32,
outFastK []float64,
outFastD []float64,
) int32
trix func(
startIdx int32,
endIdx int32,
inReal []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
ultosc func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInTimePeriod1 int32,
optInTimePeriod2 int32,
optInTimePeriod3 int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
willr func(
startIdx int32,
endIdx int32,
inHigh []float64,
inLow []float64,
inClose []float64,
optInTimePeriod int32,
outBegIdx *int32,
outNBElement *int32,
outReal []float64,
) int32
) )
+33 -1
View File
@@ -56,13 +56,45 @@ func Load() (uintptr, error) {
purego.RegisterLibFunc(&tanh, ptr, "TA_TANH") purego.RegisterLibFunc(&tanh, ptr, "TA_TANH")
purego.RegisterLibFunc(&ceil, ptr, "TA_CEIL") purego.RegisterLibFunc(&ceil, ptr, "TA_CEIL")
purego.RegisterLibFunc(&exp, ptr, "TA_EXP")
purego.RegisterLibFunc(&floor, ptr, "TA_FLOOR") purego.RegisterLibFunc(&floor, ptr, "TA_FLOOR")
purego.RegisterLibFunc(&sqrt, ptr, "TA_SQRT") purego.RegisterLibFunc(&sqrt, ptr, "TA_SQRT")
purego.RegisterLibFunc(&exp, ptr, "TA_EXP")
purego.RegisterLibFunc(&ln, ptr, "TA_LN") purego.RegisterLibFunc(&ln, ptr, "TA_LN")
purego.RegisterLibFunc(&log10, ptr, "TA_LOG10") purego.RegisterLibFunc(&log10, ptr, "TA_LOG10")
purego.RegisterLibFunc(&adx, ptr, "TA_ADX")
purego.RegisterLibFunc(&adxr, ptr, "TA_ADXR")
purego.RegisterLibFunc(&apo, ptr, "TA_APO")
purego.RegisterLibFunc(&aroon, ptr, "TA_AROON")
purego.RegisterLibFunc(&aroonosc, ptr, "TA_AROONOSC")
purego.RegisterLibFunc(&bop, ptr, "TA_BOP")
purego.RegisterLibFunc(&cci, ptr, "TA_CCI")
purego.RegisterLibFunc(&cmo, ptr, "TA_CMO")
purego.RegisterLibFunc(&dx, ptr, "TA_DX")
purego.RegisterLibFunc(&imi, ptr, "TA_IMI")
purego.RegisterLibFunc(&macd, ptr, "TA_MACD")
purego.RegisterLibFunc(&macdext, ptr, "TA_MACDEXT")
purego.RegisterLibFunc(&macdfix, ptr, "TA_MACDFIX")
purego.RegisterLibFunc(&mfi, ptr, "TA_MFI")
purego.RegisterLibFunc(&mom, ptr, "TA_MOM")
purego.RegisterLibFunc(&minus_di, ptr, "TA_MINUS_DI")
purego.RegisterLibFunc(&minus_dm, ptr, "TA_MINUS_DM")
purego.RegisterLibFunc(&plus_di, ptr, "TA_PLUS_DI")
purego.RegisterLibFunc(&plus_dm, ptr, "TA_PLUS_DM")
purego.RegisterLibFunc(&ppo, ptr, "TA_PPO")
purego.RegisterLibFunc(&roc, ptr, "TA_ROC")
purego.RegisterLibFunc(&rocp, ptr, "TA_ROCP")
purego.RegisterLibFunc(&rocr, ptr, "TA_ROCR")
purego.RegisterLibFunc(&rocr100, ptr, "TA_ROCR100")
purego.RegisterLibFunc(&rsi, ptr, "TA_RSI")
purego.RegisterLibFunc(&stoch, ptr, "TA_STOCH")
purego.RegisterLibFunc(&stochf, ptr, "TA_STOCHF")
purego.RegisterLibFunc(&stochrsi, ptr, "TA_STOCHRSI")
purego.RegisterLibFunc(&trix, ptr, "TA_TRIX")
purego.RegisterLibFunc(&ultosc, ptr, "TA_ULTOSC")
purego.RegisterLibFunc(&willr, ptr, "TA_WILLR")
return ptr, nil return ptr, nil
} }
File diff suppressed because it is too large Load Diff
+15
View File
@@ -0,0 +1,15 @@
package talib
type MAType int32
const (
SMA MAType = 0 // Simple Moving Average
EMA MAType = 1 // Exponential Moving Average
WMA MAType = 2 // Weighted Moving Average
DEMA MAType = 3 // Double Exponential Moving Average
TEMA MAType = 4 // Triple Exponential Moving Average
TRIMA MAType = 5 // Triangular Moving Average
KAMA MAType = 6 // Kaufman Adaptive Moving Average
MAMA MAType = 7 // MESA Adaptive Moving Average
T3 MAType = 8 // Triple Exponential Moving Average (T3)
)