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

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. 改进

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11678.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用股票交易量查询接口是怎么查询a股全天总成交量的?

用股票交易量查询接口是怎么查询a股全天总成交量的&#xff1f;今天下班就以通达信给大家讲解一下&#xff0c;通常是在K线图的底部状态栏&#xff0c;可以在日线进行查看a股成交量。在市场栏底部的子图中。 有当天成交的数量。成交量是表示一定的时间内已经成交的中的成交数量…

聊聊的A股

继续聊A股市场 2022-01-24 股市理性投资 价值投资看人性 今天对于A股来说&#xff0c;表现还行&#xff0c;毕竟从上周末的各项指导的思路来看的话&#xff0c;这周的行情也不会有很大的上涨行情&#xff0c;但是跌的可能性也不会很大&#xff0c;毕竟大家都知道因为外界的因素…

拉伯证券|港股站上“年线”,更有盘中暴涨160%!A股地产板块集体大涨

今天上午&#xff0c;A股首要指数涨跌互现&#xff0c;“地产链”股票团体大涨。 港股方面&#xff0c;恒生指数和恒生科技指数盘中双双站上年线&#xff0c;多头攻势微弱。 港股盘中再现异动个股&#xff0c;有港股盘中暴升约160%。 A股首要指数涨跌互现“地产链”股票团体大…

java 验证手机号码、电话号码(包括最新的电信、联通和移动号码)

Cooking Regex微信公众号 正则表达式学习 一、目前的号码段&#xff08;2019-12-04更新&#xff09; 新增号段 &#xff1a; 1、移动号码&#xff1a;189、198 2、联通号码&#xff1a;166 3、电信号码&#xff1a;191、199 【注意】&#xff1a;目前&#xff08;2019-12-04…

科研工作者们,ChatGPT (GPT-4) 玩起来了没,来这体验一下吧

话不多说&#xff0c;直接上链接&#xff1a;https://sci.justscience.cn/chatgpt 再来个让我很惊讶的案例——设计研究方案 看看是不是可以作为一个小助理来给你点参考了&#xff1f; 如果想完全让ChatGPT来帮自己做完整方案还是放弃吧&#xff01;毕竟有些回答依然是有错的…

数据从业者会不会被ChatGPT取代?我决定问ta本人

最近ChatGPT火遍全网后 不少能力都被网友们吹上了天 面对如此强大的技术 催化了越来越多小伙伴对AI的焦虑 近期&#xff0c;它竟对数据分析师“口出狂言” 但是&#xff0c;帆软坚信数据人才的发展 将始终是数字化转型中的关键要素 于是&#xff0c;我们决定亲自发问 …

联合证券|战略新兴产业火了,高增长低估值股曝光

导读&#xff1a;2022年&#xff0c;A股商场值得记载的前史性大事件不断。这一年&#xff0c;A股商场上市公司数量正式打破5000家&#xff0c;战略新兴产业上市公司数量打破2500家&#xff0c;占比初次打破50%大关。这一年&#xff0c;A股商场顶住杂乱的外部环境因素&#xff0…

ChatGPT且用且珍惜,商用在路上;阿里达摩院2023十大科技趋势;GitHub默认设置开放代码扫描功能;小红书元宇宙虚拟服饰被吐槽;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 『ChatGPT』服务器频频被挤爆&#xff0c;OpenAI 被薅怕了&#xff0c;要商用购✦买&#xff1f; OpenAI 本周表示即将推出 ChatGPT Professional…

腾讯回应进军类 ChatGPT;Meta 新语言模型能运行在单张显卡上;OpenAI 创始人提出新摩尔定律|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

ChatGPT智能教育机器人开发

随着科技的不断发展&#xff0c;人工智能正逐渐渗透到各个行业中。教育领域也不例外&#xff0c;智能教育机器人成为了无声的见证者和智慧的引导者。 一、ChatGPT智能教育机器人的概述 ChatGPT智能教育机器人是一种基于人工智能技术的教育辅助工具&#xff0c;旨在提供个性化…

它急了,谷歌版ChatGPT已开放测试申请!网友已玩疯

来源&#xff1a;新智元 GPT-4发布已然一周时间&#xff0c;而热度丝毫未减。 即便是OpenAI把限制提高到3小时只让问25个问题&#xff0c;服务器还是被网友挤爆了…… 在被微软一波爆锤之后&#xff0c;谷歌终于几个小时之前宣布&#xff0c;自家的ChatGPT——Bard&#xff0c;…

