C API 参考
TechKit 提供稳定的 C ABI,以实现最大的跨语言兼容性。
头文件
#include <techkit/techkit_c.h>
数据类型
结果结构体
tk_result
单值指标结果。
typedef struct {
double value; // Calculated value
int valid; // 1 = valid, 0 = warmup period
} tk_result;
使用方法:
tk_result r = tk_update(ind, price);
if (r.valid) {
printf("Value: %.4f\n", r.value);
}
tk_macd_result
MACD 指标结果,包含三个输出值。
typedef struct {
double macd; // MACD line (fast EMA - slow EMA)
double signal; // Signal line (EMA of MACD)
double histogram; // Histogram (MACD - Signal)
int valid;
} tk_macd_result;
tk_bbands_result
布林带结果。
typedef struct {
double upper; // Upper band (middle + nbdev * stddev)
double middle; // Middle band (SMA)
double lower; // Lower band (middle - nbdev * stddev)
int valid;
} tk_bbands_result;
tk_stoch_result
随机振荡器结果。
typedef struct {
double slowk; // %K line (smoothed)
double slowd; // %D line (SMA of %K)
int valid;
} tk_stoch_result;
tk_adx_result
ADX 指标结果,包含三个输出值。
typedef struct {
double plus_di; // +DI (Plus Directional Indicator)
double minus_di; // -DI (Minus Directional Indicator)
double adx; // ADX (Average Directional Index)
int valid;
} tk_adx_result;
tk_stochf_result
快速随机指标结果。
typedef struct {
double k; // %K line (raw stochastic)
double d; // %D line (SMA of %K)
int valid;
} tk_stochf_result;
tk_stochrsi_result
随机 RSI 结果。
typedef struct {
double k; // %K line (smoothed stochastic of RSI)
double d; // %D line (SMA of %K)
int valid;
} tk_stochrsi_result;
tk_aroon_result
Aroon 指标结果。
typedef struct {
double up; // Aroon Up (0-100)
double down; // Aroon Down (0-100)
int valid;
} tk_aroon_result;
tk_minmax_result
MINMAX 指标结果。
typedef struct {
double min; // Minimum value over period
double max; // Maximum value over period
int valid;
} tk_minmax_result;
tk_ht_phasor_result
希尔伯特变换相量结果。
typedef struct {
double inphase; // InPhase component (I1)
double quadrature; // Quadrature component (Q1)
int valid;
} tk_ht_phasor_result;
tk_ht_sine_result
希尔伯特变换正弦结果。
typedef struct {
double sine; // Sine of dominant cycle phase
double leadsine; // LeadSine (45 degrees ahead)
int valid;
} tk_ht_sine_result;
tk_drawdown_result
回撤序列结果。
typedef struct {
double drawdown; // Current drawdown (negative value)
double max_drawdown; // Maximum drawdown (negative value)
int duration; // Current drawdown duration in bars
int max_duration; // Maximum drawdown duration in bars
int valid;
} tk_drawdown_result;
tk_zigzag_result
ZigZag 指标结果。
typedef struct {
double zigzag_value; // Current ZigZag line value (extreme price)
int direction; // Current trend: 1=up, -1=down, 0=undefined
int is_pivot; // 1 if pivot confirmed this bar, 0 otherwise
int pivot_type; // If is_pivot: 1=swing high, -1=swing low
double last_pivot_price; // Price of most recent confirmed pivot
int bars_since_pivot; // Bars since last confirmed pivot
int valid;
} tk_zigzag_result;
tk_swing_result
摆动高点/低点检测器结果。
typedef struct {
int is_swing_high; // 1 if swing high detected, 0 otherwise
int is_swing_low; // 1 if swing low detected, 0 otherwise
double swing_high_price; // Price of swing high (or 0 if not detected)
double swing_low_price; // Price of swing low (or 0 if not detected)
int bars_ago; // How many bars ago the swing occurred
int valid;
} tk_swing_result;
tk_pivot_result
枢轴点结果。
typedef struct {
double pp; // Pivot Point
double r1, r2, r3; // Resistance levels 1, 2, 3
double s1, s2, s3; // Support levels 1, 2, 3
int valid;
} tk_pivot_result;
tk_harmonic_result
谐波形态检测结果。
typedef struct {
tk_harmonic_type pattern; // Detected pattern type
int direction; // 1=bullish, -1=bearish, 0=none
double x_price, a_price, b_price, c_price, d_price; // XABCD point prices
int x_bar, a_bar, b_bar, c_bar, d_bar; // XABCD point bar indices
double xab_ratio, abc_ratio, bcd_ratio, xad_ratio; // Fibonacci ratios
double prz_high, prz_low; // Potential Reversal Zone
double score; // Pattern quality score (0-100)
int is_complete; // 1 if D point is confirmed
int valid;
} tk_harmonic_result;
tk_chart_pattern_result
图表形态检测结果。
typedef struct {
tk_chart_pattern_type pattern; // Detected pattern type
int direction; // 1=bullish, -1=bearish, 0=neutral
double neckline; // Neckline/support/resistance level
double neckline_slope; // Slope of neckline (per bar)
double target_price; // Projected target after breakout
double point_prices[5]; // Prices of key pivot points
int point_bars[5]; // Bar indices of key points
int num_points; // Number of valid points (3-5)
double height; // Pattern height
double width_bars; // Pattern width in bars
double symmetry_score; // Symmetry quality (0-1)
double score; // Overall quality score (0-100)
int is_complete; // 1 if pattern formation complete
int is_confirmed; // 1 if breakout confirmed
double breakout_price; // Price at breakout (if confirmed)
int valid;
} tk_chart_pattern_result;
tk_ohlcv
需要完整价格柱的指标的 OHLCV 柱数据。
typedef struct {
double open;
double high;
double low;
double close;
double volume;
} tk_ohlcv;
不透明句柄
typedef struct tk_indicator_s* tk_indicator;
所有指标实例都通过不透明句柄表示。这确保了:
跨版本的 ABI 稳定性
内存安全(内部状态隐藏)
线程安全(无共享状态)
错误代码
typedef enum {
TK_OK = 0, // Success
TK_ERR_INVALID_PARAM = -1, // Invalid parameter value
TK_ERR_NOT_ENOUGH_DATA = -2, // Not enough data for operation
TK_ERR_OUT_OF_MEMORY = -3, // Memory allocation failed
TK_ERR_NULL_POINTER = -4, // Null pointer passed
TK_ERR_INVALID_HANDLE = -5 // Invalid indicator handle
} tk_error;
移动平均类型
typedef enum {
TK_MA_SMA = 0, // Simple Moving Average
TK_MA_EMA = 1, // Exponential Moving Average
TK_MA_WMA = 2, // Weighted Moving Average
TK_MA_DEMA = 3, // Double Exponential Moving Average
TK_MA_TEMA = 4, // Triple Exponential Moving Average
TK_MA_TRIMA = 5, // Triangular Moving Average
TK_MA_KAMA = 6, // Kaufman Adaptive Moving Average
TK_MA_MAMA = 7, // MESA Adaptive Moving Average (not implemented)
TK_MA_T3 = 8 // Triple Exponential Moving Average (T3)
} tk_ma_type;
枢轴点类型
typedef enum {
TK_PIVOT_CLASSIC = 0, // Classic: PP=(H+L+C)/3
TK_PIVOT_FIBONACCI = 1, // Fibonacci: uses 0.382, 0.618, 1.0 ratios
TK_PIVOT_WOODIE = 2, // Woodie: PP=(H+L+2C)/4
TK_PIVOT_CAMARILLA = 3, // Camarilla: close-based with 1.1/12, 1.1/6, 1.1/4
TK_PIVOT_DEMARK = 4 // DeMark: X varies by close vs open relationship
} tk_pivot_type;
谐波形态类型
typedef enum {
TK_HARMONIC_NONE = 0,
TK_HARMONIC_GARTLEY_BULL = 1,
TK_HARMONIC_GARTLEY_BEAR = 2,
TK_HARMONIC_BUTTERFLY_BULL = 3,
TK_HARMONIC_BUTTERFLY_BEAR = 4,
TK_HARMONIC_BAT_BULL = 5,
TK_HARMONIC_BAT_BEAR = 6,
TK_HARMONIC_CRAB_BULL = 7,
TK_HARMONIC_CRAB_BEAR = 8,
TK_HARMONIC_SHARK_BULL = 9,
TK_HARMONIC_SHARK_BEAR = 10,
TK_HARMONIC_CYPHER_BULL = 11,
TK_HARMONIC_CYPHER_BEAR = 12
} tk_harmonic_type;
图表形态类型
typedef enum {
TK_CHART_NONE = 0,
TK_CHART_HEAD_SHOULDERS = 1,
TK_CHART_INV_HEAD_SHOULDERS = 2,
TK_CHART_DOUBLE_TOP = 3,
TK_CHART_DOUBLE_BOTTOM = 4,
TK_CHART_TRIPLE_TOP = 5,
TK_CHART_TRIPLE_BOTTOM = 6,
TK_CHART_TRIANGLE_SYM = 7,
TK_CHART_TRIANGLE_ASC = 8,
TK_CHART_TRIANGLE_DESC = 9,
TK_CHART_WEDGE_RISING = 10,
TK_CHART_WEDGE_FALLING = 11
} tk_chart_pattern_type;
生命周期函数
创建指标
所有指标都使用模式为 tk_<name>_new(...) 的工厂函数创建。这些函数返回一个不透明句柄(tk_indicator),出错时返回 NULL。
移动平均(重叠研究)
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
2*(period-1) |
|
period: int |
close |
single |
3*(period-1) |
|
period: int |
close |
single |
period |
|
period: int |
close |
single |
period-1 |
|
period: int, vfactor: double |
close |
single |
6*(period-1) |
|
period: int, type: tk_ma_type |
close |
single |
varies |
|
period: int, nbdevup/dn: double |
close |
3 values |
period-1 |
|
accel: double, max: double |
OHLCV |
single |
1 |
|
8 parameters |
OHLCV |
single |
1 |
|
min/max: int, type: tk_ma_type |
close + period |
single |
max-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
OHLCV |
single |
period-1 |
|
- |
OHLCV |
single |
0 |
|
- |
OHLCV |
single |
0 |
|
- |
OHLCV |
single |
0 |
|
- |
OHLCV |
single |
0 |
动量指标
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
period: int |
close |
single |
period |
|
fast, slow, signal: int |
close |
3 values |
slow-1+signal-1 |
|
6 parameters |
close |
3 values |
varies |
|
signal: int |
close |
3 values |
25+signal-1 |
|
k, k_slow, d: int |
OHLCV |
2 values |
k-1+k_slow-1+d-1 |
|
k, d: int |
OHLCV |
2 values |
k-1+d-1 |
|
4 int params |
close |
2 values |
varies |
|
period: int |
OHLCV |
3 values |
2*period-1 |
|
period: int |
OHLCV |
single |
2*period-1 |
|
period: int |
OHLCV |
single |
period-1 |
|
period: int |
OHLCV |
single |
period-1 |
|
period: int |
OHLCV |
single |
period |
|
period: int |
close |
single |
period |
|
period: int |
close |
single |
period |
|
period: int |
close |
single |
period |
|
period: int |
close |
single |
period |
|
period: int |
close |
single |
period |
|
fast, slow: int |
close |
single |
slow-1 |
|
fast, slow: int |
close |
single |
slow-1 |
|
period: int |
close |
single |
period |
|
period: int |
close |
single |
3*(period-1) |
|
p1, p2, p3: int |
OHLCV |
single |
varies |
|
period: int |
OHLCV |
2 values |
period |
|
period: int |
OHLCV |
single |
period |
|
period: int |
OHLCV |
single |
2*period-1 |
|
period: int |
OHLCV |
single |
2*period-1 |
|
period: int |
OHLCV |
single |
2*period-1 |
|
period: int |
OHLCV |
single |
period |
|
period: int |
OHLCV |
single |
period |
|
- |
OHLCV |
single |
0 |
波动率指标
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
period: int |
OHLCV |
single |
period |
|
period: int |
OHLCV |
single |
period |
|
- |
OHLCV |
single |
1 |
|
period: int, nbdev: double |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
成交量指标
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
- |
OHLCV |
single |
0 |
|
- |
OHLCV |
single |
0 |
|
fast, slow: int |
OHLCV |
single |
slow-1 |
统计函数
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
period: int |
close |
single |
period-1 |
|
period: int, nbdev: double |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close + close |
single |
period-1 |
|
period: int |
close + close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
single |
period-1 |
|
period: int |
close |
2 values |
period-1 |
希尔伯特变换(周期指标)
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
- |
close |
single |
63 |
|
- |
close |
single |
63 |
|
- |
close |
single |
63 |
|
- |
close |
single |
63 |
|
- |
close |
2 values |
63 |
|
- |
close |
2 values |
63 |
风险指标
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
period: int, rfr: double, ann: int |
returns |
single |
period-1 |
|
4 params |
returns |
single |
period-1 |
|
- |
price |
single |
0 |
|
- |
price |
multi |
0 |
|
period: int, ann: int |
returns |
single |
period-1 |
|
period: int, conf: double |
returns |
single |
period-1 |
|
period: int, conf: double |
returns |
single |
period-1 |
波动率模型
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
lambda: double, ann: int |
returns |
single |
0 |
|
period: int, ann: int |
returns |
single |
period-1 |
|
period: int, ann: int |
OHLCV |
single |
period-1 |
|
4 params |
returns |
single |
0 |
结构分析
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
dev_pct: double, depth: int |
OHLCV |
multi |
depth |
|
left: int, right: int |
OHLCV |
multi |
left+right |
|
type: tk_pivot_type |
OHLCV |
multi |
1 |
形态识别
函数 |
参数 |
输入 |
输出 |
回溯期 |
|---|---|---|---|---|
|
3 params |
OHLCV |
multi |
varies |
|
3 params |
OHLCV |
multi |
varies |
|
- |
OHLCV |
single |
0-4 |
注意: 共有 61 个蜡烛图形态函数(tk_cdl_doji_new、tk_cdl_hammer_new 等)。它们都遵循相同的模式,需要 OHLCV 输入。
销毁指标
void tk_free(tk_indicator ind);
重要: 使用完指标后必须调用 tk_free() 以防止内存泄漏。
tk_indicator sma = tk_sma_new(20);
// ... use indicator ...
tk_free(sma); // Required!
重置状态
void tk_reset(tk_indicator ind);
清除所有内部状态。指标返回到初始预热状态。
更新函数
单值更新
tk_result tk_update(tk_indicator ind, double value);
用于只需要收盘价的指标:
SMA, EMA, WMA, DEMA, TEMA, KAMA, TRIMA, T3
RSI, MOM, ROC, ROCP, ROCR, ROCR100
APO, PPO, CMO, TRIX
STDDEV, VAR, LINEARREG*
HT_* 指标
风险指标(Sharpe、Sortino 等)
波动率模型(EWMA、Realized、GARCH)
示例:
tk_indicator rsi = tk_rsi_new(14);
for (int i = 0; i < n; i++) {
tk_result r = tk_update(rsi, close[i]);
if (r.valid) {
printf("RSI[%d]: %.2f\n", i, r.value);
}
}
tk_free(rsi);
OHLCV 更新
tk_result tk_update_ohlcv(tk_indicator ind, const tk_ohlcv* bar);
用于需要完整 OHLCV 数据的指标:
ATR, NATR, TRANGE
ADX, ADXR, DX, PLUS_DI, MINUS_DI, PLUS_DM, MINUS_DM
CCI, WILLR, MFI
STOCH, STOCHF
OBV, AD, ADOSC
SAR, SAREXT
AROON, ULTOSC
AVGPRICE, MEDPRICE, TYPPRICE, WCLPRICE, BOP, MIDPRICE
PARKINSON_VOL
ZIGZAG, SWING, PIVOT
HARMONIC, CHART_PATTERN
所有 CDL* 形态识别函数
示例:
tk_indicator atr = tk_atr_new(14);
for (int i = 0; i < n; i++) {
tk_ohlcv bar = {open[i], high[i], low[i], close[i], volume[i]};
tk_result r = tk_update_ohlcv(atr, &bar);
if (r.valid) {
printf("ATR[%d]: %.4f\n", i, r.value);
}
}
tk_free(atr);
多输出更新
MACD
tk_macd_result tk_macd_update(tk_indicator ind, double value);
tk_macd_result tk_macdext_update(tk_indicator ind, double value);
tk_macd_result tk_macdfix_update(tk_indicator ind, double value);
示例:
tk_indicator macd = tk_macd_new(12, 26, 9);
for (int i = 0; i < n; i++) {
tk_macd_result r = tk_macd_update(macd, close[i]);
if (r.valid) {
printf("MACD: %.4f, Signal: %.4f, Hist: %.4f\n",
r.macd, r.signal, r.histogram);
}
}
tk_free(macd);
布林带
tk_bbands_result tk_bbands_update(tk_indicator ind, double value);
随机指标
tk_stoch_result tk_stoch_update(tk_indicator ind, const tk_ohlcv* bar);
tk_stochf_result tk_stochf_update(tk_indicator ind, const tk_ohlcv* bar);
tk_stochrsi_result tk_stochrsi_update(tk_indicator ind, double value);
ADX
tk_adx_result tk_adx_update(tk_indicator ind, const tk_ohlcv* bar);
Aroon
tk_aroon_result tk_aroon_update(tk_indicator ind, const tk_ohlcv* bar);
MINMAX
tk_minmax_result tk_minmax_update(tk_indicator ind, double value);
希尔伯特变换
tk_ht_phasor_result tk_ht_phasor_update(tk_indicator ind, double value);
tk_ht_sine_result tk_ht_sine_update(tk_indicator ind, double value);
回撤
tk_drawdown_result tk_drawdown_update(tk_indicator ind, double price);
ZigZag
tk_zigzag_result tk_zigzag_update(tk_indicator ind, const tk_ohlcv* bar);
摆动
tk_swing_result tk_swing_update(tk_indicator ind, const tk_ohlcv* bar);
枢轴点
tk_pivot_result tk_pivot_update(tk_indicator ind, const tk_ohlcv* bar);
谐波形态
tk_harmonic_result tk_harmonic_update(tk_indicator ind, const tk_ohlcv* bar);
图表形态
tk_chart_pattern_result tk_chart_pattern_update(tk_indicator ind, const tk_ohlcv* bar);
特殊更新函数
MAVP(可变周期)
tk_result tk_mavp_update(tk_indicator ind, double value, double period);
Beta
tk_result tk_beta_update(tk_indicator ind, double value0, double value1);
相关性
tk_result tk_correl_update(tk_indicator ind, double value0, double value1);
查询函数
检查就绪状态
int tk_is_ready(tk_indicator ind);
如果指标有足够的数据产生有效输出,返回 1,否则返回 0。
获取回溯期
int tk_lookback(tk_indicator ind);
返回产生第一个有效输出所需的柱数。
回溯期参考表:
指标 |
回溯期公式 |
|---|---|
SMA(n) |
n - 1 |
EMA(n) |
n - 1 |
RSI(n) |
n |
MACD(f,s,g) |
s - 1 + g - 1 |
ADX(n) |
2n - 1 |
BBANDS(n) |
n - 1 |
ATR(n) |
n |
STOCH(k,s,d) |
k - 1 + s - 1 + d - 1 |
HT_* |
63 |
价格变换 |
0 |
获取指标名称
const char* tk_name(tk_indicator ind);
返回指标名称字符串(例如,"SMA"、"RSI"、"MACD")。
状态序列化
size_t tk_state_size(tk_indicator ind);
int tk_state_save(tk_indicator ind, void* buffer, size_t buffer_size);
int tk_state_load(tk_indicator ind, const void* buffer, size_t buffer_size);
保存和恢复指标状态,用于持久化或检查点。
版本信息
const char* tk_version_string(void); // "1.2.1"
int tk_version_major(void); // 1
int tk_version_minor(void); // 2
int tk_version_patch(void); // 1
批量计算
单值数组
int tk_calculate(
tk_indicator ind,
const double* data,
size_t data_len,
tk_result* out,
size_t out_capacity
);
计算整个数组的指标值。返回写入的结果数量,或负错误代码。
示例:
double prices[100] = { /* ... */ };
tk_result results[100];
tk_indicator sma = tk_sma_new(20);
int count = tk_calculate(sma, prices, 100, results, 100);
for (int i = 0; i < count; i++) {
if (results[i].valid) {
printf("SMA[%d]: %.2f\n", i, results[i].value);
}
}
tk_free(sma);
OHLCV 数组
int tk_calculate_ohlcv(
tk_indicator ind,
const tk_ohlcv* bars,
size_t bars_len,
tk_result* out,
size_t out_capacity
);
形态识别批量函数
谐波形态扫描
int tk_harmonic_scan(
const tk_ohlcv* bars,
int len,
double deviation_pct,
double tolerance,
tk_harmonic_result* out,
int max_results
);
扫描历史数据以查找谐波形态。返回找到的形态数量。
图表形态扫描
int tk_chart_pattern_scan(
const tk_ohlcv* bars,
int len,
tk_chart_pattern_type pattern_type,
double tolerance,
tk_chart_pattern_result* out,
int max_results
);
扫描历史数据以查找图表形态。将 pattern_type 设置为 0 以扫描所有形态。
形态名称辅助函数
const char* tk_harmonic_pattern_name(tk_harmonic_type type);
const char* tk_chart_pattern_name(tk_chart_pattern_type type);
double tk_chart_pattern_target(const tk_chart_pattern_result* pattern);
线程安全
TechKit 在设计上是线程安全的:
无全局状态:每个指标实例完全独立
无需锁:不同线程可以同时使用不同的指标实例
安全模式:
// Thread 1 // Thread 2
tk_indicator sma1 = tk_sma_new(20); tk_indicator sma2 = tk_sma_new(20);
tk_update(sma1, price1); tk_update(sma2, price2); // Safe!
tk_free(sma1); tk_free(sma2);
不安全模式(不要这样做):
// Sharing same indicator across threads - NOT SAFE
tk_indicator shared_sma = tk_sma_new(20);
// Thread 1: tk_update(shared_sma, price1); // Race condition!
// Thread 2: tk_update(shared_sma, price2); // Race condition!
错误处理
大多数函数不返回错误代码。相反:
工厂函数在参数无效时返回
NULL更新函数在预热期间返回
{0.0, 0}在使用
result.value之前检查result.valid
tk_indicator ind = tk_sma_new(-1); // Invalid period
if (ind == NULL) {
// Handle error
}
tk_indicator sma = tk_sma_new(20);
tk_result r = tk_update(sma, price);
if (!r.valid) {
// Still in warmup period, ignore result
}
内存管理
分配:
tk_xxx_new()在内部分配内存释放:必须调用
tk_free()来释放内存内存占用:窗口指标为 O(period),递归指标为 O(1)
指标类型 |
内存 |
示例 |
|---|---|---|
SMA, WMA, TRIMA |
O(period) |
环形缓冲区 |
EMA, RSI, MACD |
O(1) |
固定状态 |
BBANDS |
O(period) |
环形缓冲区 + 方差 |
STOCH |
O(period) |
高低跟踪 |
ADX |
O(1) |
平滑值 |
完整示例
#include <techkit/techkit_c.h>
#include <stdio.h>
int main() {
// Sample OHLCV data
double open[] = {100.0, 101.0, 102.0, 101.5, 103.0};
double high[] = {101.5, 102.5, 103.0, 103.5, 104.0};
double low[] = {99.5, 100.5, 101.0, 101.0, 102.0};
double close[] = {101.0, 102.0, 101.5, 103.0, 103.5};
double volume[] = {1000, 1100, 900, 1200, 1150};
int n = 5;
// Create indicators
tk_indicator sma = tk_sma_new(3);
tk_indicator rsi = tk_rsi_new(3);
tk_indicator atr = tk_atr_new(3);
tk_indicator macd = tk_macd_new(2, 3, 2);
printf("Version: %s\n\n", tk_version_string());
for (int i = 0; i < n; i++) {
// Single value indicators
tk_result sma_r = tk_update(sma, close[i]);
tk_result rsi_r = tk_update(rsi, close[i]);
// OHLCV indicator
tk_ohlcv bar = {open[i], high[i], low[i], close[i], volume[i]};
tk_result atr_r = tk_update_ohlcv(atr, &bar);
// Multi-output indicator
tk_macd_result macd_r = tk_macd_update(macd, close[i]);
printf("Bar %d: Close=%.2f\n", i, close[i]);
if (sma_r.valid) printf(" SMA: %.4f\n", sma_r.value);
if (rsi_r.valid) printf(" RSI: %.2f\n", rsi_r.value);
if (atr_r.valid) printf(" ATR: %.4f\n", atr_r.value);
if (macd_r.valid) printf(" MACD: %.4f, Signal: %.4f\n",
macd_r.macd, macd_r.signal);
printf("\n");
}
// Cleanup
tk_free(sma);
tk_free(rsi);
tk_free(atr);
tk_free(macd);
return 0;
}