📄 technique.cpp
字号:
if( dLast1 <= dLast2 && dNow1 > dNow2
&& dNow1 >= dLast1 && dNow2 >= dLast2 )
{
if( pnCode ) *pnCode = ITSC_GOLDENFORK;
return itsGoldenFork;
}
if( dLast1 >= dLast2 && dNow1 < dNow2
&& dNow1 <= dLast1 && dNow2 <= dLast2 )
{
if( pnCode ) *pnCode = ITSC_DEADFORK;
return itsDeadFork;
}
return ITS_NOTHING;
}
// 得到金叉或者死叉信号
int CTechnique::GetForkSignal(int nIndex, double * pdValue1, double * pdValue2,
UINT itsGoldenFork, UINT itsDeadFork, UINT *pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
if( IsGoldenFork( nIndex, pdValue1, pdValue2 ) )
{
if( pnCode ) *pnCode = ITSC_GOLDENFORK;
return itsGoldenFork;
}
if( IsDeadFork( nIndex, pdValue1, pdValue2 ) )
{
if( pnCode ) *pnCode = ITSC_DEADFORK;
return itsDeadFork;
}
return ITS_NOTHING;
}
// 得到趋势信号
int CTechnique::GetTrendIntensity(int nIndex, CSPDWordArray & adwDays,
UINT itsLong, UINT itsShort, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
if( nIndex <= 0 )
return ITS_NOTHING;
int nRet = ITS_NOTHING;
for( int k=1; k<adwDays.GetSize(); k++ )
{
double dMALast1, dMALast2, dMANow1, dMANow2;
if( !Calculate( &dMALast1, nIndex-1, min(adwDays[k-1],adwDays[k]), FALSE )
|| !Calculate( &dMALast2, nIndex-1, max(adwDays[k-1],adwDays[k]), FALSE )
|| !Calculate( &dMANow1, nIndex, min(adwDays[k-1],adwDays[k]), FALSE )
|| !Calculate( &dMANow2, nIndex, max(adwDays[k-1],adwDays[k]), FALSE ) )
return ITS_NOTHING;
if( dMANow1 >= dMALast1 && dMANow2 >= dMALast2
&& dMANow1 > dMANow2 && (dMANow1-dMANow2)>=(dMALast1-dMALast2)
&& (ITS_ISBUY(nRet) || 1==k) )
{
if( pnCode ) *pnCode = ITSC_LONG;
nRet = itsLong;
}
else if( dMANow1 <= dMALast1 && dMANow2 <= dMALast2
&& dMANow1 < dMANow2 && (dMANow1-dMANow2)<=(dMALast1-dMALast2)
&& (ITS_ISSELL(nRet) || 1==k) )
{
if( pnCode ) *pnCode = ITSC_SHORT;
nRet = itsShort;
}
else
{
if( pnCode ) *pnCode = ITSC_NOTHING;
return ITS_NOTHING;
}
}
return nRet;
}
// 得到趋势信号
int CTechnique::GetTrendIntensity1( int nIndex, UINT itsLong, UINT itsShort, UINT *pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
if( nIndex <= 0 )
return ITS_NOTHING;
double dLast = 0, dNow = 0;
if( !Calculate( &dLast, nIndex-1, FALSE )
|| !Calculate( &dNow, nIndex, FALSE ) )
return ITS_NOTHING;
if( dNow > dLast )
{
if( pnCode ) *pnCode = ITSC_LONG;
return itsLong;
}
if( dNow < dLast )
{
if( pnCode ) *pnCode = ITSC_SHORT;
return itsShort;
}
return ITS_NOTHING;
}
// 得到趋势信号
int CTechnique::GetTrendIntensity2( int nIndex, UINT itsLong, UINT itsShort, UINT *pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
if( nIndex <= 0 )
return ITS_NOTHING;
double dLast1 = 0, dLast2 = 0, dNow1 = 0, dNow2 = 0;
if( Calculate( &dLast1, &dLast2, nIndex-1, FALSE )
&& Calculate( &dNow1, &dNow2, nIndex, FALSE ) )
{
if( dNow1 >= dLast1 && dNow2 >= dLast2
&& dNow1 > dNow2 && (dNow1-dNow2)>=(dLast1-dLast2) )
{
if( pnCode ) *pnCode = ITSC_LONG;
return itsLong;
}
if( dNow1 <= dLast1 && dNow2 <= dLast2
&& dNow1 < dNow2 && (dNow1-dNow2)<=(dLast1-dLast2) )
{
if( pnCode ) *pnCode = ITSC_SHORT;
return itsShort;
}
}
return ITS_NOTHING;
}
// 得到趋势信号
int CTechnique::GetTrendIntensity(int nIndex, double * pdValue1, double * pdValue2,
UINT itsLong, UINT itsShort, UINT *pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
SP_ASSERT( NULL != pdValue1 && NULL != pdValue2 );
if( NULL == pdValue1 || NULL == pdValue2 )
return FALSE;
if( m_nLength <= 0 || m_nIndexStart < 0
|| nIndex < m_nIndexStart || nIndex-m_nIndexStart>=m_nLength
|| nIndex-m_nIndexStart < 1 )
return FALSE;
int k = nIndex-m_nIndexStart;
if( pdValue1[k] >= pdValue1[k-1] && pdValue2[k] >= pdValue2[k-1]
&& pdValue1[k] > pdValue2[k] && (pdValue1[k]-pdValue2[k])>=(pdValue1[k-1]-pdValue2[k-1]) )
{
if( pnCode ) *pnCode = ITSC_LONG;
return itsLong;
}
if( pdValue1[k] <= pdValue1[k-1] && pdValue2[k] <= pdValue2[k-1]
&& pdValue1[k] < pdValue2[k] && (pdValue1[k]-pdValue2[k])<=(pdValue1[k-1]-pdValue2[k-1]) )
{
if( pnCode ) *pnCode = ITSC_SHORT;
return itsShort;
}
return ITS_NOTHING;
}
void CTechnique::SetDefaultParameters( )
{
SP_ASSERT( FALSE );
}
void CTechnique::AttachParameters( CTechnique & src )
{
SP_ASSERT( FALSE );
}
BOOL CTechnique::IsValidParameters( )
{
SP_ASSERT( FALSE );
return FALSE;
}
// 创建新的技术指标对象
CTechnique * CTechnique::CreateTechnique( UINT nTech, CKData * pKData )
{
CTechnique * pTech = NULL;
switch( nTech )
{
case STT_MA: pTech = new CMA( pKData ); break;
case STT_BBI: pTech = new CBBI( pKData ); break;
case STT_BOLL: pTech = new CBOLL( pKData ); break;
case STT_PV: pTech = new CPV( pKData ); break;
case STT_SAR: pTech = new CSAR( pKData ); break;
case STT_DJ: pTech = new CDJ( pKData ); break;
case STT_CW: pTech = new CCW( pKData ); break;
case STT_MACD: pTech = new CMACD( pKData ); break;
case STT_MIKE: pTech = new CMIKE( pKData ); break;
case STT_PSY: pTech = new CPSY( pKData ); break;
case STT_VOLUME: pTech = new CVOLUME( pKData ); break;
case STT_NVI: pTech = new CNVI( pKData ); break;
case STT_PVI: pTech = new CPVI( pKData ); break;
case STT_VR: pTech = new CVR( pKData ); break;
case STT_VROC: pTech = new CVROC( pKData ); break;
case STT_OBV: pTech = new COBV( pKData ); break;
case STT_MOBV: pTech = new CMOBV( pKData ); break;
case STT_MFI: pTech = new CMFI( pKData ); break;
case STT_VMACD: pTech = new CVMACD( pKData ); break;
case STT_WVAD: pTech = new CWVAD( pKData ); break;
case STT_EMV: pTech = new CEMV( pKData ); break;
case STT_VRSI: pTech = new CVRSI( pKData ); break;
case STT_NVRSI: pTech = new CNVRSI( pKData ); break;
case STT_AD: pTech = new CAD( pKData ); break;
case STT_CI: pTech = new CCI( pKData ); break;
case STT_KDJ: pTech = new CKDJ( pKData ); break;
case STT_R: pTech = new CR( pKData ); break;
case STT_RSI: pTech = new CRSI( pKData ); break;
case STT_BIAS: pTech = new CBIAS( pKData ); break;
case STT_MTM: pTech = new CMTM( pKData ); break;
case STT_DMI: pTech = new CDMI( pKData ); break;
case STT_ROC: pTech = new CROC( pKData ); break;
case STT_CCI: pTech = new CCCI( pKData ); break;
case STT_CV: pTech = new CCV( pKData ); break;
case STT_ARBR: pTech = new CARBR( pKData ); break;
case STT_CR: pTech = new CCR( pKData ); break;
case STT_OSC: pTech = new COSC( pKData ); break;
case STT_UOS: pTech = new CUOS( pKData ); break;
case STT_MAOSC: pTech = new CMAOSC( pKData ); break;
case STT_36BIAS: pTech = new C36BIAS( pKData ); break;
case STT_DPO: pTech = new CDPO( pKData ); break;
case STT_KST: pTech = new CKST( pKData ); break;
case STT_REI: pTech = new CREI( pKData ); break;
case STT_DMKI: pTech = new CDMKI( pKData ); break;
case STT_PCNT: pTech = new CPCNT( pKData ); break;
case STT_HLC: pTech = new CHLC( pKData ); break;
case STT_CDP: pTech = new CCDP( pKData ); break;
case STT_ASI: pTech = new CASI( pKData ); break;
case STT_ATR: pTech = new CATR( pKData ); break;
case STT_CYO: pTech = new CCYO( pKData ); break;
case STT_DCYO: pTech = new CDCYO( pKData ); break;
case STT_HSL: pTech = new CHSL( pKData ); break;
case STT_DPER: pTech = new CDPER( pKData ); break;
default:
SP_ASSERT( FALSE );
}
return pTech;
}
// 得到买卖信号
int CTechnique::GetSignal( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
return ITS_NOTHING;
}
// 得到趋势信号
int CTechnique::GetIntensity( int nIndex, UINT * pnCode, BOOL bTraceBack )
{
UINT nCode = ITSC_NOTHING;
int nSignal = GetSignal( nIndex, &nCode );
if( ITS_NOTHING != nSignal )
{
m_nLastIntensity = nSignal;
m_nLastIntensityCode = nCode;
if( pnCode ) *pnCode = nCode;
return nSignal;
}
if( m_nLastIntensity > 1 )
m_nLastIntensity --;
if( m_nLastIntensity < -1 )
m_nLastIntensity ++;
if( bTraceBack && ITS_NOTHING == m_nLastIntensity )
m_nLastIntensity = GetIntensityTraceback( nIndex, &m_nLastIntensityCode );
if( pnCode ) *pnCode = m_nLastIntensityCode;
return m_nLastIntensity;
}
int CTechnique::GetIntensityTraceback( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
int nIntensity = ITS_NOTHING;
UINT nCode = ITSC_NOTHING;
int k;
for( k=nIndex; k>=0; k -- )
{
nIntensity = GetSignal(k,&nCode);
if( ITS_NOTHING != nIntensity )
break;
}
if( k < 0 )
return ITS_NOTHING;
for( k=k+1; k<=nIndex; k++ )
{
if( nIntensity > 1 )
nIntensity --;
else if( nIntensity < -1 )
nIntensity ++;
else
break;
}
if( pnCode ) *pnCode = nCode;
return nIntensity;
}
BOOL CTechnique::GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax )
{
SP_ASSERT( FALSE );
return FALSE;
}
BOOL CTechnique::Calculate( double * pValue, int nIndex, int nDays, BOOL bUseLast )
{
SP_ASSERT( FALSE );
return FALSE;
}
BOOL CTechnique::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
SP_ASSERT( FALSE );
return FALSE;
}
BOOL CTechnique::Calculate( double * pValue1, double * pValue2, int nIndex, BOOL bUseLast )
{
SP_ASSERT( FALSE );
return FALSE;
}
BOOL CTechnique::Calculate( double * pValue1, double * pValue2, double * pValue3, int nIndex, BOOL bUseLast )
{
SP_ASSERT( FALSE );
return FALSE;
}
BOOL CTechnique::Calculate( double * pValue1, double * pValue2, double * pValue3, double *pValue4, int nIndex, BOOL bUseLast )
{
SP_ASSERT( FALSE );
return FALSE;
}
BOOL CTechnique::Calculate( double * pValue1, double * pValue2, double * pValue3, double *pValue4, double *pValue5, int nIndex, BOOL bUseLast )
{
SP_ASSERT( FALSE );
return FALSE;
}
// 计算指标值和均值
BOOL CTechnique::CalculateMA( double * pValue, double * pMA, int nIndex, BOOL bUseLast, int nMADays )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( nMADays > nIndex+1 )
return FALSE;
if( LoadFromCache( nIndex, pValue, pMA ) )
return TRUE;
double dValue = 0, dMA = 0;
int nCount = 0;
for( int k=nIndex; k>=0; k-- )
{
double dTemp = 0;
if( Calculate( &dTemp, k, FALSE ) )
{
if( nIndex == k )
dValue = dTemp;
dMA += dTemp;
nCount ++;
if( nCount == nMADays )
{
dMA = dMA / nMADays;
if( pValue ) *pValue = dValue;
if( pMA ) *pMA = dMA;
StoreToCache( nIndex, pValue, pMA );
return TRUE;
}
}
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -