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

📄 simurealop.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
字号:
// SimuRealOp.cpp : implementation file
//

#include "stdafx.h"

#include "SimuRealOp.h"
#include "SimuStatDlg.h"
#include "SimuAddOpDlg.h"
#include "SimuAddStockDlg.h"
#include <math.h>

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

/////////////////////////////////////////////////////////////////////////////
// CSimuRealOp property page

CSimuRealOp::CSimuRealOp(CWnd* pParent /*=NULL*/)
	: CXFDialog(CSimuRealOp::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSimuRealOp)
	//}}AFX_DATA_INIT
	m_pStrategy	=	NULL;
	SetTransparent( FALSE );

	m_bModified	=	FALSE;
}

CSimuRealOp::~CSimuRealOp()
{
}

void CSimuRealOp::SetStrategy( CStrategy * pStrategy )
{
	m_pStrategy	=	pStrategy;
}

/***
	初始化实战操作数据列表等
*/
BOOL CSimuRealOp::Initialize( )
{
	m_listNextOp.InitNextOpList( );
	m_listOpRecord.InitOpRecordList( );
	m_listStockOwn.InitStockOwnList( );
	m_listOpRecord.LoadOpRecordList( m_pStrategy->RealGetOpRecord() );
	m_listStockOwn.LoadStockOwnList( m_pStrategy->RealGetStockOwn(), m_pStrategy->RealGetCurrentCash(), m_pStrategy->RealGetCurrentTime().GetTime(),
						m_pStrategy->RealGetAsset(m_pStrategy->RealGetCurrentTime()), m_pStrategy->GetTechStockContainer() );

	// Curve Init
	m_curve.SetAssetSerial( m_pStrategy->RealGetAssetSerial(), m_pStrategy->GetOpParam().m_nStartAmount );
	m_curve.Initialize( );

	// if( !AfxAssertFunclimitProf( IDS_SIMUREALOP_EVACANNOTVIEWNEXTOP ) )
	//	return TRUE;

	m_listNextOp.LoadNextOpList( m_pStrategy->RealGetNextOp() );
	return TRUE;
}

void CSimuRealOp::DoDataExchange(CDataExchange* pDX)
{
	CXFDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSimuRealOp)
	DDX_Control(pDX, IDC_STATYIELD, m_btnStatYield);
	DDX_Control(pDX, IDOK, m_btnOK);
	DDX_Control(pDX, IDC_TIMEEXPLAIN, m_staticTimeExplain);
	DDX_Control(pDX, IDC_STATICEXPLAIN, m_staticExplain);
	DDX_Control(pDX, IDC_RESETALL, m_btnResetAll);
	DDX_Control(pDX, IDC_MODIFIED, m_btnModified);
	DDX_Control(pDX, IDC_DELETESTOCK, m_btnDeleteStock);
	DDX_Control(pDX, IDC_ADDSTOCK, m_btnAddStock);
	DDX_Control(pDX, IDC_DELETEOP, m_btnDeleteOp);
	DDX_Control(pDX, IDC_ADDOP, m_btnAddOp);
	DDX_Control(pDX, IDC_COPY, m_btnCopy);
	DDX_Control(pDX, IDC_STOCKOWN, m_listStockOwn);
	DDX_Control(pDX, IDC_CURVE, m_curve);
	DDX_Control(pDX, IDC_NEXTOP, m_listNextOp);
	DDX_Control(pDX, IDC_OPRECORD, m_listOpRecord);
	DDX_Control(pDX, IDC_TABCTRL, m_tabctrl);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSimuRealOp, CXFDialog)
	//{{AFX_MSG_MAP(CSimuRealOp)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TABCTRL, OnSelchangeTabctrl)
	ON_BN_CLICKED(IDC_COPY, OnCopy)
	ON_BN_CLICKED(IDC_STATYIELD, OnStatyield)
	ON_BN_CLICKED(IDC_ADDOP, OnAddop)
	ON_BN_CLICKED(IDC_DELETEOP, OnDeleteop)
	ON_BN_CLICKED(IDC_ADDSTOCK, OnAddstock)
	ON_BN_CLICKED(IDC_DELETESTOCK, OnDeletestock)
	ON_BN_CLICKED(IDC_MODIFIED, OnModified)
	ON_BN_CLICKED(IDC_RESETALL, OnResetall)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSimuRealOp message handlers

