目录

我的学习分享

记录精彩的程序人生

【acuistock】acuistock启动

自用股票行情软件
开发工具:Netbeans 8.2
开发平台:Netbeans Platform
数据源:面向A股市场,支持多数据源(同一时间只能选择一个数据源),首先支持的是免费的Tushare


中国股票市场是由三部分组成:A股市场、B股市场和H股市场。
A股
也称为人民币普通股票、流通股、社会公众股、普通股。是指那些在中国大陆注册、在中国大陆上市的普通股票。以人民币认购和交易。

B股
也称为人民币特种股票。是指那些在中国大陆注册、在中国大陆上市的特种股票。以人民币标明面值,只能以外币认购和交易。其中,沪市B股需要用美金才能交易;深市B股必须用港币交易。

H股
也称为国企股,是指国有企业在香港 (Hong Kong) 上市的股票。


通过证券代码判断证券属于上证还是深证。
前面是000的,或者002还有300就是属于深交所的,前面是主板,后面是中小企业板.300的是属于创业板.
前面是600,或者是601的就是上交所的证券.


切换数据源时会对现有的图表造成影响,简单的方法是重新打开现有的ChartFrame;复杂的方法是让ChartFrame监听数据源改变事件并相应处理


MainPanelLayout.png

new LayoutManager() {
            @Override
            public void addLayoutComponent(String name, Component comp) {
            }

            @Override
            public void removeLayoutComponent(Component comp) {
            }

            @Override
            public Dimension preferredLayoutSize(Container parent) {
                return new Dimension(0, 0);
            }

            @Override
            public Dimension minimumLayoutSize(Container parent) {
                return new Dimension(0, 0);
            }

            @Override
            public void layoutContainer(Container parent) {
                // 计算客户区域
                int right = (int) ChartData.dataOffset.right;   // 右方数据偏移
                int bottom = (int) ChartData.dataOffset.bottom; // 下方数据偏移
                Insets insets = parent.getInsets();             // 父控件的内嵌矩形(ChartFrame)
                int w = parent.getWidth() - insets.left - insets.right - right;
                int h = parent.getHeight() - insets.top - insets.bottom - bottom;

                // 设置四个子控件所占区域
                // sPane与grid占据的区域一致
                grid.setBounds(insets.left, insets.top, w, h);
                dateAxis.setBounds(insets.left, insets.top + h, w, bottom);
                priceAxis.setBounds(insets.left + w, insets.top, right, insets.bottom + h);
                sPane.setBounds(insets.left, insets.top, w, h);
            }
        }
  • grid/sPane区域的宽度和高度都会随窗体大小的变化而变化
  • dateAxis的高度固定,宽度随窗体宽度的变化而变化
  • priceAxis的宽度固定,高度随窗体高度的变化而变化

15720852101.png

new LayoutManager() {
            @Override
            public void addLayoutComponent(String name, Component comp) {
            }

            @Override
            public void removeLayoutComponent(Component comp) {
            }

            @Override
            public Dimension preferredLayoutSize(Container parent) {
                return new Dimension(0, 0);
            }

            @Override
            public Dimension minimumLayoutSize(Container parent) {
                return new Dimension(0, 0);
            }

            @Override
            public void layoutContainer(Container parent) {
                // 计算客户区域
                Insets insets = parent.getInsets();
                int x = insets.left;
                int y = insets.top;
                int w = parent.getWidth() - insets.left - insets.right;
                int h = parent.getHeight() - insets.top - insets.bottom;
                // 指标面板的高度是固定的,图表高度是客户区高度去掉指标高度剩下的部分
                int indicatorsHeight = indicatorsPanel.getPanelHeight();
                int chartHeight = h - indicatorsHeight;

                indicatorsPanel.setBounds(x, y + chartHeight, w, indicatorsHeight);
                chartPanel.setBounds(x, y, w, chartHeight);

                Point dp = new Point(0, 50);
                Point p = label.getLocation();
                if (!dp.equals(p)) {
                    label.setBounds(p.x, p.y, width + 2, height * lines + 2);
                } else {
                    label.setBounds(dp.x, dp.y, width + 2, height * lines + 2);
                }
            }
        }

ChartPanelLayout.png

new LayoutManager() {
            @Override
            public void addLayoutComponent(String name, Component comp) {
            }

            @Override
            public void removeLayoutComponent(Component comp) {
            }

            @Override
            public Dimension preferredLayoutSize(Container parent) {
                return new Dimension(0, 0);
            }

            @Override
            public Dimension minimumLayoutSize(Container parent) {
                return new Dimension(0, 0);
            }

            @Override
            public void layoutContainer(Container parent) {
                int width = parent.getWidth();
                int height = parent.getHeight();

                stockInfo.setBounds(0, 0, width, stockInfo.getPreferredSize().height);
                annotationPanel.setBounds(0, 2, width - 4, height - 4);
                overlayToolboxes.setLocation(0, stockInfo.getPreferredSize().height + 1);
            }
        }

  • 采用富途FTAPI
  • 面向A股市场
  • 是否需要保留本地缓存?