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

📄 qianlong.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
/*
	Cross Platform Core Code.

	Copyright(R) 2001-2002 Balang Software.
	All rights reserved.

	Using:
		class	CQianLong;
*/

#include	"StdAfx.h"
#include	"../Include/Database.h"
#include	"../Include/SpString.h"
#include	"QianLong.h"

#include	<math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BOOL convert_QL_Data_5min_to_KDATA( DWORD dwMarket, const char *szCode, struct QL_Data_5min * pqlkd, KDATA *pkd )
{
	SP_ASSERT( pqlkd && pkd );
	if( NULL == pqlkd || NULL == pkd )
		return FALSE;
	memset( pkd, 0, sizeof(KDATA) );

	pkd->m_dwMarket	=	dwMarket;
	if( szCode )
		strncpy( pkd->m_szCode, szCode, min(sizeof(pkd->m_szCode)-1,strlen(szCode)) );

	pkd->m_date		=	pqlkd->min_off;
	CSPTime	sptime;
	if( sptime.FromStockTimeMin( pkd->m_date) )
		pkd->m_time	=	sptime.GetTime();

	pkd->m_fOpen	=	(float)fabs( pqlkd->open_price * 0.001 );
	pkd->m_fHigh	=	(float)fabs( pqlkd->high_price * 0.001 );
	pkd->m_fLow		=	(float)fabs( pqlkd->low_price * 0.001 );
	pkd->m_fClose	=	(float)fabs( pqlkd->close_price * 0.001 );
	pkd->m_fVolume	=	(float)fabs( pqlkd->min_volume * 100. );
	pkd->m_fAmount	=	(float)fabs( pqlkd->min_amount * 100. );
	return TRUE;
}

BOOL convert_QL_Data_day_to_KDATA( DWORD dwMarket, const char *szCode, struct QL_Data_day * pqlkd, KDATA *pkd )
{
	SP_ASSERT( pqlkd && pkd );
	if( NULL == pqlkd || NULL == pkd )
		return FALSE;
	memset( pkd, 0, sizeof(KDATA) );

	pkd->m_dwMarket	=	dwMarket;
	if( szCode )
		strncpy( pkd->m_szCode, szCode, min(sizeof(pkd->m_szCode)-1,strlen(szCode)) );

	pkd->m_date		=	pqlkd->day_date;
	CSPTime	sptime;
	if( sptime.FromStockTimeDay(pkd->m_date) )
		pkd->m_time	=	sptime.GetTime();

	pkd->m_fOpen	=	(float)fabs( pqlkd->open_price * 0.001 );
	pkd->m_fHigh	=	(float)fabs( pqlkd->high_price * 0.001 );
	pkd->m_fLow		=	(float)fabs( pqlkd->low_price * 0.001 );
	pkd->m_fClose	=	(float)fabs( pqlkd->close_price * 0.001 );
	pkd->m_fVolume	=	(float)fabs( pqlkd->day_volume * 100. );
	pkd->m_fAmount	=	(float)fabs( pqlkd->day_amount * 1000. );
	return TRUE;
}

BOOL convert_KDATA_to_QL_Data_day( KDATA * pkd, struct QL_Data_day * pqlkd )
{
	SP_ASSERT( pqlkd && pkd );
	if( NULL == pqlkd || NULL == pkd )
		return FALSE;
	memset( pqlkd, 0, sizeof(struct QL_Data_day) );

	pqlkd->day_date		=	(DWORD)( pkd->m_date );
	pqlkd->open_price	=	(DWORD)( pkd->m_fOpen * 1000 );
	pqlkd->high_price	=	(DWORD)( pkd->m_fHigh * 1000 );
	pqlkd->low_price	=	(DWORD)( pkd->m_fLow * 1000 );
	pqlkd->close_price	=	(DWORD)( pkd->m_fClose * 1000 );
	pqlkd->day_volume	=	(DWORD)( pkd->m_fVolume * 0.01 );
	pqlkd->day_amount	=	(DWORD)( pkd->m_fAmount * 0.001 );
	return TRUE;
}

BOOL convert_KDATA_to_QL_Data_5min( KDATA * pkd, struct QL_Data_5min * pqlkd )
{
	SP_ASSERT( pqlkd && pkd );
	if( NULL == pqlkd || NULL == pkd )
		return FALSE;
	memset( pqlkd, 0, sizeof(struct QL_Data_day) );

	pqlkd->min_off		=	(DWORD)( pkd->m_date );
	pqlkd->open_price	=	(DWORD)( pkd->m_fOpen * 1000 );
	pqlkd->high_price	=	(DWORD)( pkd->m_fHigh * 1000 );
	pqlkd->low_price	=	(DWORD)( pkd->m_fLow * 1000 );
	pqlkd->close_price	=	(DWORD)( pkd->m_fClose * 1000 );
	pqlkd->min_volume	=	(DWORD)( pkd->m_fVolume * 0.01 );
	pqlkd->min_amount	=	(DWORD)( pkd->m_fAmount * 0.01 );
	return TRUE;
}

