当前位置: 首页 > 知识库问答 >
问题:

JFreeChart:如何创建一个带有振荡器的中间面板

倪培
2023-03-14

我有两个面板。一个是价格(OHLC)和移动平均线,另一个是成交量。我想创建一个中间面板,其中有两个振荡器在零附近振荡。每个振荡器是上面图表的两个移动平均数之差。可能吗?非常感谢。

共有1个答案

皇甫福
2023-03-14

这是最终的解决办法。我从Plot3创建中删除了所有引用。

public class PriceVolumeChart2 extends ApplicationFrame{


final static String filename = "A.txt";
static TimeSeries t1 = new TimeSeries("49-day moving average");

/**
 * Default constructor
 */
public PriceVolumeChart2(String title)
{
    super(title);
    JPanel panel = createDemoPanel();
    panel.setPreferredSize(new Dimension(500, 270));
    setContentPane(panel);
}


//create price dataset
//hard-coded here
private static OHLCDataset createPriceDataset(String filename)
{
    //the following data is taken from http://finance.yahoo.com/
    //for demo purposes...


    OHLCSeries s1 = new OHLCSeries(filename);

    try {
        BufferedReader in = new BufferedReader(new FileReader(filename));
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        String inputLine;
        in.readLine();
        while ((inputLine = in.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(inputLine, ",");
            Date date       = df.parse( st.nextToken() );
            double open     = Double.parseDouble( st.nextToken() );
            double high     = Double.parseDouble( st.nextToken() );
            double low      = Double.parseDouble( st.nextToken() );
            double close    = Double.parseDouble( st.nextToken() );
            double volume   = Double.parseDouble( st.nextToken() );
            //double adjClose = Double.parseDouble( st.nextToken() );
            s1.add(new Day(date), open, high, low, close);
            t1.add(new Day(date), close);
        }
        in.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }



    OHLCSeriesCollection dataset = new OHLCSeriesCollection();
    dataset.addSeries(s1);

    return dataset;
}


//create volume dataset
private static IntervalXYDataset createVolumeDataset(String filename)
{
    //create dataset 2...
    TimeSeries s1 = new TimeSeries("Volume");

    try {
        BufferedReader in = new BufferedReader(new FileReader(filename));
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        String inputLine;
        in.readLine();
        while ((inputLine = in.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(inputLine, ",");
            Date date = df.parse( st.nextToken() );
            st.nextToken();
            st.nextToken();
            st.nextToken();
            st.nextToken();
            double volume   = Double.parseDouble( st.nextToken() );
            //double adjClose = Double.parseDouble( st.nextToken() );
            s1.add(new Day(date), volume);
        }
        in.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }



    return new TimeSeriesCollection(s1);
}


private static JFreeChart createCombinedChart()
{
    OHLCDataset data1 = createPriceDataset(filename);

    XYItemRenderer renderer1 = new HighLowRenderer();
    renderer1.setBaseToolTipGenerator(new StandardXYToolTipGenerator(StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0.00")));
    renderer1.setSeriesPaint(0, Color.blue);
    DateAxis domainAxis = new DateAxis("Date");
    NumberAxis rangeAxis = new NumberAxis("Price");
    rangeAxis.setNumberFormatOverride(new DecimalFormat("$0.00"));
    rangeAxis.setAutoRange(true);
    rangeAxis.setAutoRangeIncludesZero(false);
    XYPlot plot1 = new XYPlot(data1, domainAxis, rangeAxis, renderer1);
    plot1.setBackgroundPaint(Color.lightGray);
    plot1.setDomainGridlinePaint(Color.white);
    plot1.setRangeGridlinePaint(Color.white);
    plot1.setRangePannable(true);

    //Overlay the Long-Term Trend Indicator
    TimeSeries dataset3 = MovingAverage.createMovingAverage(t1, "LT", 49, 49);
    TimeSeriesCollection collection = new TimeSeriesCollection();
    collection.addSeries(dataset3);
    plot1.setDataset(1, collection);
    plot1.setRenderer(1, new StandardXYItemRenderer());

    //add a second dataset (volume) and renderer
    IntervalXYDataset data2 = createVolumeDataset(filename);
    XYBarRenderer renderer2 = new XYBarRenderer();
    renderer2.setDrawBarOutline(false);
    renderer2.setBaseToolTipGenerator(new StandardXYToolTipGenerator(StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT, new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0,000.00")));
    renderer2.setSeriesPaint(0, Color.red);

    XYPlot plot2 = new XYPlot(data2, null, new NumberAxis("Volume"), renderer2);
    plot2.setBackgroundPaint(Color.lightGray);
    plot2.setDomainGridlinePaint(Color.white);
    plot2.setRangeGridlinePaint(Color.white);

    //middle pane oscillator
    TimeSeries threeMA = MovingAverage.createMovingAverage(t1, "SL1", 3, 3);
    TimeSeries tenMA = MovingAverage.createMovingAverage(t1, "SL2", 10, 10);

    List<TimeSeriesDataItem> threeItemsList = new ArrayList<TimeSeriesDataItem>();
    List<TimeSeriesDataItem> tenItemsList = new ArrayList<TimeSeriesDataItem>();
    threeItemsList = threeMA.getItems();
    tenItemsList = tenMA.getItems();

    for (TimeSeriesDataItem item: threeItemsList)
    {
        System.out.println("three" + item.getValue().doubleValue() + " " + item.getPeriod().toString());
    }

    for (TimeSeriesDataItem item: tenItemsList)
    {
        System.out.println("ten" + item.getValue().doubleValue() + " " + item.getPeriod().toString());
    }

    TimeSeries slDataset = new TimeSeries("SL");
    int i = 0;
    //List<TimeSeriesDataItem> slItemsList = new ArrayList<TimeSeriesDataItem>();
    TimeSeriesDataItem myItem;
    Day threeDate;

    for (TimeSeriesDataItem item: threeItemsList)
    {
        //RegularTimePeriod variable = item.getPeriod();
        if (item.getPeriod().compareTo(tenItemsList.get(0).getPeriod()) < 0)
        {
            continue;
        }
        else
        {
            double result = item.getValue().doubleValue() - tenItemsList.get(i).getValue().doubleValue();
            Day currentDay = (Day)item.getPeriod();
            myItem = new TimeSeriesDataItem(currentDay, result);
            slDataset.add(myItem);

            //slItemsList.add(myItem);
            i++;
        }


    }

    System.out.println("slDataset count : " + slDataset.getItemCount());



    TimeSeriesCollection collectionSL = new TimeSeriesCollection();
    collectionSL.addSeries(slDataset);

    XYPlot plot3 = new XYPlot(collectionSL, new DateAxis("Date"), new NumberAxis("Value"), new StandardXYItemRenderer());
    plot3.setBackgroundPaint(Color.lightGray);
    plot3.setDomainGridlinePaint(Color.white);
    plot3.setRangeGridlinePaint(Color.white);
    plot3.setRangePannable(true);
    plot3.setDomainPannable(true);



    CombinedDomainXYPlot cplot = new CombinedDomainXYPlot(domainAxis);
    cplot.add(plot1, 3);
    cplot.add(plot3, 2);
    cplot.add(plot2, 2);
    cplot.setGap(8.0);
    cplot.setDomainGridlinePaint(Color.white);
    cplot.setDomainGridlinesVisible(true);
    cplot.setDomainPannable(true);


    //return the new combined chart
    JFreeChart chart = new JFreeChart("Sun Microsystems (SUNW)", JFreeChart.DEFAULT_TITLE_FONT, cplot, false);


    ChartUtilities.applyCurrentTheme(chart);
    renderer2.setShadowVisible(false);
    renderer2.setBarPainter(new StandardXYBarPainter());

    return chart;
}


//create a panel
public static JPanel createDemoPanel()
{
    JFreeChart chart = createCombinedChart();
    ChartPanel panel = new ChartPanel(chart);
    panel.setMouseWheelEnabled(true);

    return panel;
}

public static void main(String[] args) {
    // TODO code application logic here
    PriceVolumeChart2 demo = new PriceVolumeChart2("JFreeChart: CombinedXYPlotDemo1.java (base)");
    demo.pack();
    RefineryUtilities.centerFrameOnScreen(demo);
    demo.setVisible(true);
}

}

 类似资料:
  • 在下面的代码中,我希望在每次按下按钮元素时创建一个分配给o的新振荡器节点,允许多次按下,从而在440处产生多个1秒音调。然而,我发现这个按钮只能按一次以产生一个音调,之后它就会消失,就好像我没有创建新的振荡器节点一样。我正在学习JavaScript,我怀疑它一定是一些微不足道的东西。有人有主意吗? 编辑: 刚找到这个问题解决了这个问题。解决方案是将audio_context.currentTime

  • 本节,我们将探讨第三大类型的运动——振荡运动。弹簧上悬挂的重物,振荡的气泡,来回摆动的摆钟,都是振荡运动的例子。 图5-4 创建振荡运动 操作步骤 按照以下步骤,让盒子来回摆动: 1. 链接到Animation类: <head> <script src="animation.js"> </script> 2. 实例化一个Animation对象,并获取画布上下文对象: <script> wind

  • 晚上好,有经验的人可以告诉我如何制作一个像下面这样的pnel吗?我想制作一个面板,并在里面嵌入一个,这是可能的吗?如果不是,那么如何将包装在下面这样的内容中呢?下面是我想要创建一个类似于它的实际面板: 注意:我尝试了,但我认为它与图像中的不同

  • 我正在尝试添加AnalyserNode并将输出声音可视化到我制作的web音频示例中,但我不知道如何实现。我想我没有将正确的源传递给分析器(?) 完整代码如下:https://jsfidle.net/kepin95043/1ub0sjo3/ 谁能帮我找出我做错了什么?提前感谢! PS:用火狐打开吧。对我来说在基于Chromium的浏览器上不起作用。 下面是一个工作示例:https://codepen

  • 仅仅是我,还是振荡器即使在0.5增益下也听起来疯狂的响亮?我不能增加我的电脑的体积超过5%。 现在,当我将增益设置为0.001时,音量似乎“归一化”了,但这不对?我希望能有一些关于控制振荡器音量的见解。

  • 我有一个顾虑。我有3个使用Hazelcast地图的服务实例。所有实例都使用带有同步备份策略的映射。 如果一个实例每秒开始上下波动(振荡)会发生什么(由于网络问题)? 这种减速会影响所有实例的所有地图操作吗?或者Hazelcast可以以某种方式将此类实例列入黑名单?

  • 我需要将时间序列数据显示为分层条形图。JFreeChart有可能吗?任何建议都会很有帮助。 数据将是:(TS,X1,X2)的列表,其中我必须为给定的时间戳(TS)绘制X1,X2基本上将作为X1的给定值的标签。 编辑:同样,对于相同的TS,可能存在不同的X1值。其思想是将所有这些X1值表示为针对相同TS的分层条。 下面是我想要的一个例子: (所以我将在X轴上有TS而不是类别)

  • 本文向大家介绍如何在JavaFX中创建带有两个参数的气泡图?,包括了如何在JavaFX中创建带有两个参数的气泡图?的使用技巧和注意事项,需要的朋友参考一下 例 以下是一个JavaFX示例,演示了如何创建带有两个值的气泡图- 输出结果