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显示即可。

 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="216,27" sizebox="0,0,0,0" caption="0,0,0,27" mininfo="216,27" maxinfo="216,27">
<Font id="0" name="Courier New" size="18" bold="true" italic="false" />
<Font id="1" name="Times New Roman" size="16" bold="true" italic="false" />
<Font id="2" name="宋体" size="14" bold="true" italic="false" />
<VerticalLayout bordersize="1" width="216" height="27" bkcolor="0xFFFFFFFF" bkcolor2="0xFFFFFFFF" bordercolor="0xFF000000" inset="1,1,1,1">
<HorizontalLayout height="27">
<HorizontalLayout width="180">
<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" />
<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" />
<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" />
</HorizontalLayout>
<HorizontalLayout width="36">
<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;" />
</HorizontalLayout>
</HorizontalLayout>
</VerticalLayout>
</Window>

  然后大概说下如何使用libcurl库实现http get请求。

  用curl_easy_init()方法创建url链接句柄,对应使用curl_easy_cleanup()方法释放该句柄;

  用curl_easy_setopt()方法可以设置各种链接参数,如链接超时等;

  用curl_easy_perform()方法执行具体url请求;

  如下是我封装好的http get请求方法。

 //************************************
// Method: HttpGet
// Brief: 该函数用于执行HttpGet请求
// Author: menlsh
// Date: 2020/03/08
// Returns: bool
// Parameter: const string strUrl
// Parameter: string & strResponse
// Parameter: int nConnectTimeOut
// Parameter: int nTimeOut
//************************************
bool CMHttpUtils::HttpGet(const string strUrl, string& strResponse, int nConnectTimeOut, int nTimeOut)
{
if (strUrl.empty())
return false; curl_easy_reset(m_pCurl);
curl_easy_setopt(m_pCurl, CURLOPT_URL, strUrl.c_str());
curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, false);
curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, );
curl_easy_setopt(m_pCurl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, http_req_reply);
curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, (void*)&strResponse);
curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, );
curl_easy_setopt(m_pCurl, CURLOPT_HEADER, );
curl_easy_setopt(m_pCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_easy_setopt(m_pCurl, CURLOPT_CONNECTTIMEOUT, nConnectTimeOut);
curl_easy_setopt(m_pCurl, CURLOPT_TIMEOUT, nTimeOut); CURLcode res = curl_easy_perform(m_pCurl);
if (res != CURLE_OK)
return false; return true;
}

  剩下的就没啥好说的了,使用上述方法调用新浪股票数据接口,拿到数据后解析下,刷新界面显示就可以了。

  有一点是,返回的数据里是没有涨跌幅的,需要自己计算了。

  涨跌幅 = (当前价格 – 昨日收盘价格)* 100% / 当前价格

5.后记

  软件程序我放在百度网盘了,附上下载链接,欢迎小伙伴们下载试用哈。

  链接:https://pan.baidu.com/s/1VHMZ3yzP_jSfyBbVK9Vndw

  提取码:dh1o

  开发这个软件的初衷,我上面也说了,仅仅是为了方便实时的在电脑上查看股票价格而已,并且要做到够小够简约。

  后续计划再加一些实用好玩的功能上去,比如大数据分析是不是可以和炒股结合下呢,以便更好的选股呢?或者及时加仓或减仓呢?

  如果你有对该软件有什么好的想法建议,或是想和小韭菜叨叨股票,欢迎和我联系,我的邮箱:menlsh@163.com

【股票盯盘软件】01_程序员炒股之开发一款极简风格的股票盯盘软件StockDog_V1.0.0.1的更多相关文章

  1. Java程序员转Android开发必读经验分享

    小编最近几日偷偷的发现部分Java程序员想转安卓开发,故此加紧补充知识,为大家搜集资料,积极整理前人的经验,希望可以给正处于困惑中的你,带来些许的帮助. 啰哩啰嗦的说说Java和Android程序的区 ...

  2. Android程序员不容错过的10款在线实用工具

    Android十款在线工具,在做Android开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了.Android在线工具,包括在线测试工具,及其他较为重 ...

  3. 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)

    上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...

  4. 好程序员web前端开发测验之css部分

    好程序员web前端开发测验之css部分Front End Web Development Quiz CSS 部分问题与解答 Q: CSS 属性是否区分大小写? <p><font si ...

  5. CSharp程序员学Android开发---3.Android内部元素不填充BUG

    最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...

  6. CSharp程序员学Android开发---2.个人总结的快捷键

    最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...

  7. CSharp程序员学Android开发---1.初识AndriodIDE,掌握工具使用

    最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...

  8. 程序员编程利器:20款最好的免费的IDEs和编辑器

    程序员编程利器:20款最好的免费的IDEs和编辑器 还没转眼明年可就大年三十了,忙的可真是晕头转了个向,看着亲朋好友们那让人欣羡的小肚腩,不禁感慨,岁月是一把猪饲料,绿了芭蕉,肥了那杨柳小蛮腰,可怜我 ...

  9. Java 程序员最喜欢的 11 款免费 IDE 编辑器

    Java开发人员需要花费大量的时间埋头于Java代码中,使用各种不同的IDE(Intergrated Development Environment)来开发Java代码,所以下面我将为大家介绍11个不 ...

随机推荐

  1. 介绍vue-cli脚手架config目录下index.js配置文件

    1.config/index.js var path = require('path') module.exports = { build: { // production 环境 env: requi ...

  2. 为什么有这么多人呼吁要取代Facebook?

    扎克伯格这段时间算是栽了,身为人生大赢家的他或许正在遭受最为灰暗的时刻.因为泄露5000万用户数据这一事件,Facebook股价暴跌且扎克伯格身家缩水.被英国与美国相关部门调查.#删除Facebook ...

  3. javasc-正则表达式

    匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff]评注:可以用来计算字符串的长度 ...

  4. H5本地离线存储

    前言上一篇文件结尾,有同学问我本地存储图片方法,其实本地存储方式有很多,我们打开谷歌浏览器,查看源代码,在resources页签中,有web SQl ,indexedDB等等,我前面文章讲过Local ...

  5. php发送post请求的4种方式

    http://blog.163.com/fan_xy_qingyuan/blog/static/188987748201411943815244/ class Request{ public stat ...

  6. SpringBoot 处理 POST Json 传参枚举

    在 Spring 框架中对枚举类型的序列化/反序列化是有限制的. 假设如下面这样在某些情况下就不能正常工作: 123456789 public enum PayChannelEnum implemen ...

  7. 「知乎」对中国用户而言,Pure Android 是否比 MIUI 或 Flyme 体验更好? - Donnie的博客

    这篇文章转载自我在知乎上的回答 哎呀-不要站队嘛.其实这是一个很有意思的题目,让我们一点点来看 哦对,谢妖-.本人是Nexus 5用户,系统当然是Pure Android KitKat啦(臭谷粉!点D ...

  8. LeetCode 225题用队列实现栈(Implement Stack using Queues) Java语言求解

    链接 https://leetcode-cn.com/problems/implement-stack-using-queues/ 思路 首先演示push()操作:将元素依次进入队1,进入时用top元 ...

  9. C++扬帆远航——12(抓小偷)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:zhaoxiaotou.cpp * 作者:常轩 * 微信公众号: ...

  10. http面试问题集锦

    1.http的请求报文和响应报文? http请求报文:请求行(请求方法+url).请求头,请求体 http响应报文:状态行(http版本+状态码).响应头.响应体   2.常用的http请求类型? 请 ...