  
- UID
- 2
- 积分
- 2954160
- 威望
- 1427117 布
- 龙e币
- 1527043 刀
- 在线时间
- 13879 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2025-5-13

|
公式模块增加:- //第八部分 数组中级运算函数(极值,均值,方差)【参数数组为正序,返回数组也为正序】
- //寻找数组中前N个数中的最大值,返回的仍然是数组形式【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesHigh(vector<double> pc, int num)
- {
- vector<double> highvector;//声明一个临时存储最高价的变量容器
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)//第一项
- {
- highvector.push_back(pc[i]);//pc容器第一个元素代替
- }
- else if (i < num)//不是第一个元素,但是数据数目不够num周期的
- {
- double r = 0; //声明一个存储最大值的临时变量
- for (size_t j = 0; j < i; j++)
- {
- r = max2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将大值赋给r
- }
- highvector.push_back(r);//将上面循环中得到最大值代替
- }
- else//当i的数目大于或等于要求的num个时
- {
- double r = 0;//声明一个存储最大值的临时变量
- for (size_t k = 0; k < num; k++)
- {
- r = max2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最大的那个值赋给r
- }
- highvector.push_back(r);//将上面的r值增加到数组中。
- }
- }
- return highvector; //返回最高价数组
- }
- //寻找数组中前N个数中的最小值,返回的仍然是数组形式【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesLow(vector<double> pc, int num)
- {
- vector<double> lowvector;//声明一个临时存储最低价的变量容器
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)//第一项
- {
- lowvector.push_back(pc[i]);//pc容器第一个元素代替
- }
- else if (i < num)//不是第一个元素,但是数据数目不够num周期的
- {
- double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
- for (size_t j = 0; j < i; j++)
- {
- r = min2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将最小值赋给r
- }
- lowvector.push_back(r);//将上面循环中得到最小值代替
- }
- else//当i的数目大于或等于要求的num个时
- {
- double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
- for (size_t k = 0; k < num; k++)
- {
- r = min2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最小的那个值赋给r
- }
- lowvector.push_back(r);//将上面的r值增加到数组中。
- }
- }
- return lowvector; //返回最高价数组
- }
- //数组前NUM项元素简单加总计算(返回数组前NUM项的和,返回的仍然是数组形式)【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesAverage(vector<double> pc, int num)
- {
- vector<double> avgvector;//声明一个存储和的容器变量
- avgvector.clear();
- double sum = 0;
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)
- {
- avgvector.push_back(pc[i]);;
- }
- else if (i < num) //如果数据数目小于周期要求的最低bar数量
- {
- sum = 0;
- for (size_t j = 0; j < i; j++)
- {
- sum = sum + pc[i - j];//前num个数值相加
- }
- avgvector.push_back(sum/(i+1)); //用简单平均代替并存入容器中
- }
- else //pc数目大于num周期后正常计算方法
- {
- sum = 0;//重置加总变量
- for (size_t j = 0; j < num; j++)
- {
- sum = sum + pc[i - j];//加总从pc[i]往左数num个pc的数值
- }
- avgvector.push_back(sum/num);
- }
- }
- return avgvector;
- }
- //Xaverage(ema)计算公式(返回数组)【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesXaverage(vector<double> pc, int num)
- {
- vector<double> r;
- double d = 0;
- for (int i = 0; i < pc.size(); i++)
- {
- if (i == 0)
- {
- d = pc[0];
- r.push_back(d);
- }
- else
- {
- d = (2 * pc[i] + (num - 1) * d) / (num + 1);
- r.push_back(d);
- }
- }
- return r;
- }
- //平滑平均(返回数组)【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesSmoothedAverage(vector<double> pc, int num)
- {
- vector<double> smoothaverage;//声明一个存储SMA的容器变量
- double smavalue = 0;//声明中间临时存储SMA值的变量
- double sum = 0;
- double a = num + 1;
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)
- {
- smavalue = pc[i];
- smoothaverage.push_back(pc[i]);
- }
- else if (i < num) //如果数据数目小于周期要求的最低bar数量
- {
- sum = 0;
- for (size_t j = 0; j < i; j++)
- {
- sum = sum + pc[i - j];
- }
- smavalue = sum / i;
- smoothaverage.push_back(smavalue); //用简单平均代替并存入容器中
- }
- else //pc数目大于num周期后正常计算方法
- {
- sum = 0;//重置加总变量
- for (size_t j = 0; j <= num; j++)
- {
- sum = sum + pc[i - j];//加总从pc[i]往左数num个pc的数值
- }
- smavalue = (sum - smavalue) / num;
- //SmoothedAverage = (Summation(PriceValue, Len + 1) - SmoothedAverage[1]) / Len;
- smoothaverage.push_back(smavalue);
- }
- }
- return smoothaverage;
- }
- //指数平滑移动平均函数(SMA,sma(x,N,M),即x变量的N周期平均,最新值权重为M,即SMAt = SMAt-1 * (N-M)/N + x*M/N )返回数组形式【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesSMA(vector<double> pc, int num, int num2)
- {
- reverse(pc.begin(), pc.end());
- vector<double>smav; //声明一个设计变量容器
- for (int i = 0; i < pc.size(); i++)
- {
- if (i < num)
- {
- smav.push_back(pc[i]);
- }
- else
- {
- smav.push_back(smav[i - 1] * (num - num2) / num + pc[i] / num);
- }
- }
- return smav;
- }
- //加权移动平均线(Weighted Moving Average,WMA)的计算方法公式返数组【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesWMA(vector<double> pc, int num)
- {
- vector<double>newvector;//声明中间变量
- double sumvalue = 0;
- double sumnumber = 0;
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i < num) //如果pc元素数量少到周期,新数组元素用0代替
- {
- newvector.push_back((int)0);
- }
- else if(i >= num)
- {
- for (size_t j = 0; j <= num; j++)//从pc[i]向左加总num个元素
- {
- 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所以可以保留
- sumnumber = sumnumber + j; //加总1,2,3...num个数的和
- }
- newvector.push_back(sumvalue / sumnumber);
- }
- }
- return newvector;
- }
- //功能等同SeriesHigh【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesHighest(vector<double> pc, int num)
- {
- vector<double> highvector;//声明一个临时存储最高价的变量容器
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)//第一项
- {
- highvector.push_back(pc[i]);//pc容器第一个元素代替
- }
- else if (i < num)//不是第一个元素,但是数据数目不够num周期的
- {
- double r = 0; //声明一个存储最大值的临时变量
- for (size_t j = 0; j < i; j++)
- {
- r = max2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将大值赋给r
- }
- highvector.push_back(r);//将上面循环中得到最大值代替
- }
- else//当i的数目大于或等于要求的num个时
- {
- double r = 0;//声明一个存储最大值的临时变量
- for (size_t k = 0; k < num; k++)
- {
- r = max2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最大的那个值赋给r
- }
- highvector.push_back(r);//将上面的r值增加到数组中。
- }
- }
- return highvector; //返回最高价数组
- }
- //功能等同SeriesLow【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesLowest(vector<double> pc, int num)
- {
- vector<double> lowvector;//声明一个临时存储最低价的变量容器
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i == 0)//第一项
- {
- lowvector.push_back(pc[i]);//pc容器第一个元素代替
- }
- else if (i < num)//不是第一个元素,但是数据数目不够num周期的
- {
- double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
- for (size_t j = 0; j < i; j++)
- {
- r = min2(r, pc[i - j]);// 用上面声明的r变量与PC[i] 从i 到0 共 i+1个数据对比,将最小值赋给r
- }
- lowvector.push_back(r);//将上面循环中得到最小值代替
- }
- else//当i的数目大于或等于要求的num个时
- {
- double r = pc[i]; //声明一个存储最大值的临时变量,初始值为pc最新元素值pc[i]
- for (size_t k = 0; k < num; k++)
- {
- r = min2(r, pc[i - k]); //从pc[i]向左数num个元素分别与r比较,将最小的那个值赋给r
- }
- lowvector.push_back(r);//将上面的r值增加到数组中。
- }
- }
- return lowvector; //返回最高价数组
- }
- //Wilder 平滑法(Wilder's Smoothing Method)是 RSI 指标计算中的核心方法,主要用于计算 RSI 中的平均上涨幅度(AvgU)和平均下跌幅度(AvgD)【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesWilderSmoothingMethod(vector<double> pc, int num)
- {
- vector<double>newv;// 声明一个中间变量
- double r = 0;
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i < num)
- {
- r = r + pc[i];
- newv.push_back(r / num);//用简单移动平均代替
- }
- else
- {
- newv.push_back((newv[i - 1] * (num - 1) + pc[i]) / num);
- }
- }
- return newv;
- }
- //数组型方差Variance计算公式【参数数组为正序, 返回数组也为正序】
- vector<double> test::SeriesVariance(vector<double>pc, int num)
- {
- reverse(pc.begin(), pc.end());//调转数组顺序以形成正序方便下面的计算
- vector<double>avgma, newvector;
- avgma = SeriesAverage(pc, num);//中间均线
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i < num)
- {
- newvector.push_back((int)0);
- }
- else
- {
- double sumdev = 0;
- for (size_t j = 0; j < num; j++)
- {
- sumdev = sumdev + pow(pc[i - j] - avgma[i], 2);//偏离平方加总
- }
- newvector.push_back(sumdev / num);
- }
- }
- return newvector;
- }
- //数组型标准差StandardDev计算公式【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesStandardDev(vector<double> pc, int num)
- {
- vector<double>avgma, newvector;
- avgma = SeriesAverage(pc, num);//中间均线
- for (size_t i = 0; i < pc.size(); i++)
- {
- if (i < num)
- {
- newvector.push_back((int)0);
- }
- else
- {
- double sumdev = 0;
- for (size_t j = 0; j < num; j++)
- {
- sumdev = sumdev + pow(pc[i - j] - avgma[i], 2);//偏离平方加总
- }
- newvector.push_back(sqrt(sumdev / num));
- }
- }
- return newvector;
- }
- //数组型Truerange计算公式【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesTruerange()
- {
- double dPreClose = 0;
- double sumatr = 0;
- vector<double>vAtr;
- RsqBar(sPeriod, sInst);
- map<string, TKVALUE >::iterator it;
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it)
- {
- if (dPreClose != 0) //后续bar的计算
- {
- double d = it->second.dHigh - it->second.dLow;
- double dHC = abs(it->second.dHigh - dPreClose);
- double dLC = abs(it->second.dLow - dPreClose);
- if (d < dHC)d = dHC;
- if (d < dLC)d = dLC;
- vAtr.push_back(d);
- }
- dPreClose = it->second.dClose; //第一次运行先将收盘价赋值给dpreclose,方便后同的计算
- }
- return vAtr;
- }
- //数组型Truerange的N周期平均计算公式【参数数组为正序,返回数组也为正序】
- vector<double> test::SeriesAvgTruerange(int num)
- {
- double dPreClose = 0;
- vector<double>vAtr, avgatr;
- RsqBar(sPeriod, sInst);
- map<string, TKVALUE >::iterator it;
- for (it = mapK[sPeriod][sInst].begin(); it != mapK[sPeriod][sInst].end(); ++it)
- {
- if (dPreClose != 0) //后续bar的计算
- {
- double d = it->second.dHigh - it->second.dLow;
- double dHC = abs(it->second.dHigh - dPreClose);
- double dLC = abs(it->second.dLow - dPreClose);
- if (d < dHC)d = dHC;
- if (d < dLC)d = dLC;
- vAtr.push_back(d);
- }
- dPreClose = it->second.dClose; //第一次运行先将收盘价赋值给dpreclose,方便后同的计算
- }
- for (size_t i = 0; i < vAtr.size(); i++)
- {
- if (i < num) //数量小于周期时用0代替
- {
- avgatr.push_back((int)0);
- }
- else
- {
- double sumatr = 0;
- for (size_t j = 0; j < num; j++)
- {
- sumatr += vAtr[i - j];
- }
- avgatr.push_back(sumatr / num);
- }
- }
- return avgatr;
- }
- //第八部分 数组中级运算函数(极值,均值,方差)【参数数组为正序,返回数组也为正序】
复制代码 |
|