: | : | :期货量化学习 | :期货量化 |
返回列表 发帖

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

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

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

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



论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

程式码部分:
  1. //KDJ指标
  2.         map<string, TKVALUE>::iterator it;
  3.         for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
  4.         {
  5.                 pc.push_back(it->second.dClose); //将收盘价放入pc容器vector
  6.         }
  7.         int n = 0;
  8.         double hiprice = -99999;
  9.         double lowprice = 99999;
  10.         for (int i = 0; i < pc.size(); i++)
  11.         {
  12.                 if(n <= 9)
  13.                 {
  14.                 double value1 = pc[i] -
  15.                 }
  16.         }
  17.         double value1 = pc[pc.size() - 1] - lowest(sPeriod, sInst, 9);
  18.         double value2 = highest(sPeriod, sInst, 9) - lowest(sPeriod, sInst, 9);
  19.         double rsv = 100 * value1 / value2;
  20.        
  21.         if (value2 <> 0)
  22.         {
  23.                 double kvalue = (2 * kvalue/3) + rsv/3;
  24.                 double dvalue = (2 * dvalue / 3) + kvalue / 3
  25.                 double jvalue = 3 * kvalue - 2 * dvalue;
  26.         }
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

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

头文件声明:
  1.         void calculateHighLow(vector<double>highs, vector<double>lows, int period, vector<double>highest, vector<double>lowest);
  2.         void calculateKDJ(vector<double>pc, vector<double>highs, vector<double>lows, int period, double smoothingFactor);
复制代码
  1. //KDJ指标参数
  2.         vector<double> closes,highest2, lowest2,highs,lows,rsv, kValues, dValues, jValues;
  3.         double smoothingFactor;
  4.         int period1;
复制代码
源文件指标模块:
  1. #include <algorithm> // For std::min_element and std::max_element
复制代码
头部增加一个这样的
  1. // 计算最低价和最高价范围
  2. void test::calculateHighLow(vector<double>highs, vector<double>lows, int period1, vector<double>highest2, vector<double>lowest2)
  3. {
  4.         for (int i = 0; i < highs.size(); ++i)
  5.         {
  6.                 if (i < period1 - 1) {
  7.                         highest2.push_back(0);
  8.                         lowest2.push_back(0);
  9.                 }
  10.                 else {
  11.                         double maxHigh = *max_element(highs.begin() + i - period1 + 1, highs.begin() + i + 1);
  12.                         double minLow = *min_element(lows.begin() + i - period1 + 1, lows.begin() + i + 1);
  13.                         highest2.push_back(maxHigh);
  14.                         lowest2.push_back(minLow);
  15.                 }
  16.         }
  17. }
  18. // 计算 KDJ 指标
  19. void test::calculateKDJ(vector<double>closes, vector<double>highs,vector<double>lows, int period1, double smoothingFactor)
  20. {
  21.         vector<double> highest2, lowest2, rsv, kValues, dValues, jValues;
  22.         // 计算最高价和最低价
  23.         calculateHighLow(highs, lows, period1, highest2, lowest2);
  24.         // 计算 RSV
  25.         for (int i = 0; i < closes.size(); ++i)
  26.         {
  27.                 if (i < period1-1)
  28.                 {
  29.                         rsv.push_back(0);
  30.                 }
  31.                 else
  32.                 {
  33.                         double range = highest2[i] - lowest2[i];
  34.                         rsv.push_back(iff(range == 0,0,closes[i] - lowest2[i])/range * 100);
  35.                 }
  36.         }
  37.         // 初始化 K 和 D 值
  38.         kValues.push_back(50); // 通常初始值设置为 50
  39.         dValues.push_back(50);

  40.         // 迭代计算 K 和 D 值
  41.         for (int i = 1; i < rsv.size(); ++i)
  42.         {
  43.                 double k = smoothingFactor * rsv[i] + (1 - smoothingFactor) * kValues.back();
  44.                 double d = smoothingFactor * k + (1 - smoothingFactor) * dValues.back();
  45.                 kValues.push_back(k);
  46.                 dValues.push_back(d);
  47.         }

  48.         // 计算 J 值
  49.         for (size_t i = 0; i < kValues.size(); ++i)
  50.         {
  51.                 double j = 3 * kValues[i] - 2 * dValues[i];
  52.                 jValues.push_back(j);
  53.         }
  54. }
复制代码
源文件策略test.cpp里面
  1. //计算KDJ
  2.         map<string, TKVALUE>::iterator it;
  3.         for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); it++)
  4.         {
  5.                 closes.push_back(it->second.dClose);
  6.                 highs.push_back(it->second.dHigh);
  7.                 lows.push_back(it->second.dLow);
  8.         }
  9.         // 参数
  10.         period1 = 9;            // 计算周期
  11.         smoothingFactor = 1.0/3.0; // 平滑系数 (通常为 1/3)
  12.         calculateHighLow(highs, lows, period1, highest2, lowest2);
  13.         // 计算 KDJ
  14.         calculateKDJ(closes, highs, lows, period1, smoothingFactor);//获得DVALUE,KVALUE,JVALUE的 VECTOR形式数值

  15.         double value1 = kValues[kValues.size() - 1];
  16.         double value2 = dValues[dValues.size() - 1];
  17.         double value3 = jValues[jValues.size() - 1];
  18.         InsertLog("Kvalue: " + to_string(value1) + "Dvalue: " + to_string(value2) + "Jvalue: " + to_string(value3));
复制代码
我测试的会崩溃,大家不要再试了,以后我优化好了在这里贴出来。
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表