JFreeChartでロウソクチャート


暇なのでJFreeChartで過去の日中足を表示するプログラムを作ってみた。
今日で2日目。とりあえず表示ができた。
分足で、上にロウソクチャート、下に出来高
色とかはハイパーSBI風にイメージしてみた。


あちこちのサンプルから切り貼りしながら適当に作ったので、
あまり理解してないが、まぁ動いてよかった。
とりあえず、困ったところ、しのいだところのメモ。

CandlestickRendererの枠や髭の色

CandlestickRenderer#setUseOutlinePaint(false)しても枠線が消えない気がする。
さらにsetUpPaint、setDownPaintで指定した色が、枠および髭の部分には反映されないぽい。
(枠や髭はロウソク本体の色と違っているのもアリだと思うがハイパーSBI風ではない)
getItemPaintをオーバーライドしてで色指定してしのいだ。

CandlestickRenderer candleRenderer = new CandlestickRenderer(-1 , false, null){
    public Paint getItemPaint(int row, int column) {
        OHLCDataset dataset = (OHLCDataset)getPlot().getDataset();
        double yOpen = dataset.getOpenValue(row, column);
        double yClose = dataset.getCloseValue(row, column);
        if(yOpen <= yClose){
            return getUpPaint();
        }else{
            return getDownPaint();
        }
    }
};

11:00-12:30の間の空白があく

昼休みの時間帯が空白でかなり表示領域の無駄だ。
SegmentedTimelineというのを使うと設定できるらしいが、使い方が理解不能
ここのコードで

http://code.google.com/p/jstockchart/wiki/JStockChartGettingStarted

//Creates a SegmentedTimeline instance, the time scope is "09:30-11:30,13:00-15:00".

と、かなり日本のザラバ時間に近い設定をしてて、コードの数字をちょこっと変えたら、
いい具合の表示になった。

SegmentedTimeline timeline = new SegmentedTimeline(
        SegmentedTimeline.MINUTE_SEGMENT_SIZE, 1350, 90);
timeline.setStartTime(SegmentedTimeline.firstMondayAfter1900() 
        + 750 * SegmentedTimeline.MINUTE_SEGMENT_SIZE);
dateaxis.setTimeline(timeline);

上のコードはJstockchartというJFreechartを利用して株価チャートを表示するためのツール。
Jstockchartってのが簡単ならそれを使ってもよかったかもしれない。

その他いろいろ参考

日本語での解説

JFreeChartでグラフ作成(前編、後編)
http://www.thinkit.co.jp/free/tech/4/6/1.html

ファイヤープロジェクト
http://www.fireproject.jp/feature/jfreechart/index.html

Sohgetsu Blog JFreeChart
http://sohgetsu.blogspot.com/search/label/JFreeChart

jfreechart付属のデモアプリ

jfreechart-xxx-demo.jar

多数のデモがあるが、ソースがついてない。
ソースは公式ガイドブックみたいなのを買うと見れるらしい。
買おうかなと思ったが、6000円とか高いかなーと思って思いとどまった。
今度、もっとJFreechart使い込むなら買うかも。

JFreeChart in Eclipse RCP - Tutorial

http://www.vogella.de/articles/EclipseJFreeChart/article.html
SWTから利用する場合。これは簡単。