1.  背景

上班族平时没有时间盯盘,股票突然冲高、跳水来不及操作,机会转瞬即逝。

2.  思路

通过软件实时获取股票价格信息,计算相关指标,满足涨跌幅度条件时,给微信发送信息,提示看看股票是否需要进行买卖。

3. 技术实现

3.1.1 通过java定时任务,拉取股票价格信息,判断涨跌幅度。

3.1.2 以百分之一为单位,每涨、跌一个百分点以上即发送微信通知。

3.1.3 相同的涨跌幅,每日只发送一次通知。

3.1.4 通知内容伪装成QQ黄钻订单信息。

核心代码如下:

(不求美观,只求一眼明了)

3.2.1. main 方法

package com.iv6.info4m;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;import com.iv6.tips.KdjSearchTask;
import com.iv6.tips.MaxUpdownTask2;
import com.iv6.util.ClearKeyTask;public class FirstM {private static ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(2);public static void main(String[] args) {ScheduleTask st = new ScheduleTask();st.addTask(new MyTask());st.addTask(new ClearKeyTask());//每分钟执行一次scheduExec.scheduleAtFixedRate(st, 50,  60 * 1000, TimeUnit.MILLISECONDS);}
}

3.2.2.  定时调度任务

package com.iv6.info4m;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ScheduleTask implements Runnable {private List<Runnable> realTaskList= new ArrayList<Runnable>();public static Map<String,String> flagMap = new HashMap<String,String>();public void addTask(Runnable t) {realTaskList.add(t);}private ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5));@Overridepublic void run() {for(Runnable r : realTaskList) {executor.execute(r);}}}

3.2.3. 实时获取股票信息任务

