📄 techother.cpp
字号:
/*
Cross Platform Core Code.
Copyright(R) 2001-2002 Balang Software.
All rights reserved.
*/
#include "StdAfx.h"
#include "Stock.h"
#include "Technique.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// CREI
CREI::CREI( )
{
SetDefaultParameters( );
}
CREI::CREI( CKData * pKData )
: CTechnique( pKData )
{
SetDefaultParameters( );
}
CREI::~CREI()
{
Clear( );
}
void CREI::SetDefaultParameters( )
{
m_nDays = 8;
m_itsLong = ITS_BUY;
m_itsShort = ITS_SELL;
}
void CREI::AttachParameters( CREI & src )
{
m_nDays = src.m_nDays;
m_itsLong = src.m_itsLong;
m_itsShort = src.m_itsShort;
}
BOOL CREI::IsValidParameters( )
{
return ( VALID_DAYS(m_nDays) && VALID_ITS(m_itsLong) && VALID_ITS(m_itsShort) );
}
void CREI::Clear( )
{
CTechnique::Clear( );
}
int CREI::GetSignal( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
if( nIndex <= 0 )
return ITS_NOTHING;
double dLast, dNow;
if( !Calculate( &dLast, nIndex-1, FALSE )
|| !Calculate( &dNow, nIndex, FALSE ) )
return ITS_NOTHING;
if( dLast < -0.6 && dNow > -0.6 )
{ // 低位做多
if( pnCode ) *pnCode = ITSC_LONG;
return m_itsLong;
}
if( dLast > 0.6 && dNow < 0.6 )
{ // 高位做空
if( pnCode ) *pnCode = ITSC_SHORT;
return m_itsShort;
}
return ITS_NOTHING;
}
BOOL CREI::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
return AfxGetMinMaxInfo1( nStart, nEnd, pdMin, pdMax, this );
}
/***
DIF1 = 今日最高价 - 2日前最高价
DIF2 = 今日最低价 - 2日前最低价
A = N日内除满足以下情况日的(DIF1+DIF2)之和
1. 2日前最高价 小于 7日前收盘价
2. 2日前最高价 小于 8日前收盘价
3. 今日前最高价 小于 5日前最低价
4. 今日前最高价 小于 6日前最低价
5. 2日前最低价 小于 7日前收盘价
6. 2日前最低价 小于 8日前收盘价
7. 今日前最低价 小于 5日前最高价
8. 今日前最低价 小于 6日前最高价
REIA = N日的DIF1绝对值之和 + N日的DIF2绝对值之和
REI = A / REIA
*/
BOOL CREI::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( m_nDays+7 > nIndex )
return FALSE;
if( LoadFromCache( nIndex, pValue ) )
return TRUE;
double dREI = 0, dREIA = 0;
int nCount = 0;
for( int k=nIndex; k>=8; k-- )
{
double dDIF1 = 0, dDIF2 = 0;
int num1 = 1, num2 = 1;
dDIF1 = ((double)m_pKData->ElementAt(k).m_fHigh) - m_pKData->ElementAt(k-2).m_fHigh;
dDIF2 = ((double)m_pKData->ElementAt(k).m_fLow) - m_pKData->ElementAt(k-2).m_fLow;
if( m_pKData->ElementAt(k-2).m_fHigh < m_pKData->ElementAt(k-7).m_fClose
&& m_pKData->ElementAt(k-2).m_fHigh < m_pKData->ElementAt(k-8).m_fClose
&& m_pKData->ElementAt(k).m_fHigh < m_pKData->ElementAt(k-5).m_fLow
&& m_pKData->ElementAt(k).m_fHigh < m_pKData->ElementAt(k-6).m_fLow )
num1 = 0;
if( m_pKData->ElementAt(k-2).m_fLow > m_pKData->ElementAt(k-7).m_fClose
&& m_pKData->ElementAt(k-2).m_fLow > m_pKData->ElementAt(k-8).m_fClose
&& m_pKData->ElementAt(k).m_fLow > m_pKData->ElementAt(k-5).m_fHigh
&& m_pKData->ElementAt(k).m_fLow > m_pKData->ElementAt(k-6).m_fHigh )
num2 = 0;
dREI += (dDIF1+dDIF2) * num1 * num2;
dREIA += fabs(dDIF1) + fabs(dDIF2);
nCount ++;
if( nCount == m_nDays )
{
if( fabs(dREIA) < 1e-4 )
return FALSE;
if( pValue )
*pValue = dREI / dREIA;
StoreToCache( nIndex, pValue );
return TRUE;
}
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CDMKI
CDMKI::CDMKI( )
{
SetDefaultParameters( );
}
CDMKI::CDMKI( CKData * pKData )
: CTechnique( pKData )
{
SetDefaultParameters( );
}
CDMKI::~CDMKI()
{
Clear( );
}
void CDMKI::SetDefaultParameters( )
{
m_nDays = 13;
m_itsSold = ITS_BUY;
m_itsBought = ITS_SELL;
}
void CDMKI::AttachParameters( CDMKI & src )
{
m_nDays = src.m_nDays;
m_itsSold = src.m_itsSold;
m_itsBought = src.m_itsBought;
}
BOOL CDMKI::IsValidParameters( )
{
return ( VALID_DAYS(m_nDays) && VALID_ITS(m_itsSold) && VALID_ITS(m_itsBought) );
}
void CDMKI::Clear( )
{
CTechnique::Clear( );
}
int CDMKI::GetSignal( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
double dDMKI;
if( !Calculate( &dDMKI, nIndex, FALSE ) )
return ITS_NOTHING;
if( dDMKI < 0.3 )
{ // 超卖
if( pnCode ) *pnCode = ITSC_OVERSOLD;
return m_itsSold;
}
if( dDMKI > 0.7 )
{ // 超买
if( pnCode ) *pnCode = ITSC_OVERBOUGHT;
return m_itsBought;
}
return ITS_NOTHING;
}
BOOL CDMKI::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
return AfxGetMinMaxInfo1( nStart, nEnd, pdMin, pdMax, this );
}
/***
DMH = N日内最高价大于昨日最高价日的 (最高价-昨日最高价)
DML = N日内最低价小于昨日最低价日的 (昨日最低价-最低价)
DMKI = DMH / (DMH+DML)
*/
BOOL CDMKI::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 dDMH = 0, dDML = 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( kd.m_fHigh > kdLast.m_fHigh )
dDMH += (((double)kd.m_fHigh)-kdLast.m_fHigh);
if( kd.m_fLow < kdLast.m_fLow )
dDML += (((double)kdLast.m_fLow)-kd.m_fLow);
nCount ++;
if( nCount == m_nDays )
{
if( fabs(dDMH + dDML) < 1e-4 )
return FALSE;
if( pValue ) *pValue = dDMH / (dDMH+dDML);
StoreToCache( nIndex, pValue );
return TRUE;
}
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// CPCNT
CPCNT::CPCNT( )
{
SetDefaultParameters( );
}
CPCNT::CPCNT( CKData * pKData )
: CTechnique( pKData )
{
SetDefaultParameters( );
}
CPCNT::~CPCNT()
{
Clear( );
}
void CPCNT::SetDefaultParameters( )
{
m_nMADays = 6;
m_itsGoldenFork = ITS_BUY;
m_itsDeadFork = ITS_SELL;
}
void CPCNT::AttachParameters( CPCNT & src )
{
m_nMADays = src.m_nMADays;
m_itsGoldenFork = src.m_itsGoldenFork;
m_itsDeadFork = src.m_itsDeadFork;
}
BOOL CPCNT::IsValidParameters( )
{
return ( VALID_DAYS(m_nMADays) && VALID_ITS(m_itsGoldenFork) && VALID_ITS(m_itsDeadFork) );
}
void CPCNT::Clear( )
{
CTechnique::Clear( );
}
int CPCNT::GetSignal( int nIndex, UINT * pnCode )
{
if( pnCode ) *pnCode = ITSC_NOTHING;
int nMaxDays = m_nMADays;
double dLiminalLow = 0, dLiminalHigh = 0;
if( !IntensityPrepare( nIndex, pnCode, nMaxDays, ITS_GETMINMAXDAYRANGE, &dLiminalLow, &dLiminalHigh, 0.5, 0.5 ) )
return ITS_NOTHING;
double dPCNT;
if( !Calculate( &dPCNT, nIndex, FALSE ) )
return ITS_NOTHING;
int nSignal = GetForkSignal( nIndex, m_itsGoldenFork, m_itsDeadFork, pnCode );
if( dPCNT < dLiminalLow && nSignal == m_itsGoldenFork )
{ // 低位金叉
if( pnCode ) *pnCode = ITSC_GOLDENFORK;
return m_itsGoldenFork;
}
if( dPCNT > dLiminalHigh && nSignal == m_itsDeadFork )
{ // 高位死叉
if( pnCode ) *pnCode = ITSC_DEADFORK;
return m_itsDeadFork;
}
return ITS_NOTHING;
}
BOOL CPCNT::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
return AfxGetMinMaxInfo2( nStart, nEnd, pdMin, pdMax, this );
}
/***
今日收盘 - N日前收盘
PCNT = ———————————— × 100%
昨日收盘
*/
BOOL CPCNT::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
STT_ASSERT_CALCULATE1( m_pKData, nIndex );
if( LoadFromCache( nIndex, pValue ) )
return TRUE;
int nDays = 1; // same as ROC with m_nDays==1
if( nDays > nIndex )
return FALSE;
double dROC = 0;
if( m_pKData->MaindataAt(nIndex-nDays) <= 0
|| m_pKData->MaindataAt(nIndex) <= 0 )
return FALSE;
double x = m_pKData->MaindataAt(nIndex);
double y = m_pKData->MaindataAt(nIndex-nDays);
if( pValue )
*pValue = (x - y) * 100 / y;
StoreToCache( nIndex, pValue );
return TRUE;
}
/***
计算PCNT及其移动平均值
*/
BOOL CPCNT::Calculate( double * pValue, double * pMA, int nIndex, BOOL bUseLast )
{
return CTechnique::CalculateMA( pValue, pMA, nIndex, bUseLast, m_nMADays );
}
//////////////////////////////////////////////////////////////////////
// CHLC
CHLC::CHLC( )
{
SetDefaultParameters( );
}
CHLC::CHLC( CKData * pKData )
: CTechnique( pKData )
{
SetDefaultParameters( );
}
CHLC::~CHLC()
{
Clear( );
}
void CHLC::SetDefaultParameters( )
{
m_nDays = 12;
m_nMADays = 6;
m_itsGoldenFork = ITS_BUY;
m_itsDeadFork = ITS_SELL;
}
void CHLC::AttachParameters( CHLC & src )
{
m_nDays = src.m_nDays;
m_nMADays = src.m_nMADays;
m_itsGoldenFork = src.m_itsGoldenFork;
m_itsDeadFork = src.m_itsDeadFork;
}
BOOL CHLC::IsValidParameters( )
{
return ( VALID_DAYS(m_nDays) && VALID_DAYS(m_nMADays)
&& VALID_ITS(m_itsGoldenFork) && VALID_ITS(m_itsDeadFork) );
}
void CHLC::Clear( )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -