股票学习网

股票学习网_股票入门基础知识_炒股入门知识 - - 股票学习网!

股票行情接口 股票行情实时查询

2024-04-02 04:03分类:价值投资 阅读:

作者:小傅哥
博客:https://bugstack.cn

沉淀、分享、成长,让自己和他人都能有所收获!

一、前言

没招了,不写点刺激的,你总是不好好看!

以前,我不懂。写的技术就是技术内容,写的场景就是场景分析,但从读者的阅读我发现,大家更喜欢的是技术与场景结合,尤其是用技术结合那些羞羞答答的场景,虽然嘴上都不说。

本章节主要是想给大家介绍关于在 IDEA 插件开发中如何使用工具栏和Tab页,来填充在 IDEA 中底部的窗体,就像 IDEA 中的控制台一样。但就这么写好像是够呛能有人看,因为大家只从技术点来看,很难发现这里面有什么应用场景,即使看了好像也不知道这技术能干啥。

那咋办,整点刺激的吧。大家不是喜欢赔钱炒股吗,那就把股票行情和K线展示结合到IDEA插件开发中。可以让学习插件的伙伴,都能在写代码疲惫的时候还能看一眼股票,也许在关键的时候还能提醒你赶紧抛出去!

二、需求目的

安全起见,需要在 IDEA 中以一个比较隐秘的角落,开发股票插件,让炒股的同学可以在紧张编码CRUD之余,不要忘记自己关注的股票购买和抛售。

那么为了解决这个问题,我们需要几个技术点,包括:股票数据接口、查询对象封装、IDEA 底部窗体和工具栏开发、定时任务扫描、Swing UI、股票代码配置和保存、窗体按钮事件监听等。

接下来我们就结合这些技术点,来解决实际的场景问题,看看如何在 IDEA 中开发一个股票插件。

三、案例开发1. 工程结构

guide-idea-plugin-tab ├── .gradle └── src ├── main │ └── java │ └── cn.bugstack.guide.idea.plugin │ ├── domain │ │ ├── model │ │ │ ├── aggregates │ │ │ │ └── StockResult.java │ │ │ └── vo │ │ │ ├── Data.java │ │ │ ├── GoPicture.java │ │ │ └── Stock.java │ │ └── service │ │ ├── impl │ │ │ └── StockImpl.java │ │ └── IStock │ ├── factory │ │ └── TabFactory.java │ ├── infrastructure │ │ ├── DataSetting.java │ │ └── DataState.java │ ├── module │ │ ├── RefreshBar.java │ │ ├── SettingBar.java │ │ └── ViewBars.java │ └── ui │ │ ├── ConsoleUI.java │ │ ├── ConsoleUI.form │ │ ├── GidConfig.java │ │ └── GidConfig.form │ └── Config ├── resources │ └── META-INF │ └── plugin.xml ├── build.gradle └── gradle.properties

公众号:bugstack虫洞栈 回复:idea 即可下载全部 IDEA 插件开发源码

在此 IDEA 插件工程中,主要分为5块区域:

domain:领域层,提供查询股票接口的数据服务,如果你是做的一些其他工具型功能,也可以把业务类的内容放到 domain 中实现。

factory:工厂层,这里主要提供的是一个工具窗体生成的入口对象,来创建出我们自己添加的窗体内容。

infrastructure:基础层,提供了数据存放对象,这个数据对象是一个可以落盘的操作,创建好的类配置到 plugin.xml 中即可。这样我们配置好股票代码后,关机重启 IDEA 也可以把配置读取出来

module:模块,提供用于 UI 窗体使用的一些工具页操作。比如这里的 ViewBars 会在 TabFactory 中实例化,用于展示出你添加的窗体。

ui:这一部分使用的是 IDEA 中自动拖拽生成的窗体,免去了手写的复杂性,一些简单的页面直接拖拽就可以。这也是一种低代码哦!

接下来,我们就分别看下每个核心功能点的实现过程,这个过程中你可以提前把代码下载下来,对照着学习会更加容易理解。

