Hanbit ebook Realtime 70 MFC 프로그래밍 주식분석 프로그램만들기 김세훈지음
MFC 프로그래밍주식분석프로그램만들기
MFC 프로그래밍주식분석프로그램만들기 초판발행 2014 년 06 월 24 일 지은이김세훈 / 펴낸이김태헌펴낸곳한빛미디어 ( 주 ) / 주소서울시마포구양화로 7길 83 한빛미디어 ( 주 ) IT출판부전화 02-325-5544 / 팩스 02-336-7124 등록 1999년 6월 24일제10-1779호 ISBN 978-89-6848-664-7 15000 / 정가 12,000원 책임편집배용석 / 기획정지연 / 편집정지연 이세진디자인표지여동일, 내지스튜디오 [ 밈 ], 조판최송실영업김형진, 김진불, 조유미 / 마케팅박상용, 서은옥, 김옥현 이책에대한의견이나오탈자및잘못된내용에대한수정정보는한빛미디어 ( 주 ) 의홈페이지나아래이메일로알려주십시오. 한빛미디어홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright c 2014 김세훈 & HANBIT Media, Inc. 이책의저작권은김세훈과한빛미디어 ( 주 ) 에있습니다. 저작권법에의해보호를받는저작물이므로무단복제및무단전재를금합니다. 지금하지않으면할수없는일이있습니다. 책으로펴내고싶은아이디어나원고를메일 (ebookwriter@hanbit.co.kr) 로보내주세요. 한빛미디어 ( 주 ) 는여러분의소중한경험과지식을기다리고있습니다.
저자소개 지은이 _ 김세훈 나이에비해서경력이없네요. 2006년 36살의나이에한회사의 CTO에게들은말이다. 실력이없으면내인생을내마음대로결정할수없다생각했는데, 우리나라는나이가아주중요한요소임을간과했었다. 사회는변한다. 고령화사회를걱정하며, 먼훗날젊은이들이부양해야할노인들이많다고언론에선말한다. 그러나고령화사회는노인이돼서도일해야하는사회다. 저자는노인이돼서도즐겁게일하기위하여실력이나이를극복할수있다고믿으며현재도자신을만들어가는중이다. 또한, 인생의나머지반을어떻게살것인지항상고민한다.
저자서문 우리나라에서는외국인들이프로그램매매로주식을한다고알고있다. 프로그램매매라는단어에서전문가적인느낌을받지만, 간단히말하면주식매매하는사람들이컴퓨터프로그램도만들수있다는것이다. 물론, 주식분석가와프로그래머등여러사람이모여그룹을형성하여함께만들어나간것이라고보면된다. 일반적으로주식매매를하는사람들은컴퓨터프로그램에대하여잘알지못하고, 프로그래머는주식을깊이있게알지못한다. 하지만앞으로주식매매를하거나주식을깊이있게이해하기위해서는스스로프로그램을만들필요가있다. 요즘은증권회사에서주식데이터를가져올수있다. 예전에는증권회사에서제공하는데이터와주식정보만을봐야했다면이제는일반사람들이가공되지않은주식데이터를가져와서스스로원하는차트 Chart 를만들수있다. 즉, 프로그래밍할줄안다면자신이주로보는차트를직접만들어실시간으로변화를확인할수있다. 선택한종목의데이터를 1초마다계속가져와서새로그려주면 ( 컴퓨터의속도는우리가생각하는것이상으로빠르므로 ) 사용자는큰불편없이 1초마다변하는데이터를보면서매매할수있다. 이책에서는실시간으로데이터를가져와차트를업데이트하는방법은구현하지않지만, 이책을이해한독자라면큰문제없이실시간주식프로그램을만들수있다. 주식분석할때주로보는보조지표는 MACD와볼린저밴드 Bollinger Band 다. 일반사람들이주로보는이평선보다참고자료로사용하기에아주좋다. 그러나주식을하는사람들은자신이생각한것을믿는경향이있다. 예를들면, MACD라는보조지표를사용하면 30% 만이종목에맞게적용되는데도 MACD를맹신하는사람들은자신에게잘맞는보조지표라고생각하며믿곤한다. 그러나보조지표는말그
대로참고용이며, MACD 와볼린저밴드를함께보는것이좋다. 주식에서도철저 한준비가필요하다. 자신이사용하는알고리즘이있다면증권회사에서받은데이 터를가지고시뮬레이션을하는것이좋다. 현재사회는잘해야하는시대이다. 노동으로먹고살던시대에는근면성실하기만하면잘살수있었지만, 지금은노동의시간이아닌결과물의시대가되었다. 주식을한다는것은머리로생각하며올바른분석을해야하는일이다. 또한, 주식에서프로그래밍한다는것은정보의분석뿐아니라남들보다빨리정보를얻을힘이생긴것이라고볼수있다. 주식프로그램에서궁극의목적은컴퓨터가알아서매매하는것인데, 머지않은미래에는프로그램을누가더잘만들었는지가중요할것이며, 주식시장은컴퓨터간의경쟁이될것이다. 이책을나에게주식을가르쳐주신박준근형님에게바친다. 또한, 이책이출간되 기를가장많이기다린친구성연준의둘째아들성주호 (2008 년생 ) 에게선물로준 다. 주호는가끔전화로나에게말했다. 삼촌, 내책은언제줄거야? 집필을마치며 김세훈
일러두기 이책은 How-to Series 의두번째책으로 MFC를이용하여주식프로그램을만드는방법에대해알아본다. 주식프로그램은증권회사에서데이터를가져와분석한후, 자동매매를함으로써완성된다. 즉, 시스템트레이딩프로그램을잘구축하는것이중요하다. 하지만이책은 MFC 프로그래밍에초점을맞추어주식이라는주제를다루고자한다. 이책을이해한독자라면증권사에서데이터를가져오는 API를이용하여자신만의자동매매시스템을쉽게구현할수있다. 여기서다루는프로그램은윈도우 MFC에기반을두고있으며, 이책을통해 MFC 프로그래밍을이해할수있는계기가될것이다. 이책에서다룰내용은다음과같다. 주식그래프그리기 이평선구현과알고리즘검증 MACD Moving Average Convergence/Divergence, 이동평균수렴 / 확산지수구현과자동매매검증 볼린저밴드 Bollinger Band 구현과자동매매검증 주식그래프그리기 에서는 MFC로그래프를구현하는방법과 MFC의몇가지기능을다룬다. 첫번째항목을완벽히이해하면나머지항목들은주식알고리즘을중점적으로다루므로프로그램을쉽게이해할수있다. How-to Series 의첫번째책인 소수와 RSA 알고리즘으로배우는 Big Number 연산 ( 한빛미디어, 2013) 01 에서구조체사용에대해설명한대로, 주식프로그램도구조체를이용하여필요한데이터를자유자재로가져다쓸수있고, 개인적으로구현한알고리즘을검증하는 01 http://www.hanbit.co.kr/ebook/look.html?isbn=9788968486074
데큰무리가없다. 주식은세계증시, 유가, 회사공시등많은정보를가지고주식을판단해야하지 만, 이책에서는오직다섯개의정보 ( 시가 / 고가 / 저가 / 종가 / 거래량 ) 만가지고프로그램 을구현하고공개된알고리즘만다룬다. 이책을읽는독자가차트를분석하는데초보자라면차트분석을경험할수있을것이고, 분석이가능한중급이상의경력자로자신만의분석알고리즘이있다면직접알고리즘을구현하여검증할수있을것이다. MACD와볼린저밴드에서다룰자동매매는일봉을가지고검증하고, 상수값을다양한값들로변경하면서검증할것이다. 프로그래밍을위해서는구현할알고리즘을정확히이해해야하므로여기서다루는보조지표의특성을좀더깊이있게알수있을것이다. 부록에서는이트레이드증권의 API인 Xing API를간단히설명하고, 이책에서사용하는데이터를 Xing API를통하여받아오는프로그램을제공한다. 주식분석은가장최근데이터를가지고분석하는것이좋으므로부록에수록된프로그램으로원하는데이터를가져오는것도좋다. 또한, 일봉데이터를가지고진행하지만, 주봉데이터를받는다면주간데이터를가지고프로그램의검증이이루어질수있을것이다. 필자의경험으로는현재이트레이드증권의 Xing API가 MFC 프로그램을만들기에는가장적당하며풍부한자료를제공한다. 주식을분석한다는취지의프로그램책이지만, 잘만들어진주식프로그램은증권사 API를사용하여실시간으로데이터를가져와분석하여자동매매를하는것이궁극의목표일수있다. 필자는비록실제로주식을하지는않지만, 오래전부터데이터를가지고분석작업을
진행해왔다. 따라서이책의내용은분석작업의시작일수있으며독자들이확실 하게자신만의알고리즘을만든다면모의투자방식으로검증후실제매매에적용 할수도있을것이다. 이책은주식프로그램을간단히다루었지만, 언젠가는뛰어난알고리즘을구현하는한국사람이뉴욕의주식시장에서시스템트레이딩으로그들과경쟁하기를바라는마음이다. 현재는외국의프로그램매매를우리가따라가고있지만, 나중에는우리도그들의시장에서함께할수있을것이다. 그런의미에서 How-to Series 의두번째불을조용히지펴주기바란다.
대상독자및참고사항 초급초중급중급중고급고급 이책은 C++ 를알고있는초급자이상을대상으로윈도우프로그램을만드는 MFC 프로그래밍을설명합니다. 주제가있는프로그램을배우자는목적으로주식 이라는주제로프로그램을만들면서설명합니다. 주식을하는사람들은자신만의프로그램을만들어운용하기를원하지만, 방법을 모르기에어떻게시작을해야할지모를수있습니다. 이책은 MFC 프로그램의버 튼만들기부터시작하여프로그램으로구현하는방법을단계적으로설명합니다. 주식분석은증권회사에서제공하는 HTS 프로그램을이용하는데, HTS 프로그램은 MFC로만들었습니다. 따라서이책을이해한독자는간단한개인용 HTS를만들어서응용할수있습니다. 또한, 주식의보조지표인이평선이어떻게만들어졌는지를알수있으며, 주식을좀더깊게분석할때주로사용하는보조지표인 MACD와볼린저밴드를구현하는방법도이해할수있어서두보조지표를활용하는데도움이될것입니다. 보조지표가어떻게만들어지는지아는것과모르고그냥보는것에는큰차이가있습니다. 보조지표를만들수있다는것은그만큼보조지표를여러측면으로분석하는힘이있다는것입니다. 이책에서제공하는방법의하나는데이터를이용해서가상시뮬레이션을해보는알고리즘검증으로, 자신만의알고리즘이있다면주식데이터로검증하는법도이해할수있습니다. MFC 프로그래밍에대한책이지
만, 주식초보자는주식분석을이해하는데도움이되고, 중급자이상은자신만의 알고리즘을검증하는데도움이될것입니다. 이책에수록된코드들은윈도우에서생성하고실행시켜야하며 Visual studio 2008에서구현되었습니다. How-to Series 는방법론적인부분에초점을맞추어만들어진책입니다. 일방적인지식의전달이라기보다는 이러한방법도있구나 하고이해하는것이중요합니다. 예제테스트환경사용프로그렘 설명 Visual Studio 2008 이상예제는 Windows 환경에서테스트하였다. Windows OS Windows 환경에서만실행할수있다. 책에서사용한예제파일은다음웹사이트에서내려받을수있다. https://www.hanbit.co.kr/exam/2664
한빛 ebook 리얼타임 한빛 ebook 리얼타임은 IT 개발자를위한 ebook 입니다. 요즘 IT 업계에는하루가멀다하고수많은기술이나타나고사라져갑니다. 인터넷을아무리뒤져도조금이나마정리된정보를찾는것도쉽지않습니다. 또한잘정리되어책으로나오기까지는오랜시간이걸립니다. 어떻게하면조금이라도더유용한정보를빠르게얻을수있을까요? 어떻게하면남보다조금더빨리경험하고습득한지식을공유하고발전시켜나갈수있을까요? 세상에는수많은종이책이있습니다. 그리고그종이책을그대로옮긴전자책도많습니다. 전자책에는전자책에적합한콘텐츠와전자책의특성을살린형식이있다고생각합니다. 한빛이지금생각하고추구하는, 개발자를위한리얼타임전자책은이렇습니다. 1. ebook Only - 빠르게변화하는 IT 기술에대해핵심적인정보를신속하게제공합니다. 500페이지가까운분량의잘정리된도서 ( 종이책 ) 가아니라, 핵심적인내용을빠르게전달하기위해조금은거칠지만 100페이지내외의전자책전용으로개발한서비스입니다. 독자에게는새로운정보를빨리얻을수있는기회가되고, 자신이먼저경험한지식과정보를책으로펴내고싶지만너무바빠서엄두를못내는선배, 전문가, 고수분에게는보다쉽게집필할수있는기회가될수있으리라생각합니다. 또한새로운정보와지식을빠르게전달하기위해 O'Reilly의전자책번역서비스도하고있습니다. 2. 무료로업데이트되는전자책전용서비스입니다. 종이책으로는기술의변화속도를따라잡기가쉽지않습니다. 책이일정분량이상으로집필되고정리되어나오는동안기술은이미변해있습니다. 전자책으로출간된이후에도버전업을통해중요한기술적변화가있거나저자 ( 역자 ) 와독자가소통하면서보완하여발전된노하우가정리되면구매하신분께무료로업데이트해드립니다.
3. 독자의편의를위해 DRM-Free로제공합니다. 구매한전자책을다양한 IT 기기에서자유롭게활용할수있도록 DRM-Free PDF 포맷으로제공합니다. 이는독자여러분과한빛이생각하고추구하는전자책을만들어나가기위해독자여러분이언제어디서어떤기기를사용하더라도편리하게전자책을볼수있도록하기위함입니다. 4. 전자책환경을고려한최적의형태와디자인에담고자노력했습니다. 종이책을그대로옮겨놓아가독성이떨어지고읽기힘든전자책이아니라, 전자책의환경에가능한한최적화하여쾌적한경험을드리고자합니다. 링크등의기능을적극적으로이용할수있음은물론이고글자크기나행간, 여백등을전자책에가장최적화된형태로새롭게디자인하였습니다. 앞으로도독자여러분의충고에귀기울이며지속해서발전시켜나가도록하겠습니다. 지금보시는전자책에소유권한을표시한문구가없거나타인의소유권한을표시한 문구가있다면위법하게사용하고있을가능성이높습니다. 이경우저작권법에의해 불이익을받으실수있습니다. 다양한기기에사용할수있습니다. 또한한빛미디어사이트에서구입하신후에는횟수에 관계없이내려받으실수있습니다. 한빛미디어전자책은인쇄, 검색, 복사하여붙이기가가능합니다. 전자책은오탈자교정이나내용의수정 보완이이뤄지면업데이트관련공지를이메일로 알려드리며, 구매하신전자책의수정본은무료로내려받으실수있습니다. 이런특별한권한은한빛미디어사이트에서구입하신독자에게만제공되며, 다른 사람에게양도나이전은허락되지않습니다.
차례 01 MFC 시작하기 1 1.1 Visual Studio 2 1.2 MFC 프로그래밍을위한준비 2 02 Chart 그리기 20 2.1 Data Structure 21 2.2 File Data 읽기 24 2.3 Combo Box 만들기 35 2.4 Chart 그리기 44 03 이평선 64 3.1 이평선분석 65 3.2 이평선구현 66 3.3 골든크로스검증 74 3.4 이평선오실레이터 81 04 MACD 98 4.1 MACD 분석 98 4.2 MACD 구현 102 4.3 MACD 오실레이터 109 4.4 MFC Window Message 117
05 Bollinger Band 124 5.1 볼린저밴드분석 125 5.2 볼린저밴드구현 129 5.3 볼린저밴드오실레이터 139 06 알고리즘추가하기 149 6.1 MFC Check Box와 Flag 사용 151 6.2 상 / 하한가종목찾기 167 6.3 거래량많은종목찾기 171 6.4 이평선비교 172 APPENDIX 175 A 증권회사 API - Xing 175 B Xing 주식데이터가져오기 184 C Xing 실시간그래프그리기 195 집필을마치며 199
1 MFC 시작하기 현재가장많이사용하는컴퓨터운영체제는윈도우로, 윈도우에서실행되는프로그램은사용하기쉽도록그래픽부분이강조된다. 마우스가없던시절에는텍스트만사용해서컴퓨터를작동시켰지만, 윈도우프로그램은주로마우스로업무를수행할수있다. 이렇게사용자편의위주의프로그램을만드는것은프로그래머에게더많은코딩을하게만든다. MFC Microsoft Foundation Class 는윈도우프로그램을만드는확장된 C++ 라이브러리 Library 다. MFC는개발자가좀더쉽게윈도우프로그램을만들수있는기능을제공한다. MFC에서사용하는언어는비주얼 C++ 라고부른다. 단어에서도알수있듯이시각적인 Visual 윈도우응용프로그램 Application 을만들기위한프로그래밍언어다. 지금은 MFC를사용하는프로그래머가많지않으나, 윈도우프로그램을다룰줄알면프로그래밍의범위를확장할수있다. 증권회사에서제공하는 API는 MFC에기반을두고있어서증권이나주식관련데이터를다루려면좀더 MFC에친숙해져야한다. 물론, Excel의매크로기능으로주식데이터를다룰수있지만, 주식데이터를좀더자유자재로다루기위해서는프로그래밍언어를사용하는것이훨씬효과적이다. 여기서는 MFC의기능을모두설명하지않는다. 기능을전부다루려면두꺼운책한권분량이되므로프로그램을만들면서필요한부분만을설명한다. 그리고프로그램을만들기위해시중에나와있는 MFC 책을독파할필요도없다. 단지, 구현해야할기능들만인터넷이나안내서를통하여습득하는것이좋다. 프로그래밍에서는모든기능을알고만드는것보다필요한것이무엇인지를아는것이중요하다. 1 장 MFC 시작하기 1
1.1 Visual Studio 비주얼스튜디오는윈도우프로그램을만드는데필요한응용프로그램으로, 컴파일기능이있는편집기 Editor 라고할수있다. 이책에서는비주얼스튜디오 2008을사용한다. 대부분의증권회사 API가비주얼스튜디오 2008을기반으로만들어졌으므로최신버전의비주얼스튜디오가굳이필요하지않다. 또한, 이책에서구현하는프로그램들은상위버전의비주얼스튜디오에서도실행할수있다. 여기서는비주얼스튜디오의자세한사용법을명시하지않으며, 프로그램을만들면 서필요한부분만을설명한다. 자세한내용은인터넷등을찾아서습득하기바란다. 1.2 MFC 프로그래밍을위한준비 1.2.1 프로젝트생성하기 MFC는비주얼스튜디오를실행하고새프로젝트를만든다. [ 그림 1-1] 과같이비주얼스튜디오의상위메뉴에서 파일 (F) 을선택한후, 새로만들기 (N) 와 프로젝트 (P) 를선택하여프로젝트를생성한다. 새프로젝트창이열리면 [ 그림 1-2] 와같이 Visual C++ 을선택하여 MFC 응용 프로그램을만들고, 이름 (N) 에는새프로젝트의이름을써준다. 이책에서구현 하는모든프로그램은 StockAnalysis 주식분석이라는이름을사용한다. 1 장 MFC 시작하기 2
[ 그림 1-1] 새프로젝트만들기 [ 그림 1-2] 비주얼 C++ 응용프로그램 1 장 MFC 시작하기 3
[ 그림 1-3] 처럼 MFC 마법사가시작되면 다음 을눌러서응용프로그램의종류를 선택한다. [ 그림 1-3] MFC 마법사시작 응용프로그램의종류는 [ 그림 1-4] 와같이 대화상자기반 (D) 를선택하고 마침 을누르면새로운프로젝트가생성된다. 대화상자기반 은다이얼로그 Dialog 프로그램을만드는것으로, 응용프로그램에메뉴 Menu 등을생성하지않고빈 Empty 화면에서프로그램을만들기위해서다. 필자는 MFC에서다이얼로그로프로그램을생성하는것을좋아하는데, 상업적인프로그램이아닌간단한프로그램을만들기에좋다. 메뉴등을만들면프로그램의완성도를높이기위해코드수정이많이필요하다. 이책에서는내용전달에우선을두었으므로기능적인부분들은생략한다. 1 장 MFC 시작하기 4
[ 그림 1-4] 대화상자기반 ( 다이얼로그 ) 프로그램생성 MFC 에서프로젝트를만들면기본적으로생성되는파일을보일러플레이트 Boilerplate 라고한다. 윈도우환경에서프로그램을구동하는데필요한파일들은이보일러플 레이트에서생성하고필요한곳에프로그램을만들어나간다. 보일러플레이트를자세히알면좋지만, 윈도우 API를이해해야하므로필자는권하지않는다. 마우스나터치를이용한그래픽응용프로그램들을만들때기본적으로생성되는코드라고생각하면된다. 안드로이드나아이폰에서도응용프로그램들을만들때기본적인코드가생성된다. 그러므로기본적으로생성되는코드를어려워할필요가없으며그중에서무엇이필요한지만알면된다. 고맙게도인터넷에많은자료가있어서우리가원하는정보를어렵지않게찾을수있다. 프로그래밍을잘하는데는필요한정보를얼마나잘찾아응용할수있는지도중요하다. 필자는프로그래밍에서문제해결능력이가장중요하다고강조하고싶다. 1 장 MFC 시작하기 5
MFC 응용프로그램마법사를끝내면 [ 그림 1-5] 와같이다이얼로그화면이뜬다. 다이얼로그바탕에기본으로나오는글자와버튼들은삭제한다. 프로그램에필요 한모든내용을직접구현하므로하나씩만들어가면서설명한다. [ 그림 1-5] 생성된다이얼로그기반프로그램 [ 그림 1-5] 의왼쪽에자동으로생성된파일중에서다음세개의파일이중요하다. StockAnalysisDlg.h StockAnalysisDlg.cpp stdafx.h 1 장 MFC 시작하기 6
생성된보일러플레이트에서는앞의세개파일들만을가지고코드수정이이루어진다. 파일명끝에 Dlg라고이름붙은두파일은다이얼로그응용프로그램에서그래프를그리거나버튼을눌렀을때동작하는이벤트 Event 처리를위한코드를만드는데사용된다. 이책에서는 StockAnalysisDlg.h 와 StockAnalysisDlg. cpp 두개의파일과새로운클래스 Class 파일들을생성하여프로그램을구현한다. stdafx.h 파일은프로그램전체에서전역변수 Global Variable 를사용하는데필요하지만, 이책에서는사용하지않는다. 1.2.2 Button 만들기앞으로출간할 How-to Series 에서는다수의 MFC 프로그램을다룬다. 이후출간될책들은시리즈의전작에서설명한내용은생략한다. 따라서이책에서다루는 MFC의기초부분은다음시리즈에서는생략될것이다. 이절에서는 MFC의도구상자를이용하여버튼만드는법을자세히설명하겠다. 여기서버튼만드는법을이해한다면다른도구들도버튼과같은방법으로만들면되므로인터넷이나기존에출간된 MFC 관련서적을본다해도어렵지않게내용을이해할수있을것이다. 시각적인프로그램에서기본으로생각할것은개별단위들이속성 Property 을가진다는것이다. 예를들면, MFC에서는도구상자안의모든도구가속성을가지며, 웹프로그램에서는개별태그 Tag 에속성을주어좀더보기좋은프로그램을만들수있다. 1 장 MFC 시작하기 7
[ 그림 1-6] 도구를그리기위한다이얼로그 버튼을그리려면 [ 그림 1-6] 과같이 리소스뷰 를선택한후 Dialog 폴더의 IDD_STOCKANAYSIS_DIALOG 를선택한다. 다이얼로그창이열리면 [ 그림 1-6] 의오른쪽에위치한 도구상자 탭을클릭하여 [ 그림 1-7] 과같이도구상자를연다. 도구상자에서 Button을선택한다음다이얼로그창에서마우스왼쪽버튼을클릭하거나드래그 Drag 하면버튼이자동으로화면에그려진다. 1 장 MFC 시작하기 8
[ 그림 1-7] 도구상자의다양한도구들 도구상자에는매우다양한도구들이있다. 윈도우프로그램에서흔히볼수있는도구들로원하는도구를선택해서다이얼로그에그리면된다. 이책에서는다루지않지만, 도구를그릴때비주얼스튜디오는프로그램에해당도구를위한기본적인코드들을자동으로생성한다. 따라서프로그램의깊은부분까지이해하지않아도프로그램을쉽게만들수있다. [ 그림 1-6] 의오른쪽 속성 탭을선택하면 [ 그림 1-8] 과같이속성창이열린다. 다 이얼로그창에그려진 Button1 을선택하면도구상자에서해당 Button 의속성 정보가나타나는데, 여기서중요한것은 Caption 과 ID 다. Caption 은선택한 1 장 MFC 시작하기 9
버튼위에써지는텍스트 Button1 이며 ( 수정가능 ), ID 는프로그램에서사용되는버튼의고유 ID 를지정한다. 예제에서는 ID 를 IDC_BUTTON1 에서 IDC_ BTN_RUN 으로바꾼다. 이름에서 BTN 은 Button 의약어이고, 뒤에 RUN 과같이버튼의이름을써주는것이좋다. 프로그램에서버튼이많아졌을때이처럼새롭게이름을작성해주면코드에서해당버튼을쉽게구분할수있다. 속성의나머지부분들은버튼의시각적인부분들을위한것이므로여기서는다루지않는다. [ 그림 1-8] 버튼의속성설정하기 다이얼로그창에그려진 Run 버튼을마우스로더블클릭하면 [ 그림 1-9] 와같이코드가자동으로생성되고, StockAnalysisDlg.cpp 파일로이동한다. 코드아랫부분의 OnBnClickedBtnRun( ) 은실행프로그램에서 Run 버튼을클릭했을때실행되는함수다. 1 장 MFC 시작하기 10
[ 그림 1-9] 버튼을눌렀을때실행되는함수 실제버튼클릭을위해새롭게생성된코드는 [ 그림 1-9] 에나와있는것외에다음 과같은내용이더있다. [StockAnalysisDlg.h] afx_msg void OnBnClickedBtnRun(); [StockAnalysisDlg.cpp] BEGIN_MESSAGE_MAP(CStockAnalysisDlg, CDialog) 1 장 MFC 시작하기 11
ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_RUN, &CStockAnalysisDlg::OnBnClickedBtnRun) END_MESSAGE_MAP() 첫번째코드는버튼을클릭하면실행되는함수를선언한것이고, 두번째코드의회색부분은버튼을클릭했을때버튼과해당함수를연결한다. 두번째코드는 ID가 IDC_BTN_RUN 버튼을클릭했을때 (ON_BN_CLICKED) OnBnClickedBtnRun( ) 함수를실행하도록연결하는부분이다. 비주얼스튜디오는자동으로이러한코드를만들기때문에프로그래머가좀더쉽게프로그래밍을할수있으며, 해당함수내에서만코드작업을해주면된다. OnBnClickedBtnRun( ) 함수를눌렀을때메시지창 Message Box 를출력하려면 [ 그림 1-10] 과같이 OnBnClickedBtnRun( ) 함수안에 AfxMessageBox( ) 함수를사용한다. 필자는 MFC 프로그램에서디버깅 Debugging 할때매우유용한 AfxMessageBox( ) 함수를자주사용한다. AfxMessageBox( ) 함수의괄호안에는 MFC에서만쓰는 CString 이라는문자열클래스 Class 를사용해야하지만, _T 매크로를이용하여직접문자열을사용해도된다. AfxMessageBox( ) 함수는다음과같이사용하여 Run Button is Clicked. 라는메시지를출력할수있다. ::AfxMessageBox(_T( Run Button is Clicked. )); 1 장 MFC 시작하기 12
[ 그림 1-10] 버튼을눌렀을때실행되는코드 마지막으로실행프로그램을만들어테스트해보자. 비주얼스튜디오의메뉴에있는 플레이 Play 버튼을눌러도되고, 단축키로 Ctrl + F5 를사용해서컴파일하고실행프로그램을만들어도된다. 프로그램을만들면서실행프로그램을자주만들어야하므로단축키 Ctrl + F5 사용을권한다. 모든단축키를숙지하는것은힘들지만, 자주사용하는단축키정도는기억하는것이좋다. 프로그램을실행하면 [ 그림 1-11] 과같이 Run 버튼하나만나타나며, Run 버튼 을누르면 Run Button is Clicked. 라는메시지를출력하는창이생성된다. 1 장 MFC 시작하기 13
[ 그림 1-11] 실행프로그램 프로그래밍언어기초책을보면항상나오는것이 Hello World 라는문자열을출력하는것이다. 지금까지버튼을이용해서 Hello World 라는아주간단한프로그램을만들었다고보면된다. Hello World 프로그램이항상먼저나오는이유는오류 Error 없이프로그램을만들어서실행되는지를알수있기때문이며, 이는중요한부분이다. 이후부터는요소를하나씩추가하면서프로그램을만들어나가면된다. 또한, 코드를조금씩추가하면서실행프로그램을자주만들어서테스트하는것도중요하다. 01 도구상자안에있는다른도구들도이와같은방식으로그려주고속성을사용하면된다. 직접프로그래밍해보고시행착오를거쳐알게된내용이오래기억되므로여러가지도구들을직접그려보기바란다. 또한, 인터넷에개별도구들에대한자세한설명이나와있으므로직접찾아보기를권한다. 경험상프로그래밍은내가아는것만을가지고프로그램을만드는것은극히일부분이며, 무엇이필요한지를알고방법을찾아서새로운것을만드는일이라고생각한다. 01 How-to Series 의첫번째책인 소수와 RSA 알고리즘으로배우는 Big Number 연산 ( 한빛미디어, 2013) 의부록에이 부분이자세히설명되어있으므로참고하기바란다. 1 장 MFC 시작하기 14
1.2.3 Class 추가하기 MFC는 C++ 에기반을둔프로그램이므로구현하려는 C++ 클래스를추가하여프로그램을만든다. 이책의내용대부분은새롭게생성된클래스안에서구현할것이다. 단지그래프를그리거나버튼등을눌렀을때동작하는부분만 StockAnalysisDlg. cpp에구현한다. 따라서프로그램의알고리즘과같이중요한부분들은추가된클래스안에서새롭게구현한다. 새로운클래스를추가하려면 [ 그림 1-12] 와같이프로젝트이름에서마우스오른쪽 버튼을눌러, 추가 (D) 클래스 (C) 를선택한다. [ 그림 1-12] 클래스추가 1 장 MFC 시작하기 15
[ 그림 1-13] 과같이 클래스추가 창이열리면 C++ C++ 클래스 를선택하고 추가 버튼을누른다. [ 그림 1-13] C++ 클래스추가 1 장 MFC 시작하기 16
[ 그림 1-14] 와같이 C++ 클래스마법사창이열리면클래스이름을 CStock 으로 지정한다. 02 그러면첫문자 C 가생략된 Stock.h 와 Stock.cpp 파일이생성되고, Stock 이라는클래스에앞으로구현하게될코드들이생성된다. [ 그림 1-14] 클래스이름정하기 02 MFC 는클래스이름을정할때항상대문자 C 를앞에써주는것이좋다. 1 장 MFC 시작하기 17
[ 그림 1-15] 를보면 CStock 클래스와관련된두개의파일이생성되었고, 내용이없는빈클래스가선언되었음을알수있다. 이책에서는두개의 C++ 클래스에코드가구현되는데, Stock 이라는클래스와그래프를그리기위해계산을하는 Graph 클래스다. CGraph 클래스도 CStock 클래스와같은방법으로추가한다. [ 그림 1-15] 추가된클래스 MFC 프로그램을만들어본독자라면지금까지의내용은너무간단했을것이다. 하지만이책에서는 MFC 프로그래밍을처음해보는독자들도많을것으로판단되 어각단계를좀더구체적으로기술하였다. 1 장 MFC 시작하기 18
다음장은이책에서가장중요한부분으로, 데이터를읽어와서그래프를어떻게그리는지를설명한다. 여기서만드는프로그램은상업적인프로그램이아니므로간단한프로그램을통하여기본적인부분을익히고, 자신만의기능을추가하여개인프로그램을만들어보기바란다. 1 장 MFC 시작하기 19
2 Chart 그리기 이번장에서는 MFC에서주식그래프를그려본다. 주식데이터를다루는 CStock 클래스와그래프를그리기위해계산하는 CGraph 클래스, 그리고화면에그래프를그려주는 CStockAnalysisDlg 클래스에서프로그램이구현된다. 여기서사용되는데이터는 data.txt 파일에저장되어있는데, 그내용은다음과같으며최근데이터는부록으로제공되는 GetStockData 프로그램을사용해서얻을수있다. 2130 A000020 동화약품 250 20130823 6140 6220 6020 6120 83828 20130822 6300 6300 6110 6120 119820 생략 20120823 5400 5510 5390 5490 84425 A000040 S&T모터스 250 20130823 510 513 502 506 255864 20130822 500 513 488 498 721021 생략 data.txt 에서가장위에 2130 은전체종목수를나타낸다. 즉, data.txt 에는 2,130개의종목데이터가저장되어있다. 두번째줄에서 A000020 은종목번호이며, 동화약품 은종목이름, 그리고 250 이라는숫자는해당종목과관련한 250개의데이터가밑에기록되어있음을나타낸다. 250개의데이터는 250줄에기록되어있는데, 한줄에는날짜, 시가, 고가, 저가, 종가, 거래량순으로저장되어있다. data.txt 에저장된형식은필자가임의대로정한것으로, 개인적으로프로그램을만든다면데이터를보기편한방식으로저장하면된다. 2 장 Chart 그리기 20
2.1 Data Structure 주식프로그램의시작은데이터를읽어와서프로그램의구조체안에저장하는것이다. 그렇다면데이터를담기위한구조체 Structure 를어떻게만들면좋을까? 필자는개별종목하나를하나의구조체에담고, 이렇게만들어진구조체를배열 Array 로관리한다. 프로그램을만들때같은자료형과형태의데이터는배열로만드는것이좋다. 종목데이터를구조체에넣는방법은여러가지가있는데다음과같이두가지형태의구조체로표현할수있다. [ 코드 2-1] Stock Data 구조체 (1) struct Company { CString strjongmok, strname; int quantity; long date[250]; long startval[250]; long highval[250]; long lowval[250]; long lastval[250]; long vol[250]; }; // 종목번호, 종목명 // 데이터개수 // 날짜 // 시가 // 고가 // 저가 // 종가 // 거래량 Company allcompany[2130]; //2130 개의모든종목구조체를배열로선언 [ 코드 2-2] Stock Data 구조체 (2) struct Data { long date; long startval; long highval; long lowval; // 날짜 // 시가 // 고가 // 저가 2 장 Chart 그리기 21
}; long lastval; long vol; // 종가 // 거래량 struct Company { CString strjongmok, strname; int quantity; Data data[250]; }; Company companies[2130]; // 종목번호, 종목명 // 데이터개수 // 주가데이터 //2130개의모든종목구조체를배열로선언 [ 코드 2-1] 의구조체는이전에개인적으로만든프로그램에서구현한방법이고, [ 코드 2-2] 의구조체는이책에서만드는프로그램에사용할방법이다. [ 코드 2-1] 은주식데이터를날짜가아닌최소단위의데이터배열로나타냈고, [ 코드 2-2] 는날짜에따른데이터를구조체에담아서구조체를배열로만들었다. [ 코드 2-2] 에서 Company 구조체를배열로만들었는데여기의 companies 라는변수를가지고모든데이터에접근할수있다. 프로그램을만들때중요한것중하나는많이사용하는상수를정의해서 Define 사용하는것이다. 헤더파일에 Data 구조체의배열크기와모든종목개수의최대크기를정의하는것이좋다. 이책에서는 Stock.h 에다음과같이상수들을정의한다. #define MAX_DATA 250 // 한종목당 250개의데이터를가진다. #define MAX_COMPANY 2500 //2130개종목보다큰수로설정한다. 이처럼상수를정의하면헤더파일에서상수값만변경해서프로그램의크기를쉽 게바꿀수있다. 예를들어, 종목당 250 개의데이터를 1000 으로바꾸면종목당 2 장 Chart 그리기 22
1,000개의데이터를가지고처리할수있는프로그램으로쉽게바뀐다. 또한, 상수를정의하면프로그램의가독성을높여준다. 코드안에서 250이라는숫자를사용하면이것이무엇을의미하는지알기가힘들다. 그러나숫자대신 MAX_DATA 라는새롭게정의된상수를써주면이름을통하여데이터의최대값임을쉽게알수있다. 이처럼사용하면프로그램구현이쉬워지므로상수를정의해서사용하기를권한다. 다음 [ 코드 2-3] 은 Stock.h 에서사용하는코드다. [ 코드 2-3] Data 구조체 (Stock.h) #define MAX_DATA 250 #define MAX_COMPANY 2500 struct Data { long date; long startval; long highval; long lowval; long lastval; long vol; }; struct Company { CString strjongmok, strname; int quantity; Data data[max_data]; }; // 날짜 // 시가 // 고가 // 저가 // 종가 // 거래량 // 종목번호, 종목명 // 데이터개수 // 주가데이터 01 struct AllCompany { int quantity; // 전체종목개수 Company companies[max_company]; //2500개종목구조체를배열로선언 2 장 Chart 그리기 23
}; class CStock { public: 02 AllCompany allcompanies; public: CStock(void); ~CStock(void); }; 01 AllCompany 구조체는이후에추가되는이평선 Day Moving Average, 이동평균선이나보조지표등모든종목의데이터를포함하기위해추가한다. 여기서는 companies라는 Company 구조체배열만을가지고있지만, 이후에만들어지는구조체는이곳에변수로선언된다. 02 CStock 클래스에서모든데이터에접근하려면 allcompanies라는변수를 public으로선언한다. 외부에서 CStock 클래스를생성하면모든종목의데이터에대한접근이가능하다. 이전책 01 에서강조했듯이프로그램에서구조체를이해하는것이가장중요하다. 데이터가어떻게프로그램에서구조화되는지를이해해야만나머지부분을쉽게만들수있다. 특히, 주식프로그램에서는데이터를가져와서구조화할수있다면프로그램의반은끝났다고볼수있다. 물론, 여기서는증권회사에서실제데이터를가져오지는않았지만, 직접증권회사에서데이터를가져와서구조체로넣는다면실시간자동매매프로그램을쉽게구현할수있을것이다. 2.2 File Data 읽기 MFC에서파일을읽고쓰는것은 C++ 에기반을두고있어서특별히고려해야할것이없다. 또한, C++ 에서 C 함수도사용할수있으므로이책에서는 C 함수를사용하여파일에읽고쓰는작업을할것이다. 01 소수와 RSA 알고리즘으로배우는 Big Number 연산 (http://goo.gl/fnfovw) ( 한빛미디어, 2013) 2 장 Chart 그리기 24
MFC에서 C 함수를사용할때고려해야할점은자료형 Data Type 이다. 즉, 데이터를 MFC에서만사용하는문자열자료형인 CString 으로변환하는작업이필요하다. 파일에서데이터를읽을때는 C 함수로읽어서 char * 형태의문자열을 CString 으로형변환해야하며, 파일에기록할때는 CString 을 char * 형태로변환해서 C 함수로기록한다. 프로그램을만들다보면파일입출력을많이다루게된다. 잠시파일입출력이어 떤원리로이루어지는지알아보자. [ 그림 2-1] 파일입출력 [ 그림 2-1] 과같이파일은하드디스크에저장되어있다. 프로그램에서파일을열면 Open 파일의모든내용은메모리에올라간다. 파일을열때읽기 Read 만가능한지아니면쓰기 Write 도가능한지를지정하는데, 읽기만가능한파일은메모리에서읽을수만있고, 쓰기가가능한파일은읽고쓰기가가능하다. 또한, 파일의마지막부터추가하여쓰기가가능한 Append 속성을부여할수도있다. 그리고파일이메모리에올려져있으므로특정위치에서읽기와쓰기도할수도있다. 이내용은프로그램관련기초서적이나인터넷에서쉽게찾을수있으므로여기서는다루지않는다. 파일열기로파일이메모리에올려진후에프로그램은메모리에서만읽기 / 쓰기를 하게된다. 프로그램에서읽기 / 쓰기작업이다이루어진후 파일닫기 를하면, 읽 기속성의파일은연결이끊어지고쓰기속성의파일은메모리의내용을하드디스 2 장 Chart 그리기 25
크에저장한다. 간단하게파일입출력은크게 파일열기, 메모리에서파일내용 작업, 파일닫기 의세단계로구분하여이해하는것이좋다. 파일에서읽기를간단히표현하면다음과같이나타낼수있다. FILE *fp; fp = fopen( filename, "rt"); fscanf(fp, "%d \n", &variable); fclose(fp); // 파일자료형 - FILE // 파일열기 - fopen // 파일읽기 - fscanf // 파일닫기 - fclose 파일을열때 fopen( ) 함수안의 rt 로속성을주는데, r 은 Read를, t 는 Text로읽겠다는의미이다. 모든줄에사용되는변수 fp는 File Pointer로, 메모리에올려진파일의주소를가리킨다. 즉, FILE *fp 는변수 fp를파일포인터로사용한다는것이고, 두번째줄의 fp = fopen( filename, rt ) 는 filename 이라는파일을하드디스크에서읽어와메모리에올리고 fp가메모리에올려진파일을가리키고있다고생각하면된다. 세번째줄의 fscanf(fp, %d \n, &variable) 은 fp 파일에서정수형 (%d) 값을 variable 이라는변수로읽어오는것이다. 이때주의할것은변수앞에 & 문자를써주어야한다. & 문자를사용하면메모리에서변수의주소값을나타내므로 메모리에있는 variable 변수의공간에데이터를집어넣어라 는의미가된다. 마지막줄의 fclose(fp) 은처리가끝난 fp 파일을닫는다. 파일에쓰기는읽기와비슷하며다음과같이나타낼수있다. FILE *fp; fp = fopen( filename, "wt"); fprintf(fp, "%d \n", variable); fclose(fp); // 파일자료형 - FILE // 파일열기 - fopen // 파일쓰기 - fprintf // 파일닫기 - fclose 2 장 Chart 그리기 26
다음은 Cstock( ) 함수를선언하고기본뼈대를구현한부분이다. [ 코드 2-4] CStock 함수선언 (Stock.h) class CStock { public: AllCompany allcompanies; public: CStock(void); ~CStock(void); }; void Run(); void ReadDataFromFile(); void WriteDataToFile(); [ 코드 2-5] CStock 함수구현전뼈대 (Stock.cpp) void CStock::Run() { ReadDataFromFile(); WriteDataToFile(); } void CStock::ReadDataFromFile() { } void CStock::WriteDataToFile() { } 2 장 Chart 그리기 27
[ 코드 2-6] CStock 변수정의 (StockAnalysisDlg.h) #include "Stock.h" #pragma once class CStockAnalysisDlg : public CDialog { private: CStock *stock; ##### 생략 ##### }; [ 코드 2-7] CStock 변수생성과실행 (StockAnalysisDlg.cpp) BOOL CStockAnalysisDlg::OnInitDialog() { ##### 생략 ##### stock = new CStock(); ##### 생략 ##### } ##### 생략 ##### void CStockAnalysisDlg::OnBnClickedBtnRun() { stock->run(); } 지금까지구현한코드를 Ctrl + F5 키로컴파일이잘되는지확인한다. 이제는 CStock 클래스에선언된 ReadDataFromFile( ) 함수와 WriteDataToFile( ) 함수안의내용을구현한다. ReadDataFromFile( ) 함수는 [ 코드 2-8] 과같이구현한다. 2 장 Chart 그리기 28