📄 stock.cpp
字号:
else if( CStock::reportQuarter3 == nReportType )
factor = 1.333333;
return factor;
}
CStock::CStock( )
{
m_nBaseTextLen = 0;
m_pBaseText = NULL;
m_pDatabase = NULL;
SetKDataTypes( );
}
CStock::CStock( CStDatabase * pDatabase )
{
m_nBaseTextLen = 0;
m_pBaseText = NULL;
SP_ASSERT( pDatabase );
m_pDatabase = pDatabase;
SetKDataTypes( );
}
CStock::CStock( CStDatabase * pDatabase, DWORD dwMarket, const char * code )
{
m_nBaseTextLen = 0;
m_pBaseText = NULL;
SP_ASSERT( pDatabase );
m_pDatabase = pDatabase;
m_stockinfo.SetStockCode( dwMarket, code );
SetKDataTypes( );
}
CStock::~CStock()
{
Clear( );
}
void CStock::SetKDataTypes( )
{
m_kdMonth.SetKType( CKData::ktypeMonth );
m_kdWeek.SetKType( CKData::ktypeWeek );
m_kdDay.SetKType( CKData::ktypeDay );
m_kdMin60.SetKType( CKData::ktypeMin60 );
m_kdMin30.SetKType( CKData::ktypeMin30 );
m_kdMin15.SetKType( CKData::ktypeMin15 );
m_kdMin5.SetKType( CKData::ktypeMin5 );
}
void CStock::SetDatabase( CStDatabase * pDatabase )
{
m_pDatabase = pDatabase;
}
CStDatabase * CStock::GetDatabase( )
{
return m_pDatabase;
}
void CStock::SetStockCode( DWORD dwMarket, const char *szCode )
{
if( m_stockinfo.IsEqualTo(dwMarket, szCode) )
return;
Clear();
m_stockinfo.SetStockCode(dwMarket,szCode);
}
const char * CStock::GetStockCode( )
{
return m_stockinfo.GetStockCode();
}
BOOL CStock::SetStockInfo( CStockInfo * pInfo )
{
if( NULL == pInfo )
{
Clear();
return FALSE;
}
if( m_stockinfo.IsEqualTo( pInfo->GetMarket(), pInfo->GetStockCode() ) )
{
m_stockinfo = *pInfo;
return m_stockinfo.IsValidStock( );
}
Clear();
m_stockinfo = *pInfo;
return m_stockinfo.IsValidStock( );
}
CStockInfo & CStock::GetStockInfo( ) { return m_stockinfo; }
CKData & CStock::GetKData( int ktype )
{
switch( ktype )
{
case CKData::ktypeMonth:
return GetKDataMonth();
case CKData::ktypeWeek:
return GetKDataWeek();
case CKData::ktypeDay:
return GetKDataDay();
case CKData::ktypeMin60:
return GetKDataMin60();
case CKData::ktypeMin30:
return GetKDataMin30();
case CKData::ktypeMin15:
return GetKDataMin15();
case CKData::ktypeMin5:
return GetKDataMin5();
default:
SP_ASSERT( FALSE );
return GetKDataDay();
}
}
CKData & CStock::GetKDataMonth( ) { return m_kdMonth; }
CKData & CStock::GetKDataWeek( ) { return m_kdWeek; }
CKData & CStock::GetKDataDay( ) { return m_kdDay; }
CKData & CStock::GetKDataMin60( ) { return m_kdMin60; }
CKData & CStock::GetKDataMin30( ) { return m_kdMin30; }
CKData & CStock::GetKDataMin15( ) { return m_kdMin15; }
CKData & CStock::GetKDataMin5( ) { return m_kdMin5; }
CDRData & CStock::GetDRData( ) { return m_drData; }
CReport & CStock::GetReport( ) { return m_report; }
CMinute & CStock::GetMinute( ) { return m_minute; }
COutline & CStock::GetOutline( ) { return m_outline; }
char * CStock::GetBaseTextPtr( ) { return m_pBaseText; }
int CStock::GetBaseTextLength( ) { return m_nBaseTextLen; }
BOOL CStock::AllocBaseTextMem( int nNewLength )
{
SP_ASSERT( nNewLength <= 0x200000 );
if( nNewLength > 0x200000 ) return FALSE;
if( m_pBaseText )
{
delete m_pBaseText;
m_nBaseTextLen = 0;
}
m_pBaseText = new CHAR[nNewLength+1];
if( m_pBaseText )
{
memset( m_pBaseText, 0, nNewLength+1 );
m_nBaseTextLen = nNewLength;
return TRUE;
}
return FALSE;
}
int CStock::PrepareData( int type, int period, BOOL bReload )
{
SP_ASSERT( m_pDatabase );
if( ! m_pDatabase ) return 0;
switch( type )
{
case dataInfo:
return AfxGetStockContainer().GetStockInfo( m_stockinfo.GetStockCode(), &m_stockinfo );
case dataK:
{
switch( period )
{
case CKData::ktypeMonth:
if( bReload || GetKDataMonth().GetSize() == 0 )
m_pDatabase->LoadKData( this, CKData::ktypeMonth );
break;
case CKData::ktypeWeek:
if( bReload || GetKDataWeek().GetSize() == 0 )
m_pDatabase->LoadKData( this, CKData::ktypeWeek );
break;
case CKData::ktypeDay:
if( bReload || GetKDataDay().GetSize() == 0 )
m_pDatabase->LoadKData( this, CKData::ktypeDay );
break; // month, week, and day willnot extract from min60,min30...
case CKData::ktypeMin60:
if( bReload || GetKDataMin60().GetSize() == 0 )
m_pDatabase->LoadKData( this, CKData::ktypeMin60 );
break;
case CKData::ktypeMin30:
if( bReload || GetKDataMin30().GetSize() == 0 )
m_pDatabase->LoadKData( this, CKData::ktypeMin30 );
break;
case CKData::ktypeMin15:
if( bReload || GetKDataMin15().GetSize() == 0 )
m_pDatabase->LoadKData( this, CKData::ktypeMin15 );
break;
case CKData::ktypeMin5:
if( bReload || GetKDataMin5().GetSize() == 0 )
m_pDatabase->LoadKData( this, CKData::ktypeMin5 );
break;
default:
SP_ASSERT( FALSE );
return 0;
}
return ExtractKData( period, FALSE );
}
case dataDR:
if( bReload || GetDRData().GetSize() == 0 )
return m_pDatabase->LoadDRData( this );
else
return GetDRData().GetSize();
case dataBasetable:
return AfxGetStockContainer().GetStockInfo( m_stockinfo.GetStockCode(), &m_stockinfo );
case dataBasetext:
if( bReload || !GetBaseTextPtr() )
return m_pDatabase->LoadBaseText( this );
else
return GetBaseTextLength();
case dataReport:
if( bReload || GetReport().GetSize() == 0 )
return m_pDatabase->LoadReport( this );
else
return GetReport().GetSize();
case dataMinute:
if( bReload || GetMinute().GetSize() == 0 )
return m_pDatabase->LoadMinute( this );
else
return GetMinute().GetSize();
case dataOutline:
if( bReload || GetOutline().GetSize() == 0 )
return m_pDatabase->LoadOutline( this );
else
return GetOutline().GetSize();
default:
SP_ASSERT( FALSE );
return 0;
}
}
int CStock::PrepareBaseInfo( BOOL bReload )
{
// Load From File
PrepareData( CStock::dataBasetext, 0, bReload );
// Save To pText
int nTextLen = m_nBaseTextLen;
char * pText = NULL;
if( m_pBaseText && nTextLen > 0 )
{
pText = new CHAR[nTextLen+1];
if( pText ) memcpy( pText, m_pBaseText, nTextLen );
if( pText ) pText[nTextLen] = 0;
}
int nIntroLen = SLH_MAX * 80;
if( !AllocBaseTextMem( nIntroLen + m_nBaseTextLen + 10 ) )
return 0;
int nCount = 0;
#ifdef CLKLAN_ENGLISH_US
{ // Chinese pronunciation
CSPString strTemp = m_stockinfo.GetStockNameChs();
strTemp = AfxMakeSpellCode( strTemp );
strTemp = "Chinese Name(pronunciation): \t" + strTemp + STRING_CRLF;
if( nCount + strTemp.GetLength() < nIntroLen )
{
nCount += strTemp.GetLength();
strcat( m_pBaseText, (LPCTSTR)strTemp );
}
}
#endif
for( int nVariantID = SLH_MIN; nVariantID <= SLH_MAX; nVariantID ++ )
{
CSPString strTemp = AfxGetVariantName( nVariantID, TRUE );
strTemp += ": \t";
strTemp += (LPCTSTR)AfxGetVariantDispString( nVariantID, m_stockinfo, NULL );
strTemp += STRING_CRLF;
SP_ASSERT( nCount + strTemp.GetLength() < nIntroLen );
if( nCount + strTemp.GetLength() < nIntroLen )
{
nCount += strTemp.GetLength();
strcat( m_pBaseText, (LPCTSTR)strTemp );
}
}
nCount += strlen(STRING_CRLF);
strcat( m_pBaseText, STRING_CRLF );
nCount += strlen(STRING_CRLF);
strcat( m_pBaseText, STRING_CRLF );
#ifdef CLKLAN_ENGLISH_US
if( pText && nCount + nTextLen < m_nBaseTextLen && AfxIsEnglish( pText, nTextLen, 0.01f ) )
#else
if( pText && nCount + nTextLen < m_nBaseTextLen )
#endif
{
nCount += nTextLen;
strcat( m_pBaseText, pText );
}
if( pText )
delete [] pText;
return nCount;
}
int CStock::ExtractKData( int period, BOOL bForced )
{
switch( period )
{
case CKData::ktypeMonth:
{
if( bForced )
return CKData::DayToMonth( GetKDataDay(), GetKDataMonth() );
int compare = GetKDataMonth().CompareLatestDate( GetKDataDay() );
if( -1 == compare )
return CKData::DayToMonth( GetKDataDay(), GetKDataMonth() );
else if( 1 == compare )
return GetKDataMonth().GetSize();
else if( GetKDataMonth().GetSize() * 18 < GetKDataDay().GetSize() )
return CKData::DayToMonth( GetKDataDay(), GetKDataMonth() );
else
return GetKDataMonth().GetSize();
}
break;
case CKData::ktypeWeek:
{
if( bForced )
return CKData::DayToWeek( GetKDataDay(), GetKDataWeek() );
int compare = GetKDataWeek().CompareLatestDate( GetKDataDay() );
if( -1 == compare )
return CKData::DayToWeek( GetKDataDay(), GetKDataWeek() );
else if( 1 == compare )
return GetKDataWeek().GetSize();
else if( GetKDataWeek().GetSize() * 5 < GetKDataDay().GetSize() )
return CKData::DayToWeek( GetKDataDay(), GetKDataWeek() );
else
return GetKDataWeek().GetSize();
}
break;
case CKData::ktypeDay:
return GetKDataDay().GetSize();
case CKData::ktypeMin60:
{
if( bForced )
return CKData::Min5ToMin60( GetKDataMin5(), GetKDataMin60() );
int compare = GetKDataMin60().CompareLatestDate( GetKDataMin5() );
if( -1 == compare )
return CKData::Min5ToMin60( GetKDataMin5(), GetKDataMin60() );
else if( 1 == compare )
return GetKDataMin60().GetSize();
else if( GetKDataMin60().GetSize() * 12 < GetKDataMin5().GetSize() )
return CKData::Min5ToMin60( GetKDataMin5(), GetKDataMin60() );
else
return GetKDataMin60().GetSize();
}
break;
case CKData::ktypeMin30:
{
if( bForced )
return CKData::Min5ToMin30( GetKDataMin5(), GetKDataMin30() );
int compare = GetKDataMin30().CompareLatestDate( GetKDataMin5() );
if( -1 == compare )
return CKData::Min5ToMin30( GetKDataMin5(), GetKDataMin30() );
else if( 1 == compare )
return GetKDataMin30().GetSize();
else if( GetKDataMin30().GetSize() * 6 < GetKDataMin5().GetSize() )
return CKData::Min5ToMin30( GetKDataMin5(), GetKDataMin30() );
else
return GetKDataMin30().GetSize();
}
break;
case CKData::ktypeMin15:
{
if( bForced )
return CKData::Min5ToMin15( GetKDataMin5(), GetKDataMin15() );
int compare = GetKDataMin15().CompareLatestDate( GetKDataMin5() );
if( -1 == compare )
return CKData::Min5ToMin15( GetKDataMin5(), GetKDataMin15() );
else if( 1 == compare )
return GetKDataMin15().GetSize();
else if( GetKDataMin15().GetSize() * 3 < GetKDataMin5().GetSize() )
return CKData::Min5ToMin15( GetKDataMin5(), GetKDataMin15() );
else
return GetKDataMin15().GetSize();
}
break;
case CKData::ktypeMin5:
return GetKDataMin5().GetSize();
default:
SP_ASSERT( FALSE );
return 0;
}
}
int CStock::MergeBaseText( CStock &stock )
{
if( GetBaseTextLength() > 0 )
return GetBaseTextLength();
if( stock.GetBaseTextLength() > 0 )
{
if( AllocBaseTextMem( stock.GetBaseTextLength() ) )
strncpy( GetBaseTextPtr(), stock.GetBaseTextPtr(), stock.GetBaseTextLength() );
return stock.GetBaseTextLength();
}
return 0;
}
int CStock::MergeKData( CStock &stock, int period )
{
CKData * pkdata = NULL;
CKData * pkdata2 = NULL;
switch( period )
{
case CKData::ktypeMonth:
pkdata = &(GetKDataMonth());
pkdata2 = &(stock.GetKDataMonth());
break;
case CKData::ktypeWeek:
pkdata = &(GetKDataWeek());
pkdata2 = &(stock.GetKDataWeek());
break;
case CKData::ktypeDay:
pkdata = &(GetKDataDay());
pkdata2 = &(stock.GetKDataDay());
break;
case CKData::ktypeMin60:
pkdata = &(GetKDataMin60());
pkdata2 = &(stock.GetKDataMin60());
break;
case CKData::ktypeMin30:
pkdata = &(GetKDataMin30());
pkdata2 = &(stock.GetKDataMin30());
break;
case CKData::ktypeMin15:
pkdata = &(GetKDataMin15());
pkdata2 = &(stock.GetKDataMin15());
break;
case CKData::ktypeMin5:
pkdata = &(GetKDataMin5());
pkdata2 = &(stock.GetKDataMin5());
break;
default:
SP_ASSERT( FALSE );
return 0;
}
return pkdata->MergeKData( pkdata2 );
}
int CStock::MergeDRData( CStock &stock )
{
if( GetDRData().GetSize() < stock.GetDRData().GetSize() )
GetDRData().Copy( stock.GetDRData() );
return GetDRData().GetSize();
}
int CStock::StoreDRData( )
{
if( m_pDatabase )
return m_pDatabase->StoreDRData( this );
return 0;
}
void CStock::Clear( )
{
m_stockinfo.Clear( );
if( m_pBaseText )
delete [] (CHAR*)m_pBaseText;
m_nBaseTextLen = 0;
m_pBaseText = NULL;
m_kdMonth.Clear();
m_kdWeek.Clear();
m_kdDay.Clear();
m_kdMin60.Clear();
m_kdMin30.Clear();
m_kdMin15.Clear();
m_kdMin5.Clear();
m_drData.SetSize( 0 );
m_report.SetSize( 0 );
m_minute.SetSize( 0 );
m_outline.SetSize( 0 );
SetKDataTypes( );
}
// 投资家万能引擎证券市场
/*
#define SH_MARKET_EX 'HS' // 上海证券
#define SZ_MARKET_EX 'ZS' // 深圳证券
#define CZ_MARKET_EX 'ZC' // 郑州商品
#define DL_MARKET_EX 'LD' // 大连商品
#define SF_MARKET_EX 'FS' // 上海商品
#define SM_MARKET_EX 'MS' // 上海金属
#define CE_MARKET_EX 'EC' // 亚洲指数
#define CB_MARKET_EX 'BC' // CBOT
#define CC_MARKET_EX 'CC' // 软商品
#define MC_MARKET_EX 'CM' // C M X
#define IM_MARKET_EX 'MI' // 外汇期货
#define LM_MARKET_EX 'ML' // L M E
#define NY_MARKET_EX 'YN' // NYSE
#define AI_MARKET_EX 'IA' // 亚洲期指
#define WH_MARKET_EX 'HW' // 外汇交易
#define XH_MARKET_EX 'HX' // 欧美指数
#define CM_MARKET_EX 'MC' // C M E
#define NF_MARKET_EX 'FN' // 欧美期指
#define NM_MARKET_EX 'MN' // 石油产品
#define LC_MARKET_EX 'CL' // 巴黎油籽
#define LI_MARKET_EX 'IL' // 马来西亚
#define SI_MARKET_EX 'IS' // 温尼伯格
#define HS_MARKET_EX 'SH' // H S I
#define HK_MARKET_EX 'HK' // 香港股票
#define ZJ_MARKET_EX 'JZ' // ZJFE
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -