龙听期货论坛's Archiver

龙听 发表于 2024-11-3 20:54

Stochastic指标(KDJ)指标c++语言写法

下面是一个简单的C++实现 kdj 函数的示例。KDJ 指标是基于随机指标(Stochastic)的一种扩展,通常用于技术分析。它由 K、D 和 J 三个值组成。以下是一个基础实现:
**** Hidden Message *****

龙听 发表于 2024-12-23 16:51

另一个版本计算方式:[code]
#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;
}
[/code]代码说明

    calculateHighLow 函数:
        用于计算每个点在周期内的最高价和最低价。

    calculateKDJ 函数:
        按公式计算 RSV、K、D 和 J 值。
        平滑因子默认使用 1/3。

    数据说明:
        closes 是收盘价序列。
        highs 和 lows 分别是最高价和最低价序列。

    输出结果:
        每一行输出对应的收盘价、K 值、D 值和 J 值。

注意事项

    数据量较小时(如不足一个周期),KDJ 值可能无法有效计算。
    smoothingFactor 可根据需求调整平滑程度(通常为 1/3 或 1/2)。

你可以根据实际需求修改输入数据和参数配置以适应不同场景。

龙听 发表于 2024-12-29 14:02

能成功计算出KDJ的程式 码[code]
#include <iostream>
#include <vector>
#include <deque> // 用于双端队列维护滑动窗口

// 股票数据结构
struct StockData {
    double closePrice; // 收盘价
    double highPrice;  // 最高价
    double lowPrice;   // 最低价
};

// 计算 KDJ 指标
void calculateKDJ(const std::vector<StockData>& stockData, int period,
                  std::vector<double>& K, std::vector<double>& D, std::vector<double>& J) {
    if (stockData.size() < period) {
        std::cerr << "数据不足以计算 KDJ!" << std::endl;
        return;
    }

    std::deque<int> highDeque; // 双端队列维护最高价索引
    std::deque<int> lowDeque;  // 双端队列维护最低价索引

    double k = 50.0, d = 50.0; // 初始 K 和 D 值

    for (size_t i = 0; i < stockData.size(); ++i) {
        // 移除滑动窗口外的元素
        if (!highDeque.empty() && highDeque.front() < static_cast<int>(i) - period + 1) {
            highDeque.pop_front();
        }
        if (!lowDeque.empty() && lowDeque.front() < static_cast<int>(i) - period + 1) {
            lowDeque.pop_front();
        }

        // 更新双端队列中的最大值和最小值
        while (!highDeque.empty() && stockData[highDeque.back()].highPrice <= stockData[i].highPrice) {
            highDeque.pop_back();
        }
        highDeque.push_back(static_cast<int>(i));

        while (!lowDeque.empty() && stockData[lowDeque.back()].lowPrice >= stockData[i].lowPrice) {
            lowDeque.pop_back();
        }
        lowDeque.push_back(static_cast<int>(i));

        // 计算 RSV
        if (i >= period - 1) {
            double highestHigh = stockData[highDeque.front()].highPrice;
            double lowestLow = stockData[lowDeque.front()].lowPrice;
            double rsv = 0.0;

            if (highestHigh != lowestLow) {
                rsv = (stockData[i].closePrice - lowestLow) / (highestHigh - lowestLow) * 100.0;
            }

            // 更新 K 和 D
            k = 2.0 / 3.0 * k + 1.0 / 3.0 * rsv;
            d = 2.0 / 3.0 * d + 1.0 / 3.0 * k;

            // 计算 J
            double j = 3.0 * k - 2.0 * d;

            // 保存结果
            K.push_back(k);
            D.push_back(d);
            J.push_back(j);
        } else {
            // 数据不足时填充默认值
            K.push_back(k);
            D.push_back(d);
            J.push_back(3.0 * k - 2.0 * d);
        }
    }
}

int main() {
    // 示例股票数据
    std::vector<StockData> stockData = {
        {10, 15, 8}, {11, 16, 9}, {12, 17, 10}, {13, 18, 11},
        {14, 19, 12}, {15, 20, 13}, {16, 21, 14}, {17, 22, 15},
        {18, 23, 16}, {19, 24, 17}
    };

    int period = 5; // 计算周期
    std::vector<double> K, D, J;

    // 计算 KDJ
    calculateKDJ(stockData, period, K, D, J);

    // 输出结果
    std::cout << "K值: ";
    for (const auto& k : K) std::cout << k << " ";
    std::cout << "\nD值: ";
    for (const auto& d : D) std::cout << d << " ";
    std::cout << "\nJ值: ";
    for (const auto& j : J) std::cout << j << " ";
    std::cout << std::endl;

    return 0;
}
[/code]

页: [1]