feat: add MyTT.pyi type stubs, enable strict mypy

- Create type stub file for 50+ MyTT indicator functions
- Covers all 31 functions used in the project + common utilities
- Remove mypy disallow_untyped_defs/calls override for MyTT
- MyTT now covered by strict mypy via .pyi stubs
This commit is contained in:
Justin Gu
2026-06-11 02:29:47 +08:00
parent f4dc28c5d2
commit fa5bd2d44d
2 changed files with 106 additions and 2 deletions
+1 -2
View File
@@ -29,8 +29,7 @@ ignore_missing_imports = true
[[tool.mypy.overrides]] [[tool.mypy.overrides]]
module = "easy_tdx.MyTT" module = "easy_tdx.MyTT"
disallow_untyped_defs = false # Type stubs provided via MyTT.pyi — keep strict checks enabled
disallow_untyped_calls = false
[tool.ruff] [tool.ruff]
target-version = "py310" target-version = "py310"
+105
View File
@@ -0,0 +1,105 @@
"""Type stubs for MyTT technical indicator library.
Provides type annotations for the MyTT functions used in easy_tdx.
All indicator functions accept numpy arrays and return numpy arrays.
"""
from __future__ import annotations
import numpy as np
import numpy.typing as npt
NDArray = npt.NDArray[np.float64]
# ── Moving Averages ──────────────────────────────────────────────────────────
def MA(S: npt.ArrayLike, N: int) -> NDArray: ...
def EMA(S: npt.ArrayLike, N: int) -> NDArray: ...
def SMA(S: npt.ArrayLike, N: int, M: int = ...) -> NDArray: ...
def WMA(S: npt.ArrayLike, N: int) -> NDArray: ...
def DMA(S: npt.ArrayLike, A: npt.ArrayLike) -> NDArray: ...
# ── MACD / Momentum ─────────────────────────────────────────────────────────
def MACD(
CLOSE: npt.ArrayLike,
LOW: npt.ArrayLike,
HIGH: npt.ArrayLike,
SHORT: int = ...,
LONG: int = ...,
M: int = ...,
) -> tuple[NDArray, NDArray, NDArray]: ...
def RSI(CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
def MTM(CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
def ROC(CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
def OBV(CLOSE: npt.ArrayLike, VOL: npt.ArrayLike) -> NDArray: ...
# ── Bollinger / Envelope ────────────────────────────────────────────────────
def BOLL(
CLOSE: npt.ArrayLike,
N: int = ...,
P: float = ...,
) -> tuple[NDArray, NDArray, NDArray]: ...
# ── Trend Indicators ────────────────────────────────────────────────────────
def ATR(CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, N: int = ...) -> NDArray: ...
def DMI(
CLOSE: npt.ArrayLike,
HIGH: npt.ArrayLike,
LOW: npt.ArrayLike,
M: int = ...,
N: int = ...,
) -> tuple[NDArray, NDArray, NDArray, NDArray]: ...
def KDJ(
CLOSE: npt.ArrayLike,
HIGH: npt.ArrayLike,
LOW: npt.ArrayLike,
N: int = ...,
M1: int = ...,
M2: int = ...,
) -> tuple[NDArray, NDArray, NDArray]: ...
def WR(CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, N: int = ...) -> NDArray: ...
def CCI(CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, N: int = ...) -> NDArray: ...
def TRIX(CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
# ── Volume Indicators ───────────────────────────────────────────────────────
def VR(
CLOSE: npt.ArrayLike,
VOL: npt.ArrayLike,
N: int = ...,
) -> NDArray: ...
def MFI(CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, VOL: npt.ArrayLike, N: int = ...) -> NDArray: ...
def EMV(HIGH: npt.ArrayLike, LOW: npt.ArrayLike, VOL: npt.ArrayLike, N: int = ...) -> NDArray: ...
# ── Other Indicators ────────────────────────────────────────────────────────
def ASI(CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, OPEN: npt.ArrayLike, N: int = ...) -> NDArray: ...
def BBI(CLOSE: npt.ArrayLike, N1: int = ..., N2: int = ..., N3: int = ..., N4: int = ...) -> NDArray: ...
def BIAS(CLOSE: npt.ArrayLike, N1: int = ..., N2: int = ..., N3: int = ...) -> tuple[NDArray, NDArray, NDArray]: ...
def BIAS_SIGNAL(CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
def BRAR(OPEN: npt.ArrayLike, CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, N: int = ...) -> tuple[NDArray, NDArray]: ...
def CR(HIGH: npt.ArrayLike, LOW: npt.ArrayLike, CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
def DFMA(CLOSE: npt.ArrayLike, N1: int = ..., N2: int = ...) -> tuple[NDArray, NDArray]: ...
def DPO(CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
def EXPMA(CLOSE: npt.ArrayLike, N1: int = ..., N2: int = ...) -> tuple[NDArray, NDArray]: ...
def KTN(CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, N: int = ..., M: int = ...) -> tuple[NDArray, NDArray, NDArray]: ...
def MASS(HIGH: npt.ArrayLike, LOW: npt.ArrayLike, N1: int = ..., N2: int = ...) -> NDArray: ...
def PSY(CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
def TAQ(CLOSE: npt.ArrayLike, N: int = ...) -> NDArray: ...
def XSII(CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, N: int = ...) -> NDArray: ...
def ZHUOYAO(CLOSE: npt.ArrayLike, HIGH: npt.ArrayLike, LOW: npt.ArrayLike, VOL: npt.ArrayLike) -> NDArray: ...
# ── Utility Functions ────────────────────────────────────────────────────────
def CROSS(A: npt.ArrayLike, B: npt.ArrayLike) -> NDArray: ...
def HHV(S: npt.ArrayLike, N: int) -> NDArray: ...
def LLV(S: npt.ArrayLike, N: int) -> NDArray: ...
def REF(S: npt.ArrayLike, N: int) -> NDArray: ...
def SUM(S: npt.ArrayLike, N: int) -> NDArray: ...
def COUNT(S: npt.ArrayLike, N: int) -> NDArray: ...
def STD(S: npt.ArrayLike, N: int) -> NDArray: ...