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

金融证券系统

开发平台:

Visual C++

  1. // SimuView.cpp : implementation of the CSimuView class
  2. //
  3. #include "stdafx.h"
  4. #include "../StaticDoc.h"
  5. #include "SimuView.h"
  6. #include "Simulation.h"
  7. #include "../ParamDlg/SetParamDlg.h"
  8. #include "../Dialog/SimuAdvancedDlg.h"
  9. #include "../Dialog/SimuRealOp.h"
  10. #include <io.h>
  11. #include "..Dialogs.h"
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CSimuView
  19. #define SIMUVIEW_TIMER_WARNING 1
  20. IMPLEMENT_DYNCREATE(CSimuView, CFormView)
  21. BEGIN_MESSAGE_MAP(CSimuView, CFormView)
  22. //{{AFX_MSG_MAP(CSimuView)
  23. ON_WM_CREATE()
  24. ON_WM_SIZE()
  25. ON_WM_SETFOCUS()
  26. ON_WM_CTLCOLOR()
  27. ON_BN_CLICKED(IDC_SETPRPT, OnSetprpt)
  28. ON_BN_CLICKED(IDC_SELECTSTK, OnSelectstk)
  29. ON_BN_CLICKED(IDC_SETRULE, OnSetrule)
  30. ON_BN_CLICKED(IDC_SETRATE, OnSetrate)
  31. ON_BN_CLICKED(IDC_REPORT, OnReport)
  32. ON_BN_CLICKED(IDC_REALOP, OnRealOp)
  33. ON_BN_CLICKED(IDC_START, OnStart)
  34. ON_BN_CLICKED(IDC_STOP, OnStop)
  35. ON_NOTIFY(DTN_CLOSEUP, IDC_TIME_BEGIN, OnCloseupTimeBegin)
  36. ON_NOTIFY(DTN_CLOSEUP, IDC_TIME_END, OnCloseupTimeEnd)
  37. ON_WM_TIMER()
  38. ON_BN_CLICKED(IDC_ADVANCED, OnAdvanced)
  39. //}}AFX_MSG_MAP
  40. // Standard printing commands
  41. ON_MESSAGE(WM_USER_GETVIEWTITLE, OnGetViewTitle)
  42. ON_MESSAGE(WM_USER_GETVIEWCMDID, OnGetViewCmdid)
  43. ON_MESSAGE(WM_USER_CANCLOSEVIEW, OnCanCloseView)
  44. ON_MESSAGE(WM_USER_COLORCHANGE, OnColorChange)
  45. ON_MESSAGE(WM_USER_SIMULATION_YIELD, OnSimulationYield)
  46. ON_MESSAGE(WM_USER_SIMULATION_PROGRESS, OnSimulationProgress)
  47. ON_MESSAGE(WM_USER_SIMULATION_END, OnSimulationEnd)
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CSimuView construction/destruction
  51. CSimuView::CSimuView()
  52. : CFormView(CSimuView::IDD)
  53. {
  54. //{{AFX_DATA_INIT(CSimuView)
  55. m_strBuyMulti = _T("");
  56. m_tmBegin = 0;
  57. m_tmEnd = 0;
  58. m_nStartAmount = 0;
  59. m_strSellMulti = _T("");
  60. //}}AFX_DATA_INIT
  61. // TODO: add construction code here
  62. m_pStrategy = NULL;
  63. m_nStartAmount = 100;
  64. m_bDisableAllControls = FALSE;
  65. }
  66. CSimuView::~CSimuView()
  67. {
  68. }
  69. /***
  70. 初始化主数据类型ComboBox
  71. */
  72. BOOL CSimuView::InitComboMaindataType( )
  73. {
  74. m_comboMaindataType.ResetContent();
  75. int mdtype, nIndex, nSel = CB_ERR;
  76. for( mdtype = CKData::mdtypeMin; mdtype <= CKData::mdtypeMax; mdtype ++ )
  77. {
  78. nIndex = m_comboMaindataType.AddString( AfxGetMaindataTypeString(mdtype) );
  79. m_comboMaindataType.SetItemData( nIndex, mdtype );
  80. if( CKData::mdtypeClose == mdtype )
  81. nSel = nIndex;
  82. }
  83. m_comboMaindataType.SetCurSel( nSel );
  84. return TRUE;
  85. }
  86. /***
  87. 初始化买入逻辑选择ComboBox
  88. */
  89. BOOL CSimuView::InitComboBuyLogic( )
  90. {
  91. m_comboBuyLogic.ResetContent();
  92. int nLogic, nIndex, nSel = CB_ERR;
  93. for( nLogic = COpParam::logicMin; nLogic <= COpParam::logicMax; nLogic ++ )
  94. {
  95. nIndex = m_comboBuyLogic.AddString( AfxGetLogicString(nLogic) );
  96. m_comboBuyLogic.SetItemData( nIndex, nLogic );
  97. if( COpParam::logicAnd == nLogic )
  98. nSel = nIndex;
  99. }
  100. m_comboBuyLogic.SetCurSel( nSel );
  101. return TRUE;
  102. }
  103. /***
  104. 初始化买入信号ComboBox
  105. */
  106. BOOL CSimuView::InitComboBuyLimit( )
  107. {
  108. return ( m_comboBuyLimit.Initialize( )
  109. && m_comboBuyLimit.Select( ITSG_BUY ) );
  110. }
  111. /***
  112. 初始化卖出逻辑ComboBox
  113. */
  114. BOOL CSimuView::InitComboSellLogic( )
  115. {
  116. m_comboSellLogic.ResetContent();
  117. int nLogic, nIndex, nSel = CB_ERR;
  118. for( nLogic = COpParam::logicMin; nLogic <= COpParam::logicMax; nLogic ++ )
  119. {
  120. nIndex = m_comboSellLogic.AddString( AfxGetLogicString(nLogic) );
  121. m_comboSellLogic.SetItemData( nIndex, nLogic );
  122. if( COpParam::logicOr == nLogic )
  123. nSel = nIndex;
  124. }
  125. m_comboSellLogic.SetCurSel( nSel );
  126. return TRUE;
  127. }
  128. /***
  129. 初始化卖出信号ComboBox
  130. */
  131. BOOL CSimuView::InitComboSellLimit( )
  132. {
  133. return ( m_comboSellLimit.Initialize()
  134. && m_comboSellLimit.Select( ITSG_SELL ) );
  135. }
  136. /***
  137. 初始化操作仓位ComboBox
  138. */
  139. BOOL CSimuView::InitComboStoreDiv( )
  140. {
  141. m_comboStoreDiv.ResetContent();
  142. int nStoreDiv, nIndex, nSel = CB_ERR;
  143. for( nStoreDiv = COpParam::storedivMin; nStoreDiv <= COpParam::storedivMax; nStoreDiv ++ )
  144. {
  145. nIndex = m_comboStoreDiv.AddString( AfxGetStoreDivString(nStoreDiv) );
  146. m_comboStoreDiv.SetItemData( nIndex, nStoreDiv );
  147. if( COpParam::storedivThird == nStoreDiv )
  148. nSel = nIndex;
  149. }
  150. m_comboStoreDiv.SetCurSel( nSel );
  151. return TRUE;
  152. }
  153. /***
  154. 根据当前状态,使不能修改的控件变灰
  155. */
  156. BOOL CSimuView::EnableControls( )
  157. {
  158. if( !::IsWindow(m_btnStart.GetSafeHwnd())
  159. || !::IsWindow(m_btnSetPrpt.GetSafeHwnd())
  160. || !::IsWindow(m_btnSelectStk.GetSafeHwnd())
  161. || !::IsWindow(m_btnSetRate.GetSafeHwnd())
  162. || !::IsWindow(m_btnSetRule.GetSafeHwnd())
  163. || !::IsWindow(m_btnReport.GetSafeHwnd())
  164. || !::IsWindow(m_btnRealOp.GetSafeHwnd()) )
  165. return FALSE;
  166. CStrategy * pStrategy = GetStrategy( );
  167. BOOL bEnable = TRUE;
  168. CString strBtnStart;
  169. if( NULL == pStrategy )
  170. {
  171. bEnable = FALSE;
  172. strBtnStart.LoadString( IDS_SIMUVIEW_START );
  173. m_btnStart.SetWindowText( strBtnStart );
  174. m_btnStart.EnableWindow( FALSE );
  175. m_btnStop.EnableWindow( FALSE );
  176. m_staticYield.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  177. m_staticYield2.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  178. m_progress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  179. CString strWarning;
  180. strWarning.LoadString( IDS_SIMUVIEW_MSGNOSTRATEGY );
  181. m_staticWarning.SetWindowText( strWarning );
  182. }
  183. else if( pStrategy->SimuIsStatusInit() )
  184. {
  185. bEnable = TRUE;
  186. strBtnStart.LoadString( IDS_SIMUVIEW_START );
  187. m_btnStart.SetWindowText( strBtnStart );
  188. m_btnStart.EnableWindow( TRUE );
  189. m_btnStop.EnableWindow( FALSE );
  190. m_staticYield.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  191. m_staticYield2.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  192. m_progress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  193. }
  194. else if( pStrategy->SimuIsStatusRunning() )
  195. {
  196. bEnable = FALSE;
  197. strBtnStart.LoadString( IDS_SIMUVIEW_PAUSE );
  198. m_btnStart.SetWindowText( strBtnStart );
  199. m_btnStart.EnableWindow( TRUE );
  200. m_btnStop.EnableWindow( TRUE );
  201. m_staticYield.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  202. m_staticYield2.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  203. m_progress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  204. }
  205. else if( pStrategy->SimuIsStatusPaused() )
  206. {
  207. bEnable = FALSE;
  208. strBtnStart.LoadString( IDS_SIMUVIEW_CONTINUE );
  209. m_btnStart.SetWindowText( strBtnStart );
  210. m_btnStart.EnableWindow( TRUE );
  211. m_btnStop.EnableWindow( TRUE );
  212. m_staticYield.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  213. m_staticYield2.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  214. m_progress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  215. }
  216. else
  217. {
  218. bEnable = TRUE;
  219. strBtnStart.LoadString( IDS_SIMUVIEW_START );
  220. m_btnStart.SetWindowText( strBtnStart );
  221. m_btnStart.EnableWindow( TRUE );
  222. m_btnStop.EnableWindow( FALSE );
  223. m_staticYield.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  224. m_staticYield2.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  225. m_progress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  226. }
  227. if( m_bDisableAllControls )
  228. bEnable = FALSE;
  229. m_btnSetPrpt.EnableWindow( bEnable );
  230. m_btnSelectStk.EnableWindow( bEnable );
  231. m_btnSetRate.EnableWindow( bEnable );
  232. m_btnSetRule.EnableWindow( bEnable );
  233. m_btnReport.EnableWindow( bEnable );
  234. m_btnRealOp.EnableWindow( bEnable );
  235. m_comboKType.EnableWindow( bEnable );
  236. m_comboMaindataType.EnableWindow( bEnable );
  237. m_comboBuyLogic.EnableWindow( bEnable );
  238. m_comboBuyLimit.EnableWindow( bEnable );
  239. m_comboSellLogic.EnableWindow( bEnable );
  240. m_comboSellLimit.EnableWindow( bEnable );
  241. m_comboStoreDiv.EnableWindow( bEnable );
  242. m_btnAdvanced.EnableWindow( bEnable );
  243. m_editBuyMulti.EnableWindow( bEnable );
  244. m_editSellMulti.EnableWindow( bEnable );
  245. m_editStartAmount.EnableWindow( bEnable );
  246. m_tmctrlBegin.EnableWindow( bEnable );
  247. m_tmctrlEnd.EnableWindow( bEnable );
  248. if( !m_bDisableAllControls && pStrategy && pStrategy->SimuIsStatusPaused() )
  249. {
  250. m_btnReport.EnableWindow( TRUE );
  251. m_btnRealOp.EnableWindow( TRUE );
  252. }
  253. if( m_bDisableAllControls )
  254. {
  255. m_btnStart.EnableWindow( FALSE );
  256. m_btnStop.EnableWindow( FALSE );
  257. }
  258. return TRUE;
  259. }
  260. /***
  261. 重新初始化各个控件的初始选择
  262. */
  263. BOOL CSimuView::ClearData( )
  264. {
  265. // KType
  266. m_comboKType.InitializeDay( );
  267. // Maindata Type
  268. InitComboMaindataType( );
  269. // BuyLogic
  270. InitComboBuyLogic( );
  271. // Buy Rule
  272. InitComboBuyLimit( );
  273. // SellLogic
  274. InitComboSellLogic( );
  275. // Sell Rule
  276. InitComboSellLimit( );
  277. // StoreDiv
  278. InitComboStoreDiv( );
  279. m_editStockTech.SetWindowText( NULL );
  280. m_progress.SetRange( 0, STRATEGY_MAX_PROGRESS );
  281. m_progress.SetPos( 0 );
  282. return TRUE;
  283. }
  284. /***
  285. 通用函数,选择ComboBox的相应项
  286. */
  287. BOOL CSimuView::SelectComboItem( CComboBox & combo, DWORD dwData )
  288. {
  289. for( int i=0; i<combo.GetCount(); i++ )
  290. {
  291. if( dwData == combo.GetItemData(i) )
  292. {
  293. combo.SetCurSel(i);
  294. return TRUE;
  295. }
  296. }
  297. return FALSE;
  298. }
  299. CStrategy * CSimuView::GetStrategy( )
  300. {
  301. return m_pStrategy;
  302. }
  303. /***
  304. 是否能改变当前活动策略
  305. */
  306. BOOL CSimuView::CanChangeActiveStrategy( )
  307. {
  308. CStrategy * pStrategy = GetStrategy();
  309. if( pStrategy
  310. && pStrategy->SimuIsStatusRunning()
  311. && IDNO == AfxMessageBox( IDS_SIMUVIEW_RUNCANNOTCLOSE, MB_YESNO ) )
  312. {
  313. return FALSE;
  314. }
  315. if( pStrategy && pStrategy->SimuIsStatusRunning() )
  316. m_simulation.Pause();
  317. return StoreToStrategy( );
  318. }
  319. /***
  320. 当前活动策略换成了其他策略时,调用此函数
  321. */
  322. void CSimuView::OnActiveStrategyChanged( )
  323. {
  324. if( m_pStrategy )
  325. {
  326. m_pStrategy->ClearCache();
  327. StoreToStrategy( );
  328. m_pStrategy = NULL;
  329. }
  330. m_pStrategy = AfxGetActiveStrategy( );
  331. OnUpdate( NULL, UPDATE_HINT_SIMUVIEW_REREALRUN, NULL );
  332. }
  333. /***
  334. 将策略显示到策略视图中
  335. */
  336. BOOL CSimuView::LoadFromStrategy( )
  337. {
  338. ClearData( );
  339. CStrategy * pStrategy = GetStrategy( );
  340. // Set Title
  341. CString strTitle;
  342. strTitle.LoadString( IDS_SIMUVIEW_SIMU );
  343. if( pStrategy )
  344. strTitle = CString("[") + (LPCTSTR)pStrategy->GetName() + "]" + strTitle;
  345. m_staticTitle.SetWindowText( strTitle );
  346. m_staticWarning.SetWindowText( "" );
  347. if( NULL == pStrategy )
  348. return FALSE;
  349. m_editStockTech.SetWindowText( pStrategy->GetStockTechString( ) );
  350. COpParam & opparam = pStrategy->GetOpParam( );
  351. if( !opparam.IsValid() )
  352. opparam.SetDefaultOfInvalidMember();
  353. // KType
  354. if( !m_comboKType.Select( opparam.m_nKType ) )
  355. m_comboKType.InitializeDay();
  356. // MaindataType
  357. if( !SelectComboItem( m_comboMaindataType, opparam.m_nMaindataType ) )
  358. InitComboMaindataType( );
  359. // BuyLogic
  360. if( !SelectComboItem( m_comboBuyLogic, opparam.m_nBuyLogic ) )
  361. InitComboBuyLogic( );
  362. // BuyLimit
  363. if( !SelectComboItem( m_comboBuyLimit, opparam.m_nBuyLimit ) )
  364. InitComboBuyLimit( );
  365. // SellLogic
  366. if( !SelectComboItem( m_comboSellLogic, opparam.m_nSellLogic ) )
  367. InitComboSellLogic( );
  368. // SellLimit
  369. if( !SelectComboItem( m_comboSellLimit, opparam.m_nSellLimit ) )
  370. InitComboSellLimit( );
  371. // StoreDiv
  372. if( !SelectComboItem( m_comboStoreDiv, opparam.m_nStoreDiv ) )
  373. InitComboStoreDiv( );
  374. // Buy and Sell Multi
  375. m_strBuyMulti.Format( "%.2f", opparam.m_dBuyMulti * 100. );
  376. m_strSellMulti.Format( "%.2f", opparam.m_dSellMulti * 100 );
  377. // Start Amount
  378. m_nStartAmount = opparam.m_nStartAmount/10000;
  379. // Time
  380. CSPTime tmCurrent = CSPTime::GetCurrentTime();
  381. m_tmBegin = CSPTime(tmCurrent.GetYear(),tmCurrent.GetMonth(),tmCurrent.GetDay(),0,0,0,0);
  382. m_tmBegin = m_tmBegin - CSPTimeSpan( 365 * 3, 0, 0, 0 );
  383. m_tmEnd = CSPTime(tmCurrent.GetYear(),tmCurrent.GetMonth(),tmCurrent.GetDay(),23,59,59,0);
  384. m_tmEnd = m_tmEnd - CSPTimeSpan( 1, 0, 0, 0 );
  385. if( opparam.m_atmBegin.GetSize() > 0 )
  386. m_tmBegin = opparam.m_atmBegin.ElementAt(0).GetTime();
  387. if( opparam.m_atmEnd.GetSize() > 0 )
  388. m_tmEnd = opparam.m_atmEnd.ElementAt(0).GetTime();
  389. // TIMEZONES
  390. // Simulation
  391. m_simulation.SetStrategy( pStrategy, GetSafeHwnd() );
  392. SendMessage( WM_USER_SIMULATION_PROGRESS, pStrategy->SimuGetCurrentProgress(STRATEGY_MAX_PROGRESS), NULL );
  393. SendMessage( WM_USER_SIMULATION_YIELD, NULL, (LPARAM)(pStrategy->SimuGetCurrentYield()) );
  394. UpdateData( FALSE );
  395. EnableControls( );
  396. return TRUE;
  397. }
  398. /***
  399. 将策略视图中的策略选项保存到策略文件中
  400. */
  401. BOOL CSimuView::StoreToStrategy( )
  402. {
  403. UpdateData( );
  404. CStrategy * pStrategy = GetStrategy( );
  405. if( NULL == pStrategy )
  406. return TRUE;
  407. COpParam & opparam = pStrategy->GetOpParam( );
  408. if( !opparam.IsValid() )
  409. opparam.SetDefaultOfInvalidMember();
  410. // KType
  411. opparam.m_nKType = m_comboKType.GetSelect();
  412. // MaindataType
  413. opparam.m_nMaindataType = m_comboMaindataType.GetItemData(m_comboMaindataType.GetCurSel());
  414. // BuyLogic
  415. opparam.m_nBuyLogic = m_comboBuyLogic.GetItemData(m_comboBuyLogic.GetCurSel());
  416. // BuyLimit
  417. opparam.m_nBuyLimit = m_comboBuyLimit.GetItemData(m_comboBuyLimit.GetCurSel());
  418. // SellLogic
  419. opparam.m_nSellLogic = m_comboSellLogic.GetItemData(m_comboSellLogic.GetCurSel());
  420. // SellLimit
  421. opparam.m_nSellLimit = m_comboSellLimit.GetItemData(m_comboSellLimit.GetCurSel());
  422. // StoreDiv
  423. opparam.m_nStoreDiv = m_comboStoreDiv.GetItemData(m_comboStoreDiv.GetCurSel());
  424. // Buy and Sell Multi
  425. if( IsNumber(m_strBuyMulti,FALSE) )
  426. opparam.m_dBuyMulti = atof(m_strBuyMulti) / 100.;
  427. if( IsNumber(m_strSellMulti,FALSE) )
  428. opparam.m_dSellMulti = atof(m_strSellMulti) / 100.;
  429. // Start Amount
  430. opparam.m_nStartAmount = m_nStartAmount*10000;
  431. // Time
  432. m_tmBegin = CSPTime(m_tmBegin.GetYear(),m_tmBegin.GetMonth(),m_tmBegin.GetDay(),0,0,0,0);
  433. m_tmEnd = CSPTime(m_tmEnd.GetYear(),m_tmEnd.GetMonth(),m_tmEnd.GetDay(),23,59,59,0);
  434. opparam.m_atmBegin.RemoveAll();
  435. opparam.m_atmEnd.RemoveAll();
  436. opparam.m_atmBegin.Add( CSPTime(m_tmBegin.GetTime()) );
  437. opparam.m_atmEnd.Add( CSPTime(m_tmEnd.GetTime()) );
  438. // TIMEZONES
  439. if( !opparam.IsValid() || !IsNumber(m_strBuyMulti,FALSE) || !IsNumber(m_strSellMulti,FALSE) )
  440. {
  441. CString strMsg;
  442. strMsg.LoadString( IDS_SIMUVIEW_INVALIDDATA );
  443. strMsg = (LPCTSTR)pStrategy->GetName() + CString("  ") + strMsg;
  444. if( IDYES == AfxMessageBox( strMsg, MB_YESNO ) )
  445. {
  446. if( !IsNumber(m_strBuyMulti,FALSE) )
  447. opparam.m_dBuyMulti = 0;
  448. if( !IsNumber(m_strSellMulti,FALSE) )
  449. opparam.m_dSellMulti = 0;
  450. opparam.SetDefaultOfInvalidMember( );
  451. pStrategy->DoFileSave( );
  452. LoadFromStrategy( );
  453. return TRUE;
  454. }
  455. return FALSE;
  456. }
  457. else
  458. {
  459. pStrategy->DoFileSave( );
  460. return TRUE;
  461. }
  462. }
  463. void CSimuView::DoDataExchange(CDataExchange* pDX)
  464. {
  465. CFormView::DoDataExchange(pDX);
  466. //{{AFX_DATA_MAP(CSimuView)
  467. DDX_Control(pDX, IDC_SELLMULTI, m_editSellMulti);
  468. DDX_Control(pDX, IDC_ADVANCED, m_btnAdvanced);
  469. DDX_Control(pDX, IDC_STOCKTECH, m_editStockTech);
  470. DDX_Control(pDX, IDC_SELLLOGIC, m_comboSellLogic);
  471. DDX_Control(pDX, IDC_BUYLOGIC, m_comboBuyLogic);
  472. DDX_Control(pDX, IDC_STOP, m_btnStop);
  473. DDX_Control(pDX, IDC_STARTAMOUNT, m_editStartAmount);
  474. DDX_Control(pDX, IDC_STATICYIELD2, m_staticYield2);
  475. DDX_Control(pDX, IDC_STATICYIELD, m_staticYield);
  476. DDX_Control(pDX, IDC_TIME_BEGIN, m_tmctrlBegin);
  477. DDX_Control(pDX, IDC_TIME_END, m_tmctrlEnd);
  478. DDX_Control(pDX, IDC_STOREDIV, m_comboStoreDiv);
  479. DDX_Control(pDX, IDC_SELLLIMIT, m_comboSellLimit);
  480. DDX_Control(pDX, IDC_BUYMULTI, m_editBuyMulti);
  481. DDX_Control(pDX, IDC_BUYLIMIT, m_comboBuyLimit);
  482. DDX_Control(pDX, IDC_MAINDATATYPE, m_comboMaindataType);
  483. DDX_Control(pDX, IDC_STATICWARNING, m_staticWarning);
  484. DDX_Control(pDX, IDC_STATICTITLE, m_staticTitle);
  485. DDX_Control(pDX, IDC_REALOP, m_btnRealOp);
  486. DDX_Control(pDX, IDC_SETRULE, m_btnSetRule);
  487. DDX_Control(pDX, IDC_SETRATE, m_btnSetRate);
  488. DDX_Control(pDX, IDC_SETPRPT, m_btnSetPrpt);
  489. DDX_Control(pDX, IDC_REPORT, m_btnReport);
  490. DDX_Control(pDX, IDC_SELECTSTK, m_btnSelectStk);
  491. DDX_Control(pDX, IDC_START, m_btnStart);
  492. DDX_Control(pDX, IDC_PROGRESS, m_progress);
  493. DDX_Control(pDX, IDC_KTYPE, m_comboKType);
  494. DDX_Text(pDX, IDC_BUYMULTI, m_strBuyMulti);
  495. DDX_DateTimeCtrl(pDX, IDC_TIME_BEGIN, m_tmBegin);
  496. DDX_DateTimeCtrl(pDX, IDC_TIME_END, m_tmEnd);
  497. DDX_Text(pDX, IDC_STARTAMOUNT, m_nStartAmount);
  498. DDX_Text(pDX, IDC_SELLMULTI, m_strSellMulti);
  499. //}}AFX_DATA_MAP
  500. }
  501. BOOL CSimuView::PreCreateWindow(CREATESTRUCT& cs)
  502. {
  503. // TODO: Modify the Window class or styles here by modifying
  504. //  the CREATESTRUCT cs
  505. return CFormView::PreCreateWindow(cs);
  506. }
  507. void CSimuView::OnInitialUpdate()
  508. {
  509. CFormView::OnInitialUpdate();
  510. // GetParentFrame()->RecalcLayout();
  511. // ResizeParentToFit();
  512. // TODO: Add extra initialization here
  513. OnActiveStrategyChanged( );
  514. }
  515. void CSimuView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  516. {
  517. // TODO: Add your specialized code here and/or call the base class
  518. if( UPDATE_HINT_SIMUVIEW != lHint && UPDATE_HINT_SIMUVIEW_REREALRUN != lHint )
  519. return;
  520. if( IsWindowVisible() )
  521. SetFocus( );
  522. LoadFromStrategy( );
  523. if( m_pStrategy )
  524. {
  525. if( UPDATE_HINT_SIMUVIEW_REREALRUN == lHint )
  526. {
  527. CWaitDlg wait( AfxGetMainWnd(), FALSE );
  528. wait.SetProgressRange( 0, STRATEGY_MAX_PROGRESS );
  529. m_pStrategy->ClearCache();
  530. m_pStrategy->RealRun( RealRunCallback, wait.GetSafeHwnd() );
  531. wait.DestroyWindow();
  532. }
  533. if( m_pStrategy->RealGetNextOp().GetSize() > 0 )
  534. {
  535. CString strWarning;
  536. strWarning.LoadString( IDS_SIMUVIEW_REALHASNEXTOP );
  537. m_staticWarning.SetWindowText( strWarning );
  538. }
  539. else
  540. m_staticWarning.SetWindowText( "" );
  541. }
  542. }
  543. /////////////////////////////////////////////////////////////////////////////
  544. // CSimuView diagnostics
  545. #ifdef _DEBUG
  546. void CSimuView::AssertValid() const
  547. {
  548. CFormView::AssertValid();
  549. }
  550. void CSimuView::Dump(CDumpContext& dc) const
  551. {
  552. CFormView::Dump(dc);
  553. }
  554. #endif //_DEBUG
  555. /////////////////////////////////////////////////////////////////////////////
  556. // CSimuView message handlers
  557. int CSimuView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  558. {
  559. if (CFormView::OnCreate(lpCreateStruct) == -1)
  560. return -1;
  561. // TODO: Add your specialized creation code here
  562. SetTimer( SIMUVIEW_TIMER_WARNING, 250, NULL );
  563. return 0;
  564. }
  565. void CSimuView::OnTimer(UINT nIDEvent) 
  566. {
  567. // TODO: Add your message handler code here and/or call default
  568. if( SIMUVIEW_TIMER_WARNING == nIDEvent )
  569. {
  570. // 显示当前实战操作是否有操作
  571. static timercount = 0;
  572. timercount ++;
  573. if( timercount % 4 == 0 )
  574. {
  575. m_staticWarning.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  576. }
  577. else
  578. {
  579. m_staticWarning.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE );
  580. }
  581. }
  582. CFormView::OnTimer(nIDEvent);
  583. }
  584. void CSimuView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
  585. {
  586. // TODO: Add your specialized code here and/or call the base class
  587. CFormView::OnActivateView(bActivate, pActivateView, pDeactiveView);
  588. if( bActivate )
  589. EnableControls( );
  590. }
  591. void CSimuView::OnSize(UINT nType, int cx, int cy) 
  592. {
  593. // CSize sizeTotal( cx, cy );
  594. // SetScaleToFitSize( sizeTotal );
  595. CFormView::OnSize(nType, cx, cy);
  596. // TODO: Add your message handler code here
  597. }
  598. void CSimuView::OnSetFocus(CWnd* pOldWnd) 
  599. {
  600. CFormView::OnSetFocus(pOldWnd);
  601. // TODO: Add your message handler code here
  602. }
  603. LRESULT CSimuView::OnGetViewTitle(WPARAM wParam, LPARAM lParam)
  604. {
  605. CString strTitle;
  606. strTitle.LoadString( IDS_TITLE_SIMUVIEW );
  607. lstrcpyn((LPTSTR)lParam, (LPCTSTR)strTitle, wParam);
  608. if ((int)wParam > strTitle.GetLength())
  609. wParam = strTitle.GetLength();
  610. return wParam;
  611. }
  612. LRESULT CSimuView::OnGetViewCmdid(WPARAM wParam, LPARAM lParam)
  613. {
  614. if( lParam )
  615. *((LPARAM *)lParam) = ID_VIEW_SIMU;
  616. return 0L;
  617. }
  618. LRESULT CSimuView::OnCanCloseView(WPARAM wParam, LPARAM lParam)
  619. {
  620. if( lParam )
  621. *((BOOL *)lParam) = CanChangeActiveStrategy( );
  622. return 0L;
  623. }
  624. LRESULT CSimuView::OnColorChange(WPARAM wParam, LPARAM lParam)
  625. {
  626. Invalidate( );
  627. return 0L;
  628. }
  629. HBRUSH CSimuView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  630. {
  631. if( pDC )
  632. pDC->SetTextColor( AfxGetProfile().GetColor( CColorClass::clrSimuText ) );
  633. if( nCtlColor == CTLCOLOR_DLG
  634. || nCtlColor == CTLCOLOR_STATIC
  635. || nCtlColor == CTLCOLOR_MSGBOX )
  636. {
  637. if( nCtlColor == CTLCOLOR_STATIC )
  638. pDC->SetBkMode( TRANSPARENT );
  639. static CBrush brushBK;
  640. static COLORREF clrBKLast = RGB(255,255,255);
  641. COLORREF clrBKNow = AfxGetProfile().GetColor( CColorClass::clrSimuBK );
  642. if( NULL == brushBK.GetSafeHandle() || clrBKLast != clrBKNow )
  643. {
  644. brushBK.DeleteObject( );
  645. VERIFY( brushBK.CreateSolidBrush( clrBKNow ) );
  646. }
  647. clrBKLast = clrBKNow;
  648. return (HBRUSH)brushBK.GetSafeHandle();
  649. }
  650. return CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
  651. }
  652. /***
  653. 设定策略属性
  654. */
  655. void CSimuView::OnSetprpt() 
  656. {
  657. if( !StoreToStrategy( ) )
  658. return;
  659. ::PostMessage( AfxGetMainFrame()->GetSafeHwnd(), WM_COMMAND, ID_STRATEGY_PROPERTY, 0 );
  660. }
  661. /***
  662. 选择策略备选股票
  663. */
  664. void CSimuView::OnSelectstk() 
  665. {
  666. if( !StoreToStrategy( ) )
  667. return;
  668. ::PostMessage( AfxGetMainFrame()->GetSafeHwnd(), WM_COMMAND, ID_STRATEGY_STOCKS, 0 );
  669. }
  670. /***
  671. 设定策略指标
  672. */
  673. void CSimuView::OnSetrule() 
  674. {
  675. if( !StoreToStrategy( ) )
  676. return;
  677. ::PostMessage( AfxGetMainFrame()->GetSafeHwnd(), WM_COMMAND, ID_STRATEGY_SETRULE, 0 );
  678. }
  679. /***
  680. 设定交易费用
  681. */
  682. void CSimuView::OnSetrate() 
  683. {
  684. if( !StoreToStrategy( ) )
  685. return;
  686. ::PostMessage( AfxGetMainFrame()->GetSafeHwnd(), WM_COMMAND, ID_STRATEGY_SETRATE, 0 );
  687. }
  688. /***
  689. 显示策略模拟结果报表
  690. */
  691. void CSimuView::OnReport() 
  692. {
  693. if( !StoreToStrategy( ) )
  694. return;
  695. ::PostMessage( AfxGetMainFrame()->GetSafeHwnd(), WM_COMMAND, ID_STRATEGY_REPORT, 0 );
  696. }
  697. /***
  698. 显示策略实战操作
  699. */
  700. void CSimuView::OnRealOp() 
  701. {
  702. if( !StoreToStrategy( ) )
  703. return;
  704. ::PostMessage( AfxGetMainFrame()->GetSafeHwnd(), WM_COMMAND, ID_STRATEGY_REALOP, 0 );
  705. }
  706. /***
  707. 策略高级条件
  708. */
  709. void CSimuView::OnAdvanced() 
  710. {
  711. if( !StoreToStrategy( ) )
  712. return;
  713. CStrategy * pStrategy = GetStrategy( );
  714. if( pStrategy )
  715. {
  716. CSimuAdvancedDlg advanced;
  717. advanced.SetStrategy( pStrategy );
  718. advanced.DoModal();
  719. pStrategy->DoFileSave( );
  720. //AfxOnStrategyUpdated( pStrategy, advanced.m_bModified );
  721. }
  722. }
  723. /***
  724. 开始模拟或者暂停模拟
  725. */
  726. void CSimuView::OnStart() 
  727. {
  728. if( !StoreToStrategy( ) )
  729. return;
  730. CStrategy * pStrategy = GetStrategy( );
  731. if( NULL == pStrategy )
  732. return;
  733. pStrategy->DoFileSave();
  734. m_bDisableAllControls = TRUE;
  735. EnableControls( );
  736. if( pStrategy->SimuIsStatusPaused() )
  737. {
  738. m_simulation.Continue( );
  739. }
  740. else if( pStrategy->SimuIsStatusRunning() )
  741. {
  742. m_simulation.Pause( );
  743. }
  744. else
  745. {
  746. m_simulation.Restart( );
  747. }
  748. m_bDisableAllControls = FALSE;
  749. EnableControls( );
  750. }
  751. /***
  752. 停止并清楚结果
  753. */
  754. void CSimuView::OnStop() 
  755. {
  756. // TODO: Add your control notification handler code here
  757. m_bDisableAllControls = TRUE;
  758. EnableControls( );
  759. m_simulation.Stop( );
  760. m_bDisableAllControls = FALSE;
  761. EnableControls( );
  762. }
  763. /***
  764. 策略模拟进度消息响应
  765. */
  766. LRESULT CSimuView::OnSimulationProgress(WPARAM wParam, LPARAM lParam)
  767. {
  768. if( wParam < 0 )
  769. wParam = 0;
  770. if( wParam > STRATEGY_MAX_PROGRESS )
  771. wParam = STRATEGY_MAX_PROGRESS;
  772. if( ::IsWindow( m_progress.GetSafeHwnd() ) )
  773. m_progress.SetPos( wParam );
  774. return 1;
  775. }
  776. /***
  777. 策略模拟收益消息响应
  778. */
  779. LRESULT CSimuView::OnSimulationYield(WPARAM wParam, LPARAM lParam)
  780. {
  781. if( lParam < 0 )
  782. lParam = 0;
  783. if( !::IsWindow( m_staticYield2.GetSafeHwnd() ) )
  784. return 1;
  785. CString strYieldNew;
  786. strYieldNew.Format( "%.2f%%", 100.*(lParam-STRATEGY_BASEF_YIELD)/STRATEGY_BASEF_YIELD );
  787. CString strYieldOld;
  788. m_staticYield2.GetWindowText( strYieldOld );
  789. if( 0 != strYieldNew.Compare( strYieldOld ) )
  790. m_staticYield2.SetWindowText( strYieldNew );
  791. return 1;
  792. }
  793. /***
  794. 策略模拟结束消息响应
  795. */
  796. LRESULT CSimuView::OnSimulationEnd(WPARAM wParam, LPARAM lParam)
  797. {
  798. BOOL bFinished = wParam;
  799. m_simulation.OnEnd( bFinished );
  800. if( bFinished )
  801. {
  802. if( ::IsWindow( m_progress.GetSafeHwnd() ) )
  803. m_progress.SetPos( STRATEGY_MAX_PROGRESS );
  804. }
  805. EnableControls( );
  806. return 1;
  807. }
  808. /***
  809. 策略模拟开始时间选定消息响应
  810. */
  811. void CSimuView::OnCloseupTimeBegin(NMHDR* pNMHDR, LRESULT* pResult) 
  812. {
  813. // TODO: Add your control notification handler code here
  814. CSPTime tmOld = m_tmBegin;
  815. UpdateData( );
  816. if( m_tmBegin >= m_tmEnd )
  817. {
  818. AfxMessageBox( IDS_SIMUVIEW_TIMEINVALID, MB_OK|MB_ICONINFORMATION );
  819. m_tmBegin = tmOld;
  820. }
  821. if( m_tmBegin >= m_tmEnd )
  822. m_tmBegin = m_tmEnd;
  823. UpdateData( FALSE );
  824. *pResult = 0;
  825. }
  826. /***
  827. 策略模拟结束时间选定消息响应
  828. */
  829. void CSimuView::OnCloseupTimeEnd(NMHDR* pNMHDR, LRESULT* pResult) 
  830. {
  831. // TODO: Add your control notification handler code here
  832. CSPTime tmOld = m_tmEnd;
  833. UpdateData( );
  834. if( m_tmEnd < m_tmBegin )
  835. {
  836. AfxMessageBox( IDS_SIMUVIEW_TIMEINVALID, MB_OK|MB_ICONINFORMATION );
  837. m_tmEnd = tmOld;
  838. }
  839. if( m_tmEnd < m_tmBegin )
  840. m_tmEnd = m_tmBegin;
  841. UpdateData( FALSE );
  842. *pResult = 0;
  843. }