- UID
- 2
- 积分
- 2892427
- 威望
- 1396245 布
- 龙e币
- 1496182 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
另一个版本计算方式:- #include <iostream>
- #include <vector>
- #include <algorithm> // For std::min_element and std::max_element
- using namespace std;
- // 计算最低价和最高价的范围
- void calculateHighLow(const vector<double>& highs, const vector<double>& lows, int period, vector<double>& highest, vector<double>& lowest) {
- for (size_t i = 0; i < highs.size(); ++i) {
- if (i < period - 1) {
- highest.push_back(0);
- lowest.push_back(0);
- } else {
- double maxHigh = *max_element(highs.begin() + i - period + 1, highs.begin() + i + 1);
- double minLow = *min_element(lows.begin() + i - period + 1, lows.begin() + i + 1);
- highest.push_back(maxHigh);
- lowest.push_back(minLow);
- }
- }
- }
- // 计算 KDJ 指标
- void calculateKDJ(const vector<double>& closes, const vector<double>& highs, const vector<double>& lows, int period, double smoothingFactor) {
- vector<double> highest, lowest, rsv, kValues, dValues, jValues;
- // 计算最高价和最低价
- calculateHighLow(highs, lows, period, highest, lowest);
- // 计算 RSV
- for (size_t i = 0; i < closes.size(); ++i) {
- if (i < period - 1) {
- rsv.push_back(0);
- } else {
- double range = highest[i] - lowest[i];
- rsv.push_back(range == 0 ? 0 : (closes[i] - lowest[i]) / range * 100);
- }
- }
- // 初始化 K 和 D 值
- kValues.push_back(50); // 通常初始值设置为 50
- dValues.push_back(50);
- // 迭代计算 K 和 D 值
- for (size_t i = 1; i < rsv.size(); ++i) {
- double k = smoothingFactor * rsv[i] + (1 - smoothingFactor) * kValues.back();
- double d = smoothingFactor * k + (1 - smoothingFactor) * dValues.back();
- kValues.push_back(k);
- dValues.push_back(d);
- }
- // 计算 J 值
- for (size_t i = 0; i < kValues.size(); ++i) {
- double j = 3 * kValues[i] - 2 * dValues[i];
- jValues.push_back(j);
- }
- // 输出结果
- cout << "Index\tClose\tK\tD\tJ" << endl;
- for (size_t i = 0; i < closes.size(); ++i) {
- cout << i << "\t" << closes[i] << "\t" << kValues[i] << "\t" << dValues[i] << "\t" << jValues[i] << endl;
- }
- }
- int main() {
- // 示例数据
- vector<double> closes = {1.0, 1.1, 1.2, 1.1, 1.0, 1.3, 1.4, 1.5, 1.6, 1.7};
- vector<double> highs = {1.1, 1.2, 1.3, 1.2, 1.1, 1.4, 1.5, 1.6, 1.7, 1.8};
- vector<double> lows = {0.9, 1.0, 1.1, 1.0, 0.9, 1.2, 1.3, 1.4, 1.5, 1.6};
- // 参数
- int period = 9; // 计算周期
- double smoothingFactor = 1.0 / 3.0; // 平滑系数 (通常为 1/3)
- // 计算 KDJ
- calculateKDJ(closes, highs, lows, period, smoothingFactor);
- return 0;
- }
复制代码 代码说明
calculateHighLow 函数:
用于计算每个点在周期内的最高价和最低价。
calculateKDJ 函数:
按公式计算 RSV、K、D 和 J 值。
平滑因子默认使用 1/3。
数据说明:
closes 是收盘价序列。
highs 和 lows 分别是最高价和最低价序列。
输出结果:
每一行输出对应的收盘价、K 值、D 值和 J 值。
注意事项
数据量较小时(如不足一个周期),KDJ 值可能无法有效计算。
smoothingFactor 可根据需求调整平滑程度(通常为 1/3 或 1/2)。
你可以根据实际需求修改输入数据和参数配置以适应不同场景。 |
|