⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selfdb.cpp

📁 股软 通达信行情接收接口, 包括美元汇率
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		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 + -