实现 ToolWindowFactory 开发一个底部的窗体,用于承载所需的内容

左侧是侧边工具栏,配置自选股、刷新股票指数

右侧是2个 tab 页,分别用于展示股票数据和K线图,这里的数据则需要通过股票接口来提供

2. tab 页窗体

首先这里我们先使用 IDEA 插件开发中,Swing UI 功能,拖拽出2个简单的窗体。有了这样的一个基本结构大家的脑子里应该就可以有画面了。

2.1 自选股配置窗体

public class GidConfig implements Configurable { private JPanel mainPanel; private JPanel settingPanel; private JLabel gidLabel; private JTextField gidTextField; private ConsoleUI consoleUI; public GidConfig(ConsoleUI consoleUI){ this.consoleUI = consoleUI; } public JTextField getGidTextField() { return gidTextField; } @Override public void apply() throws ConfigurationException { List<String> gidList = DataSetting.getInstance().getGids(); gidList.clear(); String[] gids = gidTextField.getText().trim().split(","); for (String gid : gids) { gidList.add(gid.trim()); } // 刷新数据 consoleUI.addRows(gidList); } }

在 GidConfig 对应的 java 类中,可以对一些窗体中出现的属性进行获取。当用户点击这个窗体的确认按钮后,我们可以在 apply 中拿到用户配置的股票代码,并对其进行读取和设置股票数据。

2.2 股票展示窗体

public class ConsoleUI { private JTabbedPane tabbedPane1; private JPanel one; private JPanel two; private JLabel picMin; private JTable table; private JLabel picDay; // 查询数据服务 private IStock stock = new StockImpl(); private DefaultTableModel defaultTableModel = new DefaultTableModel(new Object[][]{}, new String[]{"股票", "代码", "最新", "涨跌", "涨幅"}); public ConsoleUI() { // 初始数据 table.setModel(defaultTableModel); addRows(DataSetting.getInstance().getGids()); // 添加事件 table.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { int row = table.getSelectedRow(); Object value = table.getValueAt(row, 1); GoPicture goPicture = stock.queryGidGoPicture(value.toString()); try { // 分钟K线 picMin.setSize(545, 300); picMin.setIcon(new ImageIcon(new URL(goPicture.getMinurl()))); // 当日K线 picDay.setSize(545, 300); picDay.setIcon(new ImageIcon(new URL(goPicture.getDayurl()))); } catch (MalformedURLException m) { m.printStackTrace(); } } }); } public JTabbedPane getPanel() { return tabbedPane1; } public void addRows(List<String> gids) { // 查询 List<Data> dataList = stock.queryPresetStockData(gids); // 清空 int rowCount = defaultTableModel.getRowCount(); for (int i = 0; i < rowCount; i++) { defaultTableModel.removeRow(0); } // 添加 for (Data data : dataList) { defaultTableModel.addRow(new String[]{data.getName(), data.getGid(), data.getNowPri(), data.getIncrease(), data.getIncrePer()}); table.setModel(defaultTableModel); } } }

展示股票的窗体对应的 ConsoleUI 类,主要负责数据的渲染、更新和对每条数据的事件操作,当用户点击某一条数据以后,就可以到 K线 页中看到对应的股票指数了。

3. 股票框体设置

在开发完 UI 窗体后,我们还需要使用一个 SimpleToolWindowPanel 的继承实现类,承载工具栏和页面的设置。

3.1 设置-工具栏

cn.bugstack.guide.idea.plugin.module.SettingBar

public class SettingBar extends DumbAwareAction { private ViewBars panel; public SettingBar(ViewBars panel) { super("配置股票", "Click to setting", IconLoader.getIcon("/icons/config.svg")); this.panel = panel; } @Override public void actionPerformed(@NotNull AnActionEvent e) { ShowSettingsUtil.getInstance().editConfigurable(panel.getProject(), new GidConfig(panel.getConsoleUI())); } }

设置工具栏位于自定义插件面板中最左侧的位置,用于设置自选股票代码。

通过在方法 actionPerformed 中使用 ShowSettingsUtil 工具类启动 UI 窗体。

3.2 刷新-工具栏

cn.bugstack.guide.idea.plugin.module.RefreshBar

public class RefreshBar extends DumbAwareAction { private ViewBars panel; public RefreshBar(ViewBars panel) { super("刷新指数", "Click to refresh", IconLoader.getIcon("/icons/refresh.svg")); this.panel = panel; } @Override public void actionPerformed(@NotNull AnActionEvent e) { panel.getConsoleUI().addRows(DataSetting.getInstance().getGids()); } }

在刷新工具栏中主要是用于手动触发刷新股票最新结果,之所以使用手动刷新主要是这个接口有查询次数限制,如果是定时任务一直跑,一会100次的查询限制就用完了。不过我们这里也是为了体现专栏内对技术的使用,增加多个设置按钮,就更容易知道如何添加了

3.3 窗体填充面板

cn.bugstack.guide.idea.plugin.module.ViewBars

public class ViewBars extends SimpleToolWindowPanel { private Project project; private ConsoleUI consoleUI; public ViewBars(Project project) { super(false, true); this.project = project; consoleUI = new ConsoleUI(); // 设置窗体侧边栏按钮 DefaultActionGroup group = new DefaultActionGroup(); group.add(new SettingBar(this)); group.add(new RefreshBar(this)); ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar("bar", group, false); toolbar.setTargetComponent(this); setToolbar(toolbar.getComponent()); // 添加 JBSplitter splitter = new JBSplitter(false); splitter.setSplitterProportionKey("main.splitter.key"); splitter.setFirstComponent(consoleUI.getPanel()); splitter.setProportion(0.3f); setContent(splitter); } public Project getProject() { return project; } public ConsoleUI getConsoleUI() { return consoleUI; } }

在填充面板中主要是在我们自定义的插件中,在左侧添加工具栏,其余位置添加股票展示面板。

DefaultActionGroup 中可以以此添加设置和刷新按钮,并最终填充到 ActionToolbar 里去,这样就设置完成了。

JBSplitter 是一个分割线,右侧填充上我们的股票指数展示面板 splitter.setFirstComponent(consoleUI.getPanel())

4. 填充主面板到IDEA工具栏4.1 窗体工厂

cn.bugstack.guide.idea.plugin.factory.TabFactory

public class TabFactory implements ToolWindowFactory { @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { // 窗体 ViewBars viewPanel = new ViewBars(project); // 获取内容工厂的实例 ContentFactory contentFactory = ContentFactory.SERVICE.getInstance(); // 获取 ToolWindow 显示的内容 Content content = contentFactory.createContent(viewPanel, "股票", false); // 设置 ToolWindow 显示的内容 toolWindow.getContentManager().addContent(content, 0); // 定时任务,自动刷新股票 /* 因每日查询次数限制,这里就不开定时任务了,用户可以自行申请 https://dashboard.juhe.cn/home Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { viewPanel.getConsoleUI().addRows(DataSetting.getInstance().getGids()); } }, 3000, 2000);*/ } }

在 TabFactory 中主要包括两部分,一个是把 ViewBars 填充到整个 toolWindow 中,另外一个是我们目前已经注释掉的刷新股票数据的定时任务。

这里由于股票接口查询次数限制,所以就把定时任务注释掉了,否则一会就把可用次数跑没了。

4.2 配置窗体

plugin.xml

<idea-plugin> <extensions defaultExtensionNs="com.intellij"> <!-- Add your extensions here --> <toolWindow id="XUtil" canCloseContents="true" anchor="bottom" factoryClass="cn.bugstack.guide.idea.plugin.factory.TabFactory" icon="/icons/stock.png" /> </extensions> </idea-plugin>

这里我们把窗体配置到整个 IDEA 界面的最下方 anchor="bottom" 这个位置既方便又最安全

5. 数据持久化配置

当我们使用 IDEA 进行配置一些基本参数后,例如:Maven、Gradle、Git、签名信息等,在日常的关闭和重启 IDEA 时,这些配置信息是会保存下来的,而不会说关闭就没了。

那么我们开发的这款插件需要做的一些自选股票代码配置,也要进行保存,否则不能每次都在 IDEA 启动时重新设置。所以这里我们需要用到 plugin.xml 中 applicationService 配置上实现了 PersistentStateComponent 的数据设置存放类。

5.1 对象数据

cn.bugstack.guide.idea.plugin.infrastructure.DataState

public class DataState { private List<String> gids = new ArrayList<>(); public List<String> getGids() { return gids; } public void setGids(List<String> gids) { this.gids = gids; } }

这个是数据对象类,你可以在这里设置你需要的属性存放,就像 gids 一样,用于存放用户配置的股票代码集合。

5.2 持久数据

cn.bugstack.guide.idea.plugin.infrastructure.DataSetting

@State(name = "DataSetting",storages = @Storage("plugin.xml")) public class DataSetting implements PersistentStateComponent<DataState> { private DataState state = new DataState(); public static DataSetting getInstance() { return ServiceManager.getService(DataSetting.class); } @Nullable @Override public DataState getState() { return state; } @Override public void loadState(@NotNull DataState state) { this.state = state; } public List<String> getGids(){ return state.getGids(); } }

DataSetting 类需要使用到 IDEA 插件开发的提供的注解 @State 配置持久对象

此外还需要提供一个 getInstance 方法来获取数据对象实例,那么在我们实际使用的时候就可以拿到我们配置的对象了并进行设置和读取数据。

5.3 plugin.xml 配置

<extensions defaultExtensionNs="com.intellij"> <!-- Add your extensions here --> <applicationService serviceImplementation="cn.bugstack.guide.idea.plugin.infrastructure.DataSetting"/> </extensions>

在创建好数据设置类以后,则需要使用 applicationService 标签把你的类配置到 plugin.xml 中 extensions 里面。

6. 股票接口6.1 技术调研

无论什么功能开发,在开始之前都需要把这些零碎的事情处理完,才能进行代码开发,这个过程也叫做技术调研到设计和评审。就像现在我们需要进行股票信息的查询,那么就需要找到一个可以提供数据查询的接口,看看这个接口如何申请使用,以及返回的对象都有哪些字段,是否符合我们的预期。

这里小傅哥找到了一个聚合数据的接口,不过只能免费100次/天调用,如果你有更好的可以更换下。

接口:http://web.juhe.cn:8080/finance/stock/hs?gid=sz000651&key=自己申请 - 这里的 key 需要自己申请

数据:

6.2 服务封装

有了股票的查询接口,接下来就可以对数据做一个查询和对象转换了。

cn.bugstack.guide.idea.plugin.domain.service.impl.StockImpl

public class StockImpl implements IStock { // 自行申请,股票API,替换key即可【一天可免费调用100次】:https://dashboard.juhe.cn/home/ private final String key = "4bc57728***********f0595"; @Override public List<Data> queryPresetStockData(List<String> gids) { List<Data> dataList = new ArrayList<>(); for (String gid : gids) { StockResult stockResult = JSON.parseObject(HttpUtil.get("http://web.juhe.cn:8080/finance/stock/hs?gid=" + gid + "&key=" + key), StockResult.class); Stock[] stocks = stockResult.getResult(); for (Stock stock : stocks) { dataList.add(stock.getData()); } } return dataList; } }

这里我们在 domain 领域层中定义数据 vo 对象,以及提供股票查询服务的封装。这样调用方就可以直接使用这份数据了,如果你是其他厂商提供的股票查询接口,也可以进行封装和更换,做一个接口适配层。

四、测试验证

如果你下载工程后没有 Plugin 和一个绿色箭头,那么可以按照图自己配置 :runIde 这样就可以运行了。

运行效果 - 激动人心的时刻到了,再也不用担心写代码影响看股票了哦

1. 配置股票

首先你需要在这里配置你关注的股票代码,我配置了3个我看好的。

2. 自选股指数

配置好以后你就可以看到自己的自选股指数了,选中一条以后,在点击K线。

当你需要看最新数据的时候,可以点左侧的刷新按钮。

3. K线

现在这个就是对应的 K线,是不是还挺香的。目前是加了最近K线和日K线,你还可以扩展其他维度的图。

五、总结

本章节我们使用到了在 IDEA 窗体中添加稍微复杂一些的页面结构,有侧边栏、有Tab页,并在需要在这些页面体中进行交互和通信。此外还是用到了数据的存储设置,这个在很多时候开发IDEA插件里都会用到。

像是这样的技术实践不只是可以用于展示股票数据,你还可以结合自己所需扩展属于你实际场景中需要的内容,比如开发一个数据集中查询插件,可以查询数据库、ES、Redis等,也可以是所有的工具类集合页,这些内容会更有技术价值。

当你自己开始主动的向你学习到的一些源码、框架、组件、项目等中添加自己想要的功能时,就是你真的开始学习了,否则一个内容看过没多久也就忘记了。

 

北京时间23日凌晨,美股周四尾盘继续下滑,道指此前一度下挫逾800点。主要股指重新恢复年末下跌行情。市场继续关注美国经济数据与衰退风险。

道指跌609.77点,跌幅为1.83%,报32766.71点;纳指跌330.61点,跌幅为3.09%,报10378.76点;标普500指数跌89.77点,跌幅为2.31%,报3788.67点。

周四美股重新回到最近熟悉的下挫模式,道指一度下跌逾800点,最低下降至32573.43点。

投资者仍然担心全球各大央行继续推行紧缩货币政策将把经济推入衰退。

Appaloosa管理公司创始人David Tepper表示:“我倾向于做空美股市场。在这么多央行都已明确表示他们下一步将会怎么做的时候,所谓的上行/下行分析对我来说没有意义。”

在这位有影响力的对冲基金经理发表上述讲话后,美股跌幅扩大。

周三美股收高,道指上涨526.74点,标普500指数与纳指分别上涨1.49%和1.54%。当天标普500指数的11大板块普遍走高,能源板块领涨。耐克与联邦快递公司公布财报后股价大涨,点燃了投资者关于企业盈利表现良好的希望。强劲的12月消费者信心指数同样令股指得到提振。

嘉信理财首席投资策略师Liz Ann Sonders表示,尽管良好的财报可能是推动周三市场情绪好转的因素,但超卖状况也对美股的反弹作出了贡献。

Liz Ann Sonders表示:“我认为,有些企业财报稍微好于市场预期。但我同时也认为,市场已经进入了另一个调整阶段,并且,从某些技术角度而言,有些超卖了。有买家入场。美股的日常波动是很难预测的。”

即使在周三美股上涨后,主要股指本周仍有可能录得跌幅。截止周三收盘,道指本周已经下跌3.51%,标普500指数下跌4.94%,纳指下跌了6.62%。三大股指均有可能结束此前连续三年上涨的行情,并有可能录得2008年以来的最差年度表现。

在今年美股下跌的背景下,美股空头今年大赚逾3000亿美元,将实现2018年来的首次盈利。卖空者的回报在一定程度上要归功于做空特斯拉、亚马逊和其他多年来引领市场走高的大型成长型股票。

根据分析公司S3 Partners的数据显示,卖空者——押注公司股价下跌的投资者——拥有3037亿美元的已实现收益和未实现收益,比2018年(他们最后一个盈利年)增长了四倍。根据S3 Partners的数据,这相当于全年9736亿美元的平均空头总回报率为31.2%。

就美元收益而言,做空特斯拉的押注居首,投资者在约193亿美元的做空股票中获得了150亿美元的已实现和未实现利润。这家电动汽车制造商的股价今年迄今已下跌约60%。过去几年,该公司的快速上涨让许多看跌的投资者蒙受了损失。

周四经济数据面,美国劳工部报告称,截至12月17日当周美国初请失业金人数21.6万,预期22.2万,前值21.1万。

美国商务部报告称,美国第三季度实际GDP年化季率终值3.2%,预期2.90%,前值2.90%。商务部称,美国第三季度实际GDP年化季率增长3.2%,高于此前的2.9%。较高的增长率在很大程度上反映了消费支出的向上修正,而消费支出是经济的主要驱动力。

第三季度消费者支出同比增长2.3%,高于此前公布的1.7%,原因是服务支出强于此前公布的数据。尽管利率上升,但消费依然强劲。

美国第三季度核心PCE物价指数年化季率终值4.7%,预期4.60%,前值4.60%。

美国第三季度实际个人消费支出季率终值2.3%,预期1.7%,前值1.7%。

分析机构指出,美国至12月17日当周初请失业金人数增幅低于预期,显示就业市场依然紧张,而第三季度经济反弹速度快于此前预期。最近几周初请失业金人数上下波动,但仍低于27万人的门槛,分析师称这将是就业市场的危险信号。

分析称,科技行业和房地产等利率敏感行业的大量裁员并未对初请失业金人数产生实质性影响。劳动力市场的强劲增长通过产生稳定的工资增长来帮助支撑经济,这有助于提高消费者支出。

同时公布的美国三季度GDP终值确认,美国经济在经历了今年上半年的收缩后,在第三季度出现反弹。尽管人们对衰退的担忧日益加剧,房地产市场也陷入低迷,但对第四季度经济增长的预期高达2.7%,消费者将承担重任,疫情期间积累的储蓄也为这一增长提供了支撑。

焦点个股

亚马逊周四盘中一度跌3.5%,市值缩水至约8500亿美元,为自2019年初以来新低。此前该公司在欧洲再度惹上官司,欧盟最高法院称其电子商城中出现了假冒的Christian Louboutin 品牌鞋类广告,并应当对此负责。之前,亚马逊刚刚就两起反垄断指控与欧盟达成和解。

葛兰素史克新冠疫苗加强针VidPrevtyn Beta在英国获得批准。

美光科技宣布计划通过自愿减员和裁员相结合的方式,在2023日历年将员工人数减少约10%。该公司预计第二季度将产生至少3000万美元的费用,大部分都是现金支出。

在同时交出的第一财季报告中,公司经调整营收40.9亿美元,分析师预期41.3亿美元;第一季度调整后每股收益0.040美元,分析师预期每股亏损0.01美元;预计第二季度经调整营收36亿美元至40亿美元;预计第二季度调整后每股亏损0.52美元至0.72美元。

特斯拉官网销售页面周三显示,本月在美国和加拿大交付的Model 3和Model Y车型可享受折扣。对于年底前交付的Model 3和Model Y汽车,该公司在美国提供7500美元的折价,在加拿大提供5,000美元的折价,还提供1万英里的免费充电服务。

英国竞争和市场管理局(CMA)周四公布一项调查结果:在收到的2100多封电子邮件中,CMA称,大约75%的人支持该交易,而其余25%的人反对。

法国隐私监管机构表示,已对爱尔兰微软处以6000万欧元的罚款,称其对该公司实施制裁是因为该公司没有建立让人们容易拒绝cookie的机制。

英国政府周四表示,美国生物技术公司Moderna计划在英国建立疫苗制造中心,该中心将在该国创造150多个新工作岗位。英国政府发言人表示,该中心每年可生产多达2.5亿支疫苗,Moderna将在该国进行至少11亿英镑的研发投资。

其他市场面,周四欧股收盘普跌,德国DAX30指数跌1.37%,英国富时100指数跌0.39%,法国CAC40指数跌1.08%,欧洲斯托克50指数跌1.36%。

https://www.haobaiyou.com

上一篇:中国pcb技术论坛和炒股论坛哪个好

下一篇:开户炒股流程及注意事项_炒股开户怎么开户流程

相关推荐

返回顶部