Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFreeChart:如何创建带有振荡器的中间面板_Java_Jfreechart - Fatal编程技术网

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

Java JFreeChart:如何创建带有振荡器的中间面板,java,jfreechart,Java,Jfreechart,我有两个面板。 一个是价格(OHLC)和移动平均线,另一个是成交量。 我想创建一个中间面板,其中两个面板在零附近振荡。 每个振荡器是上面图表的两个移动平均数之差。 可能吗? 谢谢。这是最终的解决方案。我从Plot3创建中删除了所有引用 public class PriceVolumeChart2 extends ApplicationFrame{ final static String filename = "A.txt"; static TimeSeries t1 = new TimeSe

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

这是最终的解决方案。我从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);
}
公共类PriceVolumeChart2扩展应用程序框架{
最终静态字符串filename=“A.txt”;
静态时间序列t1=新时间序列(“49天移动平均线”);
/**
*默认构造函数
*/
public PriceVolumeChart2(字符串标题)
{
超级(标题);
JPanel panel=createDemoPanel();
面板设置首选尺寸(新尺寸(500270));
设置内容窗格(面板);
}
//创建价格数据集
//这里硬编码
私有静态OHLCDataset createPriceDataset(字符串文件名)
{
//以下数据取自http://finance.yahoo.com/
//为了演示的目的。。。
OHLCS1=新的OHLCS1系列(文件名);
试一试{
BufferedReader in=新的BufferedReader(新文件读取器(文件名));
DateFormat df=新的SimpleDataFormat(“yyyyMMdd”);
字符串输入线;
in.readLine();
而((inputLine=in.readLine())!=null){
StringTokenizer st=新的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.添加(新的日期、开盘、高位、低位、收盘);
t1.添加(新的日期),结束;
}
in.close();
}
捕获(例外e){
e、 printStackTrace();
}
OHLCSeriesCollection数据集=新的OHLCSeriesCollection();
addSeries(s1);
返回数据集;
}
//创建卷数据集
私有静态IntervalXYDataset createVolumeDataset(字符串文件名)
{
//创建数据集2。。。
TimeSeries s1=新的TimeSeries(“卷”);
试一试{
BufferedReader in=新的BufferedReader(新文件读取器(文件名));
DateFormat df=新的SimpleDataFormat(“yyyyMMdd”);
字符串输入线;
in.readLine();
而((inputLine=in.readLine())!=null){
StringTokenizer st=新的StringTokenizer(inputLine,“,”);
Date-Date=df.parse(st.nextToken());
圣奈克特肯();
圣奈克特肯();
圣奈克特肯();
圣奈克特肯();
double volume=double.parseDouble(st.nextToken());
//double adjClose=double.parseDouble(st.nextToken());
s1.增加(新的日期、数量);
}
in.close();
}
捕获(例外e){
e、 printStackTrace();
}
返回新的时间体验集合(s1);
}
私有静态JFreeChart createCombinedChart()
{
OHLCDataset data1=createPriceDataset(文件名);
XYItemRenderer renderer1=新的HighLowRenderer();
RenderR1.setBaseToolTipGenerator(新的标准XYToolTipGenerator(标准XYToolTipGenerator.DEFAULT_TOOL_TIP_格式,新的SimpleDateFormat(“d-MMM-yyyy”),新的DecimalFormat(“0.00”);
渲染器1.setSeriesPaint(0,颜色为蓝色);
DateAxis domainAxis=新的DateAxis(“日期”);
NumberAxis rangeAxis=新的NumberAxis(“价格”);
rangeAxis.setNumberFormatOverride(新的十进制格式($0.00));
rangeAxis.setAutoRange(真);
rangeAxis.SetAutoRangeIncludeZero(假);
XYPlot plot1=新的XYPlot(数据1、域轴、范围轴、渲染器1);
图1.立根底色漆(颜色:浅灰色);
plot1.setDomainGridlinePaint(颜色:白色);
plot1.setRangeGridlinePaint(颜色:白色);
plot1.SetRangePanEnable(真);
//叠加长期趋势指标
TimeSeries数据集3=MovingAverage.createMovingAverage(t1,“LT”,49,49);
TimeSeriesCollection集合=新建TimeSeriesCollection();
collection.addSeries(数据集3);
plot1.setDataset(1,集合);
plot1.setRenderer(1,新的StandardXYItemRenderer());
//添加第二个数据集(卷)和渲染器
IntervalXYDataset数据2=createVolumeDataset(文件名);
XYBALLENDERER renderer2=新的XYBALLENDERER();
渲染器2.设置路线(假);
RenderR2.setBaseToolTipGenerator(新的标准XYToolTipGenerator(标准XYToolTipGenerator.DEFAULT_TOOL_TIP_格式,新的SimpleDateFormat(“d-MMM-yyyy”),新的DecimalFormat(“0000.00”);
渲染器2.setSeriesPaint(0,颜色为红色);
XYPlot plot2=新XYPlot(数据2,空,新编号轴(“卷”),渲染器2);
图2.立根底色漆(颜色:浅灰色);
plot2.setDomainGridlinePaint(颜色:白色);
plot2.setRangeGridlinePaint(颜色:白色);
//中窗格振荡器
TimeSeries 3MA=移动平均值。创建移动平均值(t1,“SL1”,3,3);
TimeSeries tenMA=MovingAverage.createMovingAverage(t1,“SL2”,10,10);
List threeItemsList=新建ArrayList();
List tenItemsList=new ArrayList();
threeItemsList=threeMA.getItems();
tenItemsList=tenMA.getItems();
for(TimeSeriesDaitem项:三项列表)
{
System.out.println(“三个”+项.getValue().doubleValue()+”+项.getPeriod().toString());
}
对于(TimeSeriesDaitem项:tenItemsList)
{
System.out.println(“十”+项.getValue().doubleValue()+”+项.getPeriod().toString());
}
TimeSeries slDataset=新的TimeSeries(“SL”);
int i=0;
//List slItemsList=new ArrayList();
TimeSeriesDaitem myItem;
第三天日期;
for(TimeSeriesDaitem项:三项列表)
{
//RegularTimePeriod变量=item.getPeriod();
if(item.getPeriod().compareTo(tenItemsList.get(0.getPeriod())<0)
{
有限公司