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

金融证券系统

开发平台:

Visual C++

  1. // DrawTech.cpp : implementation of the CStockGraph class
  2. //
  3. #include "stdafx.h"
  4. #include "StockGraph.h"
  5. #include <math.h>
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. ////////////////////////////////////////////////////////////
  12. // Draw Technical Utilities
  13. COLORREF GetLineColor( int nIndex )
  14. {
  15. int nColor = nIndex % 6;
  16. if( 0 == nColor )
  17. return AfxGetProfile().GetColor(CColorClass::clrLine1);
  18. else if( 1 == nColor )
  19. return AfxGetProfile().GetColor(CColorClass::clrLine2);
  20. else if( 2 == nColor )
  21. return AfxGetProfile().GetColor(CColorClass::clrLine3);
  22. else if( 3 == nColor )
  23. return AfxGetProfile().GetColor(CColorClass::clrLine4);
  24. else if( 4 == nColor )
  25. return AfxGetProfile().GetColor(CColorClass::clrLine5);
  26. else
  27. return AfxGetProfile().GetColor(CColorClass::clrLine6);
  28. }
  29. void CStockGraph::DrawTechUtil( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
  30.    int nTech, CTechnique * pTech, CKData * pKData, CSPDWordArray & adwDays )
  31. {
  32. CHECK_NODATATODRAW
  33. DECLARE_COLOR_DEFINATION
  34. // Draw Sub Title, Param Value
  35. if( bDrawTitle )
  36. {
  37. pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );
  38. DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  39. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  40. pDC->SetBkColor( clrBK );
  41. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
  42. double dParam = dMin;
  43. CString strText;
  44. for( int k=0; k<adwDays.GetSize(); k++ )
  45. {
  46. if( pTech->Calculate( &dParam, nIndexParam, adwDays[k], FALSE ) )
  47. {
  48. strText.Format( "%d%s %.2f", adwDays[k], (LPCTSTR)(AfxGetSTTShortName(nTech)), dParam );
  49. pDC->SetTextColor( GetLineColor( k ) );
  50. if( rect.left+m_nWidthSubtitle+(k+1)*m_nWidthParameter > rect.right )
  51. break;
  52. pDC->TextOut( rect.left+m_nWidthSubtitle+k*m_nWidthParameter, rect.top+1, strText );
  53. }
  54. }
  55. pDC->SelectObject( pOldFont );
  56. return;
  57. }
  58. if( dMax - dMin < 1e-4 )
  59. return;
  60. // Draw
  61. for( int k=0; k<adwDays.GetSize(); k++ )
  62. {
  63. int yLast, yNow;
  64. BOOL bHasLast = FALSE;
  65. double dNow = dMin;
  66. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  67. {
  68. // Prepare Rect 
  69. CRect rectK;
  70. long xMedium = 0;
  71. if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
  72. continue;
  73. // Draw
  74. if( pTech->Calculate( &dNow, nIndex, adwDays[k], bHasLast ) )
  75. {
  76. yNow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow  - dMin) / (dMax-dMin) );
  77. if( bHasLast )
  78. {
  79. if( yLast > rect.bottom || yLast < rect.top+m_nHeightSubtitle
  80. || yNow > rect.bottom || yNow < rect.top+m_nHeightSubtitle )
  81. continue;
  82. CPen penLocal( PS_SOLID, 1, GetLineColor(k) );
  83. CPen * pOldPen = pDC->SelectObject( &penLocal );
  84. pDC->MoveTo( xMedium-m_nThickness, yLast );
  85. pDC->LineTo( xMedium, yNow );
  86. pDC->SelectObject( pOldPen );
  87. }
  88. yLast = yNow;
  89. bHasLast = TRUE;
  90. }
  91. }
  92. }
  93. }
  94. void CStockGraph::DrawTechUtil1( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
  95.    int nTech, CTechnique * pTech, CKData * pKData,
  96.    COLORREF clrLine, int nDrawTechType )
  97. {
  98. CHECK_NODATATODRAW
  99. DECLARE_COLOR_DEFINATION
  100. ASSERT( drawtechtype_line == nDrawTechType || drawtechtype_dot == nDrawTechType );
  101. // Draw Sub Title, Param Value
  102. if( bDrawTitle )
  103. {
  104. pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );
  105. DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  106. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  107. pDC->SetBkColor( clrBK );
  108. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
  109. double dParam = dMin;
  110. CString strText;
  111. if( pTech->Calculate( &dParam, nIndexParam, FALSE ) )
  112. {
  113. strText.Format( "%s  %.2f", (LPCTSTR)(AfxGetSTTShortName(nTech)), dParam );
  114. pDC->SetTextColor( clrLine );
  115. if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
  116. pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
  117. }
  118. pDC->SelectObject( pOldFont );
  119. return;
  120. }
  121. if( dMax - dMin < 1e-4 )
  122. return;
  123. // Draw
  124. int yLast, yNow;
  125. BOOL bHasLast = FALSE;
  126. double dNow = dMin;
  127. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  128. {
  129. // Prepare Rect 
  130. CRect rectK;
  131. long xMedium = 0;
  132. if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
  133. continue;
  134. // Draw
  135. if( pTech->Calculate( &dNow, nIndex, bHasLast ) )
  136. {
  137. yNow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow  - dMin) / (dMax-dMin) );
  138. if( bHasLast )
  139. {
  140. if( yLast > rect.bottom || yLast < rect.top+m_nHeightSubtitle
  141. || yNow > rect.bottom || yNow < rect.top+m_nHeightSubtitle )
  142. continue;
  143. CPen penLocal( PS_SOLID, 1, clrLine );
  144. CPen * pOldPen = pDC->SelectObject( &penLocal );
  145. if( drawtechtype_line == nDrawTechType )
  146. {
  147. pDC->MoveTo( xMedium-m_nThickness, yLast );
  148. pDC->LineTo( xMedium, yNow );
  149. }
  150. else if( drawtechtype_dot == nDrawTechType )
  151. {
  152. pDC->Ellipse( xMedium-2, yNow-2, xMedium+2, yNow+2 );
  153. }
  154. pDC->SelectObject( pOldPen );
  155. }
  156. yLast = yNow;
  157. bHasLast = TRUE;
  158. }
  159. }
  160. }
  161. void CStockGraph::DrawTechUtil2( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
  162.    int nTech, CTechnique * pTech, CKData * pKData,
  163.    COLORREF clrLine1, COLORREF clrLine2,
  164.    CString strTitle1, CString strTitle2 )
  165. {
  166. CHECK_NODATATODRAW
  167. DECLARE_COLOR_DEFINATION
  168. // Draw Sub Title, Param Value
  169. if( bDrawTitle )
  170. {
  171. pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );
  172. DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  173. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  174. pDC->SetBkColor( clrBK );
  175. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
  176. double dParam1 = dMin, dParam2 = dMin;
  177. CString strText;
  178. if( pTech->Calculate( &dParam1, &dParam2, nIndexParam, FALSE ) )
  179. {
  180. strText.Format( "%s %.2f", strTitle1, dParam1 );
  181. pDC->SetTextColor( clrLine1 );
  182. if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
  183. pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
  184. strText.Format( "%s %.2f", strTitle2, dParam2 );
  185. pDC->SetTextColor( clrLine2 );
  186. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*2 < rect.right )
  187. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter, rect.top+1, strText );
  188. }
  189. pDC->SelectObject( pOldFont );
  190. return;
  191. }
  192. if( dMax - dMin < 1e-4 )
  193. return;
  194. // Draw
  195. int yLast1, yNow1, yLast2, yNow2;
  196. BOOL bHasLast = FALSE;
  197. double dNow1 = dMin, dNow2 = dMin;
  198. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  199. {
  200. // Prepare Rect 
  201. CRect rectK;
  202. long xMedium = 0;
  203. if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
  204. continue;
  205. // Draw
  206. if( pTech->Calculate( &dNow1, &dNow2, nIndex, bHasLast ) )
  207. {
  208. yNow1 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow1 - dMin) / (dMax-dMin) );
  209. yNow2 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow2 - dMin) / (dMax-dMin) );
  210. if( bHasLast )
  211. {
  212. if( yLast1 > rect.bottom || yLast1 < rect.top+m_nHeightSubtitle
  213. || yNow1 > rect.bottom || yNow1 < rect.top+m_nHeightSubtitle )
  214. continue;
  215. if( yLast2 > rect.bottom || yLast2 < rect.top+m_nHeightSubtitle
  216. || yNow2 > rect.bottom || yNow2 < rect.top+m_nHeightSubtitle )
  217. continue;
  218. CPen penLocal1( PS_SOLID, 1, clrLine1 );
  219. CPen * pOldPen = pDC->SelectObject( &penLocal1 );
  220. pDC->MoveTo( xMedium-m_nThickness, yLast1 );
  221. pDC->LineTo( xMedium, yNow1 );
  222. CPen penLocal2( PS_SOLID, 1, clrLine2 );
  223. pDC->SelectObject( &penLocal2 );
  224. pDC->MoveTo( xMedium-m_nThickness, yLast2 );
  225. pDC->LineTo( xMedium, yNow2 );
  226. pDC->SelectObject( pOldPen );
  227. }
  228. yLast1 = yNow1;
  229. yLast2 = yNow2;
  230. bHasLast = TRUE;
  231. }
  232. }
  233. }
  234. void CStockGraph::DrawTechUtil3( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
  235.    int nTech, CTechnique * pTech, CKData * pKData,
  236.    COLORREF clrLine1, COLORREF clrLine2, COLORREF clrLine3,
  237.    CString strTitle1, CString strTitle2, CString strTitle3 )
  238. {
  239. CHECK_NODATATODRAW
  240. DECLARE_COLOR_DEFINATION
  241. // Draw Sub Title, Param Value
  242. if( bDrawTitle )
  243. {
  244. pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );
  245. DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  246. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  247. pDC->SetBkColor( clrBK );
  248. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
  249. double dParam1 = dMin, dParam2 = dMin, dParam3 = dMin;
  250. CString strText;
  251. if( pTech->Calculate( &dParam1, &dParam2, &dParam3, nIndexParam, FALSE ) )
  252. {
  253. strText.Format( "%s %.2f", strTitle1, dParam1 );
  254. pDC->SetTextColor( clrLine1 );
  255. if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
  256. pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
  257. strText.Format( "%s %.2f", strTitle2, dParam2 );
  258. pDC->SetTextColor( clrLine2 );
  259. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*2 < rect.right )
  260. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter, rect.top+1, strText );
  261. strText.Format( "%s %.2f", strTitle3, dParam3 );
  262. pDC->SetTextColor( clrLine3 );
  263. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*3 < rect.right )
  264. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*2, rect.top+1, strText );
  265. }
  266. pDC->SelectObject( pOldFont );
  267. return;
  268. }
  269. if( dMax - dMin < 1e-4 )
  270. return;
  271. // Draw
  272. int yLast1, yNow1, yLast2, yNow2, yLast3, yNow3;
  273. BOOL bHasLast = FALSE;
  274. double dNow1 = dMin, dNow2 = dMin, dNow3 = dMin;
  275. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  276. {
  277. // Prepare Rect 
  278. CRect rectK;
  279. long xMedium = 0;
  280. if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
  281. continue;
  282. // Draw
  283. if( pTech->Calculate( &dNow1, &dNow2, &dNow3, nIndex, bHasLast ) )
  284. {
  285. yNow1 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow1 - dMin) / (dMax-dMin) );
  286. yNow2 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow2 - dMin) / (dMax-dMin) );
  287. yNow3 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow3 - dMin) / (dMax-dMin) );
  288. if( bHasLast )
  289. {
  290. if( yLast1 > rect.bottom || yLast1 < rect.top+m_nHeightSubtitle
  291. || yNow1 > rect.bottom || yNow1 < rect.top+m_nHeightSubtitle )
  292. continue;
  293. if( yLast2 > rect.bottom || yLast2 < rect.top+m_nHeightSubtitle
  294. || yNow2 > rect.bottom || yNow2 < rect.top+m_nHeightSubtitle )
  295. continue;
  296. if( yLast3 > rect.bottom || yLast3 < rect.top+m_nHeightSubtitle
  297. || yNow3 > rect.bottom || yNow3 < rect.top+m_nHeightSubtitle )
  298. continue;
  299. CPen penLocal1( PS_SOLID, 1, clrLine1 );
  300. CPen * pOldPen = pDC->SelectObject( &penLocal1 );
  301. pDC->MoveTo( xMedium-m_nThickness, yLast1 );
  302. pDC->LineTo( xMedium, yNow1 );
  303. CPen penLocal2( PS_SOLID, 1, clrLine2 );
  304. pDC->SelectObject( &penLocal2 );
  305. pDC->MoveTo( xMedium-m_nThickness, yLast2 );
  306. pDC->LineTo( xMedium, yNow2 );
  307. CPen penLocal3( PS_SOLID, 1, clrLine3 );
  308. pDC->SelectObject( &penLocal3 );
  309. pDC->MoveTo( xMedium-m_nThickness, yLast3 );
  310. pDC->LineTo( xMedium, yNow3 );
  311. pDC->SelectObject( pOldPen );
  312. }
  313. yLast1 = yNow1;
  314. yLast2 = yNow2;
  315. yLast3 = yNow3;
  316. bHasLast = TRUE;
  317. }
  318. }
  319. }
  320. void CStockGraph::DrawTechUtil4( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
  321.    int nTech, CTechnique * pTech, CKData * pKData,
  322.    COLORREF clrLine1, COLORREF clrLine2, COLORREF clrLine3, COLORREF clrLine4,
  323.    CString strTitle1, CString strTitle2, CString strTitle3, CString strTitle4 )
  324. {
  325. CHECK_NODATATODRAW
  326. DECLARE_COLOR_DEFINATION
  327. // Draw Sub Title, Param Value
  328. if( bDrawTitle )
  329. {
  330. pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );
  331. DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  332. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  333. pDC->SetBkColor( clrBK );
  334. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
  335. double dParam1 = dMin, dParam2 = dMin, dParam3 = dMin, dParam4 = dMin;
  336. CString strText;
  337. if( pTech->Calculate( &dParam1, &dParam2, &dParam3, &dParam4, nIndexParam, FALSE ) )
  338. {
  339. strText.Format( "%s %.2f", strTitle1, dParam1 );
  340. pDC->SetTextColor( clrLine1 );
  341. if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
  342. pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
  343. strText.Format( "%s %.2f", strTitle2, dParam2 );
  344. pDC->SetTextColor( clrLine2 );
  345. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*2 < rect.right )
  346. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter, rect.top+1, strText );
  347. strText.Format( "%s %.2f", strTitle3, dParam3 );
  348. pDC->SetTextColor( clrLine3 );
  349. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*3 < rect.right )
  350. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*2, rect.top+1, strText );
  351. strText.Format( "%s %.2f", strTitle4, dParam4 );
  352. pDC->SetTextColor( clrLine4 );
  353. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*4 < rect.right )
  354. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*3, rect.top+1, strText );
  355. }
  356. pDC->SelectObject( pOldFont );
  357. return;
  358. }
  359. if( dMax - dMin < 1e-4 )
  360. return;
  361. // Draw
  362. int yLast1, yNow1, yLast2, yNow2, yLast3, yNow3, yLast4, yNow4;
  363. BOOL bHasLast = FALSE;
  364. double dNow1 = dMin, dNow2 = dMin, dNow3 = dMin, dNow4 = dMin;
  365. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  366. {
  367. // Prepare Rect 
  368. CRect rectK;
  369. long xMedium = 0;
  370. if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
  371. continue;
  372. // Draw
  373. if( pTech->Calculate( &dNow1, &dNow2, &dNow3, &dNow4, nIndex, bHasLast ) )
  374. {
  375. yNow1 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow1 - dMin) / (dMax-dMin) );
  376. yNow2 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow2 - dMin) / (dMax-dMin) );
  377. yNow3 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow3 - dMin) / (dMax-dMin) );
  378. yNow4 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow4 - dMin) / (dMax-dMin) );
  379. if( bHasLast )
  380. {
  381. if( yLast1 > rect.bottom || yLast1 < rect.top+m_nHeightSubtitle
  382. || yNow1 > rect.bottom || yNow1 < rect.top+m_nHeightSubtitle )
  383. continue;
  384. if( yLast2 > rect.bottom || yLast2 < rect.top+m_nHeightSubtitle
  385. || yNow2 > rect.bottom || yNow2 < rect.top+m_nHeightSubtitle )
  386. continue;
  387. if( yLast3 > rect.bottom || yLast3 < rect.top+m_nHeightSubtitle
  388. || yNow3 > rect.bottom || yNow3 < rect.top+m_nHeightSubtitle )
  389. continue;
  390. if( yLast4 > rect.bottom || yLast4 < rect.top+m_nHeightSubtitle
  391. || yNow4 > rect.bottom || yNow4 < rect.top+m_nHeightSubtitle )
  392. continue;
  393. CPen penLocal1( PS_SOLID, 1, clrLine1 );
  394. CPen * pOldPen = pDC->SelectObject( &penLocal1 );
  395. pDC->MoveTo( xMedium-m_nThickness, yLast1 );
  396. pDC->LineTo( xMedium, yNow1 );
  397. CPen penLocal2( PS_SOLID, 1, clrLine2 );
  398. pDC->SelectObject( &penLocal2 );
  399. pDC->MoveTo( xMedium-m_nThickness, yLast2 );
  400. pDC->LineTo( xMedium, yNow2 );
  401. CPen penLocal3( PS_SOLID, 1, clrLine3 );
  402. pDC->SelectObject( &penLocal3 );
  403. pDC->MoveTo( xMedium-m_nThickness, yLast3 );
  404. pDC->LineTo( xMedium, yNow3 );
  405. CPen penLocal4( PS_SOLID, 1, clrLine4 );
  406. pDC->SelectObject( &penLocal4 );
  407. pDC->MoveTo( xMedium-m_nThickness, yLast4 );
  408. pDC->LineTo( xMedium, yNow4 );
  409. pDC->SelectObject( pOldPen );
  410. }
  411. yLast1 = yNow1;
  412. yLast2 = yNow2;
  413. yLast3 = yNow3;
  414. yLast4 = yNow4;
  415. bHasLast = TRUE;
  416. }
  417. }
  418. }
  419. void CStockGraph::DrawTechUtil5( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
  420.    int nTech, CTechnique * pTech, CKData * pKData,
  421.    COLORREF clrLine1, COLORREF clrLine2, COLORREF clrLine3, COLORREF clrLine4, COLORREF clrLine5,
  422.    CString strTitle1, CString strTitle2, CString strTitle3, CString strTitle4, CString strTitle5 )
  423. {
  424. CHECK_NODATATODRAW
  425. DECLARE_COLOR_DEFINATION
  426. // Draw Sub Title, Param Value
  427. if( bDrawTitle )
  428. {
  429. pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );
  430. DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  431. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  432. pDC->SetBkColor( clrBK );
  433. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
  434. double dParam1 = dMin, dParam2 = dMin, dParam3 = dMin, dParam4 = dMin, dParam5 = dMin;
  435. CString strText;
  436. if( pTech->Calculate( &dParam1, &dParam2, &dParam3, &dParam4, &dParam5, nIndexParam, FALSE ) )
  437. {
  438. strText.Format( "%s %.2f", strTitle1, dParam1 );
  439. pDC->SetTextColor( clrLine1 );
  440. if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
  441. pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
  442. strText.Format( "%s %.2f", strTitle2, dParam2 );
  443. pDC->SetTextColor( clrLine2 );
  444. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*2 < rect.right )
  445. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter, rect.top+1, strText );
  446. strText.Format( "%s %.2f", strTitle3, dParam3 );
  447. pDC->SetTextColor( clrLine3 );
  448. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*3 < rect.right )
  449. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*2, rect.top+1, strText );
  450. strText.Format( "%s %.2f", strTitle4, dParam4 );
  451. pDC->SetTextColor( clrLine4 );
  452. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*4 < rect.right )
  453. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*3, rect.top+1, strText );
  454. strText.Format( "%s %.2f", strTitle5, dParam5 );
  455. pDC->SetTextColor( clrLine5 );
  456. if( rect.left+m_nWidthSubtitle+m_nWidthParameter*5 < rect.right )
  457. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*4, rect.top+1, strText );
  458. }
  459. pDC->SelectObject( pOldFont );
  460. return;
  461. }
  462. if( dMax - dMin < 1e-4 )
  463. return;
  464. // Draw
  465. int yLast1, yNow1, yLast2, yNow2, yLast3, yNow3, yLast4, yNow4, yLast5, yNow5;
  466. BOOL bHasLast = FALSE;
  467. double dNow1 = dMin, dNow2 = dMin, dNow3 = dMin, dNow4 = dMin, dNow5 = dMin;
  468. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  469. {
  470. // Prepare Rect 
  471. CRect rectK;
  472. long xMedium = 0;
  473. if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
  474. continue;
  475. // Draw
  476. if( pTech->Calculate( &dNow1, &dNow2, &dNow3, &dNow4, &dNow5, nIndex, bHasLast ) )
  477. {
  478. yNow1 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow1 - dMin) / (dMax-dMin) );
  479. yNow2 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow2 - dMin) / (dMax-dMin) );
  480. yNow3 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow3 - dMin) / (dMax-dMin) );
  481. yNow4 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow4 - dMin) / (dMax-dMin) );
  482. yNow5 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow5 - dMin) / (dMax-dMin) );
  483. if( bHasLast )
  484. {
  485. if( yLast1 > rect.bottom || yLast1 < rect.top+m_nHeightSubtitle
  486. || yNow1 > rect.bottom || yNow1 < rect.top+m_nHeightSubtitle )
  487. continue;
  488. if( yLast2 > rect.bottom || yLast2 < rect.top+m_nHeightSubtitle
  489. || yNow2 > rect.bottom || yNow2 < rect.top+m_nHeightSubtitle )
  490. continue;
  491. if( yLast3 > rect.bottom || yLast3 < rect.top+m_nHeightSubtitle
  492. || yNow3 > rect.bottom || yNow3 < rect.top+m_nHeightSubtitle )
  493. continue;
  494. if( yLast4 > rect.bottom || yLast4 < rect.top+m_nHeightSubtitle
  495. || yNow4 > rect.bottom || yNow4 < rect.top+m_nHeightSubtitle )
  496. continue;
  497. if( yLast5 > rect.bottom || yLast5 < rect.top+m_nHeightSubtitle
  498. || yNow5 > rect.bottom || yNow5 < rect.top+m_nHeightSubtitle )
  499. continue;
  500. CPen penLocal1( PS_SOLID, 1, clrLine1 );
  501. CPen * pOldPen = pDC->SelectObject( &penLocal1 );
  502. pDC->MoveTo( xMedium-m_nThickness, yLast1 );
  503. pDC->LineTo( xMedium, yNow1 );
  504. CPen penLocal2( PS_SOLID, 1, clrLine2 );
  505. pDC->SelectObject( &penLocal2 );
  506. pDC->MoveTo( xMedium-m_nThickness, yLast2 );
  507. pDC->LineTo( xMedium, yNow2 );
  508. CPen penLocal3( PS_SOLID, 1, clrLine3 );
  509. pDC->SelectObject( &penLocal3 );
  510. pDC->MoveTo( xMedium-m_nThickness, yLast3 );
  511. pDC->LineTo( xMedium, yNow3 );
  512. CPen penLocal4( PS_SOLID, 1, clrLine4 );
  513. pDC->SelectObject( &penLocal4 );
  514. pDC->MoveTo( xMedium-m_nThickness, yLast4 );
  515. pDC->LineTo( xMedium, yNow4 );
  516. CPen penLocal5( PS_SOLID, 1, clrLine5 );
  517. pDC->SelectObject( &penLocal5 );
  518. pDC->MoveTo( xMedium-m_nThickness, yLast5 );
  519. pDC->LineTo( xMedium, yNow5 );
  520. pDC->SelectObject( pOldPen );
  521. }
  522. yLast1 = yNow1;
  523. yLast2 = yNow2;
  524. yLast3 = yNow3;
  525. yLast4 = yNow4;
  526. yLast5 = yNow5;
  527. bHasLast = TRUE;
  528. }
  529. }
  530. }
  531. ////////////////////////////////////////////////////////////
  532. // KLine Technical Attributes
  533. void CStockGraph::DrawTechMA( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
  534. {
  535. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  536. m_techparam.ma.AttachParameters( AfxGetProfile().GetTechParameters().ma );
  537. DrawTechUtil( pDC, rect, bDrawTitle, dMin, dMax, STT_MA, &(m_techparam.ma), &kdata, m_techparam.ma.m_adwMADays );
  538. }
  539. void CStockGraph::DrawTechBBI( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
  540. {
  541. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  542. m_techparam.bbi.AttachParameters( AfxGetProfile().GetTechParameters().bbi );
  543. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_BBI, &(m_techparam.bbi), &kdata,
  544. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  545. }
  546. void CStockGraph::DrawTechBOLL( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
  547. {
  548. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  549. m_techparam.boll.AttachParameters( AfxGetProfile().GetTechParameters().boll );
  550. DrawTechUtil3( pDC, rect, bDrawTitle, dMin, dMax, STT_BOLL, &(m_techparam.boll), &kdata,
  551. AfxGetProfile().GetColor(CColorClass::clrPlane),
  552. AfxGetProfile().GetColor(CColorClass::clrRise),
  553. AfxGetProfile().GetColor(CColorClass::clrFall),
  554. "MB", "UP", "DOWN");
  555. }
  556. void CStockGraph::DrawTechPV( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
  557. {
  558. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  559. m_techparam.pv.AttachParameters( AfxGetProfile().GetTechParameters().pv );
  560. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_PV, &(m_techparam.pv), &kdata,
  561. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  562. }
  563. void CStockGraph::DrawTechSAR( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
  564. {
  565. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  566. m_techparam.sar.AttachParameters( AfxGetProfile().GetTechParameters().sar );
  567. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_SAR, &(m_techparam.sar), &kdata,
  568. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_dot );
  569. }
  570. void CStockGraph::DrawTechDJ( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
  571. {
  572. CHECK_NODATATODRAW
  573. DECLARE_COLOR_DEFINATION
  574. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  575. m_techparam.dj.AttachParameters( AfxGetProfile().GetTechParameters().dj );
  576. // Draw Sub Title
  577. if( bDrawTitle )
  578. {
  579. CString strTitle = AfxGetSTTShortName(STT_DJ);
  580. strTitle += "    ";
  581. if( m_CurStock.GetStockInfo().IsShangHai() )
  582. strTitle += m_techparam.dj.m_strCodeSha;
  583. else if( m_CurStock.GetStockInfo().IsShenZhen() )
  584. strTitle += m_techparam.dj.m_strCodeSzn;
  585. DrawTechTitle( pDC, rect.left+5, rect.top+1, strTitle, TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  586. return;
  587. }
  588. // Prepare Data
  589. if( !m_techparam.dj.IsValidParameters() )
  590. m_techparam.dj.SetDefaultParameters( );
  591. if( !m_techparam.dj.PrepareStockData( &AfxGetDB(), m_CurStock.GetStockCode(),
  592. m_nCurKType, m_nCurKFormat, m_nCurMaindataType,
  593. AfxGetProfile().GetAutoResumeDRBegin(), AfxGetProfile().GetAutoResumeDRLimit() ) )
  594. return;
  595. CKData * pKData = NULL;
  596. if( m_CurStock.GetStockInfo().IsShangHai() )
  597. pKData = & ( CDJ::m_stockSha.GetKData(m_nCurKType) );
  598. else if( m_CurStock.GetStockInfo().IsShenZhen() )
  599. pKData = & ( CDJ::m_stockSzn.GetKData(m_nCurKType) );
  600. else
  601. return;
  602. // GetMinMaxInfo
  603. double dMinDJ = 0, dMaxDJ = 0;
  604. CKLine kline( pKData );
  605. int nStartDJ = pKData->GetIndexByDate( kdata.ElementAt(m_nIndexStart).m_date );
  606. int nEndDJ = pKData->GetIndexByDate( kdata.ElementAt(m_nIndexEnd).m_date );
  607. if( -1 == nStartDJ ) nStartDJ = 0;
  608. if( -1 == nEndDJ ) nEndDJ = pKData->GetSize()-1;
  609. if( nStartDJ < 0 || nEndDJ < 0 || !kline.GetMinMaxInfo( nStartDJ, nEndDJ, &dMinDJ, &dMaxDJ ) )
  610. return;
  611. // Draw
  612. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  613. {
  614. DWORD date = kdata.ElementAt(nIndex).m_date;
  615. int nIndexDJ = pKData->GetIndexByDate( date );
  616. if( nIndexDJ >= 0 && nIndexDJ < pKData->GetSize() )
  617. {
  618. DrawOneKLine( pDC, nIndex, nIndexDJ, pKData, dMinDJ, dMaxDJ, TRUE );
  619. }
  620. }
  621. }
  622. void CStockGraph::DrawTechCW( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
  623. {
  624. CHECK_NODATATODRAW
  625. DECLARE_COLOR_DEFINATION
  626. if( bDrawTitle )
  627. return;
  628. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  629. m_techparam.cw.AttachParameters( AfxGetProfile().GetTechParameters().cw );
  630. double dStep = (dMax-dMin)*0.003;
  631. CSPDWordArray adwPrice, adwVolume;
  632. double dMinVolume = 0, dMaxVolume = 0;
  633. int nEnd = -1;
  634. if( !m_techparam.cw.CalculatePastCW(nEnd, 0, m_CurStock.GetStockInfo(), dStep, adwPrice, adwVolume, &dMinVolume, &dMaxVolume, NULL, NULL )
  635. || dMinVolume < 0 || dMaxVolume < 1e-4 )
  636. return;
  637. CPen pen( PS_SOLID, 3, clrCW );
  638. CPen * pOldPen = pDC->SelectObject( &pen );
  639. double dVolume = 0, dPrice = 0;
  640. for( int k=0; k<adwPrice.GetSize() && k<adwVolume.GetSize(); k++ )
  641. {
  642. dPrice = double(adwPrice[k]) * 0.001;
  643. dVolume = adwVolume[k];
  644. int yPrice = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dPrice - dMin) / (dMax-dMin) );
  645. int xVolume = int( rect.right - (rect.Width()*dVolume/(3*dMaxVolume)) );
  646. if( yPrice > rect.top+m_nHeightSubtitle+1 && yPrice < rect.bottom-2 )
  647. {
  648. pDC->MoveTo( xVolume, yPrice );
  649. pDC->LineTo( rect.right-1, yPrice );
  650. }
  651. }
  652. pDC->SelectObject( pOldPen );
  653. }
  654. ////////////////////////////////////////////////////////////
  655. // Technical Lines
  656. void CStockGraph::DrawTechMACD( CDC * pDC, CRect rect, BOOL bDrawTitle, int nTech, CMACD * pmacd )
  657. {
  658. CHECK_NODATATODRAW
  659. DECLARE_COLOR_DEFINATION
  660. COLORREF clrLine1 = AfxGetProfile().GetColor(CColorClass::clrLine1);
  661. COLORREF clrLine2 = AfxGetProfile().GetColor(CColorClass::clrLine2);
  662. // Prepare
  663. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  664. m_techparam.macd.AttachParameters( AfxGetProfile().GetTechParameters().macd );
  665. if( NULL == pmacd )
  666. {
  667. pmacd = &(m_techparam.macd);
  668. nTech = STT_MACD;
  669. }
  670. double dMin = 0, dMax = 1;
  671. if( !pmacd->GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  672. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  673. return;
  674. // Draw Title
  675. if( bDrawTitle )
  676. DrawTechTitle( pDC, rect.left+5, rect.top+1,AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  677. // Draw
  678. double dEMA1 = 0, dEMA2 = 0, dDIF = 0, dDEA = 0;
  679. int yDIFLast = (int)dMin, yDIFNow, yDEALast = (int)dMin, yDEANow;
  680. BOOL bHasLast = FALSE;
  681. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  682. {
  683. // Prepare Rect
  684. CRect rectK;
  685. long xMedium = 0;
  686. if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
  687. continue;
  688. // Draw
  689. if( pmacd->Calculate( &dEMA1, &dEMA2, &dDIF, &dDEA, nIndex, bHasLast ) )
  690. {
  691. yDIFNow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dDIF  - dMin) / (dMax-dMin) );
  692. yDEANow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dDEA  - dMin) / (dMax-dMin) );
  693. int yZero = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (0-dMin) / (dMax-dMin) );
  694. int yGap = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (2*dDIF-2*dDEA-dMin) / (dMax-dMin) );
  695. if( bHasLast )
  696. {
  697. CPen penDiff( PS_SOLID, 1, (dDIF-dDEA)>0 ? clrRise : clrFall );
  698. CPen * pOldPen = pDC->SelectObject( &penDiff );
  699. pDC->MoveTo( xMedium, yZero );
  700. pDC->LineTo( xMedium, yGap );
  701. pDC->SelectObject( pOldPen );
  702. if( nIndex > m_nIndexStart )
  703. {
  704. if( yDIFLast > rect.bottom || yDIFLast < rect.top+m_nHeightSubtitle || yDIFNow > rect.bottom || yDIFNow < rect.top+m_nHeightSubtitle 
  705. || yDEALast > rect.bottom || yDEALast < rect.top+m_nHeightSubtitle || yDEANow > rect.bottom || yDEANow < rect.top+m_nHeightSubtitle )
  706. continue;
  707. CPen penDIF( PS_SOLID, 1, clrLine1 );
  708. pOldPen = pDC->SelectObject( &penDIF );
  709. pDC->MoveTo( xMedium-m_nThickness, yDIFLast );
  710. pDC->LineTo( xMedium, yDIFNow );
  711. CPen penDEA( PS_SOLID, 1, clrLine2 );
  712. pDC->SelectObject( &penDEA );
  713. pDC->MoveTo( xMedium-m_nThickness, yDEALast );
  714. pDC->LineTo( xMedium, yDEANow );
  715. pDC->SelectObject( pOldPen );
  716. }
  717. }
  718. bHasLast = TRUE;
  719. yDIFLast = yDIFNow;
  720. yDEALast = yDEANow;
  721. // Draw Sub Title, Param Value
  722. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : kdata.GetSize()-1 );
  723. if( bDrawTitle && nIndex == nIndexParam )
  724. {
  725. if( rect.left+300 <= rect.right )
  726. {
  727. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  728. pDC->SetBkColor( clrBK );
  729. CString strText;
  730. strText.Format( "EMA(%d) EMA(%d) DIF %.2f ", pmacd->m_nEMA1Days, pmacd->m_nEMA2Days, dDIF );
  731. pDC->SetTextColor( clrLine1 );
  732. pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
  733. strText.Format( "DEA(%d) %.2f", pmacd->m_nDIFDays, dDEA );
  734. pDC->SetTextColor( clrLine2 );
  735. pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*2, rect.top+1, strText );
  736. pDC->SelectObject( pOldFont );
  737. }
  738. }
  739. }
  740. }
  741. }
  742. void CStockGraph::DrawTechMIKE( CDC * pDC, CRect rect, BOOL bDrawTitle )
  743. {
  744. CHECK_NODATATODRAW
  745. DECLARE_COLOR_DEFINATION
  746. // Prepare
  747. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  748. m_techparam.mike.AttachParameters( AfxGetProfile().GetTechParameters().mike );
  749. // Draw Title
  750. if( bDrawTitle )
  751. DrawTechTitle( pDC, rect.left+5, rect.top+1,AfxGetSTTShortName(STT_MIKE), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  752. // Draw
  753. double dWR = 0, dMR = 0, dSR = 0, dWS = 0, dMS = 0, dSS = 0;
  754. int nIndexParam = m_nIndexCurrent >= 0 ? m_nIndexCurrent : kdata.GetSize()-1;
  755. if( nIndexParam < 0 || nIndexParam >= kdata.GetSize() )
  756. return;
  757. CFont * pOldFont = AfxSelectDCFont( pDC, 14 );
  758. pDC->SetBkColor( clrBK );
  759. if( m_techparam.mike.CalculateMIKE( &dWR, &dMR, &dSR, &dWS, &dMS, &dSS, nIndexParam ) )
  760. {
  761. CSize szUnit = CSize( max(35,rect.Width()/6), max(18,rect.Height()/5) );
  762. int xStart = rect.left+szUnit.cx;
  763. int yStart = rect.top+szUnit.cy;
  764. double dC = kdata.ElementAt(nIndexParam).m_fClose;
  765. CString strTemp;
  766. DrawTextWithRect( pDC, xStart, yStart, xStart+szUnit.cx+1, yStart+szUnit.cy+1, IDS_STOCKGRAPH_PROJECT, clrBorder, clrTitle, clrBK, &rect );
  767. DrawTextWithRect( pDC, xStart+szUnit.cx, yStart, xStart+szUnit.cx*2+1, yStart+szUnit.cy+1, IDS_STOCKGRAPH_PRIMARY, clrBorder, clrTitle, clrBK, &rect );
  768. DrawTextWithRect( pDC, xStart+szUnit.cx*2, yStart, xStart+szUnit.cx*3+1, yStart+szUnit.cy+1, IDS_STOCKGRAPH_MEDIATE, clrBorder, clrTitle, clrBK, &rect );
  769. DrawTextWithRect( pDC, xStart+szUnit.cx*3, yStart, xStart+szUnit.cx*4+1, yStart+szUnit.cy+1, IDS_STOCKGRAPH_MIGHT, clrBorder, clrTitle, clrBK, &rect );
  770. DrawTextWithRect( pDC, xStart, yStart+szUnit.cy, xStart+szUnit.cx+1, yStart+szUnit.cy*2+1, IDS_STOCKGRAPH_PRESSURE, clrBorder, clrTitle, clrBK, &rect );
  771. strTemp.Format( "%.2f", dWR );
  772. DrawTextWithRect( pDC, xStart+szUnit.cx, yStart+szUnit.cy, xStart+szUnit.cx*2+1, yStart+szUnit.cy*2+1, strTemp, clrBorder, dWR > dC ? clrRise : clrFall, clrBK, &rect );
  773. strTemp.Format( "%.2f", dMR );
  774. DrawTextWithRect( pDC, xStart+szUnit.cx*2, yStart+szUnit.cy, xStart+szUnit.cx*3+1, yStart+szUnit.cy*2+1, strTemp, clrBorder, dMR > dC ? clrRise : clrFall, clrBK, &rect );
  775. strTemp.Format( "%.2f", dSR );
  776. DrawTextWithRect( pDC, xStart+szUnit.cx*3, yStart+szUnit.cy, xStart+szUnit.cx*4+1, yStart+szUnit.cy*2+1, strTemp, clrBorder, dSR > dC ? clrRise : clrFall, clrBK, &rect );
  777. DrawTextWithRect( pDC, xStart, yStart+szUnit.cy*2, xStart+szUnit.cx+1, yStart+szUnit.cy*3+1, IDS_STOCKGRAPH_UPHOLD, clrBorder, clrTitle, clrBK, &rect );
  778. strTemp.Format( "%.2f", dWS );
  779. DrawTextWithRect( pDC, xStart+szUnit.cx, yStart+szUnit.cy*2, xStart+szUnit.cx*2+1, yStart+szUnit.cy*3+1, strTemp, clrBorder, dWS > dC ? clrRise : clrFall, clrBK, &rect );
  780. strTemp.Format( "%.2f", dMS );
  781. DrawTextWithRect( pDC, xStart+szUnit.cx*2, yStart+szUnit.cy*2, xStart+szUnit.cx*3+1, yStart+szUnit.cy*3+1, strTemp, clrBorder, dMS > dC ? clrRise : clrFall, clrBK, &rect );
  782. strTemp.Format( "%.2f", dSS );
  783. DrawTextWithRect( pDC, xStart+szUnit.cx*3, yStart+szUnit.cy*2, xStart+szUnit.cx*4+1, yStart+szUnit.cy*3+1, strTemp, clrBorder, dSS > dC ? clrRise : clrFall, clrBK, &rect );
  784. }
  785. pDC->SelectObject( pOldFont );
  786. }
  787. void CStockGraph::DrawTechPSY( CDC * pDC, CRect rect, BOOL bDrawTitle )
  788. {
  789. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  790. m_techparam.psy.AttachParameters( AfxGetProfile().GetTechParameters().psy );
  791. double dMin = 0, dMax = 0;
  792. if( !m_techparam.psy.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  793. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  794. return;
  795. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_PSY, &(m_techparam.psy), &kdata,
  796. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  797. }
  798. void CStockGraph::DrawTechVOLUME( CDC * pDC, CRect rect, BOOL bDrawTitle )
  799. {
  800. CHECK_NODATATODRAW
  801. DECLARE_COLOR_DEFINATION
  802. // Prepare
  803. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  804. m_techparam.volume.AttachParameters( AfxGetProfile().GetTechParameters().volume );
  805. double dMin = 0, dMax = 1;
  806. if( !m_techparam.volume.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  807. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 3, dMin*0.01, dMax*0.01, FALSE, TRUE, 0 ) )
  808. return;
  809. // Draw Title
  810. if( bDrawTitle )
  811. {
  812. DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(STT_VOLUME), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  813. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  814. pDC->SetBkColor( clrBK );
  815. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : kdata.GetSize()-1 );
  816. double dParam;
  817. CString strText;
  818. for( int k=0; k<m_techparam.volume.m_adwMADays.GetSize(); k++ )
  819. {
  820. if( m_techparam.volume.Calculate( &dParam, nIndexParam, m_techparam.volume.m_adwMADays[k], FALSE ) )
  821. {
  822. strText.Format( "%dMV %.0f", m_techparam.volume.m_adwMADays[k], dParam );
  823. pDC->SetTextColor( GetLineColor( k ) );
  824. if( rect.left+m_nWidthSubtitle+(k+1)*m_nWidthParameter > rect.right )
  825. break;
  826. pDC->TextOut( rect.left+m_nWidthSubtitle+k*m_nWidthParameter, rect.top+1, strText );
  827. }
  828. }
  829. pDC->SelectObject( pOldFont );
  830. }
  831. // Draw
  832. for( int k=0; k<m_techparam.volume.m_adwMADays.GetSize(); k++ )
  833. {
  834. int yLast, yNow;
  835. BOOL bHasLast = FALSE;
  836. double dNow;
  837. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  838. {
  839. // Prepare Rect 
  840. CRect rectK, rcEntity;
  841. long xMedium = 0;
  842. if( !GetOneKLineRect( nIndex, &rectK, &rcEntity.left, &rcEntity.right, &xMedium ) )
  843. continue;
  844. // Draw Entity
  845. if( 0 == k )
  846. {
  847. // Calculate rcEntity.top and rcEntity.bottom
  848. KDATA kd = kdata.ElementAt(nIndex);
  849. rcEntity.top = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (kd.m_fVolume - dMin) / (dMax-dMin) );
  850. rcEntity.bottom = rect.bottom-1;
  851. COLORREF clr = clrRise;
  852. if( kd.m_fClose < kd.m_fOpen )
  853. clr = clrFallEntity;
  854. if( kd.m_date > m_dwLatestDate )
  855. clr = clrNewKLine;
  856. pDC->SetBkColor( clrBK );
  857. if( kd.m_fClose < kd.m_fOpen )
  858. pDC->FillSolidRect( &rcEntity, clr );
  859. else
  860. pDC->Draw3dRect( &rcEntity, clr, clr );
  861. }
  862. // Draw MV
  863. if( m_techparam.volume.Calculate( &dNow, nIndex, m_techparam.volume.m_adwMADays[k], bHasLast ) )
  864. {
  865. yNow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dNow  - dMin) / (dMax-dMin) );
  866. if( bHasLast )
  867. {
  868. if( yLast > rect.bottom || yLast < rect.top+m_nHeightSubtitle
  869. || yNow > rect.bottom || yNow < rect.top+m_nHeightSubtitle )
  870. continue;
  871. CPen penLocal( PS_SOLID, 1, GetLineColor(k) );
  872. CPen * pOldPen = pDC->SelectObject( &penLocal );
  873. pDC->MoveTo( xMedium-m_nThickness, yLast );
  874. pDC->LineTo( xMedium, yNow );
  875. pDC->SelectObject( pOldPen );
  876. }
  877. bHasLast = TRUE;
  878. yLast = yNow;
  879. }
  880. }
  881. }
  882. }
  883. void CStockGraph::DrawTechNVI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  884. {
  885. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  886. m_techparam.nvi.AttachParameters( AfxGetProfile().GetTechParameters().nvi );
  887. double dMin = 0, dMax = 0;
  888. if( !m_techparam.nvi.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  889. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  890. return;
  891. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_NVI, &(m_techparam.nvi), &kdata,
  892. AfxGetProfile().GetColor(CColorClass::clrLine1),
  893. AfxGetProfile().GetColor(CColorClass::clrLine2),
  894. "NVI", "MA");
  895. }
  896. void CStockGraph::DrawTechPVI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  897. {
  898. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  899. m_techparam.pvi.AttachParameters( AfxGetProfile().GetTechParameters().pvi );
  900. double dMin = 0, dMax = 0;
  901. if( !m_techparam.pvi.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  902. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  903. return;
  904. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_PVI, &(m_techparam.pvi), &kdata,
  905. AfxGetProfile().GetColor(CColorClass::clrLine1),
  906. AfxGetProfile().GetColor(CColorClass::clrLine2),
  907. "PVI", "MA");
  908. }
  909. void CStockGraph::DrawTechVR( CDC * pDC, CRect rect, BOOL bDrawTitle )
  910. {
  911. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  912. m_techparam.vr.AttachParameters( AfxGetProfile().GetTechParameters().vr );
  913. double dMin = 0, dMax = 0;
  914. if( !m_techparam.vr.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  915. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  916. return;
  917. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_VR, &(m_techparam.vr), &kdata,
  918. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  919. }
  920. void CStockGraph::DrawTechVROC( CDC * pDC, CRect rect, BOOL bDrawTitle )
  921. {
  922. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  923. m_techparam.vroc.AttachParameters( AfxGetProfile().GetTechParameters().vroc );
  924. double dMin = 0, dMax = 0;
  925. if( !m_techparam.vroc.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  926. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  927. return;
  928. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_VROC, &(m_techparam.vroc), &kdata,
  929. AfxGetProfile().GetColor(CColorClass::clrLine1),
  930. AfxGetProfile().GetColor(CColorClass::clrLine2),
  931. "VROC", "MA" );
  932. }
  933. void CStockGraph::DrawTechOBV( CDC * pDC, CRect rect, BOOL bDrawTitle )
  934. {
  935. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  936. m_techparam.obv.AttachParameters( AfxGetProfile().GetTechParameters().obv );
  937. double dMin = 0, dMax = 0;
  938. if( !m_techparam.obv.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  939. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 3, dMin, dMax, FALSE, TRUE, 0 ) )
  940. return;
  941. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_OBV, &(m_techparam.obv), &kdata,
  942. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  943. }
  944. void CStockGraph::DrawTechMOBV( CDC * pDC, CRect rect, BOOL bDrawTitle )
  945. {
  946. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  947. m_techparam.mobv.AttachParameters( AfxGetProfile().GetTechParameters().mobv );
  948. double dMin = 0, dMax = 0;
  949. if( !m_techparam.mobv.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  950. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 3, dMin, dMax, FALSE, TRUE, 0 ) )
  951. return;
  952. DrawTechUtil3( pDC, rect, bDrawTitle, dMin, dMax, STT_MOBV, &(m_techparam.mobv), &kdata,
  953. AfxGetProfile().GetColor(CColorClass::clrLine1),
  954. AfxGetProfile().GetColor(CColorClass::clrLine2),
  955. AfxGetProfile().GetColor(CColorClass::clrLine3),
  956. "SHT", "MED", "LNG" );
  957. }
  958. void CStockGraph::DrawTechMFI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  959. {
  960. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  961. m_techparam.mfi.AttachParameters( AfxGetProfile().GetTechParameters().mfi );
  962. double dMin = 0, dMax = 0;
  963. if( !m_techparam.mfi.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  964. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  965. return;
  966. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_MFI, &(m_techparam.mfi), &kdata,
  967. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  968. }
  969. void CStockGraph::DrawTechVMACD( CDC * pDC, CRect rect, BOOL bDrawTitle )
  970. {
  971. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  972. m_techparam.vmacd.AttachParameters( AfxGetProfile().GetTechParameters().vmacd );
  973. DrawTechMACD( pDC, rect, bDrawTitle, STT_VMACD, &(m_techparam.vmacd) );
  974. }
  975. void CStockGraph::DrawTechWVAD( CDC * pDC, CRect rect, BOOL bDrawTitle )
  976. {
  977. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  978. m_techparam.wvad.AttachParameters( AfxGetProfile().GetTechParameters().wvad );
  979. double dMin = 0, dMax = 0;
  980. if( !m_techparam.wvad.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  981. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 3, dMin, dMax, FALSE, TRUE, 0 ) )
  982. return;
  983. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_WVAD, &(m_techparam.wvad), &kdata,
  984. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  985. }
  986. void CStockGraph::DrawTechEMV( CDC * pDC, CRect rect, BOOL bDrawTitle )
  987. {
  988. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  989. m_techparam.emv.AttachParameters( AfxGetProfile().GetTechParameters().emv );
  990. double dMin = 0, dMax = 0;
  991. if( !m_techparam.emv.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  992. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  993. return;
  994. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_EMV, &(m_techparam.emv), &kdata,
  995. AfxGetProfile().GetColor(CColorClass::clrLine1),
  996. AfxGetProfile().GetColor(CColorClass::clrLine2),
  997. "EMV", "MA" );
  998. }
  999. void CStockGraph::DrawTechVRSI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1000. {
  1001. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1002. m_techparam.vrsi.AttachParameters( AfxGetProfile().GetTechParameters().vrsi );
  1003. double dMin = 0, dMax = 0;
  1004. if( !m_techparam.vrsi.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1005. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1006. return;
  1007. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_VRSI, &(m_techparam.vrsi), &kdata,
  1008. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1009. }
  1010. void CStockGraph::DrawTechNVRSI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1011. {
  1012. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1013. m_techparam.nvrsi.AttachParameters( AfxGetProfile().GetTechParameters().nvrsi );
  1014. double dMin = 0, dMax = 0;
  1015. if( !m_techparam.nvrsi.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1016. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1017. return;
  1018. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_NVRSI, &(m_techparam.nvrsi), &kdata,
  1019. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1020. }
  1021. void CStockGraph::DrawTechAD( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1022. {
  1023. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1024. m_techparam.ad.AttachParameters( AfxGetProfile().GetTechParameters().ad );
  1025. double dMin = 0, dMax = 0;
  1026. if( !m_techparam.ad.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1027. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1028. return;
  1029. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_AD, &(m_techparam.ad), &kdata,
  1030. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1031. }
  1032. void CStockGraph::DrawTechCI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1033. {
  1034. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1035. m_techparam.ci.AttachParameters( AfxGetProfile().GetTechParameters().ci );
  1036. double dMin = 0, dMax = 0;
  1037. if( !m_techparam.ci.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1038. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1039. return;
  1040. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_CI, &(m_techparam.ci), &kdata,
  1041. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1042. }
  1043. void CStockGraph::DrawTechKDJ( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1044. {
  1045. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1046. m_techparam.kdj.AttachParameters( AfxGetProfile().GetTechParameters().kdj );
  1047. double dMin = 0, dMax = 0;
  1048. if( !m_techparam.kdj.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1049. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1050. return;
  1051. DrawTechUtil3( pDC, rect, bDrawTitle, dMin, dMax, STT_KDJ, &(m_techparam.kdj), &kdata,
  1052. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1053. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1054. AfxGetProfile().GetColor(CColorClass::clrLine3),
  1055. "K", "D", "J" );
  1056. }
  1057. void CStockGraph::DrawTechR( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1058. {
  1059. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1060. m_techparam.r.AttachParameters( AfxGetProfile().GetTechParameters().r );
  1061. double dMin = 0, dMax = 0;
  1062. if( !m_techparam.r.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1063. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1064. return;
  1065. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_R, &(m_techparam.r), &kdata,
  1066. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1067. }
  1068. void CStockGraph::DrawTechRSI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1069. {
  1070. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1071. m_techparam.rsi.AttachParameters( AfxGetProfile().GetTechParameters().rsi );
  1072. double dMin = 0, dMax = 0;
  1073. if( !m_techparam.rsi.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1074. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1075. return;
  1076. DrawTechUtil( pDC, rect, bDrawTitle, dMin, dMax, STT_RSI, &(m_techparam.rsi), &kdata, m_techparam.rsi.m_adwDays );
  1077. }
  1078. void CStockGraph::DrawTechBIAS( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1079. {
  1080. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1081. m_techparam.bias.AttachParameters( AfxGetProfile().GetTechParameters().bias );
  1082. double dMin = 0, dMax = 0;
  1083. if( !m_techparam.bias.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1084. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1085. return;
  1086. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_BIAS, &(m_techparam.bias), &kdata,
  1087. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1088. }
  1089. void CStockGraph::DrawTechMTM( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1090. {
  1091. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1092. m_techparam.mtm.AttachParameters( AfxGetProfile().GetTechParameters().mtm );
  1093. double dMin = 0, dMax = 0;
  1094. if( !m_techparam.mtm.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1095. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1096. return;
  1097. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_MTM, &(m_techparam.mtm), &kdata,
  1098. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1099. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1100. "MTM", "MA" );
  1101. }
  1102. void CStockGraph::DrawTechDMI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1103. {
  1104. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1105. m_techparam.dmi.AttachParameters( AfxGetProfile().GetTechParameters().dmi );
  1106. double dMin = 0, dMax = 0;
  1107. if( !m_techparam.dmi.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1108. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1109. return;
  1110. DrawTechUtil4( pDC, rect, bDrawTitle, dMin, dMax, STT_DMI, &(m_techparam.dmi), &kdata,
  1111. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1112. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1113. AfxGetProfile().GetColor(CColorClass::clrLine3),
  1114. AfxGetProfile().GetColor(CColorClass::clrLine4),
  1115. "+DI", "-DI", "ADX", "ADXR" );
  1116. }
  1117. void CStockGraph::DrawTechROC( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1118. {
  1119. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1120. m_techparam.roc.AttachParameters( AfxGetProfile().GetTechParameters().roc );
  1121. double dMin = 0, dMax = 0;
  1122. if( !m_techparam.roc.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1123. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1124. return;
  1125. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_ROC, &(m_techparam.roc), &kdata,
  1126. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1127. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1128. "ROC", "MA" );
  1129. }
  1130. void CStockGraph::DrawTechCCI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1131. {
  1132. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1133. m_techparam.cci.AttachParameters( AfxGetProfile().GetTechParameters().cci );
  1134. double dMin = 0, dMax = 0;
  1135. if( !m_techparam.cci.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1136. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1137. return;
  1138. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_CCI, &(m_techparam.cci), &kdata,
  1139. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1140. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1141. "CCI", "MA" );
  1142. }
  1143. void CStockGraph::DrawTechCV( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1144. {
  1145. CHECK_NODATATODRAW
  1146. DECLARE_COLOR_DEFINATION
  1147. COLORREF clrLine1 = AfxGetProfile().GetColor(CColorClass::clrLine1);
  1148. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1149. m_techparam.cv.AttachParameters( AfxGetProfile().GetTechParameters().cv );
  1150. // Get Min Max
  1151. double dMin = 0, dMax = 0;
  1152. if( !m_techparam.cv.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1153. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1154. return;
  1155. // Draw Title
  1156. if( bDrawTitle )
  1157. {
  1158. DrawTechTitle( pDC, rect.left+5, rect.top+1,AfxGetSTTShortName(STT_CV), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  1159. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  1160. pDC->SetBkColor( clrBK );
  1161. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : kdata.GetSize()-1 );
  1162. double dParam = dMin;
  1163. CString strText;
  1164. if( m_techparam.cv.Calculate( &dParam, nIndexParam, FALSE ) )
  1165. {
  1166. strText.Format( "%s  %.2f", (LPCTSTR)(AfxGetSTTShortName(STT_CV)), dParam );
  1167. pDC->SetTextColor( clrLine1 );
  1168. if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
  1169. pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
  1170. }
  1171. pDC->SelectObject( pOldFont );
  1172. }
  1173. // Draw
  1174. int yNow;
  1175. BOOL bHasLast = FALSE;
  1176. double dNow = dMin;
  1177. int yZero = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (0-dMin) / (dMax-dMin) );
  1178. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  1179. {
  1180. // Prepare Rect 
  1181. CRect rectK;
  1182. long xMedium = 0;
  1183. if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
  1184. continue;
  1185. // Draw
  1186. if( m_techparam.cv.Calculate( &dNow, nIndex, bHasLast ) )
  1187. {
  1188. yNow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dNow  - dMin) / (dMax-dMin) );
  1189. if( bHasLast )
  1190. {
  1191. if( yNow > rect.bottom || yNow < rect.top+m_nHeightSubtitle )
  1192. continue;
  1193. CPen pen( PS_SOLID, 1, (yNow-yZero)<0 ? clrRise : clrFall );
  1194. CPen * pOldPen = pDC->SelectObject( &pen );
  1195. pDC->MoveTo( xMedium, yZero );
  1196. pDC->LineTo( xMedium, yNow );
  1197. pDC->SelectObject( pOldPen );
  1198. }
  1199. bHasLast = TRUE;
  1200. }
  1201. }
  1202. }
  1203. void CStockGraph::DrawTechARBR( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1204. {
  1205. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1206. m_techparam.arbr.AttachParameters( AfxGetProfile().GetTechParameters().arbr );
  1207. double dMin = 0, dMax = 0;
  1208. if( !m_techparam.arbr.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1209. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1210. return;
  1211. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_ARBR, &(m_techparam.arbr), &kdata,
  1212. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1213. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1214. "AR", "BR" );
  1215. }
  1216. void CStockGraph::DrawTechCR( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1217. {
  1218. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1219. m_techparam.cr.AttachParameters( AfxGetProfile().GetTechParameters().cr );
  1220. double dMin = 0, dMax = 0;
  1221. if( !m_techparam.cr.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1222. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1223. return;
  1224. DrawTechUtil5( pDC, rect, bDrawTitle, dMin, dMax, STT_CR, &(m_techparam.cr), &kdata,
  1225. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1226. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1227. AfxGetProfile().GetColor(CColorClass::clrLine3),
  1228. AfxGetProfile().GetColor(CColorClass::clrLine4),
  1229. AfxGetProfile().GetColor(CColorClass::clrLine5),
  1230. "CR", "A", "B", "C", "D" );
  1231. }
  1232. void CStockGraph::DrawTechOSC( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1233. {
  1234. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1235. m_techparam.osc.AttachParameters( AfxGetProfile().GetTechParameters().osc );
  1236. double dMin = 0, dMax = 0;
  1237. if( !m_techparam.osc.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1238. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1239. return;
  1240. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_OSC, &(m_techparam.osc), &kdata,
  1241. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1242. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1243. "OSC", "MA" );
  1244. }
  1245. void CStockGraph::DrawTechUOS( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1246. {
  1247. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1248. m_techparam.uos.AttachParameters( AfxGetProfile().GetTechParameters().uos );
  1249. double dMin = 0, dMax = 0;
  1250. if( !m_techparam.uos.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1251. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1252. return;
  1253. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_UOS, &(m_techparam.uos), &kdata,
  1254. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1255. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1256. "UOS", "MA" );
  1257. }
  1258. void CStockGraph::DrawTechMAOSC( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1259. {
  1260. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1261. m_techparam.maosc.AttachParameters( AfxGetProfile().GetTechParameters().maosc );
  1262. double dMin = 0, dMax = 0;
  1263. if( !m_techparam.maosc.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1264. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1265. return;
  1266. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_MAOSC, &(m_techparam.maosc), &kdata,
  1267. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1268. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1269. "MAOSC", "MA" );
  1270. }
  1271. void CStockGraph::DrawTech3_6BIAS( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1272. {
  1273. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1274. m_techparam.bias36.AttachParameters( AfxGetProfile().GetTechParameters().bias36 );
  1275. double dMin = 0, dMax = 0;
  1276. if( !m_techparam.bias36.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1277. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1278. return;
  1279. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_36BIAS, &(m_techparam.bias36), &kdata,
  1280. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1281. }
  1282. void CStockGraph::DrawTechDPO( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1283. {
  1284. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1285. m_techparam.dpo.AttachParameters( AfxGetProfile().GetTechParameters().dpo );
  1286. double dMin = 0, dMax = 0;
  1287. if( !m_techparam.dpo.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1288. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1289. return;
  1290. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_DPO, &(m_techparam.dpo), &kdata,
  1291. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1292. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1293. "DPO", "MA" );
  1294. }
  1295. void CStockGraph::DrawTechKST( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1296. {
  1297. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1298. m_techparam.kst.AttachParameters( AfxGetProfile().GetTechParameters().kst );
  1299. double dMin = 0, dMax = 0;
  1300. if( !m_techparam.kst.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1301. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1302. return;
  1303. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_KST, &(m_techparam.kst), &kdata,
  1304. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1305. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1306. "KST", "MA" );
  1307. }
  1308. void CStockGraph::DrawTechREI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1309. {
  1310. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1311. m_techparam.rei.AttachParameters( AfxGetProfile().GetTechParameters().rei );
  1312. double dMin = 0, dMax = 0;
  1313. if( !m_techparam.rei.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1314. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1315. return;
  1316. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_REI, &(m_techparam.rei), &kdata,
  1317. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1318. }
  1319. void CStockGraph::DrawTechDMKI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1320. {
  1321. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1322. m_techparam.dmki.AttachParameters( AfxGetProfile().GetTechParameters().dmki );
  1323. double dMin = 0, dMax = 0;
  1324. if( !m_techparam.dmki.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1325. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1326. return;
  1327. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_DMKI, &(m_techparam.dmki), &kdata,
  1328. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1329. }
  1330. void CStockGraph::DrawTechPCNT( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1331. {
  1332. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1333. m_techparam.pcnt.AttachParameters( AfxGetProfile().GetTechParameters().pcnt );
  1334. double dMin = 0, dMax = 0;
  1335. if( !m_techparam.pcnt.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1336. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1337. return;
  1338. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_PCNT, &(m_techparam.pcnt), &kdata,
  1339. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1340. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1341. "PCNT", "MA" );
  1342. }
  1343. void CStockGraph::DrawTechHLC( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1344. {
  1345. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1346. m_techparam.hlc.AttachParameters( AfxGetProfile().GetTechParameters().hlc );
  1347. double dMin = 0, dMax = 0;
  1348. if( !m_techparam.hlc.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1349. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1350. return;
  1351. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_HLC, &(m_techparam.hlc), &kdata,
  1352. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1353. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1354. "HLC", "MA" );
  1355. }
  1356. void CStockGraph::DrawTechCDP( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1357. {
  1358. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1359. m_techparam.cdp.AttachParameters( AfxGetProfile().GetTechParameters().cdp );
  1360. double dMin = 0, dMax = 0;
  1361. if( !m_techparam.cdp.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1362. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1363. return;
  1364. DrawTechUtil4( pDC, rect, bDrawTitle, dMin, dMax, STT_CDP, &(m_techparam.cdp), &kdata,
  1365. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1366. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1367. AfxGetProfile().GetColor(CColorClass::clrLine3),
  1368. AfxGetProfile().GetColor(CColorClass::clrLine4),
  1369. "AH", "NH", "AL", "NL" );
  1370. }
  1371. void CStockGraph::DrawTechASI( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1372. {
  1373. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1374. m_techparam.asi.AttachParameters( AfxGetProfile().GetTechParameters().asi );
  1375. double dMin = 0, dMax = 0;
  1376. if( !m_techparam.asi.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1377. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1378. return;
  1379. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_ASI, &(m_techparam.asi), &kdata,
  1380. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1381. }
  1382. void CStockGraph::DrawTechATR( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1383. {
  1384. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1385. m_techparam.atr.AttachParameters( AfxGetProfile().GetTechParameters().atr );
  1386. double dMin = 0, dMax = 0;
  1387. if( !m_techparam.atr.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1388. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1389. return;
  1390. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_ATR, &(m_techparam.atr), &kdata,
  1391. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1392. }
  1393. void CStockGraph::DrawTechCYO( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1394. {
  1395. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1396. m_techparam.cyo.AttachParameters( AfxGetProfile().GetTechParameters().cyo );
  1397. double dMin = 0, dMax = 0;
  1398. if( !m_techparam.cyo.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1399. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1400. return;
  1401. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_CYO, &(m_techparam.cyo), &kdata,
  1402. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1403. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1404. "CYO", "MA");
  1405. }
  1406. void CStockGraph::DrawTechDCYO( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1407. {
  1408. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1409. m_techparam.dcyo.AttachParameters( AfxGetProfile().GetTechParameters().dcyo );
  1410. double dMin = 0, dMax = 0;
  1411. if( !m_techparam.dcyo.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1412. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1413. return;
  1414. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_DCYO, &(m_techparam.dcyo), &kdata,
  1415. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1416. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1417. "DCYO", "MA");
  1418. }
  1419. void CStockGraph::DrawTechHSL( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1420. {
  1421. CHECK_NODATATODRAW
  1422. DECLARE_COLOR_DEFINATION
  1423. // Prepare
  1424. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1425. m_techparam.hsl.AttachParameters( AfxGetProfile().GetTechParameters().hsl );
  1426. m_techparam.hsl.m_stockinfo = m_CurStock.GetStockInfo();
  1427. m_techparam.volume.AttachParameters( AfxGetProfile().GetTechParameters().volume );
  1428. double dMin = 0, dMax = 0;
  1429. if( !m_techparam.hsl.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1430. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
  1431. return;
  1432. // Draw Title
  1433. if( bDrawTitle )
  1434. {
  1435. DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTName(STT_HSL), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
  1436. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  1437. pDC->SetBkColor( clrBK );
  1438. int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : kdata.GetSize()-1 );
  1439. double dParam;
  1440. CString strText;
  1441. for( int k=0; k<m_techparam.volume.m_adwMADays.GetSize(); k++ )
  1442. {
  1443. if( m_techparam.hsl.Calculate( &dParam, nIndexParam, m_techparam.volume.m_adwMADays[k], FALSE ) )
  1444. {
  1445. strText.Format( "%dMV %.2f", m_techparam.volume.m_adwMADays[k], dParam );
  1446. pDC->SetTextColor( GetLineColor( k ) );
  1447. if( rect.left+10+m_nWidthSubtitle+(k+1)*m_nWidthParameter > rect.right )
  1448. break;
  1449. pDC->TextOut( rect.left+12+m_nWidthSubtitle+k*m_nWidthParameter, rect.top+1, strText );
  1450. }
  1451. }
  1452. pDC->SelectObject( pOldFont );
  1453. }
  1454. // Draw
  1455. for( int k=0; k<m_techparam.volume.m_adwMADays.GetSize(); k++ )
  1456. {
  1457. int yLast, yNow;
  1458. BOOL bHasLast = FALSE;
  1459. double dNow;
  1460. for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
  1461. {
  1462. // Prepare Rect 
  1463. CRect rectK, rcEntity;
  1464. long xMedium = 0;
  1465. if( !GetOneKLineRect( nIndex, &rectK, &rcEntity.left, &rcEntity.right, &xMedium ) )
  1466. continue;
  1467. // Draw Entity
  1468. if( 0 == k
  1469. && m_techparam.hsl.Calculate( &dNow, nIndex, FALSE ) )
  1470. {
  1471. // Calculate rcEntity.top and rcEntity.bottom
  1472. KDATA kd = kdata.ElementAt(nIndex);
  1473. rcEntity.top = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dNow - dMin) / (dMax-dMin) );
  1474. rcEntity.bottom = rect.bottom-1;
  1475. COLORREF clr = clrRise;
  1476. if( kd.m_fClose < kd.m_fOpen )
  1477. clr = clrFallEntity;
  1478. if( kd.m_date > m_dwLatestDate )
  1479. clr = clrNewKLine;
  1480. pDC->SetBkColor( clrBK );
  1481. if( kd.m_fClose < kd.m_fOpen )
  1482. pDC->FillSolidRect( &rcEntity, clr );
  1483. else
  1484. pDC->Draw3dRect( &rcEntity, clr, clr );
  1485. }
  1486. // Draw MV
  1487. if( m_techparam.hsl.Calculate( &dNow, nIndex, m_techparam.volume.m_adwMADays[k], FALSE ) )
  1488. {
  1489. yNow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dNow  - dMin) / (dMax-dMin) );
  1490. if( bHasLast )
  1491. {
  1492. if( yLast > rect.bottom || yLast < rect.top+m_nHeightSubtitle
  1493. || yNow > rect.bottom || yNow < rect.top+m_nHeightSubtitle )
  1494. continue;
  1495. CPen penLocal( PS_SOLID, 1, GetLineColor(k) );
  1496. CPen * pOldPen = pDC->SelectObject( &penLocal );
  1497. pDC->MoveTo( xMedium-m_nThickness, yLast );
  1498. pDC->LineTo( xMedium, yNow );
  1499. pDC->SelectObject( pOldPen );
  1500. }
  1501. bHasLast = TRUE;
  1502. yLast = yNow;
  1503. }
  1504. }
  1505. }
  1506. }
  1507. void CStockGraph::DrawTechDPER( CDC * pDC, CRect rect, BOOL bDrawTitle )
  1508. {
  1509. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1510. m_techparam.dper.AttachParameters( AfxGetProfile().GetTechParameters().dper );
  1511. double dMin = 0, dMax = 0;
  1512. if( !m_techparam.dper.GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1513. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1514. return;
  1515. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, STT_DPER, &(m_techparam.dper), &kdata,
  1516. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1517. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1518. "DPER", "MA");
  1519. }
  1520. void CStockGraph::DrawTechUser( UINT nTech, CDC * pDC, CRect rect, BOOL bDrawTitle )
  1521. {
  1522. CTechUser * pTechUser = NULL;
  1523. for( int i=0; i<m_aptrTechUser.GetSize(); i++ )
  1524. {
  1525. CTechUser * p = (CTechUser *) m_aptrTechUser.GetAt(i);
  1526. if( p->GetTechUserID() == nTech )
  1527. {
  1528. pTechUser = p;
  1529. CKData * pKData = pTechUser->GetKData();
  1530. if( !pKData || pKData->GetKType() != m_nCurKType )
  1531. pTechUser = NULL;
  1532. }
  1533. }
  1534. CKData & kdata = m_CurStock.GetKData(m_nCurKType);
  1535. if( NULL == pTechUser )
  1536. {
  1537. pTechUser = new CTechUser( &kdata );
  1538. pTechUser->SetTechUserID( nTech );
  1539. pTechUser->SetStock( &m_CurStock );
  1540. m_aptrTechUser.Add( pTechUser );
  1541. }
  1542. double dMin = 0, dMax = 0;
  1543. if( !pTechUser->GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
  1544. || !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 0 ) )
  1545. return;
  1546. UINT nLineCount = pTechUser->GetLineCount();
  1547. switch( nLineCount )
  1548. {
  1549. case 1:
  1550. DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, nTech, pTechUser, &kdata,
  1551. AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
  1552. break;
  1553. case 2:
  1554. DrawTechUtil2( pDC, rect, bDrawTitle, dMin, dMax, nTech, pTechUser, &kdata,
  1555. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1556. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1557. (LPCTSTR)pTechUser->GetLineName(1), (LPCTSTR)pTechUser->GetLineName(2) );
  1558. break;
  1559. case 3:
  1560. DrawTechUtil3( pDC, rect, bDrawTitle, dMin, dMax, nTech, pTechUser, &kdata,
  1561. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1562. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1563. AfxGetProfile().GetColor(CColorClass::clrLine3),
  1564. (LPCTSTR)pTechUser->GetLineName(1), (LPCTSTR)pTechUser->GetLineName(2),
  1565. (LPCTSTR)pTechUser->GetLineName(3) );
  1566. break;
  1567. case 4:
  1568. DrawTechUtil4( pDC, rect, bDrawTitle, dMin, dMax, nTech, pTechUser, &kdata,
  1569. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1570. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1571. AfxGetProfile().GetColor(CColorClass::clrLine3),
  1572. AfxGetProfile().GetColor(CColorClass::clrLine4),
  1573. (LPCTSTR)pTechUser->GetLineName(1), (LPCTSTR)pTechUser->GetLineName(2),
  1574. (LPCTSTR)pTechUser->GetLineName(3), (LPCTSTR)pTechUser->GetLineName(4) );
  1575. break;
  1576. case 5:
  1577. DrawTechUtil5( pDC, rect, bDrawTitle, dMin, dMax, nTech, pTechUser, &kdata,
  1578. AfxGetProfile().GetColor(CColorClass::clrLine1),
  1579. AfxGetProfile().GetColor(CColorClass::clrLine2),
  1580. AfxGetProfile().GetColor(CColorClass::clrLine3),
  1581. AfxGetProfile().GetColor(CColorClass::clrLine4),
  1582. AfxGetProfile().GetColor(CColorClass::clrLine5),
  1583. (LPCTSTR)pTechUser->GetLineName(1), (LPCTSTR)pTechUser->GetLineName(2),
  1584. (LPCTSTR)pTechUser->GetLineName(3), (LPCTSTR)pTechUser->GetLineName(4),
  1585. (LPCTSTR)pTechUser->GetLineName(5) );
  1586. break;
  1587. default:;
  1588. }
  1589. }