fix: resolve build and test errors

- Sar.Quantower.Tests.cs: add missing opening quote on string literal (line 48)
- Exports.cs: rename Correlation.Batch → Correl.Batch (CS0103)
- Ad.Validation.Tests.cs: fix Ooples OutputValues key "Ad" → "Adl"
This commit is contained in:
Miha Kralj
2026-03-16 12:45:13 -07:00
parent 3b0cdca567
commit 6f0a339c9b
131 changed files with 1570 additions and 1571 deletions
+9 -9
View File
@@ -110,7 +110,7 @@ HAS_CCI = _bind("qtl_cci", [_dp, _dp, _dp, _dp, _dp, _ci, _ci, _dp])
HAS_MACD = _bind("qtl_macd", [_dp, _dp, _ci, _ci, _ci])
HAS_PMO = _bind("qtl_pmo", [_dp, _dp, _ci, _ci, _ci, _ci])
HAS_PPO = _bind("qtl_ppo", [_dp, _dp, _ci, _ci, _ci])
HAS_PRS = _bind("qtl_prs", [_dp, _dp, _dp, _ci, _ci])
HAS_RS = _bind("qtl_rs", [_dp, _dp, _dp, _ci, _ci])
HAS_ROCP = _bind("qtl_rocp", [_dp, _dp, _ci, _ci])
HAS_ROCR = _bind("qtl_rocr", [_dp, _dp, _ci, _ci])
HAS_SAM = _bind("qtl_sam", [_dp, _dp, _ci, _cd, _ci])
@@ -168,7 +168,7 @@ HAS_RWMA = _bind("qtl_rwma", [_dp, _dp, _dp, _dp, _ci, _ci])
HAS_ADXVMA = _bind("qtl_adxvma", [_dp, _dp, _dp, _dp, _dp, _ci, _ci, _dp])
HAS_FRAMA = _bind("qtl_frama", [_dp, _dp, _dp, _ci, _ci])
HAS_HOLT = _bind("qtl_holt", [_dp, _dp, _ci, _ci, _cd])
HAS_HTIT = _bind("qtl_htit", [_dp, _dp, _ci])
HAS_HT_TRENDLINE = _bind("qtl_httrendline", [_dp, _dp, _ci])
HAS_HWMA = _bind("qtl_hwma", [_dp, _dp, _ci, _ci])
HAS_JMA = _bind("qtl_jma", [_dp, _dp, _ci, _ci, _ci])
HAS_KAMA = _bind("qtl_kama", [_dp, _dp, _ci, _ci, _ci, _ci])
@@ -197,14 +197,14 @@ HAS_ZLTEMA = _bind("qtl_zltema", [_dp, _dp, _ci, _ci])
# ═══════════════════════════════════════════════════════════════════════════
HAS_ACCBANDS = _bind("qtl_accbands", [_dp, _dp, _dp, _dp, _dp, _dp, _ci, _ci, _cd])
HAS_APZ = _bind("qtl_apz", [_dp, _dp, _dp, _dp, _dp, _ci, _cd, _ci, _dp, _dp, _dp])
HAS_DCHANNEL = _bind("qtl_dchannel", [_dp, _dp, _dp, _dp, _dp, _ci, _ci])
HAS_DC = _bind("qtl_dc", [_dp, _dp, _dp, _dp, _dp, _ci, _ci])
HAS_DECAYCHANNEL = _bind("qtl_decaychannel", [_dp, _dp, _dp, _dp, _dp, _ci, _ci])
HAS_FCB = _bind("qtl_fcb", [_dp, _dp, _dp, _dp, _dp, _ci, _ci])
HAS_JBANDS = _bind("qtl_jbands", [_dp, _dp, _dp, _dp, _ci, _ci, _ci])
HAS_KCHANNEL = _bind("qtl_kchannel", [_dp, _dp, _dp, _dp, _dp, _dp, _ci, _ci, _cd])
HAS_KC = _bind("qtl_kc", [_dp, _dp, _dp, _dp, _dp, _dp, _ci, _ci, _cd])
HAS_MAENV = _bind("qtl_maenv", [_dp, _dp, _dp, _dp, _ci, _ci, _cd, _ci])
HAS_MMCHANNEL = _bind("qtl_mmchannel", [_dp, _dp, _dp, _dp, _ci, _ci])
HAS_PCHANNEL = _bind("qtl_pchannel", [_dp, _dp, _dp, _dp, _dp, _ci, _ci])
HAS_PC = _bind("qtl_pc", [_dp, _dp, _dp, _dp, _dp, _ci, _ci])
HAS_REGCHANNEL = _bind("qtl_regchannel", [_dp, _dp, _dp, _dp, _ci, _ci, _cd])
HAS_SDCHANNEL = _bind("qtl_sdchannel", [_dp, _dp, _dp, _dp, _ci, _ci, _cd])
HAS_STARCHANNEL = _bind("qtl_starchannel", [_dp, _dp, _dp, _dp, _dp, _dp, _ci, _ci, _cd, _ci])
@@ -239,7 +239,7 @@ HAS_YZV = _bind("qtl_yzv", [_dp, _dp, _dp, _dp, _dp, _ci, _ci])
# ═══════════════════════════════════════════════════════════════════════════
# Volume
# ═══════════════════════════════════════════════════════════════════════════
HAS_ADL = _bind("qtl_adl", [_dp, _dp, _dp, _dp, _dp, _ci])
HAS_AD = _bind("qtl_ad", [_dp, _dp, _dp, _dp, _dp, _ci])
HAS_ADOSC = _bind("qtl_adosc", [_dp, _dp, _dp, _dp, _dp, _ci, _ci, _ci])
HAS_III = _bind("qtl_iii", [_dp, _dp, _dp, _dp, _dp, _ci, _ci, _ci])
HAS_KVO = _bind("qtl_kvo", [_dp, _dp, _dp, _dp, _dp, _dp, _ci, _ci, _ci, _ci])
@@ -408,7 +408,7 @@ HAS_PIVOTDEM = _bind("qtl_pivotdem", [_dp, _dp, _dp, _dp, _dp, _ci])
HAS_PIVOTEXT = _bind("qtl_pivotext", [_dp, _dp, _dp, _dp, _ci])
HAS_PIVOTFIB = _bind("qtl_pivotfib", [_dp, _dp, _dp, _dp, _ci])
HAS_PIVOTWOOD = _bind("qtl_pivotwood", [_dp, _dp, _dp, _dp, _ci])
HAS_PSAR = _bind("qtl_psar", [_dp, _dp, _dp, _dp, _dp, _ci, _cd, _cd, _cd])
HAS_SAR = _bind("qtl_sar", [_dp, _dp, _dp, _dp, _dp, _ci, _cd, _cd, _cd])
HAS_SWINGS = _bind("qtl_swings", [_dp, _dp, _dp, _dp, _ci, _ci])
HAS_TTMSCALPER = _bind("qtl_ttmscalper", [_dp, _dp, _dp, _dp, _dp, _ci, _ci])
@@ -440,7 +440,7 @@ HAS_KRI = _bind("qtl_kri", [_dp, _ci, _dp, _ci])
HAS_PSL = _bind("qtl_psl", [_dp, _ci, _dp, _ci])
HAS_DECO = _bind("qtl_deco", [_dp, _ci, _dp, _ci, _ci])
HAS_DOSC = _bind("qtl_dosc", [_dp, _ci, _dp, _ci, _ci, _ci, _ci])
HAS_DYMOI = _bind("qtl_dymoi", [_dp, _ci, _dp, _ci, _ci, _ci, _ci, _ci])
HAS_DYMI = _bind("qtl_dymi", [_dp, _ci, _dp, _ci, _ci, _ci, _ci, _ci])
HAS_CRSI = _bind("qtl_crsi", [_dp, _ci, _dp, _ci, _ci, _ci])
HAS_BBB = _bind("qtl_bbb", [_dp, _ci, _dp, _ci, _cd])
HAS_BBI = _bind("qtl_bbi", [_dp, _ci, _dp, _ci, _ci, _ci, _ci])
@@ -526,7 +526,7 @@ HAS_PVO = _bind("qtl_pvo", [_dp, _ci, _dp, _dp, _dp, _ci, _ci, _ci])
HAS_ZSCORE = _bind("qtl_zscore", [_dp, _ci, _dp, _ci])
HAS_CMA = _bind("qtl_cma", [_dp, _ci, _dp])
HAS_ENTROPY = _bind("qtl_entropy", [_dp, _ci, _dp, _ci])
HAS_CORRELATION = _bind("qtl_correlation", [_dp, _dp, _ci, _dp, _ci])
HAS_CORREL = _bind("qtl_correl", [_dp, _dp, _ci, _dp, _ci])
HAS_COVARIANCE = _bind("qtl_covariance", [_dp, _dp, _ci, _dp, _ci, _ci])
HAS_COINTEGRATION = _bind("qtl_cointegration", [_dp, _dp, _ci, _dp, _ci])
+9 -9
View File
@@ -14,14 +14,14 @@ __all__ = [
"apz",
"atrbands",
"bbands",
"dchannel",
"dc",
"decaychannel",
"fcb",
"jbands",
"kchannel",
"kc",
"maenv",
"mmchannel",
"pchannel",
"pc",
"regchannel",
"sdchannel",
"starchannel",
@@ -77,7 +77,7 @@ def apz(open: object, high: object, low: object, close: object, volume: object,
return _wrap_multi({"dstMiddle": dstMiddle, "dstUpper": dstUpper, "dstLower": dstLower}, idx, "channels", offset)
def dchannel(high: object, low: object, period: int = 14, offset: int = 0, **kwargs) -> object:
def dc(high: object, low: object, period: int = 14, offset: int = 0, **kwargs) -> object:
"""Donchian Channel."""
period = int(kwargs.get("length", period))
offset = int(offset)
@@ -86,7 +86,7 @@ def dchannel(high: object, low: object, period: int = 14, offset: int = 0, **kwa
middle = _out(n)
upper = _out(n)
lower = _out(n)
_check(_lib.qtl_dchannel(_ptr(h), _ptr(l), _ptr(middle), _ptr(upper), _ptr(lower), n, period))
_check(_lib.qtl_dc(_ptr(h), _ptr(l), _ptr(middle), _ptr(upper), _ptr(lower), n, period))
return _wrap_multi({"middle": middle, "upper": upper, "lower": lower}, idx, "channels", offset)
@@ -130,7 +130,7 @@ def jbands(close: object, period: int = 14, phase: int = 0, offset: int = 0, **k
return _wrap_multi({"middle": middle, "upper": upper, "lower": lower}, idx, "channels", offset)
def kchannel(high: object, low: object, close: object, period: int = 14, multiplier: float = 2.0, offset: int = 0, **kwargs) -> object:
def kc(high: object, low: object, close: object, period: int = 14, multiplier: float = 2.0, offset: int = 0, **kwargs) -> object:
"""Keltner Channel."""
period = int(kwargs.get("length", period))
multiplier = float(multiplier)
@@ -140,7 +140,7 @@ def kchannel(high: object, low: object, close: object, period: int = 14, multipl
middle = _out(n)
upper = _out(n)
lower = _out(n)
_check(_lib.qtl_kchannel(_ptr(h), _ptr(l), _ptr(c), _ptr(middle), _ptr(upper), _ptr(lower), n, period, multiplier))
_check(_lib.qtl_kc(_ptr(h), _ptr(l), _ptr(c), _ptr(middle), _ptr(upper), _ptr(lower), n, period, multiplier))
return _wrap_multi({"middle": middle, "upper": upper, "lower": lower}, idx, "channels", offset)
@@ -171,7 +171,7 @@ def mmchannel(high: object, low: object, period: int = 14, offset: int = 0, **kw
return _wrap_multi({"upper": upper, "lower": lower}, idx, "channels", offset)
def pchannel(high: object, low: object, period: int = 14, offset: int = 0, **kwargs) -> object:
def pc(high: object, low: object, period: int = 14, offset: int = 0, **kwargs) -> object:
"""Price Channel."""
period = int(kwargs.get("length", period))
offset = int(offset)
@@ -180,7 +180,7 @@ def pchannel(high: object, low: object, period: int = 14, offset: int = 0, **kwa
middle = _out(n)
upper = _out(n)
lower = _out(n)
_check(_lib.qtl_pchannel(_ptr(h), _ptr(l), _ptr(middle), _ptr(upper), _ptr(lower), n, period))
_check(_lib.qtl_pc(_ptr(h), _ptr(l), _ptr(middle), _ptr(upper), _ptr(lower), n, period))
return _wrap_multi({"middle": middle, "upper": upper, "lower": lower}, idx, "channels", offset)
+2 -2
View File
@@ -14,8 +14,8 @@ Category submodules:
quantalib.momentum RSI, MACD, ROC, MOM, etc.
quantalib.numerics FFT, sigmoid, slope, distributions, etc.
quantalib.oscillators Stochastic, Fisher, Williams %R, etc.
quantalib.reversals Pivot points, PSAR, fractals, etc.
quantalib.statistics Z-score, correlation, linreg, etc.
quantalib.reversals Pivot points, SAR, fractals, etc.
quantalib.statistics Z-score, correl, linreg, etc.
quantalib.trends_fir SMA, WMA, HMA, ALMA, etc.
quantalib.trends_iir EMA, DEMA, TEMA, JMA, KAMA, etc.
quantalib.volatility ATR, TR, Bollinger Width, etc.
+4 -4
View File
@@ -13,7 +13,7 @@ __all__ = [
"macd",
"pmo",
"ppo",
"prs",
"rs",
"rocp",
"rocr",
"sam",
@@ -90,15 +90,15 @@ def ppo(close: object, fastPeriod: int = 12, slowPeriod: int = 26, offset: int =
return _wrap(destination, idx, f"PPO_{fastPeriod}", "momentum", offset)
def prs(x: object, y: object, smoothPeriod: int = 5, offset: int = 0, **kwargs) -> object:
def rs(x: object, y: object, smoothPeriod: int = 5, offset: int = 0, **kwargs) -> object:
"""Price Relative Strength."""
smoothPeriod = int(smoothPeriod)
offset = int(offset)
xarr, idx = _arr(x); yarr, _ = _arr(y)
n = len(xarr)
output = _out(n)
_check(_lib.qtl_prs(_ptr(xarr), _ptr(yarr), _ptr(output), n, smoothPeriod))
return _wrap(output, idx, f"PRS_{smoothPeriod}", "momentum", offset)
_check(_lib.qtl_rs(_ptr(xarr), _ptr(yarr), _ptr(output), n, smoothPeriod))
return _wrap(output, idx, f"RS_{smoothPeriod}", "momentum", offset)
def rocp(close: object, period: int = 14, offset: int = 0, **kwargs) -> object:
+8 -8
View File
@@ -47,7 +47,7 @@ __all__ = [
"psl",
"deco",
"dosc",
"dymoi",
"dymi",
"crsi",
"bbb",
"bbi",
@@ -493,16 +493,16 @@ def dosc(close: object, rsi_period: int = 14, ema1_period: int = 5,
return _wrap(dst, idx, f"DOSC_{rsi_period}", "oscillators", offset)
def dymoi(close: object, base_period: int = 14, short_period: int = 5,
long_period: int = 10, min_period: int = 3, max_period: int = 30,
offset: int = 0, **kwargs) -> object:
def dymi(close: object, base_period: int = 14, short_period: int = 5,
long_period: int = 10, min_period: int = 3, max_period: int = 30,
offset: int = 0, **kwargs) -> object:
"""Dynamic Momentum Index."""
offset = int(offset)
src, idx = _arr(close); n = len(src); dst = _out(n)
_check(_lib.qtl_dymoi(_ptr(src), n, _ptr(dst),
int(base_period), int(short_period), int(long_period),
int(min_period), int(max_period)))
return _wrap(dst, idx, "DYMOI", "oscillators", offset)
_check(_lib.qtl_dymi(_ptr(src), n, _ptr(dst),
int(base_period), int(short_period), int(long_period),
int(min_period), int(max_period)))
return _wrap(dst, idx, "DYMI", "oscillators", offset)
def crsi(close: object, rsi_period: int = 3, streak_period: int = 2,
+4 -4
View File
@@ -17,7 +17,7 @@ __all__ = [
"pivotext",
"pivotfib",
"pivotwood",
"psar",
"sar",
"sarext",
"swings",
"ttm_scalper",
@@ -120,7 +120,7 @@ def pivotwood(high: object, low: object, close: object, offset: int = 0, **kwarg
return _wrap(ppOutput, idx, "PIVOTWOOD", "reversals", offset)
def psar(open: object, high: object, low: object, close: object, afStart: float = 0.02, afIncrement: float = 0.02, afMax: float = 0.2, offset: int = 0, **kwargs) -> object:
def sar(open: object, high: object, low: object, close: object, afStart: float = 0.02, afIncrement: float = 0.02, afMax: float = 0.2, offset: int = 0, **kwargs) -> object:
"""Parabolic SAR."""
afStart = float(afStart)
afIncrement = float(afIncrement)
@@ -129,8 +129,8 @@ def psar(open: object, high: object, low: object, close: object, afStart: float
o, idx = _arr(open); h, _ = _arr(high); l, _ = _arr(low); c, _ = _arr(close)
n = len(o)
output = _out(n)
_check(_lib.qtl_psar(_ptr(o), _ptr(h), _ptr(l), _ptr(c), _ptr(output), n, afStart, afIncrement, afMax))
return _wrap(output, idx, "PSAR", "reversals", offset)
_check(_lib.qtl_sar(_ptr(o), _ptr(h), _ptr(l), _ptr(c), _ptr(output), n, afStart, afIncrement, afMax))
return _wrap(output, idx, "SAR", "reversals", offset)
def sarext(open: object, high: object, low: object, close: object, startValue: float = 0.0, offsetOnReverse: float = 0.0, afInitLong: float = 0.02, afLong: float = 0.02, afMaxLong: float = 0.2, afInitShort: float = 0.02, afShort: float = 0.02, afMaxShort: float = 0.2, offset: int = 0, **kwargs) -> object:
+4 -4
View File
@@ -38,7 +38,7 @@ __all__ = [
"zscore",
"cma",
"entropy",
"correlation",
"correl",
"covariance",
"cointegration",
]
@@ -378,13 +378,13 @@ def entropy(close: object, period: int = 10, offset: int = 0, **kwargs) -> objec
return _wrap(dst, idx, f"ENTROPY_{period}", "statistics", offset)
def correlation(x: object, y: object, period: int = 20,
offset: int = 0, **kwargs) -> object:
def correl(x: object, y: object, period: int = 20,
offset: int = 0, **kwargs) -> object:
"""Pearson Correlation."""
period = int(kwargs.get("length", period)); offset = int(offset)
xarr, idx = _arr(x); yarr, _ = _arr(y)
n = len(xarr); dst = _out(n)
_check(_lib.qtl_correlation(_ptr(xarr), _ptr(yarr), n, _ptr(dst), period))
_check(_lib.qtl_correl(_ptr(xarr), _ptr(yarr), n, _ptr(dst), period))
return _wrap(dst, idx, f"CORR_{period}", "statistics", offset)
+4 -4
View File
@@ -11,7 +11,7 @@ __all__ = [
"adxvma",
"frama",
"holt",
"htit",
"ht_trendline",
"hwma",
"jma",
"kama",
@@ -86,14 +86,14 @@ def holt(close: object, period: int = 14, gamma: float = 0.0, offset: int = 0, *
return _wrap(output, idx, f"HOLT_{period}", "trends_iir", offset)
def htit(close: object, offset: int = 0, **kwargs) -> object:
def ht_trendline(close: object, offset: int = 0, **kwargs) -> object:
"""Hilbert Transform Instantaneous Trendline."""
offset = int(offset)
src, idx = _arr(close)
n = len(src)
output = _out(n)
_check(_lib.qtl_htit(_ptr(src), _ptr(output), n))
return _wrap(output, idx, "HTIT", "trends_iir", offset)
_check(_lib.qtl_httrendline(_ptr(src), _ptr(output), n))
return _wrap(output, idx, "HT_TRENDLINE", "trends_iir", offset)
def hwma(close: object, period: int = 14, offset: int = 0, **kwargs) -> object:
+4 -4
View File
@@ -8,7 +8,7 @@ from ._helpers import _arr, _ptr, _out, _wrap, _wrap_multi, _check, _lib
__all__ = [
"adl",
"ad",
"adosc",
"iii",
"kvo",
@@ -38,14 +38,14 @@ __all__ = [
]
def adl(high: object, low: object, close: object, volume: object, offset: int = 0, **kwargs) -> object:
def ad(high: object, low: object, close: object, volume: object, offset: int = 0, **kwargs) -> object:
"""Accumulation/Distribution Line."""
offset = int(offset)
h, idx = _arr(high); l, _ = _arr(low); c, _ = _arr(close); v, _ = _arr(volume)
n = len(h)
output = _out(n)
_check(_lib.qtl_adl(_ptr(h), _ptr(l), _ptr(c), _ptr(v), _ptr(output), n))
return _wrap(output, idx, "ADL", "volume", offset)
_check(_lib.qtl_ad(_ptr(h), _ptr(l), _ptr(c), _ptr(v), _ptr(output), n))
return _wrap(output, idx, "AD", "volume", offset)
def adosc(high: object, low: object, close: object, volume: object, fastPeriod: int = 12, slowPeriod: int = 26, offset: int = 0, **kwargs) -> object: