📄 techenergy.cpp.svn-base
字号:
}
/***
A = 当天收盘价 - 当天开盘价
B = 当天最高价 - 当天最低价
C = A÷B×V(成交量)
WVAD = 累计n天的C值
*/
BOOL CWVAD::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( m_nDays > nIndex+1 )
return FALSE;
if( LoadFromCache( nIndex, pValue ) )
return TRUE;
int nCount = 0;
double dResult = 0;
for( int k=nIndex; k>=0; k-- )
{
KDATA kd = m_pKData->ElementAt(k);
if( kd.m_fHigh > kd.m_fLow )
dResult += (((double)kd.m_fClose) - kd.m_fOpen)*kd.m_fVolume/(((double)kd.m_fHigh)-kd.m_fLow);
nCount ++;
if( nCount == m_nDays )
{
if( pValue ) *pValue = dResult;
StoreToCache( nIndex, pValue );
return TRUE;
}
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CEMV
CEMV::CEMV( )
{
SetDefaultParameters( );
}
CEMV::CEMV( CKData * pKData )
: CTechnique( pKData )
{
SetDefaultParameters( );
}
CEMV::~CEMV()
{
Clear( );
}
void CEMV::SetDefaultParameters( )
{
m_nDays = 14;
m_nMADays = 9;
m_itsGoldenFork = ITS_BUY;
m_itsGoldenFork = ITS_SELL;
}
void CEMV::AttachParameters( CEMV & src )
{
m_nDays = src.m_nDays;
m_nMADays = src.m_nMADays;
m_itsGoldenFork = src.m_itsGoldenFork;
m_itsDeadFork = src.m_itsDeadFork;
}
BOOL CEMV::IsValidParameters( )
{
return ( VALID_DAYS(m_nDays) && VALID_DAYS(m_nMADays)
&& VALID_ITS(m_itsGoldenFork) && VALID_ITS(m_itsDeadFork) );
}
void CEMV::Clear( )
{
CTechnique::Clear( );
}
int CEMV::GetSignal( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
int nMaxDays = m_nDays+m_nMADays;
double dLiminalLow = 0, dLiminalHigh = 0;
if( !IntensityPrepare( nIndex, pnCode, nMaxDays, ITS_GETMINMAXDAYRANGE, &dLiminalLow, &dLiminalHigh, 0.5, 0.5 ) )
return ITS_NOTHING;
double dEMV;
if( !Calculate( &dEMV, nIndex, FALSE ) )
return ITS_NOTHING;
int nSignal = GetForkSignal( nIndex, m_itsGoldenFork, m_itsDeadFork, pnCode );
if( dEMV < dLiminalLow && nSignal == m_itsGoldenFork )
{ // 低位金叉
if( pnCode ) *pnCode = ITSC_GOLDENFORK;
return m_itsGoldenFork;
}
if( dEMV > dLiminalHigh && nSignal == m_itsDeadFork )
{ // 高位死叉
if( pnCode ) *pnCode = ITSC_DEADFORK;
return m_itsDeadFork;
}
return ITS_NOTHING;
/* FROM BOOK */
/* if( pnCode ) *pnCode = ITSC_NOTHING;
double dValue;
if( !Calculate( &dValue, nIndex, FALSE ) )
return ITS_NOTHING;
if( dValue > 0 )
{
if( pnCode ) *pnCode = ITSC_LONG;
return m_itsLong;
}
if( dValue < 0 )
{
if( pnCode ) *pnCode = ITSC_SHORT;
return m_itsShort;
}
return ITS_NOTHING;
*/
}
BOOL CEMV::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
return AfxGetMinMaxInfo2( nStart, nEnd, pdMin, pdMax, this );
}
/***
A = (今天最高 + 今天最低)÷ 2
B = (前一天最高 + 前一天最低)÷2
C = 今天最高 - 今天最低
EM = (A-B)×C÷今天成交额
EMV = 累计n天的EM值
*/
BOOL CEMV::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( m_nDays > nIndex )
return FALSE;
if( LoadFromCache( nIndex, pValue ) )
return TRUE;
double dEMV = 0;
int nCount = 0;
for( int k=nIndex; k>=1; k-- )
{
KDATA kd = m_pKData->ElementAt(k);
KDATA kdLast = m_pKData->ElementAt(k-1);
if( 0 == kd.m_fVolume )
return FALSE;
double dDIF = 0;
dDIF = (kd.m_fHigh+kd.m_fLow)/2 - (((double)kdLast.m_fHigh)+kdLast.m_fLow)/2;
dEMV += dDIF * (kd.m_fHigh-kd.m_fLow) / kd.m_fVolume;
nCount ++;
if( nCount == m_nDays )
{
if( pValue )
*pValue = dEMV / m_nDays;
StoreToCache( nIndex, pValue );
return TRUE;
}
}
return FALSE;
}
BOOL CEMV::Calculate( double * pValue, double * pMA, int nIndex, BOOL bUseLast )
{
return CalculateMA( pValue, pMA, nIndex, bUseLast, m_nMADays );
}
//////////////////////////////////////////////////////////////////////
// CVRSI
CVRSI::CVRSI( )
{
SetDefaultParameters( );
}
CVRSI::CVRSI( CKData * pKData )
: CTechnique( pKData )
{
SetDefaultParameters( );
}
CVRSI::~CVRSI()
{
Clear( );
}
void CVRSI::SetDefaultParameters( )
{
m_nDays = 10;
m_itsDeviateOnBottom = ITS_BUYINTENSE;
m_itsDeviateOnTop = ITS_SELLINTENSE;
m_itsSold = ITS_BUY;
m_itsBought = ITS_SELL;
}
void CVRSI::AttachParameters( CVRSI & src )
{
m_nDays = src.m_nDays;
m_itsDeviateOnBottom = src.m_itsDeviateOnBottom;
m_itsDeviateOnTop = src.m_itsDeviateOnTop;
m_itsSold = src.m_itsSold;
m_itsBought = src.m_itsBought;
}
BOOL CVRSI::IsValidParameters( )
{
return ( VALID_DAYS( m_nDays )
&& VALID_ITS(m_itsDeviateOnBottom) && VALID_ITS(m_itsDeviateOnTop)
&& VALID_ITS(m_itsSold) && VALID_ITS(m_itsBought) );
}
void CVRSI::Clear( )
{
CTechnique::Clear( );
}
int CVRSI::GetSignal( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
int nMaxDays = m_nDays;
double dLiminalLow = 0, dLiminalHigh = 0;
if( !IntensityPrepare( nIndex, pnCode, nMaxDays, ITS_GETMINMAXDAYRANGE, &dLiminalLow, &dLiminalHigh ) )
return ITS_NOTHING;
double dNow;
if( !Calculate( &dNow, nIndex, FALSE ) )
return ITS_NOTHING;
if( IsDeviateOnBottom( nIndex, m_pdCache1, m_pdCache2 ) )
{ // 底背离
if( pnCode ) *pnCode = ITSC_DEVIATEONBOTTOM;
return m_itsDeviateOnBottom;
}
if( IsDeviateOnTop( nIndex, m_pdCache1, m_pdCache2 ) )
{ // 顶背离
if( pnCode ) *pnCode = ITSC_DEVIATEONTOP;
return m_itsDeviateOnTop;
}
if( dNow < dLiminalLow )
{ // 超卖
if( pnCode ) *pnCode = ITSC_OVERSOLD;
return m_itsSold;
}
if( dNow > dLiminalHigh )
{ // 超买
if( pnCode ) *pnCode = ITSC_OVERBOUGHT;
return m_itsBought;
}
return ITS_NOTHING;
}
BOOL CVRSI::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
if( pdMin ) *pdMin = 0;
if( pdMax ) *pdMax = 100;
return TRUE;
}
/***
VP = N日内成交量增加日的平均成交量
VQ = N日内成交量减少日的平均成交量
VRSI = 100 * VP / (VP+VQ)
*/
BOOL CVRSI::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( m_nDays > nIndex )
return FALSE;
if( LoadFromCache( nIndex, pValue ) )
return TRUE;
double dVP = 0, dVQ = 0, dResult = 0;
int nCount = 0, p = 0, q = 0;
for( int k=nIndex; k>=1; k-- )
{
if( m_pKData->MaindataAt(k) >= m_pKData->MaindataAt(k-1) )
{
dVP += m_pKData->ElementAt(k).m_fVolume;
p ++;
}
else
{
dVQ += m_pKData->ElementAt(k).m_fVolume;
q ++;
}
nCount ++;
if( nCount == m_nDays )
{
if( p > 0 ) dVP = dVP / p;
if( q > 0 ) dVQ = dVQ / q;
if( dVQ < 1e-4 )
dResult = 100;
else
dResult = 100 - 100. / (1 + dVP / dVQ);
if( pValue ) *pValue = dResult;
StoreToCache( nIndex, pValue );
return TRUE;
}
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CNVRSI
CNVRSI::CNVRSI( )
{
SetDefaultParameters( );
}
CNVRSI::CNVRSI( CKData * pKData )
: CVRSI( pKData )
{
SetDefaultParameters( );
}
CNVRSI::~CNVRSI()
{
Clear( );
}
/***
VP = N日内成交量增加日的总成交量
VQ = N日内成交量减少日的总成交量
VRSI = 100 * VP / (VP+VQ)
*/
BOOL CNVRSI::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( m_nDays > nIndex )
return FALSE;
if( LoadFromCache( nIndex, pValue ) )
return TRUE;
double dUV = 0, dV = 0, dResult = 0;
int nCount = 0;
for( int k=nIndex; k>=1; k-- )
{
if( m_pKData->ElementAt(k).m_fVolume > m_pKData->ElementAt(k-1).m_fVolume )
dUV += m_pKData->ElementAt(k).m_fVolume;
dV += m_pKData->ElementAt(k).m_fVolume;
nCount ++;
if( nCount == m_nDays )
{
if( dV < 1e-4 )
dResult = 50;
else
dResult = 100. * dUV / dV;
if( pValue ) *pValue = dResult;
StoreToCache( nIndex, pValue );
return TRUE;
}
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CAD
CAD::CAD( )
{
SetDefaultParameters( );
}
CAD::CAD( CKData * pKData )
: CTechnique( pKData )
{
SetDefaultParameters( );
}
CAD::~CAD()
{
Clear( );
}
void CAD::SetDefaultParameters( )
{
m_nDays = 8;
}
void CAD::AttachParameters( CAD & src )
{
m_nDays = src.m_nDays;
}
BOOL CAD::IsValidParameters( )
{
return ( VALID_DAYS(m_nDays) );
}
void CAD::Clear( )
{
CTechnique::Clear( );
}
int CAD::GetSignal( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
// 无买卖信号
return ITS_NOTHING;
}
BOOL CAD::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
return AfxGetMinMaxInfo1( nStart, nEnd, pdMin, pdMax, this );
}
/***
A = 当日最高价 - 当日最低价
B = 2 * 当日收盘价 - 当日最高价 - 当日最低价
C = 当日成交量 * B / A
AD = N日内C的总和
*/
BOOL CAD::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( m_nDays > nIndex+1 )
return FALSE;
if( LoadFromCache( nIndex, pValue ) )
return TRUE;
double dAD = 0;
int nCount = 0;
for( int k=nIndex; k>=0; k-- )
{
KDATA kd = m_pKData->ElementAt(k);
if( kd.m_fHigh-kd.m_fLow > 1e-4 )
dAD += kd.m_fVolume * (((double)kd.m_fClose)-kd.m_fLow-kd.m_fHigh+kd.m_fClose)/(((double)kd.m_fHigh)-kd.m_fLow);
nCount ++;
if( nCount == m_nDays )
{
if( pValue ) *pValue = dAD;
StoreToCache( nIndex, pValue );
return TRUE;
}
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CCI
CCI::CCI( )
{
SetDefaultParameters( );
}
CCI::CCI( CKData * pKData )
: CTechnique( pKData )
{
SetDefaultParameters( );
}
CCI::~CCI()
{
Clear( );
}
void CCI::SetDefaultParameters( )
{
}
void CCI::AttachParameters( CCI & src )
{
}
BOOL CCI::IsValidParameters( )
{
return TRUE;
}
void CCI::Clear( )
{
CTechnique::Clear( );
}
int CCI::GetSignal( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
// 无买卖信号
return ITS_NOTHING;
}
BOOL CCI::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
return AfxGetMinMaxInfo1( nStart, nEnd, pdMin, pdMax, this );
}
/***
CI = (当日收盘价 - 当日开盘价)/(当日最高价 - 当日最低价)
*/
BOOL CCI::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( LoadFromCache( nIndex, pValue ) )
return TRUE;
KDATA kd = m_pKData->ElementAt(nIndex);
if( kd.m_fHigh-kd.m_fLow < 1e-4)
return FALSE;
double dCI = (((double)kd.m_fClose)-kd.m_fOpen)/(((double)kd.m_fHigh)-kd.m_fLow);
/*
if( nIndex > 0 )
{
KDATA kdLast = m_pKData->ElementAt(nIndex-1);
if( max(kd.m_fOpen,kd.m_fClose) > kdLast.m_fClose*1.08 && kd.m_fHigh>kdLast.m_fClose)
dCI += (2.*kd.m_fClose-kd.m_fLow-kdLast.m_fClose)/(((double)kd.m_fHigh)-kdLast.m_fClose);
if( kd.m_fOpen < kdLast.m_fClose*0.92 )
dCI += (2.*kd.m_fLow-kd.m_fHigh-kdLast.m_fClose)/(((double)kd.m_fClose)-kd.m_fLow);
}
*/
dCI = kd.m_fVolume * dCI;
if( pValue )
*pValue = dCI;
StoreToCache( nIndex, pValue );
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -