JFreeChart:如何在 OHLC 图表上绘制移动平均线

2024-01-01

我试图在 OHLC 图表上叠加移动平均线,但它似乎不起作用。

我提供了代码的两个关键功能:

private static OHLCDataset createPriceDataset(String filename)
{   
    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);
        }
        in.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

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

    return dataset;
}



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
    XYDataset dataset3 = MovingAverage.createMovingAverage(data1, "LT", 49.0, 49.0);
    plot1.setDataset(1, dataset3);
    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);

    CombinedDomainXYPlot cplot = new CombinedDomainXYPlot(domainAxis);
    cplot.add(plot1, 3);
    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;
}

有任何想法吗?

谢谢。


我添加了以下代码,它似乎有效。 如果有人不同意这个解决方案,请告诉我。 事情是这样的:

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);

    CombinedDomainXYPlot cplot = new CombinedDomainXYPlot(domainAxis);
    cplot.add(plot1, 3);
    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();
    return new ChartPanel(chart);
}

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);
}

//Download data from web
}

样本数据:



20110103,41.56,42.14,41.41,41.88,3572300
20110104,41.99,42.1,41.18,41.49,3588800
20110105,41.28,41.73,41,41.4,3232700
20110106,41.37,41.84,41.21,41.48,3361400
20110107,41.52,41.8,41.04,41.62,2725900
20110110,41.41,42.72,41.3,42.22,3145800
20110111,42.52,43.31,42.38,42.94,3315400
20110112,43.2,43.41,42.96,43.13,2463100
20110113,42.88,43.23,42.87,42.97,1676400
20110114,42.79,43.37,42.76,43.26,2215600
20110117,43.26,43.26,43.26,43.26,0
20110118,43.33,44.45,43.32,44.35,2982300
20110119,44.16,44.29,42.27,42.43,4537200
20110120,41.95,42.58,41.46,42.29,4874700
20110121,42.5,43.26,42.03,42.11,3004500
20110124,42.18,42.79,42.07,42.77,2067400
20110125,42.77,43.52,42.28,42.69,3132700
20110126,42.82,42.97,42.04,42.57,3927300
20110127,42.77,43.09,42.37,42.45,3189600
20110128,42.5,42.52,40.88,40.98,3629800
20110131,41.21,41.83,40.89,41.83,3690900
20110201,42.07,42.7,41.93,42.05,3388200
20110202,41.75,41.91,40.82,41.23,3970700
20110203,40.93,41.18,40.23,40.99,3522700
20110204,41.19,43.13,40.94,42.99,5197700
20110207,43.45,44.66,43.37,44.44,4569800
20110208,44.65,44.71,43.83,44.17,3734500
20110209,44.01,44.17,43.16,43.43,3779300
20110210,43.22,44.01,42.57,44,3275700
20110211,43.77,45.15,43.65,45.02,4436000
20110214,45,45.42,44.72,44.79,3484400
20110215,44.79,45,42.64,42.65,7328000
20110216,42.91,43.6,42.7,43.57,4159800
20110217,43.38,44,43.02,43.92,2621800
20110218,43.78,44.29,43.65,43.92,4390200
20110221,43.92,43.92,43.92,43.92,0
20110222,43.21,43.75,42.39,42.49,4143600
20110223,42.59,42.75,39.94,40.45,7074200
20110224,40.34,41.55,40.18,41.15,4455700
20110225,41.16,42.41,41.13,42.36,4297500
20110228,42.43,42.65,41.36,42.08,3070200
20110301,41.98,42.49,40.65,40.68,4091300
  

新代码位于星号内。

如果您认为有更优雅的解决方案,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JFreeChart:如何在 OHLC 图表上绘制移动平均线 的相关文章

  • BoxAndWhiskerChart JFreeChart 的绘图方向

    我有一个问题JFreeChart 可以改吗PlotOrientation of a BoxAndWhiskerChart水平 我有一个直方图 我想添加一个BoxAndWhiskerChart以下 我需要它水平 这样我就可以使用相同的轴刻度
  • Jfreechart:在 x 轴上显示周数的天数

    我正在使用 JFreeChart 显示一个月中每一天的值 现在我想让我的 x 轴显示一个月中的几周而不是几天 目前 我的图表的 y 轴值是 double x 轴值是 int Timestamp ts a getTimestamp Doubl
  • Android Afreechart - 更改点形状、线条粗细和颜色

    我正在尝试在我的应用程序中更改折线图点的形状 我在用afreechart s TimeSeriesChart 我想让这条线在粗细 颜色和点形状方面变得更漂亮 哪里可以改代码 将使用哪种方法 我现在拥有的 source googlecode
  • 是否有解决方法可以使 DateAxis 从一周的第一天开始绘制刻度?

    当我创建一个需要周周期轴的图表时 我遇到了这个问题 当我设置刻度单位时DateAxis with new DateTickUnit DateTickUnitType Day 7 每 7 天显示一次刻度线 但是 刻度线的日期并非从一周的第一天
  • JFreeChart 中的 LogAxis 上未显示小刻度

    我在用着JFreeChart绘制一些数据并使用LogAxis对于范围轴 我很困惑为什么我似乎无法在轴上显示小刻度 但网格线显示得很好 如果我不使用LogAxis我可以使用以下命令打开和关闭小刻度setMinorTickMarksVisibl
  • 设置 JFree Chart 图例边框颜色

    问题已在标题中阐述 细节 我在类主题中有代码 用于为图例框架的边框设置特定的非默认颜色 LegendTitle legend jFreeChart getLegend legend setWidth 100 之后我需要设置图例边框的颜色 但
  • 如何更改 JFreeChart 中 NumberAxis 上的刻度标签?

    我正在使用 JFreeChart 并且希望能够将范围轴上的标签从数字更改为对我所在域更有意义的内容 我只看到用于自定义标签外观的选项 无法覆盖基于刻度线位置的标签 有谁知道如何覆盖tickLabel的文本 JFreeChartBarChar
  • JFreeChart SpiderWebPlot 内圈?

    所以我一直在使用 JFreeChart 尝试创建 SpiderWebPlot 到目前为止它运行良好 我想知道是否可以为可能的值添加圆圈 这样它看起来更像是一个实际的蜘蛛网 如下所示 按照建议here https stackoverflow
  • JFreeChart:尽管已加载库,但没有此类方法错误

    我在 Java swing 应用程序中使用 JFreeChart 我确实指定了库在 builder xml 文件中的位置
  • 是否可以为条形图中的每个类别自定义标签?

    最近 我收到一个要求 需要创建一个显示每个项目数据的条形图 这是一个例子 如您所见 Category是项目的名称 并且Series是该项目中不同类型的数据 但是 由于系统不保证项目名称的唯一性 将其用作类别可能会导致问题 并且我将无法使用项
  • 如何更改 JFreeChart 的大小

    我添加了一个JFreeChart to a JPanel 用一个BorderLayout 并且它是huge 我可以做些什么来让它变小吗 public void generateChart DefaultCategoryDataset dat
  • 如何在组件绘制时创建“请稍候”Swing 对话框

    对于 Swing 来说仍然相对较新 但经过几个小时的搜索 我无法在网上找到答案 因此写了这篇文章 抱歉 如果已经回答但我忽略了它 我在 Swing 应用程序中使用 JFreeChart 有些图表相对较重 180k 数据点 并且 JFreeC
  • JFreeChart - Java 堆空间问题

    我是第一次使用 JFreeChart 并且使用 TimeSeriesCollection 创建 TimeSeriesChart 我的数据库查询结果集就是全部 大约1000条记录 我在用org jfree date time Minute M
  • 将值添加到 DynamicTimeSeriesCollection 中的指定系列

    该程序每秒都会接收数据并将它们绘制在时间序列图表上 然而 一旦我创建了两个系列 我就无法为其添加新的价值 它仅显示一条直线 如何将数据附加到指定的系列 IE YYY 基于此example https stackoverflow com a
  • 如何将 XYSplineRenderer 图中的正方形形状更改为点

    In JFreeChart XYSplineRenderer Graph I need to display small dots instead of small squares to display XY coordinates How
  • Jfreechart垂直线模糊

    I am using JFreechart to generate some plots and I found the lines in my plot is blurry but the demo shows that all the
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 如何构建和使用 TimeSeriesCollections

    我想在图表的 X 轴上显示一些日期 并且here https stackoverflow com questions 5118684 jfreechart histogram with dates据说我必须使用 TimeSeriesColl
  • JFreeChart - 具有 2 个图例的颜色问题

    我尝试在图表中创建自定义图例 但当我显示一两个图例时 会发生一些奇怪的情况 当我显示 2 个图例 旧的和新的 时 一切都很好 图例和图表中的颜色受到尊重 但是 当我只想显示新图例时 图例中的颜色受到尊重 但图表中的颜色不再受到尊重 这是我的
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级

随机推荐