帮忙改一下VB函数 [金字塔]
- 咨询内容:
我需要做一个实现EMA函数的VBA程序。在金字塔中做个自定义函数。
请问哪位高手指教一下。
下面是网上找的,但好像有点问题:EMA需要2个参数,但2个参数中没有收盘价呀?
最近有用到EMA函数便自己实现了一个,EMA表示的是指数平滑移动平均,其函数的定义为,Y = [2 * X + (N - 1) * LY] / (N + 1),LY 上一个周期的Y值,其定义比较难以理解,不少人是用递归去实现的,把一个简单的问题搞的忒复杂了,其实根本不需要使用递归。下面给出偶的实现方式:
一 分析家接口实现
这个是使用分析家接口实现系统EMA函数的功能
__declspec(dllexport) int WINAPI
EMA(CALCINFO* pData)
{
float f;
const float* pValue;
int nPeriod,nFirst;
if(NULL != pData
&& pData->m_pfParam1
&& pData->m_pfParam2 //参数1,2有效
&& pData->m_nParam1Start>=0 //参数1为序列数
&& pData->m_pfParam3==NULL) //有2个参数
{
pValue = pData->m_pfParam1; //参数1
nFirst = pData->m_nParam1Start; //有效值
f = *pData->m_pfParam2;
nPeriod = (int)f; //参数2
int nLen = pData->m_nNumData;
if(nFirst>=0 && nPeriod>0 && nLen > 0)
{
if(nPeriod > nLen) nPeriod = nLen;
pData->m_pResultBuf[0] = pValue[0]; // 第一个值
for(int i=1; i < nLen; i++)
{
// Y = [2 * X + (N - 1) * LY] / (N + 1)
pData->m_pResultBuf[i] = (2 * pValue[i] + (nPeriod - 1) * pData->m_pResultBuf[i - 1]) / (nPeriod + 1);
}
return 0;
}
}
return -1;
}
//
使用方式 "chanlun@EMA"(C,5); 参数和系统自带的EMA函数一样
二 纯C++实现
这个是EMA算法实现,供在后台调用股票价格数据计算EMA值
std::vector
ChanlunTools::Ema(std::vector &X, int N) { std::vector vec; int nLen = X.size(); if(nLen >= 1) { if(N > nLen) N = nLen; vec.resize(nLen); //vec.reserve(nLen); vec[0] = X[0]; for(int i = 1; i < nLen; i++) { vec[i] = (2 * X[i] + (N - 1) * vec[i - 1]) / (N + 1); } } return vec; } - 金字塔客服:
已经安排工作人员制作EMA自定义函数范例,请耐心等待
- 用户回复:
CYC是表示取第周期的值, N是EMA函数里的N
Function EMA3(Formula,CYC,N)
Set History=Formula.ParentGrid.GetHistoryData()
Y=History.Close(0)
For i=1 To CYC
Y=(2*History.Close(i)+(N-1)*Y)/(N+1)
Next
Ema3=Y
End Function
如果创建一个自定义函数EMA2
Function EMA2(Formula,N)
EMA2 = EMA3(formula,formula.indexdata,n)
End Function
公式里这些调用测试
aa:ema(close,30);
bb:ema2(30);
与系统EMA结果完全一致
论坛上的,我试过是一样的;
<!--EndFragment-->
有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友
可联系技术人员 QQ: 1145508240 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容