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

第八部分 数组中级运算函数(极值,均值,方差)【参数数组为正序,返回数组也为正序,适合做中间变量计算用】

第八部分 数组中级运算函数(极值,均值,方差)【参数数组为正序,返回数组也为正序,适合做中间变量计算用】

头文件声明变量:
  1. //第八部分 数组中级运算函数(极值,均值,方差)【参数数组为正序,返回数组也为正序】
  2.         vector<double>SeriesHigh(vector<double> pc, int num); //high(pc[i],N)返回数组的num周期的最大值元素并存入新的数组
  3.         vector<double>SeriesLow(vector<double> pc, int num); //low(pc[i],N)返回数组的num周期的最小值元素并存入新的数组
  4.         vector<double>SeriesAverage(vector<double> pc, int num); //average(pc[i],N)数组前NUM项元素加总计算(返回数组前NUM项的和,返回的仍然是数组形式)
  5.         vector<double>SeriesXaverage(vector<double> pc, int num); //Xaverage(ema)计算公式(返回数组)
  6.         vector<double>SeriesSmoothedAverage(vector<double> pc, int num); //平滑平均(返回数组)
  7.         vector<double>SeriesSMA(vector<double> pc, int num, int num2); //指数平滑移动平均函数(SMA,sma(x,N,M),即x变量的N周期平均,最新值权重为M,即SMAt = SMAt-1 * (N-M)/N + x*M/N )返回数组形式
  8.         vector<double>SeriesWMA(vector<double> pc, int num); //加权移动平均线(Weighted Moving Average,WMA)的计算方法公式返数组
  9.         vector<double>SeriesHighest(vector<double> pc, int num); //high(pc[i],N)返回数组的num周期的最大值元素并存入新的数组(功能等同SeriesHigh)
  10.         vector<double>SeriesLowest(vector<double> pc, int num); //low(pc[i],N)返回数组的num周期的最小值元素并存入新的数组(功能等同SeriesLow)
  11.         vector<double>SeriesWilderSmoothingMethod(vector<double> pc, int num); //Wilder 平滑法(Wilder's Smoothing Method)是 RSI 指标计算中的核心方法,主要用于计算 RSI 中的平均上涨幅度(AvgU)和平均下跌幅度(AvgD)
  12.         vector<double>SeriesVariance(vector<double>pc, int num); //数组型方差Variance计算公式
  13.         vector<double>SeriesStandardDev(vector<double>pc, int num); //数组型标准差StandardDev计算公式
  14.         vector<double>SeriesTruerange(); //数组型Truerange计算公式
  15.         vector<double>SeriesAvgTruerange(int num); //数组型Truerange的N周期平均计算公式
  16.         //数组中级运算函数(极值,均值,方差)
