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

📄 daytrader.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
字号:
/*
	Cross Platform Core Code.

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

	Using:
		Packet convertor functions;
*/

#include	"StdAfx.h"
#include	"../Include/DayTrader.h"

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

#ifdef	_DEBUG
#define	new	DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
//	CDayTrader

CDayTrader::CDayTrader()
{
}

CDayTrader::~CDayTrader()
{
}

BOOL CDayTrader::SetMaxStocks( int nMaxStocks )
{
	if( nMaxStocks > 0 )
	{
		m_opparam.m_nStoreDiv	=	nMaxStocks;
		return TRUE;
	}
	return FALSE;
}

BOOL CDayTrader::BuyIt( CSPTime tmCur, CTechStock & techstock )
{
	OPRECORD record;
	memset( &record, 0, sizeof(record) );

	record.lOpType	=	STRATEGY_OPTYPE_BUY;

	record.bViewed		=	TRUE;
	record.time			=	tmCur.GetTime();
	record.dwMarket		=	techstock.m_info.GetMarket();
	strncpy( record.szCode, techstock.m_info.GetStockCode(),
			 min(sizeof(record.szCode)-1,strlen(techstock.m_info.GetStockCode())) );

	if( m_opparam.m_nStoreDiv-m_SimuStockOwn.GetSize() <= 0 )	// 股票已经够多了,不能再买入新的了
		return FALSE;
	double	dUseCash	=	m_SimuCurrentCash / (m_opparam.m_nStoreDiv-m_SimuStockOwn.GetSize());	// 需使用资金

	if( m_SimuCurrentCash < dUseCash )
		dUseCash	=	m_SimuCurrentCash;	// 资金不够,则有多少用多少

	double dSharePrice = 0;
	if( !techstock.GetClosePrice( tmCur, &dSharePrice ) )
		return FALSE;
	double	dTemp	=	dSharePrice * ( 1 + m_rate.GetRate( techstock.m_info ) );
	if( fabs(dTemp) < 1e-4 || dUseCash < 1e-4 )
		return FALSE;

	DWORD	dwShare		=	(DWORD)( dUseCash / dTemp );	// 买入股数
	dwShare		=	( dwShare / 100 ) * 100;		// 取整
	if( 0 == dwShare )
		return FALSE;

	record.dwShare		=	dwShare;
	record.dSharePrice	=	dSharePrice;
	record.dRateCost	=	record.dwShare * record.dSharePrice * m_rate.GetRate(techstock.m_info);
	return SimuOperate( record );
}

BOOL CDayTrader::SellIt( CSPTime tmCur, CTechStock & techstock )
{
	OPRECORD record;
	memset( &record, 0, sizeof(record) );

	record.lOpType	=	STRATEGY_OPTYPE_SELL;

	record.bViewed		=	TRUE;
	record.time			=	tmCur.GetTime();
	record.dwMarket		=	techstock.m_info.GetMarket();
	strncpy( record.szCode, techstock.m_info.GetStockCode(),
			 min(sizeof(record.szCode)-1,strlen(techstock.m_info.GetStockCode())) );

	double dSharePrice = 0;
	if( !techstock.GetClosePrice( tmCur, &dSharePrice ) )
		return FALSE;

	STOCKOWN	own;
	memset( &own, 0, sizeof(own) );
	if( !m_SimuStockOwn.HasThisStock( techstock.m_info, &own ) )
		return FALSE;
	DWORD	dwShare		=	own.dwShare;	// 卖出股数

	record.dwShare		=	dwShare;
	record.dSharePrice	=	dSharePrice;
	record.dRateCost	=	record.dwShare * record.dSharePrice * m_rate.GetRate(techstock.m_info);
	return SimuOperate( record );
}