package com.iv6.info4m;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;class MyTask implements Runnable {@Overridepublic void run() {// 当前日期、星期String today = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));// 交易日LocalDate currentDate = LocalDate.now();int k = currentDate.getDayOfWeek().getValue();// 周1 - 5if (k > 5) {return;}// 交易时间String res = HttpUtils.getRes("http://quan.suning.com/getSysTime.do");JSONObject obj = JSON.parseObject(res);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime currentTime = LocalDateTime.parse(obj.getString("sysTime2"), formatter);int h = currentTime.getHour();int m = currentTime.getMinute();int time = Integer.valueOf(String.valueOf(h) + String.valueOf(m < 10 ? "0" + m : m));// 交易时间检查if (time > 1530 || time < 930) {return;}check("sh601058", today);// check("sz000543", today);// check("sz002598", today);}public void check(String code, String today) {String res = HttpUtils.getRes("http://hq.sinajs.cn/list=" + code);res = res.substring(res.indexOf("\"") + 1, res.length() - 3);System.out.println(LocalDateTime.now() + " : " + res);String[] datas = res.split(",");// Double jkai = Double.valueOf(datas[1]);Double zshou = Double.valueOf(datas[2]);Double now = Double.valueOf(datas[3]);Double rate = (now - zshou) / zshou;String keyPlus = code + today + "+";String keyMinus = code + today + "-";// 上涨if (ScheduleTask.flagMap.get(keyPlus) == null) {if (rate > 0.1) {ScheduleTask.flagMap.put(keyPlus, "0.1");fireEmail("+10级", code);fireWechat("+10级", code);} else if (rate > 0.09) {ScheduleTask.flagMap.put(keyPlus, "0.09");fireEmail("+9级", code);fireWechat("+9级", code);} else if (rate > 0.08) {ScheduleTask.flagMap.put(keyPlus, "0.08");fireEmail("+8级", code);fireWechat("+8级", code);} else if (rate > 0.07) {ScheduleTask.flagMap.put(keyPlus, "0.07");fireEmail("+7级", code);fireWechat("+7级", code);} else if (rate > 0.06) {ScheduleTask.flagMap.put(keyPlus, "0.06");fireEmail("+6级", code);fireWechat("+6级", code);} else if (rate > 0.05) {ScheduleTask.flagMap.put(keyPlus, "0.05");fireEmail("+5级", code);fireWechat("+5级", code);} else if (rate > 0.04) {ScheduleTask.flagMap.put(keyPlus, "0.04");fireEmail("+4级", code);fireWechat("+4级", code);} else if (rate > 0.03) {ScheduleTask.flagMap.put(keyPlus, "0.03");fireEmail("+3级", code);fireWechat("+3级", code);} else if (rate > 0.02) {ScheduleTask.flagMap.put(keyPlus, "0.02");fireEmail("+2级", code);fireWechat("+2级", code);} else if (rate > 0.01) {ScheduleTask.flagMap.put(keyPlus, "0.01");fireEmail("+1级", code);fireWechat("+1级", code);}} else if (ScheduleTask.flagMap.get(keyPlus) != null) {Double lastRate = Double.valueOf(ScheduleTask.flagMap.get(keyPlus));if (rate > 0.1 && lastRate < 0.1) {ScheduleTask.flagMap.put(keyPlus, "0.1");fireEmail("+10级", code);fireWechat("+10级", code);} else if (rate > 0.09 && lastRate < 0.09) {ScheduleTask.flagMap.put(keyPlus, "0.09");fireEmail("+9级", code);fireWechat("+9级", code);} else if (rate > 0.08 && lastRate < 0.08) {ScheduleTask.flagMap.put(keyPlus, "0.08");fireEmail("+8级", code);fireWechat("+8级", code);} else if (rate > 0.07 && lastRate < 0.07) {ScheduleTask.flagMap.put(keyPlus, "0.07");fireEmail("+7级", code);fireWechat("+7级", code);} else if (rate > 0.06 && lastRate < 0.06) {ScheduleTask.flagMap.put(keyPlus, "0.06");fireEmail("+6级", code);fireWechat("+6级", code);} else if (rate > 0.05 && lastRate < 0.05) {ScheduleTask.flagMap.put(keyPlus, "0.05");fireEmail("+5级", code);fireWechat("+5级", code);} else if (rate > 0.04 && lastRate < 0.04) {ScheduleTask.flagMap.put(keyPlus, "0.04");fireEmail("+4级", code);fireWechat("+4级", code);} else if (rate > 0.03 && lastRate < 0.03) {ScheduleTask.flagMap.put(keyPlus, "0.03");fireEmail("+3级", code);fireWechat("+3级", code);} else if (rate > 0.02 && lastRate < 0.02) {ScheduleTask.flagMap.put(keyPlus, "0.02");fireEmail("+2级", code);fireWechat("+2级", code);} else if (rate > 0.01 && lastRate < 0.01) {ScheduleTask.flagMap.put(keyPlus, "0.01");fireEmail("+1级", code);fireWechat("+1级", code);}}// 下跌if (ScheduleTask.flagMap.get(keyMinus) == null) {if (rate < -0.1) {ScheduleTask.flagMap.put(keyMinus, "-0.1");fireEmail("-10级", code);fireWechat("-10级", code);} else if (rate < -0.09) {ScheduleTask.flagMap.put(keyMinus, "-0.09");fireEmail("-9级", code);fireWechat("-9级", code);} else if (rate < -0.08) {ScheduleTask.flagMap.put(keyMinus, "-0.08");fireEmail("-8级", code);fireWechat("-8级", code);} else if (rate < -0.07) {ScheduleTask.flagMap.put(keyMinus, "-0.07");fireEmail("-7级", code);fireWechat("-7级", code);} else if (rate < -0.06) {ScheduleTask.flagMap.put(keyMinus, "-0.06");fireEmail("-6级", code);fireWechat("-6级", code);} else if (rate < -0.05) {ScheduleTask.flagMap.put(keyMinus, "-0.05");fireEmail("-5级", code);fireWechat("-5级", code);} else if (rate < -0.04) {ScheduleTask.flagMap.put(keyMinus, "-0.04");fireEmail("-4级", code);fireWechat("-4级", code);} else if (rate < -0.03) {ScheduleTask.flagMap.put(keyMinus, "-0.03");fireEmail("-3级", code);fireWechat("-3级", code);} else if (rate < -0.02) {ScheduleTask.flagMap.put(keyMinus, "-0.02");fireEmail("-2级", code);fireWechat("-2级", code);} else if (rate < -0.01) {ScheduleTask.flagMap.put(keyMinus, "-0.01");fireEmail("-1级", code);fireWechat("-1级", code);}} else if (ScheduleTask.flagMap.get(keyMinus) != null) {Double lastRate = Double.valueOf(ScheduleTask.flagMap.get(keyMinus));if (rate < -0.1 && lastRate > -0.1) {ScheduleTask.flagMap.put(keyMinus, "-0.1");fireEmail("-10级", code);fireWechat("-10级", code);} else if (rate < -0.09 && lastRate > -0.09) {ScheduleTask.flagMap.put(keyMinus, "-0.09");fireEmail("-9级", code);fireWechat("-9级", code);} else if (rate < -0.08 && lastRate > -0.08) {ScheduleTask.flagMap.put(keyMinus, "-0.08");fireEmail("-8级", code);fireWechat("-8级", code);} else if (rate < -0.07 && lastRate > -0.07) {ScheduleTask.flagMap.put(keyMinus, "-0.07");fireEmail("-7级", code);fireWechat("-7级", code);} else if (rate < -0.06 && lastRate > -0.06) {ScheduleTask.flagMap.put(keyMinus, "-0.06");fireEmail("-6级", code);fireWechat("-6级", code);} else if (rate < -0.05 && lastRate > -0.05) {ScheduleTask.flagMap.put(keyMinus, "-0.05");fireEmail("-5级", code);fireWechat("-5级", code);} else if (rate < -0.04 && lastRate > -0.04) {ScheduleTask.flagMap.put(keyMinus, "-0.04");fireEmail("-4级", code);fireWechat("-4级", code);} else if (rate < -0.03 && lastRate > -0.03) {ScheduleTask.flagMap.put(keyMinus, "-0.03");fireEmail("-3级", code);fireWechat("-3级", code);} else if (rate < -0.02 && lastRate > -0.02) {ScheduleTask.flagMap.put(keyMinus, "-0.02");fireEmail("-2级", code);fireWechat("-2级", code);} else if (rate < -0.01 && lastRate > -0.01) {ScheduleTask.flagMap.put(keyMinus, "-0.01");fireEmail("-1级", code);fireWechat("-1级", code);}}// System.out.println(rate);}public void fireEmail(String flag, String code) {List<String> list = new ArrayList<String>();list.add("1083089079@qq.com");String date = LocalDateTime.now().minusDays(7).format(DateTimeFormatter.ISO_LOCAL_DATE);try {SendmailUtil.SendQQHtmlEmail("1083089079@qq.com", list, "QQ空间黄钻业务通知" + flag,MailTemplate.mailString.replace("########", date).replace("*********", code));} catch (Exception e) {e.printStackTrace();}}public void fireWechat(String flag, String code) {String date = LocalDateTime.now().minusDays(7).format(DateTimeFormatter.ISO_LOCAL_DATE);String title = "黄钻待支付订单提醒";String content = "您的QQ " + code + "于" + date + "购买了黄钻贵族" + flag+ " ,尚未完成支付。只差一步,开通即享QQ空间背景装扮、动态昵称展示、被挡访客查看等空间百余项特权。加入黄钻贵族,享受更多空间特权。";String remark = "点击详情别错过精彩...";SendWechat.sendMsg(title, content, remark);}public static void main(String[] args) {// 交易时间LocalTime currentTime = LocalTime.now();int h = currentTime.getHour();int m = currentTime.getMinute();int time = Integer.valueOf(String.valueOf(h) + String.valueOf(m));System.out.println(time);String res = HttpUtils.getRes("http://quan.suning.com/getSysTime.do");JSONObject obj = JSON.parseObject(res);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime currentTime0 = LocalDateTime.parse(obj.getString("sysTime2"), formatter);System.out.println(currentTime0);}}

4. 截图为证

5. 改进

如果各位有更好的思路,可以私信我共同探讨交流。

股票涨跌幅度实时监控并发送微信通知相关推荐

  1. 基于长短期记忆网络(LSTM)对股票价格的涨跌幅度进行预测

    完整代码:https://download.csdn.net/download/qq_38735017/87536579 为对股票价格的涨跌幅度进行预测,本文使用了基于长短期记忆网络(LSTM)的方法 ...

  2. python 模拟微信浏览器请求_2020-03-06 python selenium 模拟访问网页检查更新并微信通知...

    老同学说有个不错的网站,华尔街日报每天更新,但是百度网盘每24小时后就会删除,偶尔忘记去下载就再也找不到了. 简单介绍一下最后成果,在Mac下开发,Ubuntu服务器部署定时检查发送微信到指定用户.在 ...

  3. 用python实时监控A股股票的波动并发送预警邮件

    这几天对量化交易颇感兴趣,所以就鼓捣了一下,网上搜索一波发现,Tushare是一个开源的股票信息来源,可以轻松地获取股票信息,Tushare主页:http://tushare.org/ ,目前主要是通 ...

  4. java 实时监控微信扫码支付,支付成功跳转到成功页面

    **原文链接:https://www.blog-china.cn/liuzaiqingshan/home/39/1510305872502 欢迎访问个人博客,分享更多技术码上中国博客(CodeChin ...

  5. 实时监控网站内容更新,微信来提醒

    木头软件站的网站资讯监控工具,功能强大,可以对各种网站的内容进行监控,比如对网站内容更新的监控,然后微信提醒.监控网站超链接,当出现更新或满足关键字条件时,立即报警提醒并记录.帮助你从海量的网络资讯中 ...

  6. matlab 股票分时图_Matlab实时监控股票交易数据之Timer函数应用实例

    现在项目中有个需求要从股票开盘开始,实时监控指定股票(例如100只股票)的交易明细数据,这边明显要用到多线程进行处理每条股票的数据,查了下Matlab相关函数,竟然没有多线程的说法,网上说唯一一个多线 ...

  7. 股票计算总交易量 matlab,Matlab实时监控股票交易数据之Timer函数应用实例

    现在项目中有个需求要从股票开盘开始,实时监控指定股票(例如100只股票)的交易明细数据,这边明显要用到多线程进行处理每条股票的数据,查了下Matlab相关函数,竟然没有多线程的说法,网上说唯一一个多线 ...

  8. linux 监控微信通知,一个 Linux 下基于 Bash 的文件和数据库监控及备份工具,可发送微信报警通知...

    shellMonitor 一个 Linux 下基于 bash 的文件和数据库监控及备份工具. 写这个工具的原因,在于一个朋友的一个小电商网站,因为未明原因被黑了,总是会被增加超级管理员,并将收款账号改 ...

  9. Python盯盘机器人,实时监控股票价格,还能邮件通知你

    前言 Python凭借其开发效率高和功能强大的特性,在众多编程语言中脱颖而出,成为大数据时代的分析利器. 据我多年的领悟,编程语言只是一种按照人的意图去实现特定功能的高效工具而已,程序化所实现的核心决 ...

最新文章

  1. R语言ggplot2可视化:使用scale_y_continous函数自定义指定Y轴的坐标范围以及对应的数值、将坐标轴的数值设置为需要的数据类型(整型、浮点型)
  2. validating和validated的区别
  3. 5.MySQL Cluster(MySQL集群)
  4. HDOJ 5373 The shortest problem 【数论】
  5. Android中RatingBar的自定义效果
  6. python 数组组合_python-查找数组中某些元素的所有组合
  7. php 工厂静态类,静态工厂模式(Static Factory)
  8. 游戏服务器出现问题怎么维护权益,游戏服务器出问题怎么解决
  9. MongoDB数据库备份恢复与导入导出
  10. 科学计算机怎么打输入abcd,Word2007让ABCD选项对齐不用愁
  11. 7-2 输出约数 (9 分)
  12. 大端与小端字节数据详解(转)
  13. 松翰单片机--SN8F5702学习笔记(二)HelloWorld
  14. qt开发资料下载网址
  15. MultiButton | 一个小巧简单易用的事件驱动型按键驱动模块
  16. LCD1602液晶屏
  17. Java给pdf添加页码(这是我之前的一篇文章)出现内存溢出Java heap space
  18. python爬虫岗位招聘_Python爬虫系列2-抓取拉钩网2020年最新互联网岗位招聘信息
  19. 创蓝253云通讯短信平台变量说明
  20. 国人函数概念,稀里糊涂,误人子弟

热门文章

  1. catia设置技巧教程:进入管理模式VS工程图模板(如何进入管理模式)
  2. Laravel集成Maatwebsite-Laravel-Excel最新版本v3
  3. 投资理财:货币基金也有风险
  4. 机房收费系统之日、周账单
  5. 易居住房3(“发布房源”--房源基本信息填写)
  6. Selenium原理精讲
  7. 在xshell等工具中使用命令的方式调用接口
  8. 你是不是也,睡不着?
  9. java计算机毕业设计银杏湖景区旅游管理信息平台源码+系统+mysql数据库+lw文档
  10. Java学习 - URL短地址压缩算法