📄 selfdb.cpp.svn-base
字号:
/*
Cross Platform Core Code.
Copyright(R) 2001-2002 Balang Software.
All rights reserved.
Using:
class CClkFile;
class CSelfDB;
*/
#include "StdAfx.h"
#include "../Include/Database.h"
#include "../Include/SpString.h"
#include "SpLock.h"
#include <direct.h>
#include "SelfDB.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////////////
// SelfDB strings
extern char ml_dat[];
extern char ml_dat[];
extern char ml_sh_info[];
extern char ml_sz_info[];
extern char ml_sh_now[];
extern char ml_sz_now[];
extern char ml_sh_pyjc[];
extern char ml_sz_pyjc[];
extern char ml_sh_trace[];
extern char ml_sz_trace[];
extern char ml_sh_minute[];
extern char ml_sz_minute[];
extern char ml_data[];
extern char ml_sh[];
extern char ml_sz[];
extern char ml_base[];
extern char ml_month[];
extern char ml_week[];
extern char ml_day[];
extern char ml_min5[];
extern char ml_sh_base[];
extern char ml_sz_base[];
extern char ml_sh_month[];
extern char ml_sz_month[];
extern char ml_sh_week[];
extern char ml_sz_week[];
extern char ml_sh_day[];
extern char ml_sz_day[];
extern char ml_sh_min[];
extern char ml_sz_min[];
extern char ml_ext_base[];
extern char ml_ext_month[];
extern char ml_ext_week[];
extern char ml_ext_day[];
extern char ml_ext_min5[];
char self_ext_xdr[] = ".dat";
char self_sh_xdr[] = "history\\shase\\xdrdata\\";
char self_sz_xdr[] = "history\\sznse\\xdrdata\\";
char self_news[] = "history\\news\\";
char self_chna_xdr[] = "history\\CHNA.pwr"; // 除权文件,与分析家格式相同
char self_chna_basetbl[]= "history\\CHNA.bst"; // 财务资料表
// 代码表文件
char self_sh_code[] = "history\\SHSE.cod"; // 上海代码表
char self_sz_code[] = "history\\SZSE.cod"; // 深圳代码表
// 行情缓存文件
char self_sh_report[] = "realtime\\SHSE.rpt"; // 上海行情保存文件
char self_sz_report[] = "realtime\\SZSE.rpt"; // 深圳行情保存文件
char self_sh_minute[] = "realtime\\SHSE.min"; // 上海分时保存文件
char self_sz_minute[] = "realtime\\SZSE.min"; // 深圳分时保存文件
char self_outline[] = "realtime\\clkoutln.out";
/////////////////////////////////////////////////////////////////////////////////////
// SelfDB convertor
BOOL convert_CLK_DRDATA_to_DRDATA( DWORD dwMarket, const char *szCode, CLK_DRDATA * pdbdr, DRDATA * pdr )
{
SP_ASSERT( pdbdr && pdr );
if( NULL == pdbdr || NULL == pdr )
return FALSE;
memset( pdr, 0, sizeof(DRDATA) );
pdr->m_dwMarket = dwMarket;
if( szCode )
strncpy( pdr->m_szCode, szCode, min(sizeof(pdr->m_szCode)-1,strlen(szCode)) );
pdr->m_date = pdbdr->date;
CSPTime sptime;
if( sptime.FromStockTimeDay(pdr->m_date) )
pdr->m_time = sptime.GetTime();
pdr->m_fProfit = (float)( pdbdr->bonus * 0.0001 );
pdr->m_fGive = (float)( pdbdr->bonus_share * 0.001 );
pdr->m_fPei = (float)( pdbdr->ration_share * 0.001 );
pdr->m_fPeiPrice= (float)( pdbdr->ration_value * 0.001 );
return TRUE;
}
BOOL convert_DRDATA_to_CLK_DRDATA( DRDATA * pdr, CLK_DRDATA * pdbdr )
{
SP_ASSERT( pdbdr && pdr );
if( NULL == pdbdr || NULL == pdr )
return FALSE;
memset( pdbdr, 0, sizeof(CLK_DRDATA) );
pdbdr->date = pdr->m_date;
pdbdr->bonus = (DWORD)( pdr->m_fProfit * 10000 );
pdbdr->bonus_share = (DWORD)( pdr->m_fGive * 1000 );
pdbdr->ration_share = (DWORD)( pdr->m_fPei * 1000 );
pdbdr->ration_value = (DWORD)( pdr->m_fPeiPrice * 1000 );
return TRUE;
}
BOOL convert_FXJ_DRDATA_to_DRDATA( DWORD dwMarket, const char *szCode, FXJ_DRDATA * pfxjdr, DRDATA * pdr )
{
SP_ASSERT( pfxjdr && pdr );
if( NULL == pfxjdr || NULL == pdr )
return FALSE;
memset( pdr, 0, sizeof(DRDATA) );
pdr->m_dwMarket = dwMarket;
if( szCode )
strncpy( pdr->m_szCode, szCode, min(sizeof(pdr->m_szCode)-1,strlen(szCode)) );
pdr->m_time = pfxjdr->m_time;
CSPTime sptime( pdr->m_time );
pdr->m_date = sptime.ToStockTimeDay();
pdr->m_fProfit = pfxjdr->m_fProfit;
pdr->m_fGive = pfxjdr->m_fGive;
pdr->m_fPei = pfxjdr->m_fPei;
pdr->m_fPeiPrice= pfxjdr->m_fPeiPrice;
return TRUE;
}
double StringToDouble( const char *sz, int nLen )
{
char szTemp[32];
if( NULL == sz || nLen >= sizeof(szTemp) )
{
SP_ASSERT( FALSE );
return 0;
}
memset( szTemp, 0, sizeof(szTemp) );
memcpy( szTemp, sz, nLen );
int nPos = 0;
while( isspace(szTemp[nPos]) && nPos < nLen )
nPos ++;
if( nPos == nLen )
return 0;
return atof( &szTemp[nPos] );
}
BOOL convert_TDX_BASEDATA_to_BASEDATA( TDX_BASEDATA * ptdxbd, BASEDATA *pbd )
{
SP_ASSERT( ptdxbd && pbd );
if( NULL == ptdxbd || NULL == pbd )
return FALSE;
memset( pbd, 0, sizeof(BASEDATA) );
pbd->m_dwMarket = CStock::marketCHNA;
strncpy( pbd->m_szCode, ptdxbd->m_szCode, min(sizeof(pbd->m_szCode)-1,sizeof(ptdxbd->m_szCode)) );
CStockInfo info;
if( AfxGetStockContainer().GetStockInfo( pbd->m_szCode, &info ) )
{
int nSize = info.m_basedata.GetSize();
if( nSize > 0 )
memcpy( pbd, &(info.m_basedata.ElementAt(nSize-1)), sizeof(BASEDATA) );
pbd->m_dwMarket = info.GetMarket();
}
// char m_szDomain[STKLIB_MAX_DOMAIN]; // 板块
// char m_szProvince[STKLIB_MAX_PROVINCE]; // 省份
if( '0' == ptdxbd->m_szMarket )
pbd->m_dwMarket = CStock::marketSZSE;
else if( '1' == ptdxbd->m_szMarket )
pbd->m_dwMarket = CStock::marketSHSE;
pbd->m_date = (DWORD)StringToDouble( ptdxbd->m_szDate_modified, sizeof(ptdxbd->m_szDate_modified) );
pbd->m_reporttype = CStock::reportAnnals; // 报告类型:年报、中报、季报
CSPTime sptime;
if( sptime.FromStockTimeDay( pbd->m_date ) )
{
pbd->m_time = sptime.GetTime();
int nMonth = sptime.GetMonth();
if( nMonth >= 4 && nMonth <= 6 )
pbd->m_reporttype = CStock::reportQuarter;
else if( nMonth >= 7 && nMonth <= 9 )
pbd->m_reporttype = CStock::reportMid;
else if( nMonth >= 10 && nMonth <= 12 )
pbd->m_reporttype = CStock::reportQuarter3;
}
// float m_fErate_dollar; // 当期美元汇率
// float m_fErate_hkdollar; // 当期港币汇率
// ★偿债能力
// float m_fRatio_liquidity; // 流动比率
// float m_fRatio_quick; // 速动比率
// float m_fVelocity_receivables; // 应收帐款周率
// ★经营能力
// float m_fVelocity_merchandise; // 存货周转率
pbd->m_fMain_income = (float)StringToDouble( ptdxbd->m_szMain_income, sizeof(ptdxbd->m_szMain_income) ) * 1000;
// float m_fCash_ps; // 每股净现金流量
// ★资本结构
pbd->m_datebegin = (DWORD)StringToDouble( ptdxbd->m_szDate_begin, sizeof(ptdxbd->m_szDate_begin) );
pbd->m_fShare_count_total = (float)StringToDouble( ptdxbd->m_szShare_count_total, sizeof(ptdxbd->m_szShare_count_total) ) * 10000;
pbd->m_fShare_count_a = (float)StringToDouble( ptdxbd->m_szShare_count_currency, sizeof(ptdxbd->m_szShare_count_currency) ) * 10000;
pbd->m_fShare_count_b = (float)StringToDouble( ptdxbd->m_szShare_count_b, sizeof(ptdxbd->m_szShare_count_b) ) * 10000;
pbd->m_fShare_count_h = (float)StringToDouble( ptdxbd->m_szShare_count_h, sizeof(ptdxbd->m_szShare_count_h) ) * 10000;
pbd->m_fShare_count_national= (float)StringToDouble( ptdxbd->m_szShare_count_national, sizeof(ptdxbd->m_szShare_count_national) ) * 10000;
pbd->m_fShare_count_corp = (float)StringToDouble( ptdxbd->m_szShare_count_corp, sizeof(ptdxbd->m_szShare_count_corp) ) * 10000;
if( CStock::typeshB == info.GetType() || CStock::typeszB == info.GetType() ) // A B股 交换
{
float fTemp = pbd->m_fShare_count_a;
pbd->m_fShare_count_a = pbd->m_fShare_count_b;
pbd->m_fShare_count_b = fTemp;
}
if( pbd->m_fShare_count_total > 1e-4 )
pbd->m_fProfit_psud = (float)StringToDouble( ptdxbd->m_szProfit_ud, sizeof(ptdxbd->m_szProfit_ud) ) * 1000 / pbd->m_fShare_count_total;
pbd->m_fAsset = (float)StringToDouble( ptdxbd->m_szAsset, sizeof(ptdxbd->m_szAsset) ) * 1000;
if( pbd->m_fAsset > 1e-4 )
{
pbd->m_fRatio_holderright= (float)( 100 * StringToDouble( ptdxbd->m_szNet_asset, sizeof(ptdxbd->m_szNet_asset) ) * 1000 / pbd->m_fAsset );
pbd->m_fRatio_longdebt = (float)( 100 * StringToDouble( ptdxbd->m_szDebt_long, sizeof(ptdxbd->m_szDebt_long) ) * 1000 / pbd->m_fAsset );
pbd->m_fRatio_debt = (float)( 100 * ( StringToDouble( ptdxbd->m_szDebt_long, sizeof(ptdxbd->m_szDebt_long) ) * 1000 / pbd->m_fAsset
+ StringToDouble( ptdxbd->m_szDebt_long, sizeof(ptdxbd->m_szDebt_long) ) * 1000 / pbd->m_fAsset ) );
}
// ★投资收益能力
pbd->m_fNetasset_ps_regulate= (float)StringToDouble( ptdxbd->m_szNet_asset_ps_regulate, sizeof(ptdxbd->m_szNet_asset_ps_regulate) );
if( pbd->m_fShare_count_total > 1e-4 )
{
pbd->m_fNetasset_ps = (float)StringToDouble( ptdxbd->m_szNet_asset, sizeof(ptdxbd->m_szNet_asset) ) * 1000 / pbd->m_fShare_count_total;
pbd->m_fEps = (float)StringToDouble( ptdxbd->m_szNet_profit, sizeof(ptdxbd->m_szNet_profit) ) * 1000 / pbd->m_fShare_count_total;
pbd->m_fEps_deduct = (float)( pbd->m_fEps - StringToDouble( ptdxbd->m_szOut_profit, sizeof(ptdxbd->m_szOut_profit) ) * 1000 / pbd->m_fShare_count_total );
}
pbd->m_fNet_profit = (float)StringToDouble( ptdxbd->m_szNet_profit, sizeof(ptdxbd->m_szNet_profit) ) * 1000;
pbd->m_fMain_profit = (float)StringToDouble( ptdxbd->m_szMain_profit, sizeof(ptdxbd->m_szMain_profit) ) * 1000;
pbd->m_fTotal_profit = (float)StringToDouble( ptdxbd->m_szTotal_profit, sizeof(ptdxbd->m_szTotal_profit) ) * 1000;
// ★盈利能力
if( pbd->m_fMain_income > 1e-4 )
pbd->m_fProfit_margin = (float)( 100 * pbd->m_fMain_profit / pbd->m_fMain_income );
if( pbd->m_fNetasset_ps > 1e-4 )
pbd->m_fNetasset_yield = (float)( 100 * pbd->m_fEps / pbd->m_fNetasset_ps );
return TRUE;
}
BOOL convert_FXJ_BASEDATA_to_BASEDATA( FXJ_BASEDATA * pfxjbd, BASEDATA *pbd, DWORD dwDate )
{
SP_ASSERT( pfxjbd && pbd );
if( NULL == pfxjbd || NULL == pbd )
return FALSE;
memset( pbd, 0, sizeof(BASEDATA) );
pbd->m_dwMarket = CStock::marketCHNA;
strncpy( pbd->m_szCode, pfxjbd->m_szCode, min(sizeof(pbd->m_szCode)-1,sizeof(pfxjbd->m_szCode)) );
CStockInfo info;
if( AfxGetStockContainer().GetStockInfo( pbd->m_szCode, &info ) )
{
int nSize = info.m_basedata.GetSize();
if( nSize > 0 )
memcpy( pbd, &(info.m_basedata.ElementAt(nSize-1)), sizeof(BASEDATA) );
pbd->m_dwMarket = info.GetMarket();
}
// char m_szDomain[STKLIB_MAX_DOMAIN]; // 板块
// char m_szProvince[STKLIB_MAX_PROVINCE]; // 省份
if( 'ZS' == pfxjbd->m_wMarket )
pbd->m_dwMarket = CStock::marketSZSE;
else if( 'HS' == pfxjbd->m_wMarket )
pbd->m_dwMarket = CStock::marketSHSE;
pbd->m_date = dwDate;
pbd->m_reporttype = CStock::reportAnnals; // 报告类型:年报、中报、季报
CSPTime sptime;
if( sptime.FromStockTimeDay( pbd->m_date ) )
{
pbd->m_time = sptime.GetTime();
int nMonth = sptime.GetMonth();
if( nMonth >= 4 && nMonth <= 6 )
pbd->m_reporttype = CStock::reportQuarter;
else if( nMonth >= 7 && nMonth <= 9 )
pbd->m_reporttype = CStock::reportMid;
else if( nMonth >= 10 && nMonth <= 12 )
pbd->m_reporttype = CStock::reportQuarter3;
}
// float m_fErate_dollar; // 当期美元汇率
// float m_fErate_hkdollar; // 当期港币汇率
// ★偿债能力
// float m_fRatio_liquidity; // 流动比率
// float m_fRatio_quick; // 速动比率
// float m_fVelocity_receivables; // 应收帐款周率
// ★经营能力
// float m_fVelocity_merchandise; // 存货周转率
pbd->m_fMain_income = pfxjbd->m_fData[21]*1000;
// float m_fCash_ps; // 每股净现金流量
// ★盈利能力
if( pbd->m_fMain_income > 1e-4 )
pbd->m_fProfit_margin = (float)( 100 * pfxjbd->m_fData[22]*1000 / pbd->m_fMain_income );
pbd->m_fNetasset_yield = pfxjbd->m_fData[38];
// ★资本结构
// DWORD m_datebegin // 上市日期
pbd->m_fShare_count_total = pfxjbd->m_fData[2]*10000;
pbd->m_fShare_count_a = pfxjbd->m_fData[8]*10000;
pbd->m_fShare_count_b = pfxjbd->m_fData[6]*10000;
pbd->m_fShare_count_h = pfxjbd->m_fData[7]*10000;
pbd->m_fShare_count_national= pfxjbd->m_fData[3]*10000;
pbd->m_fShare_count_corp = pfxjbd->m_fData[5]*10000;
// if( CStock::typeshB == info.GetType() || CStock::typeszB == info.GetType() ) // A B股 交换
// {
// float fTemp = pbd->m_fShare_count_a;
// pbd->m_fShare_count_a = pbd->m_fShare_count_b;
// pbd->m_fShare_count_b = fTemp;
// }
pbd->m_fProfit_psud = pfxjbd->m_fData[33];
pbd->m_fAsset = pfxjbd->m_fData[11]*1000;
pbd->m_fRatio_holderright = pfxjbd->m_fData[37];
if( pbd->m_fAsset > 1e-4 )
pbd->m_fRatio_longdebt = (float)( 100 * pfxjbd->m_fData[17] * 1000 / pbd->m_fAsset );
pbd->m_fRatio_debt = 100 - pbd->m_fRatio_holderright;
// ★投资收益能力
pbd->m_fNetasset_ps = pfxjbd->m_fData[35];
pbd->m_fNetasset_ps_regulate= pfxjbd->m_fData[36];
pbd->m_fEps = pfxjbd->m_fData[34];
if( pbd->m_fShare_count_total > 1e-4 )
pbd->m_fEps_deduct = (float)( pbd->m_fEps - pfxjbd->m_fData[25] * 1000 / pbd->m_fShare_count_total );
pbd->m_fNet_profit = pfxjbd->m_fData[31]*1000;
pbd->m_fMain_profit = pfxjbd->m_fData[22]*1000;
pbd->m_fTotal_profit = pfxjbd->m_fData[29]*1000;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////
// class CClkFile
CClkFile::CClkFile( )
{
Close( );
}
CClkFile::~CClkFile( )
{
Close( );
}
BOOL CClkFile::Open( LPCTSTR lpszFileName )
{
Close( );
if( !m_file.Open( lpszFileName, CSPFile::modeReadWrite ) )
return FALSE;
if( sizeof(m_header) != m_file.Read( &m_header, sizeof(m_header) ) )
{
SP_ASSERT( FALSE );
return FALSE;
}
if( CLK_FHEADER_MAGIC != m_header.m_dwMagic )
{
SP_ASSERT( FALSE );
return FALSE;
}
return TRUE;
}
void CClkFile::Close( )
{
if( m_file.m_hFile != (UINT)CSPFile::hFileNull )
{
m_header.m_time = time(NULL);
m_file.Seek( 0, CSPFile::begin );
m_file.Write( &m_header, sizeof(m_header) );
m_file.Close();
}
memset( &m_header, 0, sizeof(m_header) );
memset( &m_CurIndexRecord, 0, sizeof(m_CurIndexRecord) );
m_dwPosCurIndex = -1;
}
// 创建空的数据文件
BOOL CClkFile::BuildEmptyFile( LPCTSTR lpszFileName,
DWORD dwDataType, // 数据分类说明,see CStock::DataType
DWORD dwMarket, // 市场,see CStock::StockMarket,如果文件包含多个市场,则=0无效
DWORD dwIndexRecordCount, // 索引区记录单元个数
DWORD dwRecordPerBlock, // 每个Block的记录数
BOOL bRebuildIfExists )
{
SP_ASSERT( NULL != lpszFileName && strlen(lpszFileName) > 0 );
if( NULL == lpszFileName || strlen(lpszFileName) <= 0 )
return FALSE;
// 如果文件存在
if( !bRebuildIfExists && 0 == access(lpszFileName,0) )
return TRUE;
CLK_FHEADER header;
memset( &header, 0,sizeof(header) );
header.m_dwMagic = CLK_FHEADER_MAGIC;
header.m_dwVerMajor = CLK_FHEADER_VERMAJOR;
header.m_dwVerMinor = CLK_FHEADER_VERMINOR;
strcpy( header.m_szDescript, "CLKing Stock File Structure. See www.ninebulls.com for more information." );
header.m_dwDataType = dwDataType;
header.m_dwMarket = dwMarket;
header.m_time = time(NULL);
// 索引区信息
header.m_dwPosFirstIndex = sizeof(header);
header.m_dwIndexRecordSize = sizeof(CLK_INDEXRECORD);
header.m_dwIndexRecordCount = dwIndexRecordCount;
header.m_dwStockCount = 0;
// 数据区信息
switch( dwDataType )
{
case CStock::dataReport:
header.m_dwDataRecordSize = sizeof(REPORT);
break;
case CStock::dataMinute:
header.m_dwDataRecordSize = sizeof(MINUTE);
break;
case CStock::dataK:
header.m_dwDataRecordSize = sizeof(KDATA);
default:
SP_ASSERT(FALSE);
return FALSE;
}
header.m_dwRecordPerBlock = dwRecordPerBlock;
header.m_dwBlockSize = sizeof(CLK_BLOCKHEADER) + header.m_dwDataRecordSize * header.m_dwRecordPerBlock;
header.m_dwPosFirstBlock = sizeof(CLK_FHEADER) + header.m_dwIndexRecordSize * header.m_dwIndexRecordCount;
header.m_dwPosFirstBlankBlock = -1;
CSPFile file;
if( !file.Open( lpszFileName, CSPFile::modeCreate | CSPFile::modeReadWrite ) )
{
SP_ASSERT( FALSE );
return FALSE;
}
file.Write( &header, sizeof(header) );
for( DWORD i=0; i<header.m_dwIndexRecordCount; i++ )
{
CLK_INDEXRECORD index;
memset( &index, 0, sizeof(index) );
index.m_dwMagic = CLK_INDEXRECORD_MAGIC;
index.m_dwPosFirstBlock = -1;
file.Write( &index, sizeof(index) );
}
file.Flush();
return TRUE;
}
// 重新创建,如果日期不是tmNow
BOOL CClkFile::RemoveFileIfOutoftime( LPCTSTR lpszFileName, time_t tmNow )
{
SP_ASSERT( NULL!=lpszFileName && strlen(lpszFileName) > 0 );
if( NULL==lpszFileName || strlen(lpszFileName) <= 0 )
return FALSE;
CClkFile file;
if( file.Open(lpszFileName) )
{
CSPTime ft( file.m_header.m_time );
CSPTime tNow( tmNow );
if( CLK_FHEADER_VERMAJOR == file.m_header.m_dwVerMajor
&& CLK_FHEADER_VERMINOR == file.m_header.m_dwVerMinor ) // 版本相同
{
if( ft.GetYear() == tNow.GetYear() && ft.GetMonth() == tNow.GetMonth() && ft.GetDay() == tNow.GetDay() )
return FALSE;
int nDayOfWeek = tNow.GetDayOfWeek();
if( 1 == nDayOfWeek || 7 == nDayOfWeek )
return FALSE;
BOOL bEmpty = FALSE; // file.EmptyAll( );
file.Close();
if( !bEmpty )
return ::DeleteFile( lpszFileName );
return TRUE;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -