mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-07-29 02:07:42 +00:00
3785 lines
161 KiB
C#
3785 lines
161 KiB
C#
// <auto-generated />
|
|
#nullable enable
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using QuanTAlib;
|
|
|
|
namespace QuanTAlib.Python;
|
|
|
|
[System.Diagnostics.CodeAnalysis.SuppressMessage(
|
|
"Security Hotspot",
|
|
"S6640",
|
|
Justification = "Generated NativeAOT export helpers bridge unmanaged caller-owned buffers into managed series objects. The unsafe context is required by the ABI and remains constrained to pointer-to-span copies over validated inputs.")]
|
|
public static unsafe partial class Exports
|
|
{
|
|
private static TSeries BuildSeries(double* src, int n)
|
|
{
|
|
var t = new long[n];
|
|
var v = new double[n];
|
|
new ReadOnlySpan<double>(src, n).CopyTo(v);
|
|
for (int i = 0; i < n; i++) t[i] = i;
|
|
return new TSeries(t, v);
|
|
}
|
|
|
|
private static TBarSeries BuildBars(double* open, double* high, double* low, double* close, double* volume, int n)
|
|
{
|
|
var t = new long[n];
|
|
var o = new double[n];
|
|
var h = new double[n];
|
|
var l = new double[n];
|
|
var c = new double[n];
|
|
var v = new double[n];
|
|
new ReadOnlySpan<double>(open, n).CopyTo(o);
|
|
new ReadOnlySpan<double>(high, n).CopyTo(h);
|
|
new ReadOnlySpan<double>(low, n).CopyTo(l);
|
|
new ReadOnlySpan<double>(close, n).CopyTo(c);
|
|
new ReadOnlySpan<double>(volume, n).CopyTo(v);
|
|
for (int i = 0; i < n; i++) t[i] = i;
|
|
var bars = new TBarSeries(n);
|
|
bars.AddRange(t, o, h, l, c, v);
|
|
return bars;
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_abber")]
|
|
public static int QtlAbber(double* source, double* middle, double* upper, double* lower, int n, int period, double multiplier)
|
|
{
|
|
if (source == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Aberr.Batch(Src(source, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ac")]
|
|
public static int QtlAc(double* high, double* low, double* destination, int n, int fastPeriod, int slowPeriod, int acPeriod)
|
|
{
|
|
if (high == null || low == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ac.Batch(Src(high, n), Src(low, n), Dst(destination, n), fastPeriod, slowPeriod, acPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_accbands")]
|
|
public static int QtlAccBands(double* high, double* low, double* close, double* middle, double* upper, double* lower, int n, int period, double factor)
|
|
{
|
|
if (high == null || low == null || close == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
AccBands.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period, factor);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_accel")]
|
|
public static int QtlAccel(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Accel.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_acf")]
|
|
public static int QtlAcf(double* source, double* output, int n, int period, int lag)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Acf.Batch(Src(source, n), Dst(output, n), period, lag);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_adf")]
|
|
public static int QtlAdf(double* source, double* output, int n, int period, int maxLag, int regression)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Adf.Batch(Src(source, n), Dst(output, n), period, maxLag, (Adf.AdfRegression)regression);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ad")]
|
|
public static int QtlAd(double* high, double* low, double* close, double* volume, double* output, int n)
|
|
{
|
|
if (high == null || low == null || close == null || volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ad.Batch(Src(high, n), Src(low, n), Src(close, n), Src(volume, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_adosc")]
|
|
public static int QtlAdosc(double* high, double* low, double* close, double* volume, double* output, int n, int fastPeriod, int slowPeriod)
|
|
{
|
|
if (high == null || low == null || close == null || volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Adosc.Batch(Src(high, n), Src(low, n), Src(close, n), Src(volume, n), Dst(output, n), fastPeriod, slowPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_adr")]
|
|
public static int QtlAdr(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int method, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Adr.Batch(sourceBars, period, (AdrMethod)method);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_adx")]
|
|
public static int QtlAdx(double* high, double* low, double* close, int period, int n, double* destination)
|
|
{
|
|
if (high == null || low == null || close == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Adx.Batch(Src(high, n), Src(low, n), Src(close, n), period, Dst(destination, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_adxr")]
|
|
public static int QtlAdxr(double* high, double* low, double* close, int period, int n, double* destination)
|
|
{
|
|
if (high == null || low == null || close == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Adxr.Batch(Src(high, n), Src(low, n), Src(close, n), period, Dst(destination, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_adxvma")]
|
|
public static int QtlAdxvma(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Adxvma.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_alligator")]
|
|
public static int QtlAlligator(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int jawPeriod, int jawOffset, int teethPeriod, int teethOffset, int lipsPeriod, int lipsOffset, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Alligator.Batch(sourceBars, jawPeriod, jawOffset, teethPeriod, teethOffset, lipsPeriod, lipsOffset);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_amat")]
|
|
public static int QtlAmat(double* source, double* trend, double* strength, int n, int fastPeriod, int slowPeriod)
|
|
{
|
|
if (source == null || trend == null || strength == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Amat.Batch(Src(source, n), Dst(trend, n), Dst(strength, n), fastPeriod, slowPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ao")]
|
|
public static int QtlAo(double* high, double* low, double* destination, int n, int fastPeriod, int slowPeriod)
|
|
{
|
|
if (high == null || low == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ao.Batch(Src(high, n), Src(low, n), Dst(destination, n), fastPeriod, slowPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_apz")]
|
|
public static int QtlApz(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, double multiplier, int n, double* dstMiddle, double* dstUpper, double* dstLower)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dstMiddle == null || dstUpper == null || dstLower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Apz.Batch(sourceBars, period, multiplier);
|
|
var valuesMiddle = result.Middle.Values;
|
|
if (valuesMiddle.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpanMiddle = Dst(dstMiddle, n);
|
|
outSpanMiddle.Fill(double.NaN);
|
|
valuesMiddle.CopyTo(outSpanMiddle);
|
|
var valuesUpper = result.Upper.Values;
|
|
if (valuesUpper.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpanUpper = Dst(dstUpper, n);
|
|
outSpanUpper.Fill(double.NaN);
|
|
valuesUpper.CopyTo(outSpanUpper);
|
|
var valuesLower = result.Lower.Values;
|
|
if (valuesLower.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpanLower = Dst(dstLower, n);
|
|
outSpanLower.Fill(double.NaN);
|
|
valuesLower.CopyTo(outSpanLower);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_aroon")]
|
|
public static int QtlAroon(double* high, double* low, int period, int n, double* destination)
|
|
{
|
|
if (high == null || low == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Aroon.Batch(Src(high, n), Src(low, n), period, Dst(destination, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_aroonosc")]
|
|
public static int QtlAroonOsc(double* high, double* low, int period, int n, double* destination)
|
|
{
|
|
if (high == null || low == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
AroonOsc.Batch(Src(high, n), Src(low, n), period, Dst(destination, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_atrstop")]
|
|
public static int QtlAtrstop(double* high, double* low, double* close, double* output, int n, int period, double multiplier)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
if (period <= 0) return StatusCodes.QTL_ERR_INVALID_PARAM;
|
|
try
|
|
{
|
|
Atrstop.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_atr")]
|
|
public static int QtlAtr(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Atr.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_atrn")]
|
|
public static int QtlAtrn(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Atrn.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_bbs")]
|
|
public static int QtlBbs(double* high, double* low, double* close, double* output, int n, int bbPeriod, double bbMult)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Bbs.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n), bbPeriod, bbMult);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_bop")]
|
|
public static int QtlBop(double* open, double* high, double* low, double* close, double* destination, int n)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Bop.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(destination, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_bwmfi")]
|
|
public static int QtlBwMfi(double* high, double* low, double* volume, double* mfiOutput, double* zoneOutput, int n)
|
|
{
|
|
if (high == null || low == null || volume == null || mfiOutput == null || zoneOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var hi = Src(high, n);
|
|
var lo = Src(low, n);
|
|
var vol = Src(volume, n);
|
|
var mfiTmp = new double[n];
|
|
var zoneTmp = new int[n];
|
|
BwMfi.Batch(hi, lo, vol, mfiTmp.AsSpan(), zoneTmp.AsSpan());
|
|
mfiTmp.AsSpan().CopyTo(Dst(mfiOutput, n));
|
|
var zoneDst = Dst(zoneOutput, n);
|
|
for (int i = 0; i < n; i++)
|
|
{
|
|
zoneDst[i] = zoneTmp[i];
|
|
}
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_dstoch")]
|
|
public static int QtlDstoch(double* high, double* low, double* close, double* output, int n, int period)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
if (period <= 0) return StatusCodes.QTL_ERR_INVALID_PARAM;
|
|
try
|
|
{
|
|
Dstoch.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_cci")]
|
|
public static int QtlCci(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Cci.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_chandelier")]
|
|
public static int QtlChandelier(double* open, double* high, double* low, double* close, double* output, int n, int period, double multiplier)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Chandelier.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_chop")]
|
|
public static int QtlChop(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Chop.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ckstop")]
|
|
public static int QtlCkstop(double* open, double* high, double* low, double* close, double* output, int n, int atrPeriod, double multiplier, int stopPeriod)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ckstop.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(output, n), atrPeriod, multiplier, stopPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_coppock")]
|
|
public static int QtlCoppock(double* source, double* output, int n, int longRoc, int shortRoc, int wmaPeriod)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Coppock.Batch(Src(source, n), Dst(output, n), longRoc, shortRoc, wmaPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_dc")]
|
|
public static int QtlDc(double* high, double* low, double* middle, double* upper, double* lower, int n, int period)
|
|
{
|
|
if (high == null || low == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Dc.Batch(Src(high, n), Src(low, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_decaychannel")]
|
|
public static int QtlDecaychannel(double* high, double* low, double* middle, double* upper, double* lower, int n, int period)
|
|
{
|
|
if (high == null || low == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Decaychannel.Batch(Src(high, n), Src(low, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_dmh")]
|
|
public static int QtlDmh(double* high, double* low, int period, int n, double* destination)
|
|
{
|
|
if (high == null || low == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Dmh.Batch(Src(high, n), Src(low, n), period, Dst(destination, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_dmx")]
|
|
public static int QtlDmx(double* high, double* low, double* close, int period, int n, double* destination)
|
|
{
|
|
if (high == null || low == null || close == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Dmx.Batch(Src(high, n), Src(low, n), Src(close, n), period, Dst(destination, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_dx")]
|
|
public static int QtlDx(double* high, double* low, double* close, int period, int n, double* destination)
|
|
{
|
|
if (high == null || low == null || close == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Dx.Batch(Src(high, n), Src(low, n), Src(close, n), period, Dst(destination, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_eri")]
|
|
public static int QtlEri(double* source, int period, int n, double* dst)
|
|
{
|
|
if (source == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceSeries = BuildSeries(source, n);
|
|
var result = Eri.Batch(sourceSeries, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_fcb")]
|
|
public static int QtlFcb(double* high, double* low, double* middle, double* upper, double* lower, int n, int period)
|
|
{
|
|
if (high == null || low == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Fcb.Batch(Src(high, n), Src(low, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_fdist")]
|
|
public static int QtlFdist(double* source, double* output, int n, int d1, int d2, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Fdist.Batch(Src(source, n), Dst(output, n), d1, d2, period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_fft")]
|
|
public static int QtlFft(double* src, double* output, int n, int windowSize, int minPeriod, int maxPeriod)
|
|
{
|
|
if (src == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Fft.Batch(Src(src, n), Dst(output, n), windowSize, minPeriod, maxPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_fi")]
|
|
public static int QtlFi(double* source, int period, int n, double* dst)
|
|
{
|
|
if (source == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceSeries = BuildSeries(source, n);
|
|
var result = Fi.Batch(sourceSeries, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_fractals")]
|
|
public static int QtlFractals(double* high, double* low, double* upOutput, double* downOutput, int n)
|
|
{
|
|
if (high == null || low == null || upOutput == null || downOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Fractals.Batch(Src(high, n), Src(low, n), Dst(upOutput, n), Dst(downOutput, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_frama")]
|
|
public static int QtlFrama(double* high, double* low, double* output, int n, int period)
|
|
{
|
|
if (high == null || low == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Frama.Batch(Src(high, n), Src(low, n), period, Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_fwma")]
|
|
public static int QtlFwma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Fwma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_gammadist")]
|
|
public static int QtlGammadist(double* source, double* output, int n, double alpha, double beta, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Gammadist.Batch(Src(source, n), Dst(output, n), alpha, beta, period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_gator")]
|
|
public static int QtlGator(double* source, double* output, int n, int jawPeriod, int jawShift, int teethPeriod, int teethShift, int lipsPeriod, int lipsShift)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Gator.Batch(Src(source, n), Dst(output, n), jawPeriod, jawShift, teethPeriod, teethShift, lipsPeriod, lipsShift);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_gauss")]
|
|
public static int QtlGauss(double* source, double* output, int n, double sigma)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Gauss.Batch(Src(source, n), Dst(output, n), sigma);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_geomean")]
|
|
public static int QtlGeomean(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Geomean.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ghla")]
|
|
public static int QtlGhla(double* high, double* low, double* close, double* output, int n, int period)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ghla.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_gkv")]
|
|
public static int QtlGkv(double* open, double* high, double* low, double* close, double* output, int n, int period, int annualize, int annualPeriods)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Gkv.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period, annualize != 0, annualPeriods);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_granger")]
|
|
public static int QtlGranger(double* seriesY, double* seriesX, double* output, int n, int period)
|
|
{
|
|
if (seriesY == null || seriesX == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Granger.Batch(Src(seriesY, n), Src(seriesX, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_gwma")]
|
|
public static int QtlGwma(double* source, double* output, int n, int period, double sigma)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Gwma.Batch(Src(source, n), Dst(output, n), period, sigma);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ha")]
|
|
public static int QtlHa(double* open, double* high, double* low, double* close, double* haOpenOut, double* haHighOut, double* haLowOut, double* haCloseOut, int n)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || haOpenOut == null || haHighOut == null || haLowOut == null || haCloseOut == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ha.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(haOpenOut, n), Dst(haHighOut, n), Dst(haLowOut, n), Dst(haCloseOut, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hamma")]
|
|
public static int QtlHamma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hamma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hann")]
|
|
public static int QtlHann(double* source, double* output, int n, int length)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hann.Batch(Src(source, n), Dst(output, n), length);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_harmean")]
|
|
public static int QtlHarmean(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Harmean.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hend")]
|
|
public static int QtlHend(double* source, double* output, int n, int period, double nanValue)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hend.Batch(Src(source, n), Dst(output, n), period, nanValue);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_highest")]
|
|
public static int QtlHighest(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Highest.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hlv")]
|
|
public static int QtlHlv(double* high, double* low, double* output, int n, int period, int annualize, int annualPeriods)
|
|
{
|
|
if (high == null || low == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hlv.Batch(Src(high, n), Src(low, n), Dst(output, n), period, annualize != 0, annualPeriods);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_holt")]
|
|
public static int QtlHolt(double* source, double* output, int n, int period, double gamma)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Holt.Batch(Src(source, n), Dst(output, n), period, gamma);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_homod")]
|
|
public static int QtlHomod(double* source, double* output, int n, double minPeriod, double maxPeriod)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Homod.Batch(Src(source, n), Dst(output, n), minPeriod, maxPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hp")]
|
|
public static int QtlHp(double* source, double* output, int n, double lambda)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hp.Batch(Src(source, n), Dst(output, n), lambda);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hpf")]
|
|
public static int QtlHpf(double* source, double* output, int n, int length)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hpf.Batch(Src(source, n), Dst(output, n), length);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_htdcperiod")]
|
|
public static int QtlHtDcperiod(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
HtDcperiod.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_htdcphase")]
|
|
public static int QtlHtDcphase(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
HtDcphase.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_htphasor")]
|
|
public static int QtlHtPhasor(double* source, double* inPhase, double* quadrature, int n)
|
|
{
|
|
if (source == null || inPhase == null || quadrature == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
HtPhasor.Batch(Src(source, n), Dst(inPhase, n), Dst(quadrature, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_htsine")]
|
|
public static int QtlHtSine(double* source, double* sine, double* leadSine, int n)
|
|
{
|
|
if (source == null || sine == null || leadSine == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
HtSine.Batch(Src(source, n), Dst(sine, n), Dst(leadSine, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_httrendmode")]
|
|
public static int QtlHtTrendmode(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
HtTrendmode.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_httrendline")]
|
|
public static int QtlHtTrendline(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
HtTrendline.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_huber")]
|
|
public static int QtlHuber(double* actual, double* predicted, double* output, int n, int period, double delta)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Huber.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period, delta);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hurst")]
|
|
public static int QtlHurst(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hurst.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hv")]
|
|
public static int QtlHv(double* prices, double* output, int n, int period, int annualize, int annualPeriods)
|
|
{
|
|
if (prices == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hv.Batch(Src(prices, n), Dst(output, n), period, annualize != 0, annualPeriods);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_hwma")]
|
|
public static int QtlHwma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Hwma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ichimoku")]
|
|
public static int QtlIchimoku(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int tenkanPeriod, int kijunPeriod, int senkouBPeriod, int displacement, int n, double* dstTenkan, double* dstKijun, double* dstSenkouA, double* dstSenkouB, double* dstChikou)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dstTenkan == null || dstKijun == null || dstSenkouA == null || dstSenkouB == null || dstChikou == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Ichimoku.Batch(sourceBars, tenkanPeriod, kijunPeriod, senkouBPeriod, displacement);
|
|
var valuesTenkan = result.Tenkan.Values;
|
|
if (valuesTenkan.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpanTenkan = Dst(dstTenkan, n);
|
|
outSpanTenkan.Fill(double.NaN);
|
|
valuesTenkan.CopyTo(outSpanTenkan);
|
|
var valuesKijun = result.Kijun.Values;
|
|
if (valuesKijun.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpanKijun = Dst(dstKijun, n);
|
|
outSpanKijun.Fill(double.NaN);
|
|
valuesKijun.CopyTo(outSpanKijun);
|
|
var valuesSenkouA = result.SenkouA.Values;
|
|
if (valuesSenkouA.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpanSenkouA = Dst(dstSenkouA, n);
|
|
outSpanSenkouA.Fill(double.NaN);
|
|
valuesSenkouA.CopyTo(outSpanSenkouA);
|
|
var valuesSenkouB = result.SenkouB.Values;
|
|
if (valuesSenkouB.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpanSenkouB = Dst(dstSenkouB, n);
|
|
outSpanSenkouB.Fill(double.NaN);
|
|
valuesSenkouB.CopyTo(outSpanSenkouB);
|
|
var valuesChikou = result.Chikou.Values;
|
|
if (valuesChikou.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpanChikou = Dst(dstChikou, n);
|
|
outSpanChikou.Fill(double.NaN);
|
|
valuesChikou.CopyTo(outSpanChikou);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ifft")]
|
|
public static int QtlIfft(double* src, double* output, int n, int windowSize, int numHarmonics)
|
|
{
|
|
if (src == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ifft.Batch(Src(src, n), Dst(output, n), windowSize, numHarmonics);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_iii")]
|
|
public static int QtlIii(double* high, double* low, double* close, double* volume, double* output, int n, int period, int cumulative)
|
|
{
|
|
if (high == null || low == null || close == null || volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Iii.Batch(Src(high, n), Src(low, n), Src(close, n), Src(volume, n), Dst(output, n), period, cumulative != 0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ilrs")]
|
|
public static int QtlIlrs(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ilrs.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_imi")]
|
|
public static int QtlImi(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Imi.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_impulse")]
|
|
public static int QtlImpulse(double* source, int emaPeriod, int macdFast, int macdSlow, int macdSignal, int n, double* dst)
|
|
{
|
|
if (source == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceSeries = BuildSeries(source, n);
|
|
var result = Impulse.Batch(sourceSeries, emaPeriod, macdFast, macdSlow, macdSignal);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_iqr")]
|
|
public static int QtlIqr(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Iqr.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_jb")]
|
|
public static int QtlJb(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Jb.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_jbands")]
|
|
public static int QtlJbands(double* source, double* middle, double* upper, double* lower, int n, int period, int phase)
|
|
{
|
|
if (source == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Jbands.Batch(Src(source, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period, phase);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_jerk")]
|
|
public static int QtlJerk(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Jerk.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_jma")]
|
|
public static int QtlJma(double* source, double* output, int n, int period, int phase)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Jma.Batch(Src(source, n), Dst(output, n), period, phase);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_jvolty")]
|
|
public static int QtlJvolty(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Jvolty.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_jvoltyn")]
|
|
public static int QtlJvoltyn(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Jvoltyn.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kaiser")]
|
|
public static int QtlKaiser(double* source, double* output, int n, int period, double beta, double nanValue)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kaiser.Batch(Src(source, n), Dst(output, n), period, beta, nanValue);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kalman")]
|
|
public static int QtlKalman(double* source, double* output, int n, double q, double r)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kalman.Batch(Src(source, n), Dst(output, n), q, r);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kama")]
|
|
public static int QtlKama(double* source, double* output, int n, int period, int fastPeriod, int slowPeriod)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kama.Batch(Src(source, n), Dst(output, n), period, fastPeriod, slowPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kc")]
|
|
public static int QtlKc(double* high, double* low, double* close, double* middle, double* upper, double* lower, int n, int period, double multiplier)
|
|
{
|
|
if (high == null || low == null || close == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kc.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kdj")]
|
|
public static int QtlKdj(double* high, double* low, double* close, double* kOut, double* dOut, double* jOut, int n, int length, int signal)
|
|
{
|
|
if (high == null || low == null || close == null || kOut == null || dOut == null || jOut == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kdj.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(kOut, n), Dst(dOut, n), Dst(jOut, n), length, signal);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kendall")]
|
|
public static int QtlKendall(double* seriesX, double* seriesY, double* output, int n, int period)
|
|
{
|
|
if (seriesX == null || seriesY == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kendall.Batch(Src(seriesX, n), Src(seriesY, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kst")]
|
|
public static int QtlKst(double* source, double* kstOut, double* sigOut, int n, int r1, int r2, int r3, int r4, int s1, int s2, int s3, int s4, int sigPeriod)
|
|
{
|
|
if (source == null || kstOut == null || sigOut == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kst.Batch(Src(source, n), Dst(kstOut, n), Dst(sigOut, n), r1, r2, r3, r4, s1, s2, s3, s4, sigPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kurtosis")]
|
|
public static int QtlKurtosis(double* source, double* output, int n, int period, int isPopulation)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kurtosis.Batch(Src(source, n), Dst(output, n), period, isPopulation != 0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_kvo")]
|
|
public static int QtlKvo(double* high, double* low, double* close, double* volume, double* output, double* signal, int n, int fastPeriod, int slowPeriod, int signalPeriod)
|
|
{
|
|
if (high == null || low == null || close == null || volume == null || output == null || signal == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Kvo.Batch(Src(high, n), Src(low, n), Src(close, n), Src(volume, n), Dst(output, n), Dst(signal, n), fastPeriod, slowPeriod, signalPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_laguerre")]
|
|
public static int QtlLaguerre(double* source, double* output, int n, double gamma)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Laguerre.Batch(Src(source, n), Dst(output, n), gamma);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_lanczos")]
|
|
public static int QtlLanczos(double* source, double* output, int n, int period, double nanValue)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Lanczos.Batch(Src(source, n), Dst(output, n), period, nanValue);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_linreg")]
|
|
public static int QtlLinReg(double* source, double* output, int n, int period, int offset, double initialLastValid)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
LinReg.Batch(Src(source, n), Dst(output, n), period, offset, initialLastValid);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_lineartrans")]
|
|
public static int QtlLineartrans(double* source, double* output, int n, double slope, double intercept)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Lineartrans.Batch(Src(source, n), Dst(output, n), slope, intercept);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_lms")]
|
|
public static int QtlLms(double* source, double* output, int n, int order, double mu)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Lms.Batch(Src(source, n), Dst(output, n), order, mu);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_loess")]
|
|
public static int QtlLoess(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Loess.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_logcosh")]
|
|
public static int QtlLogCosh(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
LogCosh.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_lognormdist")]
|
|
public static int QtlLognormdist(double* source, double* output, int n, double mu, double sigma, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Lognormdist.Batch(Src(source, n), Dst(output, n), mu, sigma, period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_logtrans")]
|
|
public static int QtlLogtrans(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Logtrans.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_lowest")]
|
|
public static int QtlLowest(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Lowest.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ltma")]
|
|
public static int QtlLtma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ltma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_lunar")]
|
|
public static int QtlLunar(double* source, int n, double* dst)
|
|
{
|
|
if (source == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceSeries = BuildSeries(source, n);
|
|
var result = Lunar.Batch(sourceSeries);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_maape")]
|
|
public static int QtlMaape(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Maape.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_macd")]
|
|
public static int QtlMacd(double* source, double* destination, int n, int fastPeriod, int slowPeriod)
|
|
{
|
|
if (source == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Macd.Batch(Src(source, n), Dst(destination, n), fastPeriod, slowPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_maenv")]
|
|
public static int QtlMaenv(double* source, double* middle, double* upper, double* lower, int n, int period, double percentage, int maType)
|
|
{
|
|
if (source == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Maenv.Batch(Src(source, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period, percentage, (MaenvType)maType);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mama")]
|
|
public static int QtlMama(double* source, double* output, double fastLimit, int n, double slowLimit, double* famaOutput)
|
|
{
|
|
if (source == null || output == null || famaOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mama.Batch(Src(source, n), Dst(output, n), fastLimit, slowLimit, Dst(famaOutput, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mapd")]
|
|
public static int QtlMapd(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mapd.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_marketfi")]
|
|
public static int QtlMarketfi(double* high, double* low, double* volume, double* output, int n)
|
|
{
|
|
if (high == null || low == null || volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Marketfi.Batch(Src(high, n), Src(low, n), Src(volume, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mase")]
|
|
public static int QtlMase(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mase.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_massi")]
|
|
public static int QtlMassi(double* source, double* output, int n, int emaLength, int sumLength)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Massi.Batch(Src(source, n), Dst(output, n), emaLength, sumLength);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mavp")]
|
|
public static int QtlMavp(double* source, double* periods, double* output, int n, int minPeriod, int maxPeriod)
|
|
{
|
|
if (source == null || periods == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mavp.Batch(Src(source, n), Src(periods, n), Dst(output, n), minPeriod, maxPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_maxindex")]
|
|
public static int QtlMaxindex(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Maxindex.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mcnma")]
|
|
public static int QtlMcnma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mcnma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mdae")]
|
|
public static int QtlMdae(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mdae.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mdape")]
|
|
public static int QtlMdape(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mdape.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_me")]
|
|
public static int QtlMe(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Me.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_meandev")]
|
|
public static int QtlMeanDev(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
MeanDev.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_median")]
|
|
public static int QtlMedian(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Median.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mgdi")]
|
|
public static int QtlMgdi(double* source, double* output, int n, int period, double k)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mgdi.Batch(Src(source, n), Dst(output, n), period, k);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_midpoint")]
|
|
public static int QtlMidpoint(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Midpoint.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_midprice")]
|
|
public static int QtlMidprice(double* high, double* low, double* output, int n, int period)
|
|
{
|
|
if (high == null || low == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Midprice.Batch(Src(high, n), Src(low, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_minindex")]
|
|
public static int QtlMinindex(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Minindex.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_minusdi")]
|
|
public static int QtlMinusDi(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = MinusDi.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_minusdm")]
|
|
public static int QtlMinusDm(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = MinusDm.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mma")]
|
|
public static int QtlMma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mmchannel")]
|
|
public static int QtlMmchannel(double* high, double* low, double* upper, double* lower, int n, int period)
|
|
{
|
|
if (high == null || low == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mmchannel.Batch(Src(high, n), Src(low, n), Dst(upper, n), Dst(lower, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mode")]
|
|
public static int QtlMode(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mode.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_modf")]
|
|
public static int QtlModf(double* source, double* output, int n, int period, double beta, int feedback, double fbWeight)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Modf.Batch(Src(source, n), Dst(output, n), period, beta, feedback != 0, fbWeight);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mpe")]
|
|
public static int QtlMpe(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mpe.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mrae")]
|
|
public static int QtlMrae(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mrae.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_msle")]
|
|
public static int QtlMsle(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Msle.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_mstoch")]
|
|
public static int QtlMstoch(double* src, double* output, int n, int stochLength, int hpLength, int ssLength)
|
|
{
|
|
if (src == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Mstoch.Batch(Src(src, n), Dst(output, n), stochLength, hpLength, ssLength);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_natr")]
|
|
public static int QtlNatr(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Natr.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_nlma")]
|
|
public static int QtlNlma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Nlma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_nma")]
|
|
public static int QtlNma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Nma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_normalize")]
|
|
public static int QtlNormalize(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Normalize.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_normdist")]
|
|
public static int QtlNormdist(double* source, double* output, int n, double mu, double sigma, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Normdist.Batch(Src(source, n), Dst(output, n), mu, sigma, period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_notch")]
|
|
public static int QtlNotch(double* source, double* output, int n, int period, double q)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Notch.Batch(Src(source, n), Dst(output, n), period, q);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_nw")]
|
|
public static int QtlNw(double* source, double* output, int n, int period, double bandwidth)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Nw.Batch(Src(source, n), Dst(output, n), period, bandwidth);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_nyqma")]
|
|
public static int QtlNyqma(double* source, double* output, int n, int period, int nyquistPeriod)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Nyqma.Batch(Src(source, n), Dst(output, n), period, nyquistPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_oneeuro")]
|
|
public static int QtlOneEuro(double* source, double* output, int n, double minCutoff, double beta, double dCutoff)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
OneEuro.Batch(Src(source, n), Dst(output, n), minCutoff, beta, dCutoff);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pacf")]
|
|
public static int QtlPacf(double* source, double* output, int n, int period, int lag)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pacf.Batch(Src(source, n), Dst(output, n), period, lag);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pc")]
|
|
public static int QtlPc(double* high, double* low, double* middle, double* upper, double* lower, int n, int period)
|
|
{
|
|
if (high == null || low == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pc.Batch(Src(high, n), Src(low, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_percentile")]
|
|
public static int QtlPercentile(double* source, double* output, int n, int period, double percent)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Percentile.Batch(Src(source, n), Dst(output, n), period, percent);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pfe")]
|
|
public static int QtlPfe(double* source, double* output, int n, int period, int smoothPeriod)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pfe.Batch(Src(source, n), Dst(output, n), period, smoothPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pgo")]
|
|
public static int QtlPgo(double* high, double* low, double* close, double* destination, int n, int period)
|
|
{
|
|
if (high == null || low == null || close == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pgo.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(destination, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pivot")]
|
|
public static int QtlPivot(double* high, double* low, double* close, double* ppOutput, int n)
|
|
{
|
|
if (high == null || low == null || close == null || ppOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pivot.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(ppOutput, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pivotcam")]
|
|
public static int QtlPivotcam(double* high, double* low, double* close, double* ppOutput, int n)
|
|
{
|
|
if (high == null || low == null || close == null || ppOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pivotcam.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(ppOutput, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pivotdem")]
|
|
public static int QtlPivotdem(double* open, double* high, double* low, double* close, double* ppOutput, int n)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || ppOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pivotdem.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(ppOutput, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pivotext")]
|
|
public static int QtlPivotext(double* high, double* low, double* close, double* ppOutput, int n)
|
|
{
|
|
if (high == null || low == null || close == null || ppOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pivotext.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(ppOutput, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pivotfib")]
|
|
public static int QtlPivotfib(double* high, double* low, double* close, double* ppOutput, int n)
|
|
{
|
|
if (high == null || low == null || close == null || ppOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pivotfib.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(ppOutput, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pivotwood")]
|
|
public static int QtlPivotwood(double* high, double* low, double* close, double* ppOutput, int n)
|
|
{
|
|
if (high == null || low == null || close == null || ppOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pivotwood.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(ppOutput, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_plusdi")]
|
|
public static int QtlPlusDi(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = PlusDi.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_plusdm")]
|
|
public static int QtlPlusDm(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = PlusDm.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pma")]
|
|
public static int QtlPma(double* source, double* pmaOutput, double* triggerOutput, int n, int period)
|
|
{
|
|
if (source == null || pmaOutput == null || triggerOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pma.Batch(Src(source, n), Dst(pmaOutput, n), Dst(triggerOutput, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pmo")]
|
|
public static int QtlPmo(double* source, double* output, int n, int timePeriods, int smoothPeriods, int signalPeriods)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pmo.Batch(Src(source, n), Dst(output, n), timePeriods, smoothPeriods, signalPeriods);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_poissondist")]
|
|
public static int QtlPoissondist(double* source, double* output, int n, double lambda, int period, int threshold)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Poissondist.Batch(Src(source, n), Dst(output, n), lambda, period, threshold);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_polyfit")]
|
|
public static int QtlPolyfit(double* source, double* output, int n, int period, int degree, double initialLastValid)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Polyfit.Batch(Src(source, n), Dst(output, n), period, degree, initialLastValid);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ppo")]
|
|
public static int QtlPpo(double* source, double* destination, int n, int fastPeriod, int slowPeriod)
|
|
{
|
|
if (source == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ppo.Batch(Src(source, n), Dst(destination, n), fastPeriod, slowPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rs")]
|
|
public static int QtlRs(double* baseSeries, double* compSeries, double* output, int n, int smoothPeriod)
|
|
{
|
|
if (baseSeries == null || compSeries == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rs.Batch(Src(baseSeries, n), Src(compSeries, n), Dst(output, n), smoothPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_sar")]
|
|
public static int QtlSar(double* open, double* high, double* low, double* close, double* output, int n, double afStart, double afIncrement, double afMax)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Sar.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(output, n), afStart, afIncrement, afMax);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pseudohuber")]
|
|
public static int QtlPseudoHuber(double* actual, double* predicted, double* output, int n, int period, double delta)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
PseudoHuber.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period, delta);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_pwma")]
|
|
public static int QtlPwma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Pwma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_qema")]
|
|
public static int QtlQema(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Qema.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_qqe")]
|
|
public static int QtlQqe(double* source, double* output, int n, int rsiPeriod, int smoothFactor, double qqeFactor)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Qqe.Batch(Src(source, n), Dst(output, n), rsiPeriod, smoothFactor, qqeFactor);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_qrma")]
|
|
public static int QtlQrma(double* source, double* output, int n, int period, double initialLastValid)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Qrma.Batch(Src(source, n), Dst(output, n), period, initialLastValid);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_qstick")]
|
|
public static int QtlQstick(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int useEma, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Qstick.Batch(sourceBars, period, useEma != 0);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_quantile")]
|
|
public static int QtlQuantile(double* source, double* output, int n, int period, double quantileLevel)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Quantile.Batch(Src(source, n), Dst(output, n), period, quantileLevel);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_quantileloss")]
|
|
public static int QtlQuantileLoss(double* actual, double* predicted, double* output, int n, int period, double quantile)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
QuantileLoss.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period, quantile);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rae")]
|
|
public static int QtlRae(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rae.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ravi")]
|
|
public static int QtlRavi(double* source, double* output, int n, int shortPeriod, int longPeriod)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ravi.Batch(Src(source, n), Dst(output, n), shortPeriod, longPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_regchannel")]
|
|
public static int QtlRegchannel(double* source, double* middle, double* upper, double* lower, int n, int period, double multiplier)
|
|
{
|
|
if (source == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Regchannel.Batch(Src(source, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_relu")]
|
|
public static int QtlRelu(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Relu.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rema")]
|
|
public static int QtlRema(double* source, double* output, int n, int period, double lambda)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rema.Batch(Src(source, n), Dst(output, n), period, lambda);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_reverseema")]
|
|
public static int QtlReverseEma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
ReverseEma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rgma")]
|
|
public static int QtlRgma(double* source, double* output, int n, int period, int passes)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rgma.Batch(Src(source, n), Dst(output, n), period, passes);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rls")]
|
|
public static int QtlRls(double* source, double* output, int n, int order, double lambda)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rls.Batch(Src(source, n), Dst(output, n), order, lambda);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rma")]
|
|
public static int QtlRma(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rma.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rmed")]
|
|
public static int QtlRmed(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rmed.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rmsle")]
|
|
public static int QtlRmsle(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rmsle.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rocp")]
|
|
public static int QtlRocp(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rocp.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rocr")]
|
|
public static int QtlRocr(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rocr.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_roofing")]
|
|
public static int QtlRoofing(double* source, double* output, int n, int hpLength, int ssLength)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Roofing.Batch(Src(source, n), Dst(output, n), hpLength, ssLength);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rse")]
|
|
public static int QtlRse(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rse.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rsquared")]
|
|
public static int QtlRsquared(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rsquared.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rsv")]
|
|
public static int QtlRsv(double* open, double* high, double* low, double* close, double* output, int n, int period, int annualize, int annualPeriods)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rsv.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period, annualize != 0, annualPeriods);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rv")]
|
|
public static int QtlRv(double* prices, double* output, int n, int period, int smoothingPeriod, int annualize, int annualPeriods)
|
|
{
|
|
if (prices == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rv.Batch(Src(prices, n), Dst(output, n), period, smoothingPeriod, annualize != 0, annualPeriods);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rvgi")]
|
|
public static int QtlRvgi(double* open, double* high, double* low, double* close, double* rvgiOutput, double* signalOutput, int n, int period)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || rvgiOutput == null || signalOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rvgi.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(rvgiOutput, n), Dst(signalOutput, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rvi")]
|
|
public static int QtlRvi(double* prices, double* output, int n, int stdevLength, int rmaLength)
|
|
{
|
|
if (prices == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rvi.Batch(Src(prices, n), Dst(output, n), stdevLength, rmaLength);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_rwma")]
|
|
public static int QtlRwma(double* close, double* high, double* low, double* output, int n, int period)
|
|
{
|
|
if (close == null || high == null || low == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Rwma.Batch(Src(close, n), Src(high, n), Src(low, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_sam")]
|
|
public static int QtlSam(double* source, double* output, int n, double alpha, int cutoff)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Sam.Batch(Src(source, n), Dst(output, n), alpha, cutoff);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_sarext")]
|
|
public static int QtlSarext(double* open, double* high, double* low, double* close, double* output, int n, double startValue, double offsetOnReverse, double afInitLong, double afLong, double afMaxLong, double afInitShort, double afShort, double afMaxShort)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Sarext.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(output, n), n, startValue, offsetOnReverse, afInitLong, afLong, afMaxLong, afInitShort, afShort, afMaxShort);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_sdchannel")]
|
|
public static int QtlSdchannel(double* source, double* middle, double* upper, double* lower, int n, int period, double multiplier)
|
|
{
|
|
if (source == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Sdchannel.Batch(Src(source, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_sgf")]
|
|
public static int QtlSgf(double* source, double* output, int n, int period, int polyOrder)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Sgf.Batch(Src(source, n), Dst(output, n), period, polyOrder);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_sigmoid")]
|
|
public static int QtlSigmoid(double* source, double* output, int n, double k, double x0)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Sigmoid.Batch(Src(source, n), Dst(output, n), k, x0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_skew")]
|
|
public static int QtlSkew(double* source, double* output, int n, int period, int isPopulation)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Skew.Batch(Src(source, n), Dst(output, n), period, isPopulation != 0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_slope")]
|
|
public static int QtlSlope(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Slope.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_smape")]
|
|
public static int QtlSmape(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Smape.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_smi")]
|
|
public static int QtlSmi(double* high, double* low, double* close, double* kOut, double* dOut, int n, int kPeriod, int kSmooth, int dSmooth, int blau)
|
|
{
|
|
if (high == null || low == null || close == null || kOut == null || dOut == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Smi.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(kOut, n), Dst(dOut, n), kPeriod, kSmooth, dSmooth, blau != 0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_solar")]
|
|
public static int QtlSolar(double* source, int n, double* dst)
|
|
{
|
|
if (source == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceSeries = BuildSeries(source, n);
|
|
var result = Solar.Batch(sourceSeries);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_spbf")]
|
|
public static int QtlSpbf(double* source, double* output, int n, int shortPeriod, int longPeriod, int rmsPeriod)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Spbf.Batch(Src(source, n), Dst(output, n), shortPeriod, longPeriod, rmsPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_spearman")]
|
|
public static int QtlSpearman(double* seriesX, double* seriesY, double* output, int n, int period)
|
|
{
|
|
if (seriesX == null || seriesY == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Spearman.Batch(Src(seriesX, n), Src(seriesY, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_sqrttrans")]
|
|
public static int QtlSqrttrans(double* source, double* output, int n)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Sqrttrans.Batch(Src(source, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_squeeze")]
|
|
public static int QtlSqueeze(double* high, double* low, double* close, double* momOut, double* sqOut, int n, int period, double bbMult, double kcMult)
|
|
{
|
|
if (high == null || low == null || close == null || momOut == null || sqOut == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Squeeze.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(momOut, n), Dst(sqOut, n), period, bbMult, kcMult);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_squeeze_pro")]
|
|
public static int QtlSqueezePro(double* high, double* low, double* close, double* momOut, double* sqOut, int n, int period, double bbMult, double kcMultWide, double kcMultNormal, double kcMultNarrow, int momLength, int momSmooth, int useSma)
|
|
{
|
|
if (high == null || low == null || close == null || momOut == null || sqOut == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
SqueezePro.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(momOut, n), Dst(sqOut, n), period, bbMult, kcMultWide, kcMultNormal, kcMultNarrow, momLength, momSmooth, useSma != 0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ssf2")]
|
|
public static int QtlSsf2(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ssf2.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ssf3")]
|
|
public static int QtlSsf3(double* source, double* destination, int n, int period, double initialLast)
|
|
{
|
|
if (source == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ssf3.Batch(Src(source, n), Dst(destination, n), period, initialLast);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ssfdsp")]
|
|
public static int QtlSsfdsp(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ssfdsp.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_starchannel")]
|
|
public static int QtlStarchannel(double* high, double* low, double* close, double* middle, double* upper, double* lower, int n, int period, double multiplier, int atrPeriod)
|
|
{
|
|
if (high == null || low == null || close == null || middle == null || upper == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Starchannel.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(middle, n), Dst(upper, n), Dst(lower, n), period, multiplier, atrPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_stbands")]
|
|
public static int QtlStbands(double* high, double* low, double* close, double* upper, double* lower, double* trend, int n, int period, double multiplier)
|
|
{
|
|
if (high == null || low == null || close == null || upper == null || lower == null || trend == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Stbands.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(upper, n), Dst(lower, n), Dst(trend, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_stc")]
|
|
public static int QtlStc(double* source, double* output, int n, int kPeriod, int dPeriod, int fastLength, int slowLength, int smoothing)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Stc.Batch(Src(source, n), Dst(output, n), kPeriod, dPeriod, fastLength, slowLength, (StcSmoothing)smoothing);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_stderr")]
|
|
public static int QtlStderr(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Stderr.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_stoch")]
|
|
public static int QtlStoch(double* high, double* low, double* close, double* kOut, double* dOut, int n, int kLength, int dPeriod)
|
|
{
|
|
if (high == null || low == null || close == null || kOut == null || dOut == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Stoch.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(kOut, n), Dst(dOut, n), kLength, dPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_stochf")]
|
|
public static int QtlStochf(double* high, double* low, double* close, double* kOut, double* dOut, int n, int kLength, int dPeriod)
|
|
{
|
|
if (high == null || low == null || close == null || kOut == null || dOut == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Stochf.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(kOut, n), Dst(dOut, n), kLength, dPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_stochrsi")]
|
|
public static int QtlStochrsi(double* source, double* output, int n, int rsiLength, int stochLength, int kSmooth, int dSmooth)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Stochrsi.Batch(Src(source, n), Dst(output, n), rsiLength, stochLength, kSmooth, dSmooth);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_sum")]
|
|
public static int QtlSum(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Sum.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_super")]
|
|
public static int QtlSuper(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, double multiplier, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Super.Batch(sourceBars, period, multiplier);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_swings")]
|
|
public static int QtlSwings(double* high, double* low, double* highOutput, double* lowOutput, int n, int lookback)
|
|
{
|
|
if (high == null || low == null || highOutput == null || lowOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Swings.Batch(Src(high, n), Src(low, n), Dst(highOutput, n), Dst(lowOutput, n), lookback);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_t3")]
|
|
public static int QtlT3(double* source, double* output, int n, int period, double vfactor)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
T3.Batch(Src(source, n), Dst(output, n), period, vfactor);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_tdist")]
|
|
public static int QtlTdist(double* source, double* output, int n, int nu, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Tdist.Batch(Src(source, n), Dst(output, n), nu, period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_theil")]
|
|
public static int QtlTheil(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Theil.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_theilu")]
|
|
public static int QtlTheilU(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
TheilU.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_trama")]
|
|
public static int QtlTrama(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Trama.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_trim")]
|
|
public static int QtlTrim(double* source, double* output, int n, int period, double trimPct)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Trim.Batch(Src(source, n), Dst(output, n), period, trimPct);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ttmlrc")]
|
|
public static int QtlTtmLrc(double* source, double* midline, double* upper1, double* lower1, double* upper2, double* lower2, int n, int period)
|
|
{
|
|
if (source == null || midline == null || upper1 == null || lower1 == null || upper2 == null || lower2 == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
TtmLrc.Batch(Src(source, n), Dst(midline, n), Dst(upper1, n), Dst(lower1, n), Dst(upper2, n), Dst(lower2, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ttmscalper")]
|
|
public static int QtlTtmScalper(double* high, double* low, double* close, double* highOutput, double* lowOutput, int n, int useCloses)
|
|
{
|
|
if (high == null || low == null || close == null || highOutput == null || lowOutput == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
TtmScalper.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(highOutput, n), Dst(lowOutput, n), useCloses != 0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ttmsqueeze")]
|
|
public static int QtlTtmSqueeze(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int bbPeriod, double bbMult, int kcPeriod, double kcMult, int momPeriod, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = TtmSqueeze.Batch(sourceBars, bbPeriod, bbMult, kcPeriod, kcMult, momPeriod);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ttmtrend")]
|
|
public static int QtlTtmTrend(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int period, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = TtmTrend.Batch(sourceBars, period);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ttmwave")]
|
|
public static int QtlTtmWave(double* source, int n, double* dst)
|
|
{
|
|
if (source == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceSeries = BuildSeries(source, n);
|
|
var result = TtmWave.Batch(sourceSeries);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_tukeybiweight")]
|
|
public static int QtlTukeyBiweight(double* actual, double* predicted, double* output, int n, int period, double c)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
TukeyBiweight.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period, c);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_twap")]
|
|
public static int QtlTwap(double* price, double* output, int n, int period)
|
|
{
|
|
if (price == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Twap.Batch(Src(price, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ubands")]
|
|
public static int QtlUbands(double* source, double* upper, double* middle, double* lower, int n, int period, double multiplier)
|
|
{
|
|
if (source == null || upper == null || middle == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ubands.Batch(Src(source, n), Dst(upper, n), Dst(middle, n), Dst(lower, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_uchannel")]
|
|
public static int QtlUchannel(double* high, double* low, double* close, double* upper, double* middle, double* lower, int n, int strPeriod, int centerPeriod, double multiplier)
|
|
{
|
|
if (high == null || low == null || close == null || upper == null || middle == null || lower == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Uchannel.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(upper, n), Dst(middle, n), Dst(lower, n), strPeriod, centerPeriod, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ui")]
|
|
public static int QtlUi(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ui.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ultosc")]
|
|
public static int QtlUltosc(double* high, double* low, double* close, double* output, int n, int period1, int period2, int period3)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ultosc.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period1, period2, period3);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_usf")]
|
|
public static int QtlUsf(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Usf.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_va")]
|
|
public static int QtlVa(double* high, double* low, double* close, double* volume, double* output, int n)
|
|
{
|
|
if (high == null || low == null || close == null || volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Va.Batch(Src(high, n), Src(low, n), Src(close, n), Src(volume, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vama")]
|
|
public static int QtlVama(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int baseLength, int shortAtrPeriod, int longAtrPeriod, int minLength, int maxLength, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Vama.Batch(sourceBars, baseLength, shortAtrPeriod, longAtrPeriod, minLength, maxLength);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vel")]
|
|
public static int QtlVel(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vel.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vhf")]
|
|
public static int QtlVhf(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vhf.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vidya")]
|
|
public static int QtlVidya(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vidya.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vo")]
|
|
public static int QtlVo(double* volume, double* output, int n, int shortPeriod, int longPeriod)
|
|
{
|
|
if (volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vo.Batch(Src(volume, n), Dst(output, n), shortPeriod, longPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vortex")]
|
|
public static int QtlVortex(double* high, double* low, double* close, int period, double* viPlus, int n, double* viMinus)
|
|
{
|
|
if (high == null || low == null || close == null || viPlus == null || viMinus == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vortex.Batch(Src(high, n), Src(low, n), Src(close, n), period, Dst(viPlus, n), Dst(viMinus, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_voss")]
|
|
public static int QtlVoss(double* source, double* output, int n, int period, int predict, double bandwidth)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Voss.Batch(Src(source, n), Dst(output, n), period, predict, bandwidth);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vstop")]
|
|
public static int QtlVstop(double* high, double* low, double* close, double* output, int n, int period, double multiplier)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
if (period <= 0) return StatusCodes.QTL_ERR_INVALID_PARAM;
|
|
try
|
|
{
|
|
Vstop.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period, multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vov")]
|
|
public static int QtlVov(double* source, double* output, int n, int volatilityPeriod, int vovPeriod)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vov.Batch(Src(source, n), Dst(output, n), volatilityPeriod, vovPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vr")]
|
|
public static int QtlVr(double* high, double* low, double* close, double* output, int n, int period)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vr.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vroc")]
|
|
public static int QtlVroc(double* volume, double* output, int n, int period, int usePercent)
|
|
{
|
|
if (volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vroc.Batch(Src(volume, n), Dst(output, n), period, usePercent != 0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vwad")]
|
|
public static int QtlVwad(double* high, double* low, double* close, double* volume, double* output, int n, int period)
|
|
{
|
|
if (high == null || low == null || close == null || volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vwad.Batch(Src(high, n), Src(low, n), Src(close, n), Src(volume, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vwap")]
|
|
public static int QtlVwap(double* high, double* low, double* close, double* volume, double* output, int n, int period)
|
|
{
|
|
if (high == null || low == null || close == null || volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vwap.Batch(Src(high, n), Src(low, n), Src(close, n), Src(volume, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vwapbands")]
|
|
public static int QtlVwapbands(double* price, double* volume, double* upper1, double* lower1, double* upper2, double* lower2, double* vwap, double* stdDev, int n, double multiplier)
|
|
{
|
|
if (price == null || volume == null || upper1 == null || lower1 == null || upper2 == null || lower2 == null || vwap == null || stdDev == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vwapbands.Batch(Src(price, n), Src(volume, n), Dst(upper1, n), Dst(lower1, n), Dst(upper2, n), Dst(lower2, n), Dst(vwap, n), Dst(stdDev, n), multiplier);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_vwapsd")]
|
|
public static int QtlVwapsd(double* price, double* volume, double* upper, double* lower, double* vwap, double* stdDev, int n, double numDevs)
|
|
{
|
|
if (price == null || volume == null || upper == null || lower == null || vwap == null || stdDev == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Vwapsd.Batch(Src(price, n), Src(volume, n), Dst(upper, n), Dst(lower, n), Dst(vwap, n), Dst(stdDev, n), numDevs);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_wad")]
|
|
public static int QtlWad(double* high, double* low, double* close, double* volume, double* output, int n)
|
|
{
|
|
if (high == null || low == null || close == null || volume == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Wad.Batch(Src(high, n), Src(low, n), Src(close, n), Src(volume, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_wavelet")]
|
|
public static int QtlWavelet(double* source, double* output, int n, int levels, double threshMult)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Wavelet.Batch(Src(source, n), Dst(output, n), levels, threshMult);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_wavg")]
|
|
public static int QtlWavg(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Wavg.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_wclprice")]
|
|
public static int QtlWclprice(double* high, double* low, double* close, double* output, int n)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Wclprice.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n));
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_weibulldist")]
|
|
public static int QtlWeibulldist(double* source, double* output, int n, double k, double lambda, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Weibulldist.Batch(Src(source, n), Dst(output, n), k, lambda, period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_wiener")]
|
|
public static int QtlWiener(double* source, double* destination, int n, int period, int smoothPeriod)
|
|
{
|
|
if (source == null || destination == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Wiener.Batch(Src(source, n), Dst(destination, n), period, smoothPeriod);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_willr")]
|
|
public static int QtlWillr(double* high, double* low, double* close, double* output, int n, int period)
|
|
{
|
|
if (high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Willr.Batch(Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_wins")]
|
|
public static int QtlWins(double* source, double* output, int n, int period, double winPct)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Wins.Batch(Src(source, n), Dst(output, n), period, winPct);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_wmape")]
|
|
public static int QtlWmape(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Wmape.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_wrmse")]
|
|
public static int QtlWrmse(double* actual, double* predicted, double* output, int n, int period)
|
|
{
|
|
if (actual == null || predicted == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Wrmse.Batch(Src(actual, n), Src(predicted, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_yzv")]
|
|
public static int QtlYzv(double* open, double* high, double* low, double* close, double* output, int n, int period)
|
|
{
|
|
if (open == null || high == null || low == null || close == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Yzv.Batch(Src(open, n), Src(high, n), Src(low, n), Src(close, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_yzvama")]
|
|
public static int QtlYzvama(double* sourceOpen, double* sourceHigh, double* sourceLow, double* sourceClose, double* sourceVolume, int yzvShortPeriod, int yzvLongPeriod, int percentileLookback, int minLength, int maxLength, int n, double* dst)
|
|
{
|
|
if (sourceOpen == null || sourceHigh == null || sourceLow == null || sourceClose == null || sourceVolume == null || dst == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
var sourceBars = BuildBars(sourceOpen, sourceHigh, sourceLow, sourceClose, sourceVolume, n);
|
|
var result = Yzvama.Batch(sourceBars, yzvShortPeriod, yzvLongPeriod, percentileLookback, minLength, maxLength);
|
|
var values = result.Values;
|
|
if (values.Length > n) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
var outSpan = Dst(dst, n);
|
|
outSpan.Fill(double.NaN);
|
|
values.CopyTo(outSpan);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_zldema")]
|
|
public static int QtlZldema(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Zldema.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_zlema")]
|
|
public static int QtlZlema(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Zlema.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_zltema")]
|
|
public static int QtlZltema(double* source, double* output, int n, int period)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Zltema.Batch(Src(source, n), Dst(output, n), period);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
|
|
[UnmanagedCallersOnly(EntryPoint = "qtl_ztest")]
|
|
public static int QtlZtest(double* source, double* output, int n, int period, double mu0)
|
|
{
|
|
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
|
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
|
try
|
|
{
|
|
Ztest.Batch(Src(source, n), Dst(output, n), period, mu0);
|
|
return StatusCodes.QTL_OK;
|
|
}
|
|
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
|
}
|
|
}
|