1.前言
話說最近一段時間受疫情的影響,股市各種妖魔橫行。本人作為一個入股市不滿三年的小韭菜,就有幸見證了好幾次歷史,也是滿心驚喜,就權當是接受資本市場的再教育了吧。
小韭菜的炒股方法其實很簡單,這兩年多來一直死守着一只股票,不滿倉,也不空倉,逢低就買點,逢高就賣點。靠着這種守株待兔的笨方法,沒有賺到大錢,但好在也不至於虧錢,目前的累計收益率是25.83%。
年初復工前窩在家,天天抱着個手機,實時看着股票行情,心情也跟着起飛下降,好不愜意;復工上班后,不能一直抱着手機看,突然還有點不習慣了。
怎么辦呢?
炒股咱是小韭菜,開發軟件咱可是老磚家了,自己動手開發了股票盯盤桌面軟件唄,實時獲取股票數據,顯示在界面上,不就得了。一邊“專心”工作,一邊瞟着股票信息,老板再也不用擔心我上班玩手機啦!
2.實現思路
想法是有了,具體要怎么實現呢?
首先,要解決如何獲取股票數據的問題。經過一番搜索,找到了幾種獲取股票數據的接口,簡單了解驗證了下,果斷選擇了新浪股票數據接口。
該接口使用也很簡單,如下就是獲取茅台的接口:
http://hq.sinajs.cn/list=sh600519
可以看出該接口實際上就是一個http get請求,參數是股票代碼;返回的數據就是股票信息,包含了今日開盤價、當前價格、昨日收盤價等等,具體如下:
該盯盤軟件的目標是界面要做到極簡,只顯示核心關鍵信息:股票名稱、當前價格、漲跌幅。要得到這些信息,上述接口返回的數據足夠了。
然后,要考慮下用什么編程語言來開發這個軟件。這個其實也不用多想,當然是選本人最拿手擅長的C++了。
用C++實現http get請求,方法也有很多。直接從底層socket api寫起,這種重復反復造輪子的事,咱可不能干,不是有個開源的網絡協議庫嗎?直接拿來用就好了。
對的,我說的就是大名鼎鼎的libcurl庫。libcurl庫支持支持http、ftp等多種協議,區區http get請求,自是不在話下。
最后,來說下界面怎么搞。用C++語言做桌面應用程序,一般就是MFC或者QT了。MFC就算了,想把界面做的漂亮還是要費點功夫的,懶得折騰了;QT倒是不錯,界面可以做的美美的,還支持跨平台。不過,還有其他的選擇,那就是DirectUI界面庫,比如Duilib。
針對Duilib界面庫,我這里就不展開介紹了,有興趣的小伙伴可以自行搜索了解下,拿來做界面還是蠻不錯的。
3.效果展示
最終實現的效果是怎樣的呢?
就是下圖看到的這個樣子,噓!一不小心暴露了我持倉的股票。
程序界面非常簡潔,只顯示了一支股票的名稱、當前價格、漲跌幅和一個關閉按鈕;程序默認是在右下角任務欄上面顯示的,較為隱蔽,具有頂層顯示功能,無論你當前在電腦上瀏覽網頁還是操作Office辦公軟件等,都能顯示在桌面的最上層,方便實時窺看;當然,你也可以將它拖動到桌面任何位置上,操作非常簡單;股票當前價格和漲跌幅是實時刷新顯示的,漲的時候紅艷艷,跌的時候綠油油,你懂的。
4.具體實現
下面我們來說說具體怎么實現吧,要上干貨了。
首先是界面布局,Duilib界面庫使用xml來描述界面布局,從而很好的將界面和邏輯分離,同時也易於實現各種界面效果。界面的xml源碼如下,其他的就是Duilib界面庫使用的常規操作了,加載該xml顯示即可。
1 <?xml version="1.0" encoding="utf-8" standalone="yes" ?> 2 <Window size="216,27" sizebox="0,0,0,0" caption="0,0,0,27" mininfo="216,27" maxinfo="216,27"> 3 <Font id="0" name="Courier New" size="18" bold="true" italic="false" /> 4 <Font id="1" name="Times New Roman" size="16" bold="true" italic="false" /> 5 <Font id="2" name="宋體" size="14" bold="true" italic="false" /> 6 <VerticalLayout bordersize="1" width="216" height="27" bkcolor="0xFFFFFFFF" bkcolor2="0xFFFFFFFF" bordercolor="0xFF000000" inset="1,1,1,1"> 7 <HorizontalLayout height="27"> 8 <HorizontalLayout width="180"> 9 <Label name="title" text="" float="true" width="60" height="27" pos="2,0,60,27" textpadding="0,0,0,0" textcolor="0xFF000000" font="0" align="center" /> 10 <Label name="price" text="0.00" float="true" width="60" height="27" pos="60,0,120,27" textpadding="0,0,0,0" textcolor="0xFF000000" font="1" align="center" /> 11 <Label name="rate" text="0.00%" float="true" width="60" height="27" pos="120,0,180,27" textpadding="0,0,0,0" textcolor="0xFF000000" font="1" align="center" /> 12 </HorizontalLayout> 13 <HorizontalLayout width="36"> 14 <Button name="closebtn" width="36" height="27" width="36" align="center" normalimage="file='close_normal.png' source='10,0,46,27'" hotimage="file='close_pushed.png' source='10,0,46,27'" pushedimage="file='close_pushed.png' source='10,0,46,27'" /> 15 </HorizontalLayout> 16 </HorizontalLayout> 17 </VerticalLayout> 18 </Window>
然后大概說下如何使用libcurl庫實現http get請求。
用curl_easy_init()方法創建url鏈接句柄,對應使用curl_easy_cleanup()方法釋放該句柄;
用curl_easy_setopt()方法可以設置各種鏈接參數,如鏈接超時等;
用curl_easy_perform()方法執行具體url請求;
如下是我封裝好的http get請求方法。
1 //************************************ 2 // Method: HttpGet 3 // Brief: 該函數用於執行HttpGet請求 4 // Author: menlsh 5 // Date: 2020/03/08 6 // Returns: bool 7 // Parameter: const string strUrl 8 // Parameter: string & strResponse 9 // Parameter: int nConnectTimeOut 10 // Parameter: int nTimeOut 11 //************************************ 12 bool CMHttpUtils::HttpGet(const string strUrl, string& strResponse, int nConnectTimeOut, int nTimeOut) 13 { 14 if (strUrl.empty()) 15 return false; 16 17 curl_easy_reset(m_pCurl); 18 curl_easy_setopt(m_pCurl, CURLOPT_URL, strUrl.c_str()); 19 curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, false); 20 curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, false); 21 curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, 1); 22 curl_easy_setopt(m_pCurl, CURLOPT_READFUNCTION, NULL); 23 curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, http_req_reply); 24 curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, (void*)&strResponse); 25 curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 1); 26 curl_easy_setopt(m_pCurl, CURLOPT_HEADER, 1); 27 curl_easy_setopt(m_pCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 28 curl_easy_setopt(m_pCurl, CURLOPT_CONNECTTIMEOUT, nConnectTimeOut); 29 curl_easy_setopt(m_pCurl, CURLOPT_TIMEOUT, nTimeOut); 30 31 CURLcode res = curl_easy_perform(m_pCurl); 32 if (res != CURLE_OK) 33 return false; 34 35 return true; 36 }
剩下的就沒啥好說的了,使用上述方法調用新浪股票數據接口,拿到數據后解析下,刷新界面顯示就可以了。
有一點是,返回的數據里是沒有漲跌幅的,需要自己計算了。
漲跌幅 = (當前價格 – 昨日收盤價格)* 100% / 當前價格
5.后記
軟件程序我放在百度網盤了,附上下載鏈接,歡迎小伙伴們下載試用哈。
鏈接:https://pan.baidu.com/s/1VHMZ3yzP_jSfyBbVK9Vndw
提取碼:dh1o
開發這個軟件的初衷,我上面也說了,僅僅是為了方便實時的在電腦上查看股票價格而已,並且要做到夠小夠簡約。
后續計划再加一些實用好玩的功能上去,比如大數據分析是不是可以和炒股結合下呢,以便更好的選股呢?或者及時加倉或減倉呢?
如果你有對該軟件有什么好的想法建議,或是想和小韭菜叨叨股票,歡迎和我聯系,我的郵箱:menlsh@163.com