📄 selfdb.cpp
字号:
#include "stdafx.h"
#include "Database.h"
#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[] = "data\\sh\\xdr\\";
char self_sz_xdr[] = "data\\sz\\xdr\\";
char self_news[] = "news\\";
char self_chna_xdr[] = "data\\chna.pwr"; // 除权文件,与分析家格式相同
char self_chna_basetbl[]= "data\\shna.bst"; // 财务资料表
// 代码表文件
char self_sh_code[] = "data\\shse.cod"; // 上海代码表
char self_sz_code[] = "data\\szse.cod"; // 深圳代码表
// 行情缓存文件
char self_sh_report[] = "data\\shse.rpt"; // 上海行情保存文件
char self_sz_report[] = "data\\szse.rpt"; // 深圳行情保存文件
char self_sh_minute[] = "data\\shse.min"; // 上海分时保存文件
char self_sz_minute[] = "data\\szse.min"; // 深圳分时保存文件
char self_outline[] = "data\\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;
}
DWORD ReadMinute(CStock* pstock, LPCTSTR lpszFileName)
{
SP_ASSERT(pstock && pstock->GetStockInfo().IsValidStock());
if (!pstock || !pstock->GetStockInfo().IsValidStock())
return 0;
CMinute& aMinute = pstock->GetMinute();
aMinute.RemoveAll();
CTSKFile file;
if (file.Open(lpszFileName))
{
DWORD dwDataRecordCount = file.GetDataRecordCount(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode());
aMinute.SetSize(dwDataRecordCount);
DWORD dwCount = file.LoadDataRecord(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(), aMinute.GetData(), sizeof(MINUTE), dwDataRecordCount);
aMinute.SetSize(dwCount);
aMinute.Sort();
aMinute.RemoveDirty();
}
return aMinute.GetSize();
}
//=============================================================================
// CTSKFile
CTSKFile::CTSKFile()
{
Close();
}
CTSKFile::~CTSKFile()
{
Close();
}
BOOL CTSKFile::Open(LPCTSTR lpszFileName)
{
Close();
if (!m_file.Open(lpszFileName, CSPFile::modeReadWrite))
return FALSE;
if (m_file.Read(&m_header, sizeof(m_header)) != sizeof(m_header))
{
SP_ASSERT(FALSE);
return FALSE;
}
if (m_header.m_dwMagic != CLK_FHEADER_MAGIC)
{
SP_ASSERT(FALSE);
return FALSE;
}
return TRUE;
}
void CTSKFile::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 CTSKFile::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 CTSKFile::RemoveFileIfOutoftime(LPCTSTR lpszFileName, time_t tmNow)
{
SP_ASSERT(NULL!=lpszFileName && strlen(lpszFileName) > 0);
if (NULL==lpszFileName || strlen(lpszFileName) <= 0)
return FALSE;
CTSKFile file;
if (file.Open(lpszFileName))
{
CSPTime ft(file.m_header.m_time);
CSPTime tNow(tmNow);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -