moontalib

    TA-Lib-style technical analysis indicator library for MoonBit

    moonbit
    finance
    trading
    technical-analysis
    indicators
    Download zip
    Author
    Version
    0.5.0
    License
    Apache-2.0
    Last updated
    9 minutes ago
    Downloads
    13

    No dependencies

    #moontalib

    CI

    moontalib 是 MoonBit 的技术分析指标库 —— 一个 TA-Lib 风格的工具箱,用于处理股票与加密货币的 OHLCV 行情数据。纯 MoonBit 实现,零第三方依赖,原生 / WASM / JS 三后端可用。

    TA-Lib-style technical analysis indicator library for MoonBit. Pure MoonBit, zero third-party dependencies, works on native / wasm / js backends.

    #为什么需要它

    MoonBit 生态里已经有了行情数据、图表库(moonchart 等)和事件驱动回测引擎 (moon-certified/finance/backtest 的 QuantStart/Zipline 风格实现),唯独缺 少中间这一层"行情 → 指标"的纯函数计算库。Zipline 的标准搭档正是 TA-Lib —— moontalib 补上的就是这块拼图。

    • 指标公式全部有据可依:语义对齐 TA-Lib(SMA 种子 EMA、Wilder 平滑、 总体标准差、0.015 常数 CCI 等),可与其他生态的实现逐值对拍;
    • 全库 65 个单元测试:每个指标都有手工推演的 golden 值,外加 "MACD = EMA(fast) − EMA(slow)"式的交叉不变量校验;
    • moon check 零警告:错误处理采用 MoonBit 2026 惯用的 -> T raise TaError 风格,pub(all) 构造可见性、suberror 错误类型。

    #指标清单(v0.5,53 个公开函数)

    #overlap —— 均线与通道

    函数lookback说明
    sman−1简单移动平均
    ema / ema_fromn−1指数移动平均(前 n 个值的 SMA 作种子,TA-Lib 约定)
    wman−1线性加权移动平均(最新一根权重 n)
    hman+⌊√n⌋−2Hull 移动平均
    dema2(n−1)双重指数移动平均
    tema3(n−1)三重指数移动平均
    bbandsn−1布林带(总体标准差,上/中/下轨)
    vwman−1成交量加权移动平均
    midpointn−1滚动中点价:(max + min) / 2
    midpricen−1K 线滚动中点价:(最高价 + 最低价) / 2
    moving_average—SMA/EMA 选择器(APO/PPO 共用)

    #momentum —— 动量与摆动指标

    函数lookback说明
    rsin相对强弱指数(Wilder 平滑)
    macd(slow−1)+(signal−1)MACD 线 / 信号线 / 柱状图
    rocn变动率(百分比)
    momn动量
    cmonChande 动量振荡器
    willrn−1威廉 %R
    stoch / stochf(p−1)+(ks−1)+(d−1)随机指标(慢速 / 快速)
    ccin−1顺势指标(0.015 归一化常数)
    trix3(n−1)+1三重 EMA 的百分比变动率
    adx2n−1平均趋向指数(同时返回 +DI / −DI)
    apo / pposlow−1绝对 / 百分比价格振荡器
    ultoscp3终极振荡器(三周期 4:2:1 加权,默认 7/14/28)
    bop0平衡量:(close − open) / (high − low)
    aroonn阿隆指标(窗口 period+1 根含当前 K 线;并列极值取最近者)
    aroonoscn阿隆振荡线:up − down
    dxn动向指数 DX:ADX 平滑前的原始比率

    #volume —— 成交量指标

    函数lookback说明
    obv0能量潮(OBV)
    mfin资金流量指标(MFI)
    ad0Chaikin 集散线(A/D Line)
    adoscslow−1Chaikin A/D 振荡器

    #volatility —— 波动率

    函数lookback说明
    tr_range0每根 K 线的真实波幅
    atrn真实波幅均值(Wilder 平滑)
    natrn归一化 ATR(占收盘价百分比)
    stddev / variancen−1滚动总体标准差 / 方差

    #statistic —— 价格变换与滚动工具

    函数lookback说明
    avg_price / med_price / typ_price / wcl_price0四种经典价格变换
    max / min / sumn−1滚动窗口最大 / 最小 / 求和
    linearreg_slope / linearreg_interceptn−1滚动最小二乘的斜率 / 截距
    linearreg / linearreg_angle / tsfn−1回归端点 / 斜率角度(度) / 前瞻一期预测
    correln−1滚动皮尔逊相关系数(双序列,-1..+1)
    minmaxn−1滚动极值对(min + max 一次返回)
    avgdevn−1滚动平均绝对偏差

    每个指标都配有 xxx_lookback 辅助函数,返回输出的前导 NaN 个数(adx 等复合指标除外,见各函数文档)。

    #安装

    # 已发布到 mooncakes 后(把 yiii0012 换成发布者 ID) moon add yiii0012/moontalib

    或直接在 moon.mod 中声明依赖后运行 moon update。

    #快速开始

    import {
    "yiii0012/moontalib",
    "yiii0012/moontalib/base",
    }

    /// 所有不可恢复的输入问题都会以 `TaError` 抛出,
    /// 可在任意 raise 上下文中直接调用。
    fn analyze(candles : @base.Candles) -> Unit raise @base.TaError {
    let closes = candles.close
    let sma20 = @moontalib.sma(closes, 20)
    let rsi14 = @moontalib.rsi(closes, 14)
    let bb = @moontalib.bbands(closes, 20, ndev=2.0)
    let macd = @moontalib.macd(closes, 12, 26, 9)
    // 所有输出与输入等长;前 lookback 个位置是 NaN
    let last = closes.length() - 1
    println("close=\{closes[last]} sma20=\{sma20[last]} rsi=\{rsi14[last]}")
    println("bb.upper=\{bb.upper[last]} macd.hist=\{macd.hist[last]}")
    }

    运行完整演示(120 根合成 K 线,9 个指标的固定宽度表格):

    moon run cmd/demo

    #测试

    moon check # 类型检查,零警告 moon test # 65 个单元测试(golden 值 + 交叉不变量)

    #语义约定

    1. 输出与输入等长。指标输出数组的长度恒等于输入长度。
    2. 前导 NaN(lookback)。数据不足前导窗口的位置一律为 NaN; 每个指标提供 xxx_lookback 查询这个长度。
    3. 窗口内 NaN 即 NaN。某个窗口只要含 NaN,该位置的输出就是 NaN (pandas 滚动语义);递归型指标(EMA 链、RSI、ATR、ADX)中 NaN 会 向后传播。
    4. 错误用 raise 表达。空输入 → EmptyInput;周期 ≤ 0 → InvalidPeriod;周期 > 输入长度 → NotEnoughData;Candles 列长度 不一致 → MismatchedLength。除这些显式错误外,指标对"数据刚够"的 情形是宽容的(全 NaN 输出而非报错)。
    5. EMA 以 SMA 为种子(TA-Lib 约定);RSI / ATR / ADX 用 Wilder 平滑;stddev / variance 用总体标准差(分母 n);CCI 用 0.015 归一化常数。平坦窗口的规则在各函数文档中逐个写明(如随机指标 hh==ll 读 0、WILLR 由 %R = %K − 100 恒等式得 −100)。

    #架构

    moontalib/ ├── moontalib.mbt 门面:import 一次拿到全部指标(@moontalib.sma 等) ├── base/ Candle/Candles 数据模型、TaError、NaN 与校验原语 ├── overlap/ 均线族(SMA/EMA/WMA/HMA/DEMA/TEMA/BBANDS/VWMA) ├── momentum/ 动量族(RSI/MACD/STOCH/CCI/ADX/TRIX/...) ├── volume/ 成交量族(OBV/MFI/AD/ADOSC) ├── volatility/ 波动率族(ATR/NATR/STDDEV/VARIANCE/TRANGE) ├── statistic/ 价格变换与滚动工具 └── cmd/demo/ 可运行示例(moon run cmd/demo)

    依赖方向:base ← overlap ← momentum;base ← volume/volatility/statistic; 门面聚合全部子包,无循环依赖。

    #路线图

    #发布

    moon login # 填入 mooncakes.io 的 token moon publish # 首次发布前先把 yiii0012 替换成你的 mooncakes 用户名

    #License

    Apache-2.0

    Chaikin Accumulation/Distribution Line.

    adosc

    fn adosc(candles :
    Candles
    , fast_period : Int, slow_period : Int) -> Array[Double] raise
    TaError

    Chaikin A/D Oscillator: EMA(fast) - EMA(slow) of the A/D line.

    adx

    Average Directional Index with +DI / -DI (Wilder).

    apo

    fn apo(data : Array[Double], fast_period : Int, slow_period : Int, ma_type~ :
    MAType
    ) -> Array[Double] raise
    TaError

    Absolute Price Oscillator: fast_MA - slow_MA.

    aroonosc

    fn aroonosc(candles :
    Candles
    , period : Int) -> Array[Double] raise
    TaError

    Aroon Oscillator: up - down, ranges from -100 to +100.

    atr

    Average True Range (Wilder smoothing).

    avg_price

    Average price: (open + high + low + close) / 4.

    avgdev

    fn avgdev(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Mean absolute deviation over a rolling window.

    bbands

    fn bbands(data : Array[Double], period : Int, ndev~ : Double) ->
    BBands
    raise
    TaError

    Bollinger Bands (population standard deviation over the window).

    bop

    Balance of Power: (close - open) / (high - low).

    cci

    Commodity Channel Index.

    cmo

    fn cmo(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Chande Momentum Oscillator.

    correl

    fn correl(data1 : Array[Double], data2 : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Rolling Pearson correlation between two series, ranging from -1 to +1.

    dema

    fn dema(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Double exponential moving average.

    Directional Movement Index (DX): the raw ratio that smooths.

    ema

    fn ema(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Exponential moving average (SMA-seeded, TA-Lib convention).

    ema_from

    fn ema_from(data : Array[Double], period : Int, first_valid : Int) -> Array[Double]

    EMA over a series that only becomes valid at first_valid.

    hma

    fn hma(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Hull moving average.

    linearreg

    fn linearreg(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Linear regression endpoint: the fitted value at the current bar.

    linearreg_angle

    fn linearreg_angle(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Linear regression angle in degrees: atan(slope) converted from radians.

    linearreg_intercept

    fn linearreg_intercept(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Least-squares intercept over a rolling window, defined at bar offset 0.

    linearreg_slope

    fn linearreg_slope(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Least-squares slope over a rolling window.

    macd

    fn macd(data : Array[Double], fast_period : Int, slow_period : Int, signal_period : Int) ->
    Macd
    raise
    TaError

    Moving Average Convergence/Divergence with signal line and histogram.

    max

    fn max(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Rolling maximum over a window.

    med_price

    Median price: (high + low) / 2.

    mfi

    Money Flow Index.

    midpoint

    fn midpoint(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Midpoint over a rolling window: (max + min) / 2.

    midprice

    fn midprice(candles :
    Candles
    , period : Int) -> Array[Double] raise
    TaError

    Midprice over a rolling candle window: (highest_high + lowest_low) / 2.

    min

    fn min(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Rolling minimum over a window.

    minmax

    Rolling minimum and maximum over a window, in one result.

    mom

    fn mom(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Momentum: close[i] - close[i - period].

    moving_average

    fn moving_average(data : Array[Double], period : Int, ma_type~ :
    MAType
    ) -> Array[Double] raise
    TaError

    Moving average with a selectable flavor (SMA or EMA).

    natr

    Normalized ATR: 100 * ATR / close.

    ppo

    fn ppo(data : Array[Double], fast_period : Int, slow_period : Int, ma_type~ :
    MAType
    ) -> Array[Double] raise
    TaError

    Percentage Price Oscillator: 100 * (fast_MA - slow_MA) / slow_MA.

    roc

    fn roc(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Rate of change in percent over period bars.

    rsi

    fn rsi(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Relative Strength Index (Wilder smoothing).

    sma

    fn sma(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Simple moving average. See overlap/ma for semantics.

    stddev

    fn stddev(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Population standard deviation over a rolling window.

    stoch

    fn stoch(candles :
    Candles
    , period : Int, k_slowing~ : Int, d_period~ : Int) ->
    Stoch
    raise
    TaError

    Stochastic Oscillator (slowed %K, %D = SMA of %K).

    stochf

    Fast Stochastic: raw %K and its SMA (%D) without slowing.

    sum

    fn sum(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Rolling sum over a window.

    tema

    fn tema(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Triple exponential moving average.

    tr_range

    True range per bar (tr_range[i] matches base.true_range(candles, i)).

    trix

    fn trix(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    TRIX: percent rate of change of a triple-EMA.

    tsf

    fn tsf(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Time series forecast: the regression value one bar beyond the current one.

    typ_price

    Typical price: (high + low + close) / 3.

    ultosc

    fn ultosc(candles :
    Candles
    , p1~ : Int, p2~ : Int, p3~ : Int) -> Array[Double] raise
    TaError

    Ultimate Oscillator: 100 * (4*avg1 + 2*avg2 + avg3) / 7 over three buying-pressure ratios (defaults 7 / 14 / 28).

    variance

    fn variance(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Population variance over a rolling window.

    vwma

    fn vwma(price : Array[Double], volume : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Volume-weighted moving average of price weighted by volume.

    wcl_price

    Weighted close price: (high + low + 2 * close) / 4.

    willr

    Williams %R.

    wma

    fn wma(data : Array[Double], period : Int) -> Array[Double] raise
    TaError

    Weighted moving average (most recent bar weighted by period).

    Source Files