复制代码

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   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. //第八部分 数组中级运算函数(极值,均值,方差)【参数数组为正序,返回数组也为正序】
  2. //寻找数组中前N个数中的最大值,返回的仍然是数组形式【参数数组为正序,返回数组也为正序】
  3. vector<double> test::SeriesHigh(vector<double> pc, int num)
  4. {
  5.         vector<double> highvector;//声明一个临时存储最高价的变量容器
  6.         for (size_t i = 0; i < pc.size(); i++)
  7.         {
  8.                 if (i == 0)//第一项
  9.                 {
  10.                         highvector.push_back(pc[i]);//pc容器第一个元素代替
  11.                 }
  12.                 else if (i < num)//不是第一个元素,但是数据数目不够num周期的
  13.                 {
  14.                         double r = 0; //声明一个存储最大值的临时变量
  15.                         for (size_t j = 0; j < i; j++)
  16.                         {
  17.                                 r = max2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将大值赋给r
  18.                         }
  19.                         highvector.push_back(r);//将上面循环中得到最大值代替
  20.                 }
  21.                 else//当i的数目大于或等于要求的num个时
  22.                 {
  23.                         double r = 0;//声明一个存储最大值的临时变量
  24.                         for (size_t k = 0; k < num; k++)
  25.                         {
  26.                                 r = max2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最大的那个值赋给r
  27.                         }
  28.                         highvector.push_back(r);//将上面的r值增加到数组中。
  29.                 }
  30.         }
  31.         return highvector; //返回最高价数组
  32. }
  33. //寻找数组中前N个数中的最小值,返回的仍然是数组形式【参数数组为正序,返回数组也为正序】
  34. vector<double> test::SeriesLow(vector<double> pc, int num)
  35. {
  36.         vector<double> lowvector;//声明一个临时存储最低价的变量容器
  37.         for (size_t i = 0; i < pc.size(); i++)
  38.         {
  39.                 if (i == 0)//第一项
  40.                 {
  41.                         lowvector.push_back(pc[i]);//pc容器第一个元素代替
  42.                 }
  43.                 else if (i < num)//不是第一个元素,但是数据数目不够num周期的
  44.                 {
  45.                         double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
  46.                         for (size_t j = 0; j < i; j++)
  47.                         {
  48.                                 r = min2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将最小值赋给r
  49.                         }
  50.                         lowvector.push_back(r);//将上面循环中得到最小值代替
  51.                 }
  52.                 else//当i的数目大于或等于要求的num个时
  53.                 {
  54.                         double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
  55.                         for (size_t k = 0; k < num; k++)
  56.                         {
  57.                                 r = min2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最小的那个值赋给r
  58.                         }
  59.                         lowvector.push_back(r);//将上面的r值增加到数组中。
  60.                 }
  61.         }
  62.         return lowvector; //返回最高价数组
  63. }
  64. //数组前NUM项元素简单加总计算(返回数组前NUM项的和,返回的仍然是数组形式)【参数数组为正序,返回数组也为正序】
  65. vector<double> test::SeriesAverage(vector<double> pc, int num)
  66. {

  67.         vector<double> avgvector;//声明一个存储和的容器变量
  68.         avgvector.clear();
  69.         double sum = 0;
  70.         for (size_t i = 0; i < pc.size(); i++)
  71.         {
  72.                 if (i == 0)
  73.                 {
  74.                         avgvector.push_back(pc[i]);;
  75.                 }
  76.                 else if (i < num) //如果数据数目小于周期要求的最低bar数量
  77.                 {
  78.                         sum = 0;
  79.                         for (size_t j = 0; j < i; j++)
  80.                         {
  81.                                 sum = sum + pc[i - j];//前num个数值相加
  82.                         }
  83.                         avgvector.push_back(sum/(i+1)); //用简单平均代替并存入容器中
  84.                 }
  85.                 else //pc数目大于num周期后正常计算方法
  86.                 {
  87.                         sum = 0;//重置加总变量
  88.                         for (size_t j = 0; j < num; j++)
  89.                         {
  90.                                 sum = sum + pc[i - j];//加总从pc[i]往左数num个pc的数值
  91.                         }
  92.                         avgvector.push_back(sum/num);
  93.                 }
  94.         }

  95.         return avgvector;
  96. }
  97. //Xaverage(ema)计算公式(返回数组)【参数数组为正序,返回数组也为正序】
  98. vector<double> test::SeriesXaverage(vector<double> pc, int num)
  99. {

  100.         vector<double> r;
  101.         double d = 0;
  102.         for (int i = 0; i < pc.size(); i++)
  103.         {
  104.                 if (i == 0)
  105.                 {
  106.                         d = pc[0];
  107.                         r.push_back(d);
  108.                 }
  109.                 else
  110.                 {
  111.                         d = (2 * pc[i] + (num - 1) * d) / (num + 1);
  112.                         r.push_back(d);
  113.                 }
  114.         }

  115.         return r;
  116. }
  117. //平滑平均(返回数组)【参数数组为正序,返回数组也为正序】
  118. vector<double> test::SeriesSmoothedAverage(vector<double> pc, int num)
  119. {
  120.         vector<double> smoothaverage;//声明一个存储SMA的容器变量
  121.         double smavalue = 0;//声明中间临时存储SMA值的变量
  122.         double sum = 0;
  123.         double a = num + 1;
  124.         for (size_t i = 0; i < pc.size(); i++)
  125.         {
  126.                 if (i == 0)
  127.                 {
  128.                         smavalue = pc[i];
  129.                         smoothaverage.push_back(pc[i]);
  130.                 }
  131.                 else if (i < num) //如果数据数目小于周期要求的最低bar数量
  132.                 {
  133.                         sum = 0;
  134.                         for (size_t j = 0; j < i; j++)
  135.                         {
  136.                                 sum = sum + pc[i - j];
  137.                         }
  138.                         smavalue = sum / i;
  139.                         smoothaverage.push_back(smavalue); //用简单平均代替并存入容器中
  140.                 }
  141.                 else //pc数目大于num周期后正常计算方法
  142.                 {
  143.                         sum = 0;//重置加总变量
  144.                         for (size_t j = 0; j <= num; j++)
  145.                         {
  146.                                 sum = sum + pc[i - j];//加总从pc[i]往左数num个pc的数值
  147.                         }
  148.                         smavalue = (sum - smavalue) / num;
  149.                         //SmoothedAverage = (Summation(PriceValue, Len + 1) - SmoothedAverage[1]) / Len;
  150.                         smoothaverage.push_back(smavalue);
  151.                 }
  152.         }
  153.         return smoothaverage;
  154. }

  155. //指数平滑移动平均函数(SMA,sma(x,N,M),即x变量的N周期平均,最新值权重为M,即SMAt = SMAt-1 * (N-M)/N + x*M/N )返回数组形式【参数数组为正序,返回数组也为正序】
  156. vector<double> test::SeriesSMA(vector<double> pc, int num, int num2)
  157. {
  158.         reverse(pc.begin(), pc.end());
  159.         vector<double>smav; //声明一个设计变量容器
  160.         for (int i = 0; i < pc.size(); i++)
  161.         {
  162.                 if (i < num)
  163.                 {
  164.                         smav.push_back(pc[i]);
  165.                 }
  166.                 else
  167.                 {
  168.                         smav.push_back(smav[i - 1] * (num - num2) / num + pc[i] / num);
  169.                 }
  170.         }
  171.         return smav;
  172. }


  173. //加权移动平均线(Weighted Moving Average,WMA)的计算方法公式返数组【参数数组为正序,返回数组也为正序】
  174. vector<double> test::SeriesWMA(vector<double> pc, int num)
  175. {
  176.         vector<double>newvector;//声明中间变量
  177.         double sumvalue = 0;
  178.         double sumnumber = 0;
  179.         for (size_t i = 0; i < pc.size(); i++)
  180.         {
  181.                 if (i < num) //如果pc元素数量少到周期,新数组元素用0代替
  182.                 {
  183.                         newvector.push_back((int)0);
  184.                 }
  185.                 else if(i >= num)
  186.                 {
  187.                         for (size_t j = 0; j <= num; j++)//从pc[i]向左加总num个元素
  188.                         {
  189.                             sumvalue = sumvalue + (num - j) * pc[i-j];//计算(num-0)*PC[i-0] + (num-1)*pc[i-1]+... + (num - (num-1))*pc[i-(num-1)],因为最后一项0*pc[i-num]=0所以可以保留
  190.                                 sumnumber = sumnumber + j; //加总1,2,3...num个数的和
  191.                         }
  192.                         newvector.push_back(sumvalue / sumnumber);
  193.                 }
  194.         }
  195.         return newvector;
  196. }
  197. //功能等同SeriesHigh【参数数组为正序,返回数组也为正序】
  198. vector<double> test::SeriesHighest(vector<double> pc, int num)
  199. {
  200.         vector<double> highvector;//声明一个临时存储最高价的变量容器
  201.         for (size_t i = 0; i < pc.size(); i++)
  202.         {
  203.                 if (i == 0)//第一项
  204.                 {
  205.                         highvector.push_back(pc[i]);//pc容器第一个元素代替
  206.                 }
  207.                 else if (i < num)//不是第一个元素,但是数据数目不够num周期的
  208.                 {
  209.                         double r = 0; //声明一个存储最大值的临时变量
  210.                         for (size_t j = 0; j < i; j++)
  211.                         {
  212.                                 r = max2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将大值赋给r
  213.                         }
  214.                         highvector.push_back(r);//将上面循环中得到最大值代替
  215.                 }
  216.                 else//当i的数目大于或等于要求的num个时
  217.                 {
  218.                         double r = 0;//声明一个存储最大值的临时变量
  219.                         for (size_t k = 0; k < num; k++)
  220.                         {
  221.                                 r = max2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最大的那个值赋给r
  222.                         }
  223.                         highvector.push_back(r);//将上面的r值增加到数组中。
  224.                 }
  225.         }
  226.         return highvector; //返回最高价数组
  227. }
  228. //功能等同SeriesLow【参数数组为正序,返回数组也为正序】
  229. vector<double> test::SeriesLowest(vector<double> pc, int num)
  230. {
  231.         vector<double> lowvector;//声明一个临时存储最低价的变量容器
  232.         for (size_t i = 0; i < pc.size(); i++)
  233.         {
  234.                 if (i == 0)//第一项
  235.                 {
  236.                         lowvector.push_back(pc[i]);//pc容器第一个元素代替
  237.                 }
  238.                 else if (i < num)//不是第一个元素,但是数据数目不够num周期的
  239.                 {
  240.                         double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
  241.                         for (size_t j = 0; j < i; j++)
  242.                         {
  243.                                 r = min2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将最小值赋给r
  244.                         }
  245.                         lowvector.push_back(r);//将上面循环中得到最小值代替
  246.                 }
  247.                 else//当i的数目大于或等于要求的num个时
  248.                 {
  249.                         double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
  250.                         for (size_t k = 0; k < num; k++)
  251.                         {
  252.                                 r = min2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最小的那个值赋给r
  253.                         }
  254.                         lowvector.push_back(r);//将上面的r值增加到数组中。
  255.                 }
  256.         }
  257.         return lowvector; //返回最高价数组
  258. }

  259. //Wilder 平滑法(Wilder's Smoothing Method)是 RSI 指标计算中的核心方法,主要用于计算 RSI 中的平均上涨幅度(AvgU)和平均下跌幅度(AvgD)【参数数组为正序,返回数组也为正序】
  260. vector<double> test::SeriesWilderSmoothingMethod(vector<double> pc, int num)
  261. {
  262.         vector<double>newv;// 声明一个中间变量
  263.         double r = 0;
  264.         for (size_t i = 0; i < pc.size(); i++)
  265.         {
  266.                 if (i < num)
  267.                 {
  268.                         r = r + pc[i];
  269.                         newv.push_back(r / num);//用简单移动平均代替
  270.                 }
  271.                 else
  272.                 {
  273.                         newv.push_back((newv[i - 1] * (num - 1) + pc[i]) / num);
  274.                 }
  275.         }
  276.         return newv;
  277. }
  278. //数组型方差Variance计算公式【参数数组为正序, 返回数组也为正序】
  279. vector<double> test::SeriesVariance(vector<double>pc, int num)
  280. {
  281.         reverse(pc.begin(), pc.end());//调转数组顺序以形成正序方便下面的计算
  282.         vector<double>avgma, newvector;
  283.         avgma = SeriesAverage(pc, num);//中间均线

  284.         for (size_t i = 0; i < pc.size(); i++)
  285.         {
  286.                 if (i < num)
  287.                 {
  288.                         newvector.push_back((int)0);
  289.                 }
  290.                 else
  291.                 {
  292.                         double sumdev = 0;
  293.                         for (size_t j = 0; j < num; j++)
  294.                         {
  295.                                 sumdev = sumdev + pow(pc[i - j] - avgma[i], 2);//偏离平方加总
  296.                         }
  297.                         newvector.push_back(sumdev / num);
  298.                 }
  299.         }
  300.         return newvector;
  301. }
  302. //数组型标准差StandardDev计算公式【参数数组为正序,返回数组也为正序】
  303. vector<double> test::SeriesStandardDev(vector<double> pc, int num)
  304. {
  305.         vector<double>avgma, newvector;
  306.         avgma = SeriesAverage(pc, num);//中间均线

  307.         for (size_t i = 0; i < pc.size(); i++)
  308.         {
  309.                 if (i < num)
  310.                 {
  311.                         newvector.push_back((int)0);
  312.                 }
  313.                 else
  314.                 {
  315.                         double sumdev = 0;
  316.                         for (size_t j = 0; j < num; j++)
  317.                         {
  318.                                 sumdev = sumdev + pow(pc[i - j] - avgma[i], 2);//偏离平方加总
  319.                         }
  320.                         newvector.push_back(sqrt(sumdev / num));
  321.                 }
  322.         }
  323.         return newvector;
  324. }
  325. //数组型Truerange计算公式【参数数组为正序,返回数组也为正序】
  326. vector<double> test::SeriesTruerange()
  327. {
  328.         double dPreClose = 0;
  329.         double sumatr = 0;
  330.         vector<double>vAtr;
  331.         RsqBar(sPeriod, sInst);
  332.         map<string, TKVALUE >::iterator it;
  333.         for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it)
  334.         {
  335.                 if (dPreClose != 0) //后续bar的计算
  336.                 {
  337.                         double d = it->second.dHigh - it->second.dLow;
  338.                         double dHC = abs(it->second.dHigh - dPreClose);
  339.                         double dLC = abs(it->second.dLow - dPreClose);
  340.                         if (d < dHC)d = dHC;
  341.                         if (d < dLC)d = dLC;
  342.                         vAtr.push_back(d);
  343.                 }
  344.                 dPreClose = it->second.dClose; //第一次运行先将收盘价赋值给dpreclose,方便后同的计算
  345.         }
  346.         return vAtr;
  347. }
  348. //数组型Truerange的N周期平均计算公式【参数数组为正序,返回数组也为正序】
  349. vector<double> test::SeriesAvgTruerange(int num)
  350. {
  351.         double dPreClose = 0;
  352.         vector<double>vAtr, avgatr;
  353.         RsqBar(sPeriod, sInst);
  354.         map<string, TKVALUE >::iterator it;
  355.         for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it)
  356.         {
  357.                 if (dPreClose != 0) //后续bar的计算
  358.                 {
  359.                         double d = it->second.dHigh - it->second.dLow;
  360.                         double dHC = abs(it->second.dHigh - dPreClose);
  361.                         double dLC = abs(it->second.dLow - dPreClose);
  362.                         if (d < dHC)d = dHC;
  363.                         if (d < dLC)d = dLC;
  364.                         vAtr.push_back(d);
  365.                 }
  366.                 dPreClose = it->second.dClose; //第一次运行先将收盘价赋值给dpreclose,方便后同的计算
  367.         }

  368.         for (size_t i = 0; i < vAtr.size(); i++)
  369.         {
  370.                 if (i < num) //数量小于周期时用0代替
  371.                 {
  372.                         avgatr.push_back((int)0);
  373.                 }
  374.                 else
  375.                 {
  376.                         double sumatr = 0;
  377.                         for (size_t j = 0; j < num; j++)
  378.                         {
  379.                                 sumatr += vAtr[i - j];
  380.                         }
  381.                         avgatr.push_back(sumatr / num);
  382.                 }
  383.         }
  384.         return avgatr;
  385. }
  386. //第八部分 数组中级运算函数(极值,均值,方差)【参数数组为正序,返回数组也为正序】
复制代码
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表