复旦开源首个「中国版ChatGPT」MOSS!全新插件系统

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 来自&#xff1a;新智元 【新智元导读】复旦NLP团队首次上线MOSS两个月后&#xff0c;他们遵照承诺&#xff0c;真的把MOSS开源了。同时&#xff0c;MOSS也成为了国内首个搭载插件系统的开源对话语言模…

11种方式加入ChatGPT引领的生成式AI浪潮

近期ChatGPT爆火出圈&#xff0c;除了它能准确高效地和我们对话&#xff0c;怎么区分它和人类的作品&#xff1b;它会代替哪些行业&#xff1b;它还有哪些可发掘的商业价值&#xff1b;这是否是AI奴役或毁灭人类的第一步&#xff0c;都成了大家关注的热点&#xff0c;对此ChatG…

华人团队迷你GPT-4抢跑看图聊天:OpenAI有的它都有,服务器已被挤爆

梦晨 发自 凹非寺量子位 | 公众号 QbitAI GPT-4识图功能迟迟不开放&#xff0c;终于有人忍不住自己动手做了一个。 MiniGPT-4来了&#xff0c;Demo开放在线可玩。 传一张海鲜大餐照片上去&#xff0c;就能直接获得菜谱。 传一张商品效果图&#xff0c;就可以让AI写一篇带货文案…

聚观早报 | 百度文心一言被用户挤爆;贝莱德准备竞购瑞信

今日要闻&#xff1a;百度文心一言被用户挤爆&#xff1b;贝莱德准备竞购瑞信&#xff1b;Meta 在美国推出付费加「蓝 V」服务&#xff1b;三星正开发 3500ppi 的 FMM&#xff1b;老干妈冰激凌要来了 百度文心一言被用户挤爆 百度正式发布了自己的 AI 大模型文心一言&#xff…

当CRM遇见ChatGPT,AI如何帮销售打造“最强大脑”

导读&#xff1a;这一轮AI浪潮将对CRM企业带来哪些新机遇&#xff1f; ChatGPT诞生至今不过100多天&#xff0c;但它已经对很多行业产生了巨大影响。 企业直面市场的一线战场——销售、营销、客服等领域也是如此。以ChatGPT为代表的人工智能技术热潮正在改变着传统营销、销售的…

如何用 10 种策略改进 ChatGPT 的人工智能

你是否曾有过和AI机器人交互无果的经历&#xff1f;或许只是因为提示语的问题&#xff01;想要ChatGPT/Bard/Bing Chat等AI机器人更智能、回应更高效? 必须学会AI提示语技巧&#xff01;本文将深入解析如何用精准的语言编写提示&#xff0c;让您的AI聊天机器人更进一步。 为什…

ChatGPT与数据挖掘:洞察消费者行为,优化营销策略

随着科技的不断进步和数字化时代的到来&#xff0c;企业们越来越意识到数据的重要性。在零售和电子商务行业&#xff0c;了解消费者行为并准确洞察其需求&#xff0c;是成功营销和提升业绩的关键。而现在&#xff0c;借助人工智能技术中的ChatGPT以及数据挖掘技术&#xff0c;企…

苹果禁用ChatGPT,为防机密泄露!大模型版Siri即将升级推出

明敏 杨净 发自 凹非寺量子位 | 公众号 QbitAI 前脚ChatGPT刚刚上线iOS嗨翻全球&#xff0c;火速霸榜APP Store&#xff1b; 后脚却曝出消息——苹果自家员工不能用ChatGPT&#xff0c;而且已经好几个月了。 这事儿马上引发巨大讨论。 要知道&#xff0c;从ChatGPT趋势到来后&a…

Midjourney|文心一格prompt教程[Text Prompt(上篇)]:品牌log、App、徽章、插画、头像场景生成,各种风格选择:科技风、运动风

Midjourney|文心一格prompt教程[Text Prompt&#xff08;上篇&#xff09;]&#xff1a;品牌log、App、徽章、插画、头像场景生成&#xff0c;各种风格选择&#xff1a;科技风、运动风 1.撰写 Text Prompt 注意事项 Midjourney 跟 ChatGPT 在 prompt 的使用上有很多不一样的地…