龙听期货论坛's Archiver

龙听 发表于 2024-12-18 16:59

鼎元C++期货量化/程序化教程【随机指标(Stochastic Oscillator,KDJ)的计算方法及调用方法】

第一部分、简介与计算原理

KDJ指标的中文名称又叫随机指标,最早起源于期货市场,由乔治·莱恩(George Lane)首创。随机指标KDJ最早是以KD指标的形式出现,而KD指标是在威廉指标的基础上发展起来的。不过KD指标只判断股票的超买超卖的现象,在KDJ指标中则融合了移动平均线速度上的观念,形成比较准确的买卖信号依据。在实践中,K线与D线配合J线组成KDJ指标来使用。KDJ指标在设计过程中主要是研究最高价、最低价和收盘价之间的关系,同时也融合了动量观念、强弱指标和移动平均线的一些优点。因此,能够比较迅速、快捷、直观地研判行情,被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具。

[img]http://p.algo2.net/2024/1218/dc258aeda9b19.png[/img]
[img]http://p.algo2.net/2024/1218/29f6991c57251.png[/img]

龙听 发表于 2024-12-18 18:48

程式码部分:[code]
//KDJ指标
        map<string, TKVALUE>::iterator it;
        for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
        {
                pc.push_back(it->second.dClose); //将收盘价放入pc容器vector
        }
        int n = 0;
        double hiprice = -99999;
        double lowprice = 99999;
        for (int i = 0; i < pc.size(); i++)
        {
                if(n <= 9)
                {
                double value1 = pc[i] -
                }
        }
        double value1 = pc[pc.size() - 1] - lowest(sPeriod, sInst, 9);
        double value2 = highest(sPeriod, sInst, 9) - lowest(sPeriod, sInst, 9);
        double rsv = 100 * value1 / value2;
       
        if (value2 <> 0)
        {
                double kvalue = (2 * kvalue/3) + rsv/3;
                double dvalue = (2 * dvalue / 3) + kvalue / 3
                double jvalue = 3 * kvalue - 2 * dvalue;
        }
[/code]

龙听 发表于 2024-12-24 10:12

存档的一个版本,以后有空再继续研究,不要加到鼎元里面,会死掉的。

头文件声明:[code]
        void calculateHighLow(vector<double>highs, vector<double>lows, int period, vector<double>highest, vector<double>lowest);
        void calculateKDJ(vector<double>pc, vector<double>highs, vector<double>lows, int period, double smoothingFactor);
[/code][code]
//KDJ指标参数
        vector<double> closes,highest2, lowest2,highs,lows,rsv, kValues, dValues, jValues;
        double smoothingFactor;
        int period1;
[/code]源文件指标模块:[code]
#include <algorithm> // For std::min_element and std::max_element
[/code]头部增加一个这样的[code]
// 计算最低价和最高价范围
void test::calculateHighLow(vector<double>highs, vector<double>lows, int period1, vector<double>highest2, vector<double>lowest2)
{
        for (int i = 0; i < highs.size(); ++i)
        {
                if (i < period1 - 1) {
                        highest2.push_back(0);
                        lowest2.push_back(0);
                }
                else {
                        double maxHigh = *max_element(highs.begin() + i - period1 + 1, highs.begin() + i + 1);
                        double minLow = *min_element(lows.begin() + i - period1 + 1, lows.begin() + i + 1);
                        highest2.push_back(maxHigh);
                        lowest2.push_back(minLow);
                }
        }
}
// 计算 KDJ 指标
void test::calculateKDJ(vector<double>closes, vector<double>highs,vector<double>lows, int period1, double smoothingFactor)
{
        vector<double> highest2, lowest2, rsv, kValues, dValues, jValues;
        // 计算最高价和最低价
        calculateHighLow(highs, lows, period1, highest2, lowest2);
        // 计算 RSV
        for (int i = 0; i < closes.size(); ++i)
        {
                if (i < period1-1)
                {
                        rsv.push_back(0);
                }
                else
                {
                        double range = highest2[i] - lowest2[i];
                        rsv.push_back(iff(range == 0,0,closes[i] - lowest2[i])/range * 100);
                }
        }
        // 初始化 K 和 D 值
        kValues.push_back(50); // 通常初始值设置为 50
        dValues.push_back(50);

        // 迭代计算 K 和 D 值
        for (int 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);
        }
}
[/code]源文件策略test.cpp里面[code]
//计算KDJ
        map<string, TKVALUE>::iterator it;
        for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
        {
                closes.push_back(it->second.dClose);
                highs.push_back(it->second.dHigh);
                lows.push_back(it->second.dLow);
        }
        // 参数
        period1 = 9;            // 计算周期
        smoothingFactor = 1.0/3.0; // 平滑系数 (通常为 1/3)
        calculateHighLow(highs, lows, period1, highest2, lowest2);
        // 计算 KDJ
        calculateKDJ(closes, highs, lows, period1, smoothingFactor);//获得DVALUE,KVALUE,JVALUE的 VECTOR形式数值

        double value1 = kValues[kValues.size() - 1];
        double value2 = dValues[dValues.size() - 1];
        double value3 = jValues[jValues.size() - 1];
        InsertLog("Kvalue: " + to_string(value1) + "Dvalue: " + to_string(value2) + "Jvalue: " + to_string(value3));
[/code]我测试的会崩溃,大家不要再试了,以后我优化好了在这里贴出来。

页: [1]