BOOL CSimuRealOp::OnInitDialog() 
{
	CXFDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	ASSERT( m_pStrategy );

	// Set Attr
	CString	strItem;
	strItem.LoadString( IDS_SIMUREALOP_NEXTOP );
	m_tabctrl.InsertItem( 0, strItem );
	strItem.LoadString( IDS_SIMUREPORT_OPRECORD );
	m_tabctrl.InsertItem( 1, strItem );
	strItem.LoadString( IDS_SIMUREPORT_CURVE );
	m_tabctrl.InsertItem( 2, strItem );
	strItem.LoadString( IDS_SIMUREALOP_STOCKOWN );
	m_tabctrl.InsertItem( 3, strItem );

	// Init
	Initialize( );

	// Tab Show
	m_listNextOp.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
	m_listOpRecord.ShowWindow( SW_HIDE );
	m_curve.ShowWindow( SW_HIDE );
	m_listStockOwn.ShowWindow( SW_HIDE );
	m_btnCopy.EnableWindow( TRUE );
	m_btnAddOp.ShowWindow( SW_HIDE );
	m_btnDeleteOp.ShowWindow( SW_HIDE );
	m_btnAddStock.ShowWindow( SW_HIDE );
	m_btnDeleteStock.ShowWindow( SW_HIDE );
	m_btnModified.ShowWindow( SW_HIDE );

	CString	strExplain, strExplainFmt;
	strExplainFmt.LoadString( IDS_SIMUREALOP_TIMEEXPLAINFMT );
	strExplain.Format( strExplainFmt, m_pStrategy->RealGetCurrentTime().Format("%Y-%m-%d") );
	m_staticTimeExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
	m_staticTimeExplain.SetWindowText( strExplain );

	m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
	strExplain.LoadString( IDS_SIMUREALOP_EXPLAINNEXTOP );
	m_staticExplain.SetWindowText( strExplain );

	UpdateData( FALSE );

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CSimuRealOp::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int	nCurSel	=	m_tabctrl.GetCurSel();
	CString	strExplain;
	switch( nCurSel )
	{
	case	0:
		m_listNextOp.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_listOpRecord.ShowWindow( SW_HIDE );
		m_curve.ShowWindow( SW_HIDE );
		m_listStockOwn.ShowWindow( SW_HIDE );
		m_btnCopy.EnableWindow( TRUE );
		m_btnAddOp.ShowWindow( SW_HIDE );
		m_btnDeleteOp.ShowWindow( SW_HIDE );
		m_btnAddStock.ShowWindow( SW_HIDE );
		m_btnDeleteStock.ShowWindow( SW_HIDE );
		m_btnModified.ShowWindow( SW_HIDE );
		m_staticTimeExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		strExplain.LoadString( IDS_SIMUREALOP_EXPLAINNEXTOP );
		m_staticExplain.SetWindowText( strExplain );
		break;
	case	1:
		m_listNextOp.ShowWindow( SW_HIDE );
		m_listOpRecord.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_curve.ShowWindow( SW_HIDE );
		m_listStockOwn.ShowWindow( SW_HIDE );
		m_btnCopy.EnableWindow( TRUE );
		m_btnAddOp.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_btnDeleteOp.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_btnAddStock.ShowWindow( SW_HIDE );
		m_btnDeleteStock.ShowWindow( SW_HIDE );
		m_btnModified.ShowWindow( SW_HIDE );
		m_staticTimeExplain.ShowWindow( SW_HIDE );
		m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		strExplain.LoadString( IDS_SIMUREALOP_EXPLAINOPRECORD );
		m_staticExplain.SetWindowText( strExplain );
		break;
	case	2:
		m_listNextOp.ShowWindow( SW_HIDE );
		m_listOpRecord.ShowWindow( SW_HIDE );
		m_curve.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_listStockOwn.ShowWindow( SW_HIDE );
		m_btnCopy.EnableWindow( FALSE );
		m_btnAddOp.ShowWindow( SW_HIDE );
		m_btnDeleteOp.ShowWindow( SW_HIDE );
		m_btnAddStock.ShowWindow( SW_HIDE );
		m_btnDeleteStock.ShowWindow( SW_HIDE );
		m_btnModified.ShowWindow( SW_HIDE );
		m_staticTimeExplain.ShowWindow( SW_HIDE );
		m_staticExplain.ShowWindow( SW_HIDE );
		break;
	case	3:
		m_listNextOp.ShowWindow( SW_HIDE );
		m_listOpRecord.ShowWindow( SW_HIDE );
		m_curve.ShowWindow( SW_HIDE );
		m_listStockOwn.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_btnCopy.EnableWindow( TRUE );
		m_btnAddOp.ShowWindow( SW_HIDE );
		m_btnDeleteOp.ShowWindow( SW_HIDE );
		m_btnAddStock.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_btnDeleteStock.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_btnModified.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_staticTimeExplain.ShowWindow( SW_HIDE );
		m_staticExplain.ShowWindow( SW_HIDE );
		break;
	default:
		ASSERT( FALSE );
		break;
	}
	*pResult = 0;
}