void ConvertQLStockInfo( DWORD dwMarket, QL_Stock_info_V302 & block, CStockInfo *pInfo )
{
	pInfo->Clear();

	char	code[sizeof(block.stock_code)+2];
	memset(code,0,sizeof(code));
	strncpy(code,(const char *)block.stock_code,sizeof(block.stock_code));

	char	name[sizeof(block.stock_name)+2];
	memset(name,0,sizeof(name));
	strncpy(name,(const char *)block.stock_name,sizeof(block.stock_name));

	pInfo->SetStockCode( dwMarket, code );
	pInfo->SetStockName( name );
	pInfo->SetType( block.stock_type );

/*
	pInfo->m_fLast		=	(float)fabs( block.last_close_price * 0.001 );
	pInfo->m_fOpen		=	(float)fabs( block.open_price * 0.001 );
	pInfo->m_fHigh		=	(float)fabs( block.high_price * 0.001 );
	pInfo->m_fLow		=	(float)fabs( block.low_price * 0.001 );
	pInfo->m_fClose		=	(float)fabs( block.close_price * 0.001 );
	pInfo->m_fVolume	=	(float)fabs( block.total_volume * 100. );
	pInfo->m_fAmount	=	(float)fabs( block.total_value * 1000. );
	pInfo->m_fBuyPrice[0]	=	(float)fabs( block.buy_1_price * 0.001 );
	pInfo->m_fBuyVolume[0]	=	(float)fabs( block.buy_1_volume * 100. );
	pInfo->m_fBuyPrice[1]	=	(float)fabs( block.buy_2_price * 0.001 );
	pInfo->m_fBuyVolume[1]	=	(float)fabs( block.buy_2_volume * 100. );
	pInfo->m_fBuyPrice[2]	=	(float)fabs( block.buy_3_price * 0.001 );
	pInfo->m_fBuyVolume[2]	=	(float)fabs( block.buy_3_volume * 100. );
	pInfo->m_fSellPrice[0]	=	(float)fabs( block.sell_1_price * 0.001 );
	pInfo->m_fSellVolume[0]	=	(float)fabs( block.sell_1_volume * 100. );
	pInfo->m_fSellPrice[1]	=	(float)fabs( block.sell_2_price * 0.001 );
	pInfo->m_fSellVolume[1]	=	(float)fabs( block.sell_2_volume * 100. );
	pInfo->m_fSellPrice[2]	=	(float)fabs( block.sell_3_price * 0.001 );
	pInfo->m_fSellVolume[2]	=	(float)fabs( block.sell_3_volume * 100. );
*/
}

void ConvertQLStockInfo( DWORD dwMarket, QL_Stock_info2_V304 & block, CStockInfo *pInfo )
{
	pInfo->Clear();

	char	code[sizeof(block.stock_code)+2];
	memset(code,0,sizeof(code));
	strncpy(code,(const char *)block.stock_code,sizeof(block.stock_code));

	char	name[sizeof(block.stock_name)+2];
	memset(name,0,sizeof(name));
	strncpy(name,(const char *)block.stock_name,sizeof(block.stock_name));

	pInfo->SetStockCode( dwMarket, code );
	pInfo->SetStockName( name );
	pInfo->SetType( block.stock_type );

/*
	pInfo->m_fLast		=	(float)fabs( block.last_close_price * 0.001 );
	pInfo->m_fOpen		=	(float)fabs( block.open_price * 0.001 );
	pInfo->m_fHigh		=	(float)fabs( block.high_price * 0.001 );
	pInfo->m_fLow		=	(float)fabs( block.low_price * 0.001 );
	pInfo->m_fClose		=	(float)fabs( block.close_price * 0.001 );
	pInfo->m_fVolume	=	(float)fabs( block.total_volume * 100. );
	pInfo->m_fAmount	=	(float)fabs( block.total_value * 1000. );
	pInfo->m_fBuyPrice[0]	=	(float)fabs( block.buy_1_price * 0.001 );
	pInfo->m_fBuyVolume[0]	=	(float)fabs( block.buy_1_volume * 100. );
	pInfo->m_fBuyPrice[1]	=	(float)fabs( block.buy_2_price * 0.001 );
	pInfo->m_fBuyVolume[1]	=	(float)fabs( block.buy_2_volume * 100. );
	pInfo->m_fBuyPrice[2]	=	(float)fabs( block.buy_3_price * 0.001 );
	pInfo->m_fBuyVolume[2]	=	(float)fabs( block.buy_3_volume * 100. );
	pInfo->m_fSellPrice[0]	=	(float)fabs( block.sell_1_price * 0.001 );
	pInfo->m_fSellVolume[0]	=	(float)fabs( block.sell_1_volume * 100. );
	pInfo->m_fSellPrice[1]	=	(float)fabs( block.sell_2_price * 0.001 );
	pInfo->m_fSellVolume[1]	=	(float)fabs( block.sell_2_volume * 100. );
	pInfo->m_fSellPrice[2]	=	(float)fabs( block.sell_3_price * 0.001 );
	pInfo->m_fSellVolume[2]	=	(float)fabs( block.sell_3_volume * 100. );
*/
}

