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

📄 selfdb.cpp

📁 股软 通达信行情接收接口, 包括美元汇率
💻 CPP
📖 第 1 页 / 共 4 页
字号:

#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 + -