void CSimuRealOp::OnCopy() 
{
	if( m_listNextOp.IsWindowVisible() )
	{
		m_listNextOp.Copy( );
	}
	if( m_listOpRecord.IsWindowVisible() )
	{
		m_listOpRecord.Copy( );
	}
	else if( m_listStockOwn.IsWindowVisible() )
	{
		m_listStockOwn.Copy( );
	}
}

/***
	显示结果统计信息
*/
void CSimuRealOp::OnStatyield() 
{
	// TODO: Add your control notification handler code here
	CSimuStatDlg	dlg;
	dlg.SetStrategy( m_pStrategy );
	dlg.DoModal();
}

/***
	手动加入操作
*/
void CSimuRealOp::OnAddop() 
{
	// TODO: Add your control notification handler code here
	if( m_pStrategy && m_listOpRecord.IsWindowVisible() )
	{
		CSimuAddOpDlg	dlg;
		dlg.SetStrategy( m_pStrategy );
		if( IDOK == dlg.DoModal() )
		{
			Initialize( );
			m_bModified	=	TRUE;
		}
	}
}

/***
	手动删除操作
*/
void CSimuRealOp::OnDeleteop() 
{
	// TODO: Add your control notification handler code here
	if( m_pStrategy && m_listOpRecord.IsWindowVisible() )
	{
		int	nSelected	=	m_listOpRecord.GetSelected();
		if( -1 == nSelected )
		{
			AfxMessageBox( IDS_SIMUREALOP_OPRECORDNOSEL, MB_OK | MB_ICONINFORMATION );
			return;
		}

		if( IDYES != AfxMessageBox( IDS_SIMUREALOP_DELETELATER, MB_YESNO ) )
			return;

		int	nRecord	=	m_listOpRecord.GetItemData( nSelected );
		if( !m_pStrategy->RealDeleteOpRecordStrict( nRecord ) )
		{
			AfxMessageBox( IDS_SIMUREALOP_CANNOTDELETE, MB_OK | MB_ICONINFORMATION );
			return;
		}
		Initialize( );
		m_bModified	=	TRUE;
	}
}

/***
	手动加入拥有股票
*/
void CSimuRealOp::OnAddstock() 
{
	CSimuAddStockDlg	dlg;
	dlg.SetStrategy( m_pStrategy );
	dlg.SetMode( CSimuAddStockDlg::modeAddStock, "", 0, 0 );
	if( IDOK == dlg.DoModal( ) )
	{
		CString	strStockCode	=	dlg.GetStockCode();
		double	dShare			=	dlg.GetValue();
		double	dSharePrice		=	dlg.GetPrice();
		
		OPRECORD	record;
		memset( &record, 0, sizeof(record) );
		CSPTime	tmNow	=	CSPTime::GetCurrentTime();
		CSPTime	tmDay	=	CSPTime( tmNow.GetYear(), tmNow.GetMonth(), tmNow.GetDay(), 0, 0, 0 );
		record.time		=	tmDay.GetTime();
		record.lOpType	=	STRATEGY_OPTYPE_ADDSTOCK;
		strncpy( record.szCode, strStockCode.GetBuffer(sizeof(record.szCode)+1), sizeof(record.szCode) );
		strStockCode.ReleaseBuffer();
		record.dwShare	=	(DWORD)dShare;
		record.dSharePrice	=	dSharePrice;
		if( m_pStrategy->RealOperate( record ) )
			Initialize( );
		else
			AfxMessageBox( IDS_SIMUREALOP_ADDSTOCKFAILED, MB_OK|MB_ICONINFORMATION );
		m_bModified	=	TRUE;
	}
}