/////////////////////////////////////////////////////////////////////////////////////
// class	CQianlong
/*
struct QL_Info_data datainfo_sha[TYPE_NUM];
struct QL_Info_data datainfo_szn[TYPE_NUM];

unsigned char exepath[80];
unsigned char appdexe[88];

unsigned char ml_sys[80];
unsigned char ml_dat[80];
unsigned char ml_sh_day[80];
unsigned char ml_sz_day[80];
unsigned char ml_sh_min[80];
unsigned char ml_sz_min[80];
unsigned char ml_sh_wek[80];
unsigned char ml_sz_wek[80];
unsigned char ml_sh_mnt[80];
unsigned char ml_sz_mnt[80];

unsigned char sl_sys[80];
unsigned char sl_dat[80];
unsigned char sl_sh_day[80];
unsigned char sl_sz_day[80];
unsigned char sl_sh_min[80];
unsigned char sl_sz_min[80];
unsigned char sl_sh_wek[80];
unsigned char sl_sz_wek[80];
unsigned char sl_sh_mnt[80];
unsigned char sl_sz_mnt[80];

unsigned char hx_sys[80];
unsigned char hx_dat[80];
unsigned char hx_sh_day[80];
unsigned char hx_sz_day[80];
unsigned char hx_sh_min[80];
unsigned char hx_sz_min[80];
unsigned char hx_sh_wek[80];
unsigned char hx_sz_wek[80];
unsigned char hx_sh_mnt[80];
unsigned char hx_sz_mnt[80];

unsigned char dealpath[80];
unsigned char dealdat[80];
unsigned char tmpdir[80];
unsigned char sysdir[80];
unsigned char infdir[80];
unsigned char datdir[80];
unsigned char basdir[80];
unsigned char flag_mlv304;

unsigned long nowdate;
unsigned char datestr[10];
unsigned char flag_dynamic;
unsigned char ml30_flag;
unsigned char slon_flag;
unsigned char hxtw_flag;
*/

char ml_dat[]			=	"realtime\\";
char ml_sh_info[]		=	"realtime\\shinfo.dat";
char ml_sz_info[]		=	"realtime\\szinfo.dat";
char ml_sh_now[]		=	"realtime\\shnow.dat";
char ml_sz_now[]		=	"realtime\\sznow.dat";
char ml_sh_pyjc[]		=	"realtime\\shpyjc.dat";
char ml_sz_pyjc[]		=	"realtime\\szpyjc.dat";
char ml_sh_trace[]		=	"realtime\\shtrace.dat";
char ml_sz_trace[]		=	"realtime\\sztrace.dat";
char ml_sh_minute[]		=	"realtime\\shminute.dat";
char ml_sz_minute[]		=	"realtime\\szminute.dat";

char ml_data[]			=	"history\\";
char ml_sh[]			=	"history\\shase\\";
char ml_sz[]			=	"history\\sznse\\";
char ml_base[]			=	"base\\";
char ml_month[]			=	"month\\";
char ml_week[]			=	"week\\";
char ml_day[]			=	"day\\";
char ml_min5[]			=	"nmn\\";
char ml_sh_base[]		=	"history\\shase\\base\\";
char ml_sz_base[]		=	"history\\sznse\\base\\";
char ml_sh_month[]		=	"history\\shase\\month\\";
char ml_sz_month[]		=	"history\\sznse\\month\\";
char ml_sh_week[]		=	"history\\shase\\week\\";
char ml_sz_week[]		=	"history\\sznse\\week\\";
char ml_sh_day[]		=	"history\\shase\\day\\";
char ml_sz_day[]		=	"history\\sznse\\day\\";
char ml_sh_min[]		=	"history\\shase\\nmn\\";
char ml_sz_min[]		=	"history\\sznse\\nmn\\";

