是否可以在烛台jfreechart中显示空心蜡烛?

时间:2015-03-19 18:49:16

标签: java jfreechart

大多数金融图表库都使用一些规则来点燃蜡烛:

  1. 如果close >= open,则蜡烛为hollow(未填充)
  2. 如果close < open,则蜡烛为filled
  3. 如果previous close <= close,则蜡烛为green
  4. 如果previous close > close,则蜡烛为red
  5. jFreeChart似乎有自己的着色规则,可以更改它们。默认情况下,图表看起来像这样(某些颜色已更改):

    candlestick chart jfreechart

    如您所见,可以更改蜡烛,背景,情节边框等颜色。

    我想在图表中实施规则1和2(上面)。有可能吗?

    结果应该是这样的:

    jfreechart ohlc candlestick

    这是我在示例中使用的当前CandlestickRenderer:

    public class CandlestickRenderer extends org.jfree.chart.renderer.xy.CandlestickRenderer {
    
        public CandlestickRenderer() {
            setDrawVolume(false);
        }
    
        @Override
        public Paint getItemPaint(int series, int item) {
            OHLCDataset highLowData = (OHLCDataset)getPlot().getDataset(series);
            Number curClose = highLowData.getClose(series, item);
            Number prevClose = highLowData.getClose(series, item>0 ? item-1 : 0);
            if (prevClose.doubleValue() <=  curClose.doubleValue()) {
                return getUpPaint();
            }
            else {
                return getDownPaint();
            }
        }   
    }
    

    更新1

    似乎可以通过将up paint设置为black并将item pant与颜色保持一致来实现。

    public class CandlestickRenderer extends org.jfree.chart.renderer.xy.CandlestickRenderer {
    
        public CandlestickRenderer() {
            setDrawVolume(false);
            setUseOutlinePaint(false);
            setUpPaint(Color.BLACK); // <-- rule 1. (plot is also black so it looks not filled)
        }
    
        @Override
        public Paint getItemPaint(int series, int item) {
            OHLCDataset highLowData = (OHLCDataset) getPlot().getDataset(series);
            Number curClose = highLowData.getClose(series, item);
            Number prevClose = highLowData.getClose(series, item>0 ? item-1 : 0);
    
            if (prevClose.doubleValue() <=  curClose.doubleValue()) {
                return Color.GREEN; // <-- rule 3.
            } else {
                return Color.RED; // <-- rule 4.
            }
        }
    
    }
    

    但主要问题持续:

    • 根据jFreeChart,down (downPaint)up (upPaint)是什么意思?是比较prev. close vs. close值还是open vs. close

    • 在jFreeChart的源代码中我可以找到upPaint&amp;的部分。使用downPaint

    现在这是一个奇怪的结果:

    enter image description here

1 个答案:

答案 0 :(得分:2)

我做到了。这是完整的渲染器:

public class CandlestickRenderer extends org.jfree.chart.renderer.xy.CandlestickRenderer {

    private final Paint colorRaising = Color.GREEN;
    private final Paint colorFalling = Color.RED;
    private final Paint colorUnknown = Color.GRAY;
    private final Paint colorTransparent = Color.BLACK;

    public CandlestickRenderer() {
        setDrawVolume(false);
        setUpPaint(colorUnknown); // use unknown color if error
        setDownPaint(colorUnknown); // use unknown color if error
    }


    @Override
    public Paint getItemPaint(int series, int item) {
        OHLCDataset highLowData = (OHLCDataset) getPlot().getDataset(series);
        Number curClose = highLowData.getClose(series, item);
        Number prevClose = highLowData.getClose(series, item>0 ? item-1 : 0);

        if (prevClose.doubleValue() <=  curClose.doubleValue()) {
            return Color.GREEN;
        } else {
            return Color.RED;
        }
    }


    @Override
    public void drawItem(Graphics2D g2, XYItemRendererState state,
            Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot,
            ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset,
            int series, int item, CrosshairState crosshairState, int pass) {

        OHLCDataset highLowData = (OHLCDataset) dataset;
        double yOpen = highLowData.getOpenValue(series, item);
        double yClose = highLowData.getCloseValue(series, item);        

        // set color for filled candle
        if (yClose >= yOpen) {
            setUpPaint(colorRaising);
            setDownPaint(colorFalling);
        }

        // set color for hollow (not filled) candle
        else {
            setUpPaint(colorTransparent);
            setDownPaint(colorTransparent);
        }

        // call parent method
        super.drawItem(g2, state, dataArea, info, plot, domainAxis, rangeAxis, dataset, series, item, crosshairState, pass);
    }   

}

结果图表:

enter image description here

如果您需要所有示例代码,请随时与我联系。