/***
	手动移除拥有股票
*/
void CSimuRealOp::OnDeletestock() 
{
	// TODO: Add your control notification handler code here
	if( m_pStrategy && m_listStockOwn.IsWindowVisible() )
	{
		int	nSelected	=	m_listStockOwn.GetSelected();
		if( -1 == nSelected )
		{
			AfxMessageBox( IDS_SIMUREALOP_OPRECORDNOSEL, MB_OK | MB_ICONINFORMATION );
			return;
		}

		int	nStock	=	m_listStockOwn.GetItemData( nSelected );
		CStockOwnContainer	& stockown	=	m_pStrategy->RealGetStockOwn();
		BOOL	bOK	=	FALSE;
		if( nStock >= 0 && nStock < stockown.GetSize() )
		{
			OPRECORD	record;
			memset( &record, 0, sizeof(record) );
			CSPTime	tmNow	=	CSPTime::GetCurrentTime();
			CSPTime	tmDay	=	CSPTime( tmNow.GetYear(), tmNow.GetMonth(), tmNow.GetDay(), 0, 0, 0 );
			record.time		=	tmDay.GetTime();
			record.lOpType	=	STRATEGY_OPTYPE_REMOVESTOCK;
			strncpy( record.szCode, stockown.ElementAt(nStock).szCode, sizeof(record.szCode) );
			record.dwShare	=	stockown.ElementAt(nStock).dwShare;
			bOK		=	m_pStrategy->RealOperate( record );
			Initialize( );
			m_bModified	=	TRUE;
		}
		
		if( !bOK )
			AfxMessageBox( IDS_SIMUREALOP_CANNOTDELETE, MB_OK | MB_ICONINFORMATION );
	}
}

/***
	手动改变拥有股票数量
*/
void CSimuRealOp::OnModified()
{
	// TODO: Add your control notification handler code here
	CSimuAddStockDlg	dlg;
	dlg.SetStrategy( m_pStrategy );
	dlg.SetMode( CSimuAddStockDlg::modeModifiedCash, "", m_pStrategy->RealGetCurrentCash(), 0 );
	if( IDOK == dlg.DoModal( ) )
	{
		double	dValue		=	dlg.GetValue();
		double	dValueOld	=	m_pStrategy->RealGetCurrentCash();
		
		OPRECORD	record;
		memset( &record, 0, sizeof(record) );
		CSPTime	tmNow	=	CSPTime::GetCurrentTime();
		CSPTime	tmDay	=	CSPTime( tmNow.GetYear(), tmNow.GetMonth(), tmNow.GetDay(), 0, 0, 0 );
		record.time		=	tmDay.GetTime();
		if( dValue > dValueOld )
			record.lOpType	=	STRATEGY_OPTYPE_ADDCASH;
		else
			record.lOpType	=	STRATEGY_OPTYPE_REMOVECASH;
		record.dSharePrice	=	fabs(dValue-dValueOld);
		if( m_pStrategy->RealOperate( record ) )
			Initialize( );
		else
			AfxMessageBox( IDS_SIMUREALOP_MODIFIEDCASHFAILED, MB_OK|MB_ICONINFORMATION );
		m_bModified	=	TRUE;
	}
}

/***
	策略实战选股进度回调函数
*/
BOOL CALLBACK RealRunCallback(DWORD dwType, DWORD dwValue,
							LPCTSTR lpszMsg, void *cookie)
{
	HWND hWnd = (HWND)cookie;

	if( SIMULATION_PROGRESS == dwType )
	{
		::SendMessage( hWnd, WM_USER_SIMULATION_PROGRESS, dwValue, (LPARAM)lpszMsg );
	}

	return TRUE;
}

/***
	全部重来
*/
void CSimuRealOp::OnResetall() 
{
	// TODO: Add your control notification handler code here
	if( m_pStrategy && IDYES == AfxMessageBox(IDS_SIMUREALOP_RESETCONFIRM,MB_YESNO) )
	{
		CWaitDlg	wait( AfxGetMainWnd(), FALSE );
		wait.SetProgressRange( 0, STRATEGY_MAX_PROGRESS );

		m_pStrategy->RealReset( );
		m_pStrategy->RealRun( RealRunCallback, wait.GetSafeHwnd() );

		wait.DestroyWindow();

		Initialize( );
	}
}

⌨️ 快捷键说明

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