SimuRealOp.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:13k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // SimuRealOp.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SimuRealOp.h"
  5. #include "SimuStatDlg.h"
  6. #include "SimuAddOpDlg.h"
  7. #include "SimuAddStockDlg.h"
  8. #include <math.h>
  9. #include "..Dialogs.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CSimuRealOp property page
  17. CSimuRealOp::CSimuRealOp(CWnd* pParent /*=NULL*/)
  18. : CDialog(CSimuRealOp::IDD, pParent)
  19. {
  20. //{{AFX_DATA_INIT(CSimuRealOp)
  21. //}}AFX_DATA_INIT
  22. m_pStrategy = NULL;
  23. //SetTransparent( FALSE );
  24. m_bModified = FALSE;
  25. }
  26. CSimuRealOp::~CSimuRealOp()
  27. {
  28. }
  29. void CSimuRealOp::SetStrategy( CStrategy * pStrategy )
  30. {
  31. m_pStrategy = pStrategy;
  32. }
  33. /***
  34. 初始化实战操作数据列表等
  35. */
  36. BOOL CSimuRealOp::Initialize( )
  37. {
  38. m_listNextOp.InitNextOpList( );
  39. m_listOpRecord.InitOpRecordList( );
  40. m_listStockOwn.InitStockOwnList( );
  41. m_listOpRecord.LoadOpRecordList( m_pStrategy->RealGetOpRecord() );
  42. m_listStockOwn.LoadStockOwnList( m_pStrategy->RealGetStockOwn(), m_pStrategy->RealGetCurrentCash(), m_pStrategy->RealGetCurrentTime().GetTime(),
  43. m_pStrategy->RealGetAsset(m_pStrategy->RealGetCurrentTime()), m_pStrategy->GetTechStockContainer() );
  44. // Curve Init
  45. m_curve.SetAssetSerial( m_pStrategy->RealGetAssetSerial(), m_pStrategy->GetOpParam().m_nStartAmount );
  46. m_curve.Initialize( );
  47. // if( !AfxAssertFunclimitProf( IDS_SIMUREALOP_EVACANNOTVIEWNEXTOP ) )
  48. // return TRUE;
  49. m_listNextOp.LoadNextOpList( m_pStrategy->RealGetNextOp() );
  50. return TRUE;
  51. }
  52. void CSimuRealOp::DoDataExchange(CDataExchange* pDX)
  53. {
  54. CDialog::DoDataExchange(pDX);
  55. //{{AFX_DATA_MAP(CSimuRealOp)
  56. DDX_Control(pDX, IDC_STATYIELD, m_btnStatYield);
  57. DDX_Control(pDX, IDOK, m_btnOK);
  58. DDX_Control(pDX, IDC_TIMEEXPLAIN, m_staticTimeExplain);
  59. DDX_Control(pDX, IDC_STATICEXPLAIN, m_staticExplain);
  60. DDX_Control(pDX, IDC_RESETALL, m_btnResetAll);
  61. DDX_Control(pDX, IDC_MODIFIED, m_btnModified);
  62. DDX_Control(pDX, IDC_DELETESTOCK, m_btnDeleteStock);
  63. DDX_Control(pDX, IDC_ADDSTOCK, m_btnAddStock);
  64. DDX_Control(pDX, IDC_DELETEOP, m_btnDeleteOp);
  65. DDX_Control(pDX, IDC_ADDOP, m_btnAddOp);
  66. DDX_Control(pDX, IDC_COPY, m_btnCopy);
  67. DDX_Control(pDX, IDC_STOCKOWN, m_listStockOwn);
  68. DDX_Control(pDX, IDC_CURVE, m_curve);
  69. DDX_Control(pDX, IDC_NEXTOP, m_listNextOp);
  70. DDX_Control(pDX, IDC_OPRECORD, m_listOpRecord);
  71. DDX_Control(pDX, IDC_TABCTRL, m_tabctrl);
  72. //}}AFX_DATA_MAP
  73. }
  74. BEGIN_MESSAGE_MAP(CSimuRealOp, CDialog)
  75. //{{AFX_MSG_MAP(CSimuRealOp)
  76. ON_NOTIFY(TCN_SELCHANGE, IDC_TABCTRL, OnSelchangeTabctrl)
  77. ON_BN_CLICKED(IDC_COPY, OnCopy)
  78. ON_BN_CLICKED(IDC_STATYIELD, OnStatyield)
  79. ON_BN_CLICKED(IDC_ADDOP, OnAddop)
  80. ON_BN_CLICKED(IDC_DELETEOP, OnDeleteop)
  81. ON_BN_CLICKED(IDC_ADDSTOCK, OnAddstock)
  82. ON_BN_CLICKED(IDC_DELETESTOCK, OnDeletestock)
  83. ON_BN_CLICKED(IDC_MODIFIED, OnModified)
  84. ON_BN_CLICKED(IDC_RESETALL, OnResetall)
  85. //}}AFX_MSG_MAP
  86. END_MESSAGE_MAP()
  87. /////////////////////////////////////////////////////////////////////////////
  88. // CSimuRealOp message handlers
  89. BOOL CSimuRealOp::OnInitDialog() 
  90. {
  91. CDialog::OnInitDialog();
  92. // TODO: Add extra initialization here
  93. ASSERT( m_pStrategy );
  94. // Set Attr
  95. CString strItem;
  96. strItem.LoadString( IDS_SIMUREALOP_NEXTOP );
  97. m_tabctrl.InsertItem( 0, strItem );
  98. strItem.LoadString( IDS_SIMUREPORT_OPRECORD );
  99. m_tabctrl.InsertItem( 1, strItem );
  100. strItem.LoadString( IDS_SIMUREPORT_CURVE );
  101. m_tabctrl.InsertItem( 2, strItem );
  102. strItem.LoadString( IDS_SIMUREALOP_STOCKOWN );
  103. m_tabctrl.InsertItem( 3, strItem );
  104. // Init
  105. Initialize( );
  106. // Tab Show
  107. m_listNextOp.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  108. m_listOpRecord.ShowWindow( SW_HIDE );
  109. m_curve.ShowWindow( SW_HIDE );
  110. m_listStockOwn.ShowWindow( SW_HIDE );
  111. m_btnCopy.EnableWindow( TRUE );
  112. m_btnAddOp.ShowWindow( SW_HIDE );
  113. m_btnDeleteOp.ShowWindow( SW_HIDE );
  114. m_btnAddStock.ShowWindow( SW_HIDE );
  115. m_btnDeleteStock.ShowWindow( SW_HIDE );
  116. m_btnModified.ShowWindow( SW_HIDE );
  117. CString strExplain, strExplainFmt;
  118. strExplainFmt.LoadString( IDS_SIMUREALOP_TIMEEXPLAINFMT );
  119. strExplain.Format( strExplainFmt, m_pStrategy->RealGetCurrentTime().Format("%Y-%m-%d") );
  120. m_staticTimeExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  121. m_staticTimeExplain.SetWindowText( strExplain );
  122. m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  123. strExplain.LoadString( IDS_SIMUREALOP_EXPLAINNEXTOP );
  124. m_staticExplain.SetWindowText( strExplain );
  125. UpdateData( FALSE );
  126. return TRUE;  // return TRUE unless you set the focus to a control
  127.               // EXCEPTION: OCX Property Pages should return FALSE
  128. }
  129. void CSimuRealOp::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT* pResult) 
  130. {
  131. // TODO: Add your control notification handler code here
  132. int nCurSel = m_tabctrl.GetCurSel();
  133. CString strExplain;
  134. switch( nCurSel )
  135. {
  136. case 0:
  137. m_listNextOp.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  138. m_listOpRecord.ShowWindow( SW_HIDE );
  139. m_curve.ShowWindow( SW_HIDE );
  140. m_listStockOwn.ShowWindow( SW_HIDE );
  141. m_btnCopy.EnableWindow( TRUE );
  142. m_btnAddOp.ShowWindow( SW_HIDE );
  143. m_btnDeleteOp.ShowWindow( SW_HIDE );
  144. m_btnAddStock.ShowWindow( SW_HIDE );
  145. m_btnDeleteStock.ShowWindow( SW_HIDE );
  146. m_btnModified.ShowWindow( SW_HIDE );
  147. m_staticTimeExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  148. m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  149. strExplain.LoadString( IDS_SIMUREALOP_EXPLAINNEXTOP );
  150. m_staticExplain.SetWindowText( strExplain );
  151. break;
  152. case 1:
  153. m_listNextOp.ShowWindow( SW_HIDE );
  154. m_listOpRecord.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  155. m_curve.ShowWindow( SW_HIDE );
  156. m_listStockOwn.ShowWindow( SW_HIDE );
  157. m_btnCopy.EnableWindow( TRUE );
  158. m_btnAddOp.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  159. m_btnDeleteOp.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  160. m_btnAddStock.ShowWindow( SW_HIDE );
  161. m_btnDeleteStock.ShowWindow( SW_HIDE );
  162. m_btnModified.ShowWindow( SW_HIDE );
  163. m_staticTimeExplain.ShowWindow( SW_HIDE );
  164. m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  165. strExplain.LoadString( IDS_SIMUREALOP_EXPLAINOPRECORD );
  166. m_staticExplain.SetWindowText( strExplain );
  167. break;
  168. case 2:
  169. m_listNextOp.ShowWindow( SW_HIDE );
  170. m_listOpRecord.ShowWindow( SW_HIDE );
  171. m_curve.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  172. m_listStockOwn.ShowWindow( SW_HIDE );
  173. m_btnCopy.EnableWindow( FALSE );
  174. m_btnAddOp.ShowWindow( SW_HIDE );
  175. m_btnDeleteOp.ShowWindow( SW_HIDE );
  176. m_btnAddStock.ShowWindow( SW_HIDE );
  177. m_btnDeleteStock.ShowWindow( SW_HIDE );
  178. m_btnModified.ShowWindow( SW_HIDE );
  179. m_staticTimeExplain.ShowWindow( SW_HIDE );
  180. m_staticExplain.ShowWindow( SW_HIDE );
  181. break;
  182. case 3:
  183. m_listNextOp.ShowWindow( SW_HIDE );
  184. m_listOpRecord.ShowWindow( SW_HIDE );
  185. m_curve.ShowWindow( SW_HIDE );
  186. m_listStockOwn.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  187. m_btnCopy.EnableWindow( TRUE );
  188. m_btnAddOp.ShowWindow( SW_HIDE );
  189. m_btnDeleteOp.ShowWindow( SW_HIDE );
  190. m_btnAddStock.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  191. m_btnDeleteStock.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  192. m_btnModified.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  193. m_staticTimeExplain.ShowWindow( SW_HIDE );
  194. m_staticExplain.ShowWindow( SW_HIDE );
  195. break;
  196. default:
  197. ASSERT( FALSE );
  198. break;
  199. }
  200. *pResult = 0;
  201. }
  202. void CSimuRealOp::OnCopy() 
  203. {
  204. if( m_listNextOp.IsWindowVisible() )
  205. {
  206. m_listNextOp.Copy( );
  207. }
  208. if( m_listOpRecord.IsWindowVisible() )
  209. {
  210. m_listOpRecord.Copy( );
  211. }
  212. else if( m_listStockOwn.IsWindowVisible() )
  213. {
  214. m_listStockOwn.Copy( );
  215. }
  216. }
  217. /***
  218. 显示结果统计信息
  219. */
  220. void CSimuRealOp::OnStatyield() 
  221. {
  222. // TODO: Add your control notification handler code here
  223. CSimuStatDlg dlg;
  224. dlg.SetStrategy( m_pStrategy );
  225. dlg.DoModal();
  226. }
  227. /***
  228. 手动加入操作
  229. */
  230. void CSimuRealOp::OnAddop() 
  231. {
  232. // TODO: Add your control notification handler code here
  233. if( m_pStrategy && m_listOpRecord.IsWindowVisible() )
  234. {
  235. CSimuAddOpDlg dlg;
  236. dlg.SetStrategy( m_pStrategy );
  237. if( IDOK == dlg.DoModal() )
  238. {
  239. Initialize( );
  240. m_bModified = TRUE;
  241. }
  242. }
  243. }
  244. /***
  245. 手动删除操作
  246. */
  247. void CSimuRealOp::OnDeleteop() 
  248. {
  249. // TODO: Add your control notification handler code here
  250. if( m_pStrategy && m_listOpRecord.IsWindowVisible() )
  251. {
  252. int nSelected = m_listOpRecord.GetSelected();
  253. if( -1 == nSelected )
  254. {
  255. AfxMessageBox( IDS_SIMUREALOP_OPRECORDNOSEL, MB_OK | MB_ICONINFORMATION );
  256. return;
  257. }
  258. if( IDYES != AfxMessageBox( IDS_SIMUREALOP_DELETELATER, MB_YESNO ) )
  259. return;
  260. int nRecord = m_listOpRecord.GetItemData( nSelected );
  261. if( !m_pStrategy->RealDeleteOpRecordStrict( nRecord ) )
  262. {
  263. AfxMessageBox( IDS_SIMUREALOP_CANNOTDELETE, MB_OK | MB_ICONINFORMATION );
  264. return;
  265. }
  266. Initialize( );
  267. m_bModified = TRUE;
  268. }
  269. }
  270. /***
  271. 手动加入拥有股票
  272. */
  273. void CSimuRealOp::OnAddstock() 
  274. {
  275. CSimuAddStockDlg dlg;
  276. dlg.SetStrategy( m_pStrategy );
  277. dlg.SetMode( CSimuAddStockDlg::modeAddStock, "", 0, 0 );
  278. if( IDOK == dlg.DoModal( ) )
  279. {
  280. CString strStockCode = dlg.GetStockCode();
  281. double dShare = dlg.GetValue();
  282. double dSharePrice = dlg.GetPrice();
  283. OPRECORD record;
  284. memset( &record, 0, sizeof(record) );
  285. CSPTime tmNow = CSPTime::GetCurrentTime();
  286. CSPTime tmDay = CSPTime( tmNow.GetYear(), tmNow.GetMonth(), tmNow.GetDay(), 0, 0, 0 );
  287. record.time = tmDay.GetTime();
  288. record.lOpType = STRATEGY_OPTYPE_ADDSTOCK;
  289. strncpy( record.szCode, strStockCode.GetBuffer(sizeof(record.szCode)+1), sizeof(record.szCode) );
  290. strStockCode.ReleaseBuffer();
  291. record.dwShare = (DWORD)dShare;
  292. record.dSharePrice = dSharePrice;
  293. if( m_pStrategy->RealOperate( record ) )
  294. Initialize( );
  295. else
  296. AfxMessageBox( IDS_SIMUREALOP_ADDSTOCKFAILED, MB_OK|MB_ICONINFORMATION );
  297. m_bModified = TRUE;
  298. }
  299. }
  300. /***
  301. 手动移除拥有股票
  302. */
  303. void CSimuRealOp::OnDeletestock() 
  304. {
  305. // TODO: Add your control notification handler code here
  306. if( m_pStrategy && m_listStockOwn.IsWindowVisible() )
  307. {
  308. int nSelected = m_listStockOwn.GetSelected();
  309. if( -1 == nSelected )
  310. {
  311. AfxMessageBox( IDS_SIMUREALOP_OPRECORDNOSEL, MB_OK | MB_ICONINFORMATION );
  312. return;
  313. }
  314. int nStock = m_listStockOwn.GetItemData( nSelected );
  315. CStockOwnContainer & stockown = m_pStrategy->RealGetStockOwn();
  316. BOOL bOK = FALSE;
  317. if( nStock >= 0 && nStock < stockown.GetSize() )
  318. {
  319. OPRECORD record;
  320. memset( &record, 0, sizeof(record) );
  321. CSPTime tmNow = CSPTime::GetCurrentTime();
  322. CSPTime tmDay = CSPTime( tmNow.GetYear(), tmNow.GetMonth(), tmNow.GetDay(), 0, 0, 0 );
  323. record.time = tmDay.GetTime();
  324. record.lOpType = STRATEGY_OPTYPE_REMOVESTOCK;
  325. strncpy( record.szCode, stockown.ElementAt(nStock).szCode, sizeof(record.szCode) );
  326. record.dwShare = stockown.ElementAt(nStock).dwShare;
  327. bOK = m_pStrategy->RealOperate( record );
  328. Initialize( );
  329. m_bModified = TRUE;
  330. }
  331. if( !bOK )
  332. AfxMessageBox( IDS_SIMUREALOP_CANNOTDELETE, MB_OK | MB_ICONINFORMATION );
  333. }
  334. }
  335. /***
  336. 手动改变拥有股票数量
  337. */
  338. void CSimuRealOp::OnModified()
  339. {
  340. // TODO: Add your control notification handler code here
  341. CSimuAddStockDlg dlg;
  342. dlg.SetStrategy( m_pStrategy );
  343. dlg.SetMode( CSimuAddStockDlg::modeModifiedCash, "", m_pStrategy->RealGetCurrentCash(), 0 );
  344. if( IDOK == dlg.DoModal( ) )
  345. {
  346. double dValue = dlg.GetValue();
  347. double dValueOld = m_pStrategy->RealGetCurrentCash();
  348. OPRECORD record;
  349. memset( &record, 0, sizeof(record) );
  350. CSPTime tmNow = CSPTime::GetCurrentTime();
  351. CSPTime tmDay = CSPTime( tmNow.GetYear(), tmNow.GetMonth(), tmNow.GetDay(), 0, 0, 0 );
  352. record.time = tmDay.GetTime();
  353. if( dValue > dValueOld )
  354. record.lOpType = STRATEGY_OPTYPE_ADDCASH;
  355. else
  356. record.lOpType = STRATEGY_OPTYPE_REMOVECASH;
  357. record.dSharePrice = fabs(dValue-dValueOld);
  358. if( m_pStrategy->RealOperate( record ) )
  359. Initialize( );
  360. else
  361. AfxMessageBox( IDS_SIMUREALOP_MODIFIEDCASHFAILED, MB_OK|MB_ICONINFORMATION );
  362. m_bModified = TRUE;
  363. }
  364. }
  365. /***
  366. 策略实战选股进度回调函数
  367. */
  368. BOOL CALLBACK RealRunCallback(DWORD dwType, DWORD dwValue,
  369. LPCTSTR lpszMsg, void *cookie)
  370. {
  371. HWND hWnd = (HWND)cookie;
  372. if( SIMULATION_PROGRESS == dwType )
  373. {
  374. ::SendMessage( hWnd, WM_USER_SIMULATION_PROGRESS, dwValue, (LPARAM)lpszMsg );
  375. }
  376. return TRUE;
  377. }
  378. /***
  379. 全部重来
  380. */
  381. void CSimuRealOp::OnResetall() 
  382. {
  383. // TODO: Add your control notification handler code here
  384. if( m_pStrategy && IDYES == AfxMessageBox(IDS_SIMUREALOP_RESETCONFIRM,MB_YESNO) )
  385. {
  386. CWaitDlg wait( AfxGetMainWnd(), FALSE );
  387. wait.SetProgressRange( 0, STRATEGY_MAX_PROGRESS );
  388. m_pStrategy->RealReset( );
  389. m_pStrategy->RealRun( RealRunCallback, wait.GetSafeHwnd() );
  390. wait.DestroyWindow();
  391. Initialize( );
  392. }
  393. }