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

📄 tw.cpp

📁 接收证券行情数据接口的VC源代码,配合上mystock,可很好了解股票软件的内部源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	return 0;
}

int TryGetReport( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
	if( len < sizeof(TW_ANS) )
		return 0;

	TW_ANS * pans = (TW_ANS*)buffer;
	if( TW_MAGIC != pans->m_header.m_magic )
		return 0;
	if( 0x00 != pans->m_tag1 || 0x03 != pans->m_tag2 )
		return 0;
	CTWStockArray astocks;
	BOOL bStockOK = GetSerialStock( pans->m_serial, astocks );

	// get it, fill pRCV_DATA
	size_t dataoffset = 43;
	int datalen = len - dataoffset;
	if( pRCV_DATA && bStockOK && astocks.GetSize() > 0 && datalen >= (int)sizeof(TW_ANS_REPORT) )
	{
		TW_ANS_REPORT * preport = (TW_ANS_REPORT*)(buffer+dataoffset);

		memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
		pRCV_DATA->m_wDataType	=	RCV_REPORT;	// no use
		pRCV_DATA->m_nPacketNum	=	astocks.GetSize();
		pRCV_DATA->m_bDISK		=	FALSE;
		pRCV_DATA->m_pReport	=	new RCV_REPORT_STRUCTEx[astocks.GetSize()];
		memset( pRCV_DATA->m_pReport, 0, sizeof(RCV_REPORT_STRUCTEx)*astocks.GetSize() );

		CSPTime tLatest = CTSCache::GetInstance().GetLocalLatest( );
		for( int i=0; i<astocks.GetSize() && i<datalen/(int)sizeof(TW_ANS_REPORT); i++ )
		{
			pRCV_DATA->m_pReport[i].m_cbSize = sizeof(RCV_REPORT_STRUCTEx);
			pRCV_DATA->m_pReport[i].m_time = tLatest.GetTime();

			pRCV_DATA->m_pReport[i].m_wMarket = (astocks[i].m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
			strncpy(pRCV_DATA->m_pReport[i].m_szLabel, astocks[i].m_code,
					min(sizeof(pRCV_DATA->m_pReport[i].m_szLabel),sizeof(astocks[i].m_code)));
	
			// unknown pRCV_DATA->m_pReport[i].m_fLastClose	= (float)(0.001*preport->m_open);
			pRCV_DATA->m_pReport[i].m_fOpen		= (float)(0.001*preport[i].m_open);
			pRCV_DATA->m_pReport[i].m_fHigh		= (float)(0.001*preport[i].m_high);
			pRCV_DATA->m_pReport[i].m_fLow		= (float)(0.001*preport[i].m_low);
			pRCV_DATA->m_pReport[i].m_fNewPrice	= (float)(0.001*preport[i].m_new);
			pRCV_DATA->m_pReport[i].m_fVolume	= (float)(0.01*preport[i].m_volume);
			pRCV_DATA->m_pReport[i].m_fAmount	= (float)(0.01*preport[i].m_amount);

			pRCV_DATA->m_pReport[i].m_fBuyPrice[0]= (float)(0.001*preport[i].m_buy1);
			pRCV_DATA->m_pReport[i].m_fBuyPrice[1]= (float)(0.001*preport[i].m_buy2);
			pRCV_DATA->m_pReport[i].m_fBuyPrice[2]= (float)(0.001*preport[i].m_buy3);
			pRCV_DATA->m_pReport[i].m_fBuyVolume[0]= (float)(0.01*preport[i].m_buy1vol);
			pRCV_DATA->m_pReport[i].m_fBuyVolume[1]= (float)(0.01*preport[i].m_buy2vol);
			pRCV_DATA->m_pReport[i].m_fBuyVolume[2]= (float)(0.01*preport[i].m_buy3vol);
			pRCV_DATA->m_pReport[i].m_fSellPrice[0]= (float)(0.001*preport[i].m_sell1);
			pRCV_DATA->m_pReport[i].m_fSellPrice[1]= (float)(0.001*preport[i].m_sell2);
			pRCV_DATA->m_pReport[i].m_fSellPrice[2]= (float)(0.001*preport[i].m_sell3);
			pRCV_DATA->m_pReport[i].m_fSellVolume[0]= (float)(0.01*preport[i].m_sell1vol);
			pRCV_DATA->m_pReport[i].m_fSellVolume[1]= (float)(0.01*preport[i].m_sell2vol);
			pRCV_DATA->m_pReport[i].m_fSellVolume[2]= (float)(0.01*preport[i].m_sell3vol);
		}

		return len;
	}

	return 0;
}

int TryGetMinute( BYTE * buffer, size_t len, PRCV_DATA pRCV_MINUTE, PRCV_DATA pRCV_REPORT )
{
	if( len < sizeof(TW_ANS) )
		return 0;

	TW_ANS * pans = (TW_ANS*)buffer;
	if( TW_MAGIC != pans->m_header.m_magic )
		return 0;
	if( 0x01 != pans->m_tag1 || 0x04 != pans->m_tag2 )
		return 0;
	TW_STOCK	stock;
	memset( &stock, 0, sizeof(stock) );
	BOOL bStockOK = GetSerialStock( pans->m_serial, stock );

	// get it, fill pRCV_DATA
	size_t dataoffset = 43;
	int datalen = len - dataoffset;
	if( pRCV_MINUTE && pRCV_REPORT && bStockOK && datalen >= (int)(sizeof(TW_ANS_MINUTE)-240*sizeof(TW_MINUTE)) )
	{
		TW_ANS_MINUTE * pminute = (TW_ANS_MINUTE*)(buffer+dataoffset);

		CSPTime tLatest = CTSCache::GetInstance().GetLocalLatest( );

		int nCount = min(241,pminute->m_offset+1);

		int count1 = 0, count2 = 0;
		for( int k=0; k<nCount; k++ )
		{
			if( pminute->m_minutes[k].m_data1 <= pminute->m_high && pminute->m_minutes[k].m_data1 >= pminute->m_low )
				count1 ++;
			if( pminute->m_minutes[k].m_data2 <= pminute->m_high && pminute->m_minutes[k].m_data2 >= pminute->m_low )
				count2 ++;
		}
		int mode = ( count1 > count2 ? 1 : 2 );

		// minute
		memset( pRCV_MINUTE, 0, sizeof(RCV_DATA) );
		pRCV_MINUTE->m_wDataType	=	FILE_MINUTE_EX;
		pRCV_MINUTE->m_nPacketNum	=	1+nCount;
		pRCV_MINUTE->m_bDISK		=	FALSE;
		pRCV_MINUTE->m_pMinute		=	new RCV_MINUTE_STRUCTEx[1+nCount];
		memset( pRCV_MINUTE->m_pMinute, 0, sizeof(RCV_MINUTE_STRUCTEx)*(1+nCount) );
		pRCV_MINUTE->m_pMinute[0].m_head.m_dwHeadTag	=	EKE_HEAD_TAG;
		pRCV_MINUTE->m_pMinute[0].m_head.m_wMarket		=	(stock.m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
		strncpy(pRCV_MINUTE->m_pMinute[0].m_head.m_szLabel, stock.m_code,
				min(sizeof(pRCV_MINUTE->m_pMinute[0].m_head.m_szLabel),sizeof(stock.m_code)));
		
		for( int i=0; i<nCount; i++ )
		{
			pRCV_MINUTE->m_pMinute[i+1].m_time = CSPTime::GetTradeOffsetToTime(i,tLatest.GetTime());
			if( 1 == mode )
			{
				pRCV_MINUTE->m_pMinute[i+1].m_fPrice = (float)(0.001 * pminute->m_minutes[i].m_data1);
				pRCV_MINUTE->m_pMinute[i+1].m_fVolume = (float)(0.01 * pminute->m_minutes[i].m_data2);
			}
			else
			{
				pRCV_MINUTE->m_pMinute[i+1].m_fPrice = (float)(0.001 * pminute->m_minutes[i].m_data2);
				pRCV_MINUTE->m_pMinute[i+1].m_fVolume = (float)(0.01 * pminute->m_minutes[i].m_data1);
			}
			pRCV_MINUTE->m_pMinute[i+1].m_fAmount = (float)(100. * pRCV_MINUTE->m_pMinute[i+1].m_fVolume * pRCV_MINUTE->m_pMinute[i+1].m_fPrice);
		}

		// report
		memset( pRCV_REPORT, 0, sizeof(RCV_DATA) );
		pRCV_REPORT->m_wDataType	=	RCV_REPORT;	// no use
		pRCV_REPORT->m_nPacketNum	=	11;
		pRCV_REPORT->m_bDISK		=	FALSE;
		pRCV_REPORT->m_pReport		=	new RCV_REPORT_STRUCTEx[11];
		memset( pRCV_REPORT->m_pReport, 0, sizeof(RCV_REPORT_STRUCTEx)*11 );
		for( i=0;i <11; i++ )
		{
			pRCV_REPORT->m_pReport[i].m_cbSize = sizeof(RCV_REPORT_STRUCTEx);
			pRCV_REPORT->m_pReport[i].m_time = CSPTime::GetTradeOffsetToTime(pminute->m_details[i].m_offset,tLatest.GetTime());

			pRCV_REPORT->m_pReport[i].m_wMarket = (stock.m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
			strncpy(pRCV_REPORT->m_pReport[i].m_szLabel, stock.m_code,
					min(sizeof(pRCV_REPORT->m_pReport[i].m_szLabel),sizeof(stock.m_code)));
	
			// unknown pRCV_REPORT->m_pReport[i].m_fLastClose	= (float)(0.001*pminute->m_open);
			pRCV_REPORT->m_pReport[i].m_fOpen		= (float)(0.001*pminute->m_open);
			pRCV_REPORT->m_pReport[i].m_fHigh		= (float)(0.001*pminute->m_high);
			pRCV_REPORT->m_pReport[i].m_fLow		= (float)(0.001*pminute->m_low);
			pRCV_REPORT->m_pReport[i].m_fNewPrice	= (float)(0.001*pminute->m_details[i].m_price);
			pRCV_REPORT->m_pReport[i].m_fVolume		= (float)(0.01*pminute->m_details[i].m_volume);
			pRCV_REPORT->m_pReport[i].m_fAmount		= (float)(100.*pRCV_REPORT->m_pReport[i].m_fVolume*pRCV_REPORT->m_pReport[i].m_fNewPrice);

			pRCV_REPORT->m_pReport[i].m_fBuyPrice[0]= (float)(0.001*pminute->m_details[i].m_buy);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fBuyPrice[1]= (float)(0.001*pminute->m_buy2);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fBuyPrice[2]= (float)(0.001*pminute->m_buy3);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fBuyVolume[0]= (float)(0.01*pminute->m_buy1vol);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fBuyVolume[1]= (float)(0.01*pminute->m_buy2vol);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fBuyVolume[2]= (float)(0.01*pminute->m_buy3vol);
			pRCV_REPORT->m_pReport[i].m_fSellPrice[0]= (float)(0.001*pminute->m_details[i].m_sell);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fSellPrice[1]= (float)(0.001*pminute->m_sell2);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fSellPrice[2]= (float)(0.001*pminute->m_sell3);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fSellVolume[0]= (float)(0.01*pminute->m_sell1vol);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fSellVolume[1]= (float)(0.01*pminute->m_sell2vol);
			if(10==i)	pRCV_REPORT->m_pReport[i].m_fSellVolume[2]= (float)(0.01*pminute->m_sell3vol);
		}

		return len;
	}

	return 0;
}

int TryGetHistory( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
	if( len < sizeof(TW_ANS) )
		return 0;

	TW_ANS * pans = (TW_ANS*)buffer;
	if( TW_MAGIC != pans->m_header.m_magic )
		return 0;
	if( 0x09 != pans->m_tag2 )
		return 0;
	TW_STOCK	stock;
	memset( &stock, 0, sizeof(stock) );
	int	nCount = 0;
	BOOL bStockOK = GetSerialStock( pans->m_serial, stock, &nCount );
	if( 1 == nCount )	nCount = 2;

	int ktype = ktypeDay;
	if( 0x20 == pans->m_tag1 )
		ktype = ktypeDay;
	else if( 0x30 == (0xf0 & pans->m_tag1) )
		ktype = ktypeMin5;
	else if( 0x40 == (0xf0 & pans->m_tag1) )
		ktype = ktypeMin15;
	else if( 0x50 == (0xf0 & pans->m_tag1) )
		ktype = ktypeMin30;
	else if( 0x60 == (0xf0 & pans->m_tag1) )
		ktype = ktypeMin60;
	else if( 0x10 == (0xf0 & pans->m_tag1) )
		ktype = ktypeDay;
	else if( 0x80 == (0xf0 & pans->m_tag1) )
		ktype = ktypeWeek;
	else if( 0x90 == (0xf0 & pans->m_tag1) )
		ktype = ktypeMonth;

	// get it, fill pRCV_DATA
	size_t dataoffset = 43;
	int datalen = len - dataoffset;
	if( pRCV_DATA && bStockOK && nCount > 0 && datalen >= nCount*(int)(sizeof(TW_ANS_HISTORY)+sizeof(DWORD)) )
	{
		int dataprefix = datalen - nCount*(int)(sizeof(TW_ANS_HISTORY)+sizeof(DWORD));
		if( 2 == nCount && datalen >= nCount*(int)(sizeof(TW_ANS_HISTORY)+sizeof(DWORD))+36 )
		{
			dataprefix = datalen - nCount*(int)(sizeof(TW_ANS_HISTORY)+sizeof(DWORD)) - 36;
		}

		TW_ANS_HISTORY * phistory = (TW_ANS_HISTORY*)(buffer+dataoffset+dataprefix);

		CSPTime tLatest = CTSCache::GetInstance().GetLocalLatest( );

		// minute
		memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
		pRCV_DATA->m_wDataType	=	FILE_HISTORY_EX;
		pRCV_DATA->m_nPacketNum	=	1 + nCount;
		pRCV_DATA->m_bDISK		=	FALSE;
		pRCV_DATA->m_pDay		=	new RCV_HISTORY_STRUCTEx[pRCV_DATA->m_nPacketNum+1];
		memset( pRCV_DATA->m_pDay, 0, sizeof(RCV_HISTORY_STRUCTEx)*(pRCV_DATA->m_nPacketNum+1) );

		pRCV_DATA->m_pDay[0].m_head.m_dwHeadTag	=	EKE_HEAD_TAG;
		pRCV_DATA->m_pDay[0].m_head.m_wMarket	=	(stock.m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
		strncpy(pRCV_DATA->m_pDay[0].m_head.m_szLabel, stock.m_code,
				min(sizeof(pRCV_DATA->m_pDay[0].m_head.m_szLabel),sizeof(stock.m_code)));
		
		for( int i=0; i<nCount; i++ )
		{
			CSPTime	sptime;
			if( sptime.FromStockTime( phistory[i].m_date, ktype, tLatest.GetYear() ) )
				pRCV_DATA->m_pDay[i+1].m_time = sptime.GetTime();
			else
				return 0;
			pRCV_DATA->m_pDay[i+1].m_fOpen = (float)(0.001 * phistory[i].m_open);
			pRCV_DATA->m_pDay[i+1].m_fHigh = (float)(0.001 * phistory[i].m_high);
			pRCV_DATA->m_pDay[i+1].m_fLow = (float)(0.001 * phistory[i].m_low);
			pRCV_DATA->m_pDay[i+1].m_fClose = (float)(0.001 * phistory[i].m_close);
			pRCV_DATA->m_pDay[i+1].m_fVolume = (float)(phistory[i].m_volume);
			pRCV_DATA->m_pDay[i+1].m_fAmount = (float)(1000. * ((DWORD*)&(phistory[nCount]))[i] );
		}

		return len;
	}

	return 0;
}

int TryGetMultisort( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
	if( len < sizeof(TW_ANS) )
		return 0;

	TW_ANS * pans = (TW_ANS*)buffer;
	if( TW_MAGIC != pans->m_header.m_magic )
		return 0;
	if( 0x0a != pans->m_tag1 || 0x08 != pans->m_tag2 )
		return 0;

	// get it, fill pRCV_DATA
	size_t dataoffset = 41;
	int datalen = len - dataoffset;
	if( pRCV_DATA && datalen >= (int)sizeof(TW_ANS_MULTISORT) )
	{
		TW_ANS_MULTISORT * pmultisort = (TW_ANS_MULTISORT*)(buffer+dataoffset);

		if( 0x0006 == pmultisort->m_tag1 || datalen == sizeof(TW_ANS_MULTISORT) )
		{
			memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
			pRCV_DATA->m_wDataType	=	FILE_MULTISORT_EX;	// no use
			pRCV_DATA->m_nPacketNum	=	1;
			pRCV_DATA->m_bDISK		=	FALSE;
			pRCV_DATA->m_pMultisort	=	new RCV_MULTISORT_STRUCTEx[1];
			memset( pRCV_DATA->m_pMultisort, 0, sizeof(RCV_MULTISORT_STRUCTEx)*1 );
			memcpy( pRCV_DATA->m_pMultisort, pmultisort, sizeof(TW_ANS_MULTISORT) );
			return len;
		}
	}

	return 0;
}

int TryGetDetail( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
	if( len < sizeof(TW_ANS) )
		return 0;

	TW_ANS * pans = (TW_ANS*)buffer;
	if( TW_MAGIC != pans->m_header.m_magic )
		return 0;
	if( 0x01 != pans->m_tag1 || 0x02 != pans->m_tag2 )
		return 0;
	TW_STOCK	stock;
	memset( &stock, 0, sizeof(stock) );
	BOOL bStockOK = GetSerialStock( pans->m_serial, stock );

	// get it, fill pRCV_DATA
	size_t dataoffset = 43;
	int datalen = len - dataoffset;
	if( pRCV_DATA && bStockOK && datalen >= (int)sizeof(TW_ANS_DETAIL) )
	{
		TW_ANS_DETAIL * pdetail = (TW_ANS_DETAIL*)(buffer+dataoffset);
		int packetsize = datalen/(int)sizeof(TW_ANS_DETAIL);

		memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
		pRCV_DATA->m_wDataType	=	RCV_REPORT;	// no use
		pRCV_DATA->m_nPacketNum	=	packetsize;
		pRCV_DATA->m_bDISK		=	FALSE;
		pRCV_DATA->m_pReport	=	new RCV_REPORT_STRUCTEx[packetsize];
		memset( pRCV_DATA->m_pReport, 0, sizeof(RCV_REPORT_STRUCTEx)*packetsize );

		CSPTime tLatest = CTSCache::GetInstance().GetLocalLatest( );

		for( int i=0;i <packetsize; i++ )
		{
			pRCV_DATA->m_pReport[i].m_cbSize = sizeof(RCV_REPORT_STRUCTEx);
			pRCV_DATA->m_pReport[i].m_time = CSPTime::GetTradeOffsetToTime( pdetail[i].m_offset, tLatest.GetTime() );

			pRCV_DATA->m_pReport[i].m_wMarket = (stock.m_type & 0x20) ? SZ_MARKET_EX : SH_MARKET_EX;
			strncpy(pRCV_DATA->m_pReport[i].m_szLabel, stock.m_code,
					min(sizeof(pRCV_DATA->m_pReport[i].m_szLabel),sizeof(stock.m_code)));

			pRCV_DATA->m_pReport[i].m_fNewPrice	= (float)(0.001*pdetail[i].m_price);
			pRCV_DATA->m_pReport[i].m_fVolume		= (float)(0.01*pdetail[i].m_volume);
			pRCV_DATA->m_pReport[i].m_fAmount		= (float)(100.*pRCV_DATA->m_pReport[i].m_fVolume*pRCV_DATA->m_pReport[i].m_fNewPrice);

			pRCV_DATA->m_pReport[i].m_fBuyPrice[0]= (float)(0.001*pdetail[i].m_buy1);
			pRCV_DATA->m_pReport[i].m_fSellPrice[0]= (float)(0.001*pdetail[i].m_sell1);
		}

		return len;
	}

	return 0;
}

int TryGetBase( BYTE * buffer, size_t len, PRCV_DATA pRCV_DATA )
{
	if( len < sizeof(TW_ANS) )
		return 0;

	TW_ANS * pans = (TW_ANS*)buffer;
	if( TW_MAGIC != pans->m_header.m_magic )
		return 0;
	if( 0x05 != pans->m_tag1 || 0x0b != pans->m_tag2 )
		return 0;
	TW_STOCK	stock;
	memset( &stock, 0, sizeof(stock) );
	BOOL bStockOK = GetSerialStock( pans->m_serial, stock );

	// get it, fill pRCV_DATA
	size_t dataoffset = 45;
	int datalen = len - dataoffset;
	if( pRCV_DATA && bStockOK && datalen > 0 )
	{
		memset( pRCV_DATA, 0, sizeof(RCV_DATA) );
		pRCV_DATA->m_wDataType	=	FILE_BASE_EX;
		pRCV_DATA->m_nPacketNum	=	1;
		pRCV_DATA->m_bDISK		=	FALSE;

		pRCV_DATA->m_File.m_dwLen	=	datalen;
		strncpy( pRCV_DATA->m_File.m_szFileName, stock.m_code, min(sizeof(stock.m_code),sizeof(pRCV_DATA->m_File.m_szFileName)-1) );
		if( strlen(pRCV_DATA->m_File.m_szFileName)+5 < sizeof(pRCV_DATA->m_File.m_szFileName) )
			strcat(pRCV_DATA->m_File.m_szFileName, ".txt");
		pRCV_DATA->m_pData		=	new BYTE[datalen+1];
		memcpy( pRCV_DATA->m_pData, buffer + dataoffset, datalen );
		((char*)pRCV_DATA->m_pData)[datalen] = 0;
		return len;
	}

	return 0;
}

⌨️ 快捷键说明

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