?? 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 + -