sclass TradingCandlePainter extends AbstractTickerPainter { settable L candles; int spikeWidth = 1; Color shortColor = java.awt.Color.blue; Color longColor = java.awt.Color.yellow; public void drawOn(Graphics2D g) { if (empty(candles)) ret; var run = new TradingRun(candles); verticalRange(doubleRange(run.min(), run.max())); horizontalRange(doubleRange(run.startTime().unixDate(), run.endTime().unixDate())); drawPercentLines(g); // Draw candles var nCandles = l(candles); for i to nCandles: { var candle = candles.get(i); var x1 = xRange().start()+doubleRatio(i, nCandles)*xRange().length(); var x2 = xRange().start()+doubleRatio(i+1, nCandles)*xRange().length(); x2 = blend(x1, x2, 0.75); var xCenter = avg(x1, x2); var y1 = yToScreen(candle.max()); var y2 = yToScreen(candle.min()); var yStart = yToScreen(candle.start()); var yEnd = yToScreen(candle.end()); // draw "spikes" var r = doubleRectFromPoints(xCenter, y1, xCenter+spikeWidth, y2); fillRect(g, growRectBottom(1, toRect_round(r)), candle.color()); // draw candle body r = doubleRectFromPoints(x1, min(yStart, yEnd), x2, max(yStart, yEnd)); fillRect(g, growRectBottom(1, toRect_round(r)), candle.color()); } drawPositions(g); } }