BOOL CDayTrader::SimuRun( SIMULATION_CALLBACK fnCallback, void * cookie )
{
	// 准备数据
	if( !PrepareData( fnCallback, cookie ) )
		return FALSE;

	if( m_techstocks.GetSize() <= m_opparam.m_nStoreDiv )
	{
		SP_ASSERT( FALSE );
	}

	ClearLastIntensity( );
	
	int nCount = 0;
	int nSeperate = ::GetPrivateProfileInt( "DayTrader", "Seperate", 5, AfxGetProfile().GetWorkDirectory()+"DayTrader.ini" );
	char szGap[128];
	memset( szGap, 0, sizeof(szGap) );
	::GetPrivateProfileString( "DayTrader", "Gap", "5.0", szGap, sizeof(szGap)-2, AfxGetProfile().GetWorkDirectory()+"DayTrader.ini" );
	double dGap = atof(szGap);

	do	{
		CSPTime	tmCur	=	SimuGetCurrentTime();	// 模拟当前时间

		int nMaxDiffPercent = -1;
		double dMaxDiffPercent = -100;	// 最大涨幅%
		int nMinDiffPercent = -1;
		double dMinDiffPercent = 100;	// 最大跌幅%

		// Find
		for( int i=0; i<m_techstocks.GetSize(); i++ )	// 每只股票依次判断
		{
			CTechStock & techstock	=	m_techstocks.ElementAt(i);

			if( techstock.IsStopTrading(tmCur) )	// 停牌吗
				continue;

			// Judge Whether to operate, if yes, save to nextop
			STOCKOWN	own;
			memset( &own, 0, sizeof(own) );
			if( m_SimuStockOwn.HasThisStock( techstock.m_info, &own ) )	// 如果已经有这支股票,判断是否卖出
			{
				if( m_SimuStockOwn.GetSize() >= m_opparam.m_nStoreDiv )
				{
					double dDiffPercent;
					if( techstock.GetCloseDiffPercent( tmCur, &dDiffPercent )
						&& (dDiffPercent > dMaxDiffPercent || -1 == nMaxDiffPercent) )
					{
						dMaxDiffPercent = dDiffPercent;
						nMaxDiffPercent = i;
					}
				}
			}
			else if( m_SimuStockOwn.GetSize() <= m_opparam.m_nStoreDiv )
			{
				double dDiffPercent;
				if( techstock.GetCloseDiffPercent( tmCur, &dDiffPercent )
					&& (dDiffPercent < dMinDiffPercent || -1 == nMinDiffPercent) )
				{
					dMinDiffPercent = dDiffPercent;
					nMinDiffPercent = i;
				}
			}
		}

		// operate
		if( -1 != nMaxDiffPercent && -1 != nMinDiffPercent )
		{
			double dRate = m_rate.GetRate( m_techstocks.ElementAt(nMaxDiffPercent).m_info )
							+ m_rate.GetRate( m_techstocks.ElementAt(nMinDiffPercent).m_info );
			if( dMaxDiffPercent - dMinDiffPercent <= dGap + dRate * 100 )
			{
				nMaxDiffPercent = nMinDiffPercent = -1;
			}
		}

		nCount ++;
		if( -1 != nMaxDiffPercent && -1 != nMinDiffPercent && nCount >= nSeperate )
		{
			nCount = 0;
			SellIt( tmCur, m_techstocks.ElementAt(nMaxDiffPercent) );
		}
		if( -1 != nMinDiffPercent )
			BuyIt( tmCur, m_techstocks.ElementAt(nMinDiffPercent) );


		// 进度显示
		DWORD	dwProgress	=	SimuGetCurrentProgress( STRATEGY_MAX_PROGRESS );
		double	dYield		=	SimuGetCurrentYield( );
		if( fnCallback && !fnCallback( SIMULATION_PROGRESS, dwProgress, NULL, cookie ) )
			return FALSE;
		if( fnCallback && !fnCallback( SIMULATION_YIELD, (DWORD)dYield, NULL, cookie ) )
			return FALSE;

	} while( SimuGotoNextTime() );	// 模拟的下一个交易日

	if( fnCallback )
		fnCallback( SIMULATION_PROGRESS, STRATEGY_MAX_PROGRESS, NULL, cookie );
	return TRUE;
}

⌨️ 快捷键说明

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