幫忙改一下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 進行 有償 編寫!(不貴!點擊查看價格!)
相關文章
-
沒有相關內容