jfreechart ulega awarii podczas korzystania z cytatów Yahoo Finance
Mam bardzo szczególny problem.
Skonfigurowałem plik, który wysyła żądanie url do strony internetowej Yahoo Finance, a następnie wykorzystuje wyniki do narysowania JFreeChart w JFrame.
To, czego po prostu nie rozumiem, jest następujące:
W przypadku niektórych żądań URL, JFrame ulega awarii
Zaczyna się, ale pokazuje tylko biały ekran. Podczas gdy dla innych wniosków mój program działa dobrze.
PrzykładNa przykład:
Ta prośba:
"http://ichart.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2011&d=6&e=24&f=2013&g=d&ignore=.csv";
działa w porządku.
Ale ta prośba:
"http://ichart.yahoo.com/table.csv?s=GOOG&a=2&b=1&c=2012&d=6&e=24&f=2013&g=d&ignore=.csv";
powoduje błąd.
Jak to jest możliwe?
UwagaZnam następujące rzeczy:
JFrame ulega awarii, ale JVM go nie odnotowuje (nie zauważa, że ulega awarii)Pobieranie notowań giełdowych (informacje, których używa JFreeChart) jest doskonałe w obu przypadkachKod do pobierania danych i wyświetlania ich w JFreeChart pochodzi zta strona (kod opublikowany przezRoyW »Sob 10 maja 2008 7:52).Ilość przychodzących danych nie wydaje się problemem, ponieważ w żądaniu 1 jest więcej punktów danych niż w żądaniu 2Sposób pobierania danych nie ma znaczenia (próbowałem czytać bezpośrednio z adresu URL i próbowałem zapisać.csv
plik do folderu, a następnie czytanie z folderu)Problem nie występuje losowo: próbowałem uruchomić JFrame (rekompilacja kodu, a następnie uruchomienie go) wiele razy, ale „błędny” cytat zawiesza JFrame za każdym razem.Dodatkowe informacjeCoś, co może się z tym wiązać:
Kiedy uruchamiam wykres z poprawnym cytatem i przeciągam wykres wokół, dzieje się coś dziwnego. W pewnym odstępie czasu wydaje się, że w każdy weekend świeczniki stają się coraz mniejsze, dopóki nie są tylko paskiem. Potem, gdy przeciągam przez weekend, znów stają się grubsze, aż znów staną się normalne. Wydaje się, że tak się dzieje w każdy weekend. Zobacz następujące zdjęcia:
Więc pomyślałem, że to może mieć coś wspólnegodni handlowe. Ale to też nie ma sensu, ponieważ1/1/2011 (wniosek 1) przypada na sobotę i3/1/2012 (żądanie 2) przypada na czwartek, gdy żądanie 1 zakończyło się pomyślnie, a żądanie 2 nie powiodło się.
Jestem absolutnie nieświadomy tego, co powinienem zrobić.
Cała pomoc jest bardzo doceniana.
AktualizacjaNa życzenie jest tutajSSCCE ztrashgodsugestie użytkownika (przy użyciu JFreechart lib v1.0.14).
import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.CandlestickRenderer;
import org.jfree.data.xy.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.text.*;
import java.util.*;
import java.util.List;
public class CandlestickDemo2 extends JFrame {
public CandlestickDemo2(String stockSymbol) {
super("CandlestickDemo");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DateAxis domainAxis = new DateAxis("Date");
NumberAxis rangeAxis = new NumberAxis("Price");
CandlestickRenderer renderer = new CandlestickRenderer();
XYDataset dataset = getDataSet(stockSymbol);
XYPlot mainPlot = new XYPlot(dataset, domainAxis, rangeAxis, renderer);
//Do some setting up, see the API Doc
renderer.setSeriesPaint(0, Color.BLACK);
renderer.setDrawVolume(false);
rangeAxis.setAutoRangeIncludesZero(false);
domainAxis.setTimeline( SegmentedTimeline.newMondayThroughFridayTimeline() );
//Now create the chart and chart panel
JFreeChart chart = new JFreeChart(stockSymbol, null, mainPlot, false);
ChartPanel chartPanel = new ChartPanel(chart, false);
chartPanel.setPreferredSize(new Dimension(600, 300));
this.add(chartPanel);
this.pack();
}
protected AbstractXYDataset getDataSet(String stockSymbol) {
//This is the dataset we are going to create
DefaultOHLCDataset result = null;
//This is the data needed for the dataset
OHLCDataItem[] data;
//This is where we go get the data, replace with your own data source
data = getData(stockSymbol);
//Create a dataset, an Open, High, Low, Close dataset
result = new DefaultOHLCDataset(stockSymbol, data);
return result;
}
//This method uses yahoo finance to get the OHLC data
protected OHLCDataItem[] getData(String stockSymbol) {
List<OHLCDataItem> dataItems = new ArrayList<OHLCDataItem>();
try {
String strUrl= "http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=2&b=1&c=2012&d=6&e=24&f=2013&g=d&ignore=.csv";
URL url = new URL(strUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
DateFormat df = new SimpleDateFormat("y-M-d");
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() );
OHLCDataItem item = new OHLCDataItem(date, open, high, low, close, volume);
dataItems.add(item);
}
in.close();
}
catch (Exception e) {
e.printStackTrace();
}
//Data from Yahoo is from newest to oldest. Reverse so it is oldest to newest
Collections.reverse(dataItems);
//Convert the list into an array
OHLCDataItem[] data = dataItems.toArray(new OHLCDataItem[dataItems.size()]);
return data;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new CandlestickDemo2("GOOG").setVisible(true);
}
});
}
}
Powoduje to wygenerowanie ramki JFrame, która wyświetla tylko biały ekran. Spróbuj zmienićstrUrl
do
"http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2011&d=6&e=24&f=2013&g=d&ignore=.csv";
i zauważysz, że działa dobrze.
AktualizacjaRozwiązałem to! Problemem była wersja JFreeChart. Zmiana z wersji 1.0.14 na wersję 1.0.15 rozwiązała wszystko. Uznanie dlatrashgod za (nieświadomie) rozwiązanie mojego problemu poprzez obszerną odpowiedźi wspominając wersję biblioteki używany.
Czy ktoś wie, jak mogę pomóc innym, którzy mają ten sam problem? Czy jest gdzieś portal, w którym mogę odnotować ten błąd?