char ml_ext_base[]		=	".txt";
char ml_ext_month[]		=	".mnt";
char ml_ext_week[]		=	".wek";
char ml_ext_day[]		=	".day";
char ml_ext_min5[]		=	".nmn";


CQianlong::CQianlong( const char * rootpath, BOOL bOK )
{
	m_bIsOK	=	FALSE;
	memset( m_szRootPath, 0, sizeof(m_szRootPath) );
	if( !bOK )
	{
		if( GetAccurateRoot( rootpath, m_szRootPath, sizeof(m_szRootPath)-1 ) )
			m_bIsOK	=	TRUE;
		else
			m_bIsOK	=	FALSE;
	}
	else
	{
		strncpy( m_szRootPath, rootpath, sizeof(m_szRootPath)-1 );
		m_bIsOK	=	TRUE;
	}

	m_nVersion	=	versionUnknown;
	if( bOK )
		m_nVersion	=	DetectVersion( GetRootPath() );
}

CQianlong::~CQianlong( )
{
}

int	CQianlong::GetMaxStockNumber( )
{
	SP_ASSERT( m_bIsOK );
	if( ! m_bIsOK )	return 0;

	// load shinfo.dat szinfo.dat

	int	blocksize	=	sizeof(struct QL_Stock_info_V302);
	if( version304 == m_nVersion )
		blocksize	=	sizeof(struct QL_Stock_info2_V304);

	DWORD	dwCount	=	0;
	CSPString	sFileName	=	GetRootPath();
	sFileName	+=	ml_sh_now;
	CSPFile	file;
	if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
	{
		DWORD dwFileLen = file.GetLength();
		dwCount	+=	dwFileLen / blocksize;
		file.Close();
	}
	sFileName	=	GetRootPath();
	sFileName	+=	ml_sz_now;
	if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
	{
		DWORD dwFileLen = file.GetLength();
		dwCount	+=	dwFileLen / blocksize;
		file.Close();
	}
	return	dwCount;
}

int	CQianlong::LoadCodetable( CStockContainer & container )
{
	SP_ASSERT( m_bIsOK );
	if( !m_bIsOK )	return 0;

	int maxsize = GetMaxStockNumber();
	container.SetSize( maxsize );
	CStockInfo * pdata = container.GetData();

	char	szShortName[QL_SHORTNAME_LEN+1];
	memset( szShortName, 0, sizeof(szShortName) );
	int	 nCount	=	0;
	CSPString	sFileName	=	GetRootPath();
	sFileName	+=	ml_sh_now;
	CSPFile	file;
	if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
	{
		// pin yin file
		CSPString	sFileNamePyjc	=	GetRootPath();
		sFileNamePyjc	+=	ml_sh_pyjc;
		CSPFile	filePyjc;
		filePyjc.Open( sFileNamePyjc, CSPFile::modeRead | CSPFile::shareDenyNone );
		
		if( version302 == m_nVersion )
		{
			struct QL_Stock_info_V302	block;
			while( nCount < maxsize 
					&& sizeof(block) == file.Read( &block, sizeof(block) ) )
			{
				pdata[nCount].Clear();
				ConvertQLStockInfo( CStock::marketSHSE, block, &(pdata[nCount]) );

				// read shortname
				if( CSPFile::hFileNull != filePyjc.m_hFile && QL_SHORTNAME_LEN == filePyjc.Read( szShortName, QL_SHORTNAME_LEN ) )
					pdata[nCount].SetStockShortName( szShortName );

				nCount	++;
			}
		}
		else if( version304 == m_nVersion )
		{
			struct QL_Stock_info2_V304	block;
			while( nCount < maxsize 
					&& sizeof(block) == file.Read( &block, sizeof(block) ) )
			{
				pdata[nCount].Clear();
				ConvertQLStockInfo( CStock::marketSHSE, block, &(pdata[nCount]) );

				// read shortname
				if( CSPFile::hFileNull != filePyjc.m_hFile && QL_SHORTNAME_LEN == filePyjc.Read( szShortName, QL_SHORTNAME_LEN ) )
					pdata[nCount].SetStockShortName( szShortName );

				nCount	++;
			}
		}

		if( CSPFile::hFileNull != filePyjc.m_hFile )
			filePyjc.Close();
		file.Close();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -