【股票盯盤軟件】01_程序員炒股之開發一款極簡風格的股票盯盤軟件StockDog_V1.0.0.1


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=&apos;close_normal.png&apos; source=&apos;10,0,46,27&apos;" hotimage="file=&apos;close_pushed.png&apos; source=&apos;10,0,46,27&apos;" pushedimage="file=&apos;close_pushed.png&apos; source=&apos;10,0,46,27&apos;" />
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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM