📄 selfdb.cpp
字号:
switch (nKType)
{
case CKData::ktypeMonth:
sFileName += CSPString(ml_month) + pInfo->GetStockCode() + ml_ext_month;
break;
case CKData::ktypeWeek:
sFileName += CSPString(ml_week) + pInfo->GetStockCode() + ml_ext_week;
break;
case CKData::ktypeDay:
sFileName += CSPString(ml_day) + pInfo->GetStockCode() + ml_ext_day;
break;
case CKData::ktypeMin60:
return FALSE;
case CKData::ktypeMin30:
return FALSE;
case CKData::ktypeMin15:
return FALSE;
case CKData::ktypeMin5:
sFileName += CSPString(ml_min5) + pInfo->GetStockCode() + ml_ext_min5;
break;
default:
return FALSE;
}
if (access(sFileName, 0) != 0 && sFileNameQL.GetLength() > 0)
sFileName = sFileNameQL;
return TRUE;
}
else if (nDataType == CStock::dataDR)
{
sFileName = GetRootPath();
if (pInfo->IsShenZhen())
sFileName += self_sz_xdr;
else
sFileName += self_sh_xdr;
sFileName += CSPString(pInfo->GetStockCode()) + self_ext_xdr;
if (access(sFileName, 0) == 0)
return TRUE;
CSPString sTemp = GetRootPath();
sTemp += self_sh_xdr;
sTemp += CSPString(pInfo->GetStockCode()) + self_ext_xdr;
if (access(sTemp,0) == 0)
sFileName = sTemp;
return TRUE;
}
else if (nDataType == CStock::dataReport)
{
sFileName = GetRootPath();
if (pInfo->IsShenZhen())
sFileName += self_sz_report;
else
sFileName += self_sh_report;
return TRUE;
}
else if (nDataType == CStock::dataMinute)
{
sFileName = GetRootPath();
if (pInfo->IsShenZhen())
sFileName += self_sz_minute;
else
sFileName += self_sh_minute;
return TRUE;
}
return FALSE;
}
CSPString CSelfDB::GetNewsPath(DWORD dwMarket)
{
CSPString strPath = AfxGetProfile().GetSelfDBPath();
strPath += self_news;
return strPath;
}
CSPString CSelfDB::GetBasePath(DWORD dwMarket)
{
CSPString strPath = AfxGetProfile().GetSelfDBPath();
switch (dwMarket)
{
case CStock::marketSHSE:
strPath += ml_sh_base;
break;
case CStock::marketSZSE:
strPath += ml_sz_base;
break;
default:
strPath += ml_sh_base;
SP_ASSERT(FALSE);
}
return strPath;
}
BOOL CSelfDB::CreateSelfDB(const char * rootpath)
{
if (NULL == rootpath || strlen(rootpath) == 0)
return FALSE;
// get rootpath
CSPString strRoot = rootpath;
int nLen = strRoot.GetLength();
if (strRoot[nLen-1] != '\\' && strRoot[nLen-1] != '/')
strRoot += CHAR_DIRSEP;
nLen = strRoot.GetLength();
if (0 != access(strRoot, 0))
return FALSE;
if (0 != access(strRoot + ml_dat, 0))
mkdir(strRoot + ml_dat);
if (0 != access(strRoot + ml_data, 0))
mkdir(strRoot + ml_data);
if (0 != access(strRoot + ml_sh, 0))
mkdir(strRoot + ml_sh);
if (0 != access(strRoot + ml_sh_base, 0))
mkdir(strRoot + ml_sh_base);
if (0 != access(strRoot + ml_sh_month, 0))
mkdir(strRoot + ml_sh_month);
if (0 != access(strRoot + ml_sh_week, 0))
mkdir(strRoot + ml_sh_week);
if (0 != access(strRoot + ml_sh_day, 0))
mkdir(strRoot + ml_sh_day);
if (0 != access(strRoot + ml_sh_min, 0))
mkdir(strRoot + ml_sh_min);
if (0 != access(strRoot + self_sh_xdr, 0))
mkdir(strRoot + self_sh_xdr);
if (0 != access(strRoot + ml_sz, 0))
mkdir(strRoot + ml_sz);
if (0 != access(strRoot + ml_sz_base, 0))
mkdir(strRoot + ml_sz_base);
if (0 != access(strRoot + ml_sz_month, 0))
mkdir(strRoot + ml_sz_month);
if (0 != access(strRoot + ml_sz_week, 0))
mkdir(strRoot + ml_sz_week);
if (0 != access(strRoot + ml_sz_day, 0))
mkdir(strRoot + ml_sz_day);
if (0 != access(strRoot + ml_sz_min, 0))
mkdir(strRoot + ml_sz_min);
if (0 != access(strRoot + self_sz_xdr, 0))
mkdir(strRoot + self_sz_xdr);
if (0 != access(strRoot + self_news, 0))
mkdir(strRoot + self_news);
return TRUE;
}
int LoadCodeTable(CStockContainer& container, LPCTSTR lpszFileName, DWORD dwMarket)
{
int nCount = 0;
char seps[] = ",\t\r\n";
char quotation_mark[] = "\"";
BOOL bHasQuotationMark = FALSE;
CSPFile file;
if (file.Open(lpszFileName, CSPFile::modeRead | CSPFile::shareDenyNone))
{
CSPString rString;
while(file.ReadString(rString))
{
CStockInfo info;
// 600000,浦发银行,17,PFYH,"PuFaYinHang"
// 英文名称可以用双引号引起来
int nToken = 0;
while(!rString.IsEmpty())
{
nToken ++;
CSPString sTemp;
int nIndex = -1;
if (5 == nToken && -1 != (nIndex=rString.Find(quotation_mark)))
{
rString = rString.Mid(nIndex+1);
nIndex = rString.Find(quotation_mark);
if (-1 != nIndex) sTemp = rString.Left(nIndex);
if (-1 != nIndex) rString = rString.Mid(nIndex+1);
nIndex = rString.FindOneOf(seps);
if (-1 != nIndex)
rString = rString.Mid(nIndex+1);
else
rString.Empty();
}
else
{
nIndex = rString.FindOneOf(seps);
if (-1 != nIndex)
{
sTemp = rString.Left(nIndex);
rString = rString.Mid(nIndex+1);
}
else
{
sTemp = rString;
rString.Empty();
}
}
if (1 == nToken)
info.SetStockCode(dwMarket, sTemp);
else if (2 == nToken)
info.SetStockName(sTemp);
else if (3 == nToken)
info.SetType(atol(sTemp));
else if (4 == nToken)
info.SetStockShortName(sTemp);
else if (5 == nToken)
{
info.SetStockNameEnu(sTemp);
break;
}
}
if (info.IsValidStock())
container.Add(info);
nCount ++;
}
file.Close();
}
return nCount;
}
int CSelfDB::LoadCodetable(CStockContainer& container)
{
if (!m_bIsOK) return 0;
container.SetSize(0, 2000);
// 上海指数
CSPString sFileName = GetRootPath();
sFileName += self_sh_code;
LoadCodeTable(container, sFileName, CStock::marketSHSE);
// 深圳指数
sFileName = GetRootPath();
sFileName += self_sz_code;
LoadCodeTable(container, sFileName, CStock::marketSZSE);
if (container.GetSize() <= 0)
CQianlong::LoadCodetable(container);
return container.GetSize();
}
int CSelfDB::StoreCodetable(CStockContainer& container)
{
if (!m_bIsOK) return 0;
if (container.GetSize() <= 0)
return 0;
// 上海指数
CSPString sFileNameSH = GetRootPath();
sFileNameSH += self_sh_code;
// 深圳指数
CSPString sFileNameSZ = GetRootPath();
sFileNameSZ += self_sz_code;
CSPFile fileSHSE, fileSZSE;
if (!fileSHSE.Open(sFileNameSH, CSPFile::modeCreate | CSPFile::modeWrite)
|| !fileSZSE.Open(sFileNameSZ, CSPFile::modeCreate | CSPFile::modeWrite))
{
return 0;
}
container.Lock();
for (int i=0; i<container.GetSize(); i++)
{
CStockInfo & info = container.ElementAt(i);
CSPString str;
str.Format("%s,%s,%d,%s,\"%s\"\r\n", info.GetStockCode(), info.GetStockNameChs(), info.GetType(),
info.GetStockShortName(), info.GetStockNameEnu());
if (info.IsShangHai())
{
fileSHSE.Write(str, str.GetLength());
}
if (info.IsShenZhen())
{
fileSZSE.Write(str, str.GetLength());
}
}
container.UnLock();
return container.GetSize();
}
int CSelfDB::LoadKData(CStock* pstock, int nKType)
{
// WILLCHECK
int ret = CQianlong::LoadKData(pstock, nKType);
if (CKData::ktypeMin5 == nKType && LoadMinute(pstock) > 0)
{
CKData & kdataMin5 = pstock->GetKDataMin5();
CMinute & minute = pstock->GetMinute();
CKData kdataNew;
if (minute.ToKData(kdataNew) && CKData::ktypeMin5 == kdataNew.GetKType())
{
kdataMin5.MergeKData(&kdataNew);
}
return kdataMin5.GetSize();
}
return ret;
}
int CSelfDB::LoadBasetable(CStockContainer& container)
{
container.Lock();
CSPMapStringToPtr map;
map.InitHashTable(container.GetSize() + container.GetSize() + 100);
for (int i=0; i<container.GetSize(); i++)
{
CStockInfo & info = container.ElementAt(i);
map.SetAt(info.GetStockCode(), (void *)i);
info.m_basedata.RemoveAll();
}
CSPString sFileName = GetRootPath();
sFileName += self_chna_basetbl;
CSPFile file;
if (file.Open(sFileName, CSPFile::modeRead | CSPFile::shareDenyNone))
{
BASEDATA block;
while(sizeof(block) == file.Read(&block, sizeof(block)))
{
void * pArrayID = NULL;
if (map.Lookup(block.m_szCode, pArrayID))
{
int nIndex = ((int)pArrayID);
if (nIndex >= 0 && nIndex < container.GetSize())
{
container.ElementAt(nIndex).m_basedata.InsertBaseDataSort(block);
}
}
}
file.Close();
}
container.UnLock();
return container.GetSize();
}
int CSelfDB::StoreBasetable(CStockContainer& container)
{
// SP_ASSERT(m_bIsOK && container.GetSize() > 0);
if (!m_bIsOK || container.GetSize() <= 0) return 0;
int nCount = 0;
CSPString sRoot = GetRootPath();
CSPString sFileName = sRoot + self_chna_basetbl;
container.Lock();
CSPFile file;
if (file.Open(sFileName, CSPFile::modeWrite | CSPFile::modeCreate))
{
for (int i=0; i<container.GetSize(); i++)
{
CStockInfo & info = container.ElementAt(i);
for (int k=0; k<info.m_basedata.GetSize(); k++)
{
BASEDATA & block = info.m_basedata.ElementAt(k);
if (k == info.m_basedata.GetSize() - 1)
{
block.m_fYield_average = info.m_fYield_average;
block.m_fYield_stddev = info.m_fYield_stddev;
block.m_fBeite = info.m_fBeite;
}
file.Write(&block, sizeof(block));
}
nCount ++;
}
}
container.UnLock();
return nCount;
}
int CSelfDB::LoadDRData(CStock* pstock)
{
SP_ASSERT(m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock());
if (!m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock()) return 0;
CSPString sFileName;
GetFileName(sFileName, CStock::dataDR, &(pstock->GetStockInfo()));
CDRData & drdata = pstock->GetDRData();
DWORD dwMarket = pstock->GetStockInfo().GetMarket();
CSPString sCode = pstock->GetStockCode();
CSPFile file;
if (file.Open(sFileName, CSPFile::modeRead | CSPFile::shareDenyNone))
{
DWORD dwLen = file.GetLength();
CLK_DRDATA dbdr;
int nSize = dwLen/sizeof(dbdr);
drdata.SetSize(0, nSize);
while(sizeof(dbdr) == file.Read(&dbdr, sizeof(dbdr)))
{
DRDATA dr;
if (convert_CLK_DRDATA_to_DRDATA(dwMarket, sCode, &dbdr, &dr))
drdata.InsertDRDataSort(dr);
}
file.Close();
return drdata.GetSize();
}
// Load From FXJ_DRDATA
sFileName = GetRootPath();
sFileName += self_chna_xdr;
WORD wFxjMarket = 'HS';
if (CStock::marketSZSE == dwMarket)
wFxjMarket = 'ZS';
if (file.Open(sFileName, CSPFile::modeRead | CSPFile::shareDenyNone))
{
if (8 == file.Seek(8, CSPFile::begin))
{
BOOL bMy = FALSE;
FXJ_DRDATA fxjdr;
while(sizeof(fxjdr) == file.Read(&fxjdr, sizeof(fxjdr)))
{
BOOL bMyOld = bMy;
if (-1 == fxjdr.m_dwMagic)
bMy = (fxjdr.m_wMarket == wFxjMarket && 0 == strncmp(sCode, fxjdr.m_szCode, min(sizeof(fxjdr.m_szCode),sCode.GetLength())));
else if (bMy)
{
DRDATA dr;
if (convert_FXJ_DRDATA_to_DRDATA(dwMarket, sCode, &fxjdr, &dr))
drdata.InsertDRDataSort(dr);
}
if (bMyOld && !bMy)
break;
}
}
}
return drdata.GetSize();
}
int CSelfDB::StoreDRData(CStock* pstock)
{
SP_ASSERT(m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock());
if (!m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock()) return 0;
CSPString sFileName;
GetFileName(sFileName, CStock::dataDR, &(pstock->GetStockInfo()));
CDRData & drdata = pstock->GetDRData();
if (drdata.GetSize() == 0)
{
::DeleteFile(sFileName);
return 0;
}
// Compare
CStock stocktemp;
stocktemp.SetStockInfo(&(pstock->GetStockInfo()));
if (LoadDRData(&stocktemp) > 0 && stocktemp.GetDRData().IsSameAs(&drdata))
return drdata.GetSize();
// Store
CSPFile file;
if (file.Open(sFileName, CSPFile::modeCreate | CSPFile::modeWrite | CSPFile::shareDenyNone))
{
for (int i=0; i<drdata.GetSize(); i++)
{
CLK_DRDATA dbdr;
convert_DRDATA_to_CLK_DRDATA(&(drdata.ElementAt(i)), &dbdr);
file.Write(&dbdr, sizeof(dbdr));
}
}
return drdata.GetSize();
}
DWORD ReadReport(CStock* pstock, LPCTSTR lpszFileName)
{
SP_ASSERT(pstock && pstock->GetStockInfo().IsValidStock());
if (!pstock || !pstock->GetStockInfo().IsValidStock())
return 0;
CReport& aReport = pstock->GetReport();
aReport.RemoveAll();
CTSKFile file;
if (file.Open(lpszFileName))
{
DWORD dwDataRecordCount = file.GetDataRecordCount(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode());
aReport.SetSize(dwDataRecordCount);
DWORD dwCount = file.LoadDataRecord(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(), aReport.GetData(), sizeof(REPORT), dwDataRecordCount);
aReport.SetSize(dwCount);
aReport.Sort();
int nOldSize = aReport.GetSize();
aReport.RemoveDirty();
if (nOldSize - aReport.GetSize() > 50)
{
SP_VERIFY(aReport.GetSize() == (int)file.StoreDataRecord(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(),
aReport.GetData(), sizeof(REPORT), aReport.GetSize(), TRUE));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -