关于飞狐的SMA算法, 1)最初在网上查到: input:n(20,1,99),m(2,1,99); if n<=m then EXIT; a:=c; y:=a; for i=2 to datacount do y:=(m*a+(n-m)*y)/n; 虫sma:y,colorred; 然而,这个算法不成立!
2)正确的算法,需要用到“数组”,如: input:n(20,1,99),m(2,1,99); x:=c; y[1]:=x[1]; for i=2 to datacount do y[i]:(m*x[i]+(n-m)*y[i-1])/n; 经测试,和飞狐原SMA(c,20,2)的算法完全一致。 只是有个很大的问题,调用该公式速度很慢,感觉有点"卡"。
3)如果通过DLL编程,速度就很快,如: __declspec(dllexport) int WINAPI MYSMA(CALCINFO* pData) { if ( pData->m_pfParam1 && pData->m_pfParam2 && pData->m_nParam1Start<0 && pData->m_pfParam3==NULL ) { float fParam1 = *pData->m_pfParam1; float fParam2 = *pData->m_pfParam2;
int nPeriod = (int)fParam1; int nP2 = (int)fParam2;
if(nPeriod>0) { float fSMA; int i; pData->m_pResultBuf[0]=pData->m_pData[0].m_fClose; for ( i = 1; i < pData->m_nNumData; i++ ) { fSMA = pData->m_pResultBuf[i-1]; pData->m_pResultBuf[i] = (pData->m_pData[i].m_fClose*nP2 + fSMA*(nPeriod-nP2))/nPeriod; } return 0; } } return -1; }
|