2017-01-08 03:14:27 +01:00
|
|
|
/*
|
|
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
|
|
* To change this template file, choose Tools | Templates
|
|
|
|
* and open the template in the editor.
|
|
|
|
*/
|
|
|
|
package chart;
|
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
import sesim.OHLCDataItem;
|
|
|
|
import sesim.OHLCData;
|
2017-01-08 03:14:27 +01:00
|
|
|
import java.awt.*;
|
2017-01-08 13:16:00 +01:00
|
|
|
import sesim.Exchange.*;
|
|
|
|
import sesim.Quote;
|
2017-01-22 10:04:50 +01:00
|
|
|
import gui.Globals;
|
2017-01-13 08:16:09 +01:00
|
|
|
import java.awt.geom.Rectangle2D;
|
2017-01-20 17:03:50 +01:00
|
|
|
import java.text.DateFormat;
|
|
|
|
import java.text.SimpleDateFormat;
|
2017-01-12 23:16:37 +01:00
|
|
|
import java.util.ArrayList;
|
2017-01-20 17:03:50 +01:00
|
|
|
import java.util.Date;
|
2017-01-12 23:16:37 +01:00
|
|
|
import java.util.Iterator;
|
2017-01-23 18:56:09 +01:00
|
|
|
import javax.swing.Scrollable;
|
|
|
|
import sesim.MinMax;
|
2017-01-08 03:14:27 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @author 7u83 <7u83@mail.ru>
|
|
|
|
*/
|
2017-01-23 18:56:09 +01:00
|
|
|
public class Chart extends javax.swing.JPanel implements QuoteReceiver, Scrollable {
|
|
|
|
|
|
|
|
protected int em_size = 1;
|
|
|
|
|
|
|
|
protected float bar_width = 0.8f;
|
|
|
|
protected float bar_width_em = 1;
|
|
|
|
protected float y_legend_width = 8;
|
|
|
|
|
|
|
|
protected int num_bars = 4000;
|
|
|
|
|
|
|
|
protected Rectangle clip_bounds = new Rectangle();
|
2017-01-31 08:04:11 +01:00
|
|
|
protected Dimension gdim;
|
2017-01-23 18:56:09 +01:00
|
|
|
|
|
|
|
protected int first_bar, last_bar;
|
2017-01-08 03:14:27 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates new form Chart
|
|
|
|
*/
|
|
|
|
public Chart() {
|
|
|
|
initComponents();
|
2017-01-22 10:04:50 +01:00
|
|
|
if (Globals.se == null) {
|
2017-01-09 08:25:29 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-01-22 10:04:50 +01:00
|
|
|
Globals.se.addQuoteReceiver(this);
|
2017-01-08 03:14:27 +01:00
|
|
|
|
|
|
|
}
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
// int item_width = 10;
|
|
|
|
//int items = 350;
|
|
|
|
//long ntime = 0;
|
2017-01-29 22:21:12 +01:00
|
|
|
OHLCData data = new OHLCData(16000);
|
2017-01-08 13:16:00 +01:00
|
|
|
|
2017-01-09 08:25:29 +01:00
|
|
|
OHLCDataItem current = null;
|
2017-01-20 17:03:50 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
void drawCandle(Graphics2D g, OHLCData d, int x, int y) {
|
2017-01-20 17:03:50 +01:00
|
|
|
|
2017-01-13 21:49:09 +01:00
|
|
|
}
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
@Override
|
|
|
|
public Dimension getPreferredScrollableViewportSize() {
|
|
|
|
return this.getPreferredSize();
|
|
|
|
}
|
2017-01-20 17:03:50 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
@Override
|
|
|
|
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
|
|
|
|
return 100;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean getScrollableTracksViewportWidth() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean getScrollableTracksViewportHeight() {
|
|
|
|
return false;
|
2017-01-13 08:16:09 +01:00
|
|
|
}
|
2017-01-13 21:49:09 +01:00
|
|
|
|
2017-01-20 17:03:50 +01:00
|
|
|
class XLegendDef {
|
|
|
|
|
|
|
|
double unit_width = 1;
|
|
|
|
int big_tick = 10;
|
|
|
|
long start;
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
XLegendDef() {
|
|
|
|
|
2017-01-20 17:03:50 +01:00
|
|
|
}
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
String getAt(int unit) {
|
2017-02-02 18:39:55 +01:00
|
|
|
Date date = new Date(/*sesim.Scheduler.timeStart*/ 0 + unit * 5000);
|
2017-01-22 07:03:16 +01:00
|
|
|
// DateFormat formatter = new SimpleDateFormat("HH:mm:ss:SSS");
|
|
|
|
DateFormat formatter = new SimpleDateFormat("HH:mm:ss");
|
2017-01-20 17:03:50 +01:00
|
|
|
String dateFormatted = formatter.format(date);
|
|
|
|
return dateFormatted;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
void drawOHLC(Graphics2D g, int x, OHLCDataItem di) {
|
2017-01-20 17:03:50 +01:00
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void drawXLegend(Graphics2D g, XLegendDef xld) {
|
2017-01-20 17:03:50 +01:00
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
//XLegendDef xld = new XLegendDef();
|
2017-01-20 17:03:50 +01:00
|
|
|
g = (Graphics2D) g.create();
|
|
|
|
|
2017-01-13 08:16:09 +01:00
|
|
|
int xl_height = 30;
|
|
|
|
Dimension dim = this.getSize();
|
|
|
|
|
2017-01-20 17:03:50 +01:00
|
|
|
int em_height = g.getFontMetrics().getHeight();
|
|
|
|
int em_width = g.getFontMetrics().stringWidth("M");
|
2017-01-13 08:16:09 +01:00
|
|
|
|
2017-01-20 17:03:50 +01:00
|
|
|
int y = dim.height - em_height * 3;
|
2017-01-13 08:16:09 +01:00
|
|
|
|
|
|
|
g.drawLine(0, y, dim.width, y);
|
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
int n;
|
|
|
|
double x;
|
|
|
|
|
|
|
|
for (n = 0, x = 0; x < dim.width; x += em_width * xld.unit_width) {
|
2017-01-20 17:03:50 +01:00
|
|
|
|
|
|
|
if (n % xld.big_tick == 0) {
|
|
|
|
g.drawLine((int) x, y, (int) x, y + em_height);
|
|
|
|
} else {
|
|
|
|
g.drawLine((int) x, y, (int) x, y + em_height / 2);
|
|
|
|
}
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
if (n % xld.big_tick == 0) {
|
2017-01-20 17:03:50 +01:00
|
|
|
String text = "Hello";
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
text = xld.getAt(n);
|
2017-01-20 17:03:50 +01:00
|
|
|
int swidth = g.getFontMetrics().stringWidth(text);
|
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
g.drawString(text, (int) x - swidth / 2, y + em_height * 2);
|
2017-01-20 17:03:50 +01:00
|
|
|
}
|
2017-01-22 07:03:16 +01:00
|
|
|
|
2017-01-20 17:03:50 +01:00
|
|
|
OHLCDataItem d;
|
|
|
|
try {
|
|
|
|
d = data.data.get(n);
|
|
|
|
} catch (Exception e) {
|
|
|
|
d = null;
|
|
|
|
}
|
2017-01-22 07:03:16 +01:00
|
|
|
|
2017-01-20 17:03:50 +01:00
|
|
|
n++;
|
|
|
|
|
|
|
|
}
|
2017-01-22 07:03:16 +01:00
|
|
|
}
|
2017-01-20 17:03:50 +01:00
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
private void getData() {
|
2017-01-13 08:16:09 +01:00
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
}
|
2017-01-13 08:16:09 +01:00
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
class RenderCtx {
|
2017-01-13 08:16:09 +01:00
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
Rectangle rect;
|
|
|
|
float scaling;
|
|
|
|
float min;
|
|
|
|
Graphics2D g;
|
|
|
|
float iwidth;
|
2017-01-13 08:16:09 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
float getYc(float y) {
|
|
|
|
return getY(y);
|
|
|
|
//return rect.height - ((y - min) * scaling);
|
2017-01-22 07:03:16 +01:00
|
|
|
}
|
|
|
|
}
|
2017-01-13 08:16:09 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
boolean logs = true;
|
2017-01-13 08:16:09 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
float getY(float y) {
|
|
|
|
|
|
|
|
if (logs) {
|
|
|
|
|
|
|
|
float m = c_mm.max/c_mm.min;
|
|
|
|
|
2017-01-31 08:04:11 +01:00
|
|
|
//System.out.printf("Min: %f Max: %f M: %f\n",c_mm.min,c_mm.max,m);
|
2017-01-23 18:56:09 +01:00
|
|
|
|
|
|
|
|
|
|
|
//float fac = (float) c_rect.height /(float) Math.log(c_mm.max * c_yscaling);
|
|
|
|
float fac = (float) c_rect.height /(float)Math.log(m);
|
|
|
|
|
|
|
|
|
|
|
|
float fmin = c_rect.height - ((float) Math.log((y / c_mm.min)) * fac);
|
|
|
|
|
|
|
|
|
2017-01-31 08:04:11 +01:00
|
|
|
//System.out.printf("Fac: %f fmin: %f\n", fac, fmin);
|
2017-01-23 18:56:09 +01:00
|
|
|
return fmin;
|
|
|
|
|
|
|
|
//return c_rect.height - ((float) Math.log((y - c_mm.min) * c_yscaling) * fac);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return c_rect.height - ((y - c_mm.min) * c_yscaling);
|
|
|
|
|
|
|
|
// return c_rect.height - ((y - c_mm.min) * c_yscaling);
|
2017-01-09 08:25:29 +01:00
|
|
|
}
|
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
/* private void old_drawItem(Graphics2D g, Rectangle r, int prevx, int x, OHLCDataItem prev, OHLCDataItem item, float s, float min) {
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
if (prev == null) {
|
|
|
|
prev = item;
|
|
|
|
}
|
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
g.drawLine(prevx, (int) getYc(prev.close, min, s, r), x, (int) getYc(item.close, min, s, r));
|
2017-01-22 07:03:16 +01:00
|
|
|
g.drawLine(r.x, r.height + r.y, r.x + r.width, r.height + r.y);
|
|
|
|
}
|
2017-01-23 18:56:09 +01:00
|
|
|
*/
|
2017-01-22 07:03:16 +01:00
|
|
|
private void drawItem_l(RenderCtx ctx, int prevx, int x, OHLCDataItem prev, OHLCDataItem item) {
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
if (prev == null) {
|
|
|
|
prev = item;
|
2017-01-09 08:25:29 +01:00
|
|
|
}
|
2017-01-22 07:03:16 +01:00
|
|
|
Graphics2D g = ctx.g;
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
Rectangle r = ctx.rect;
|
2017-01-23 18:56:09 +01:00
|
|
|
g.drawLine(prevx, (int) ctx.getYc(prev.close), x, (int) ctx.getYc(item.close));
|
2017-01-22 07:03:16 +01:00
|
|
|
g.drawLine(r.x, r.height + r.y, r.x + r.width, r.height + r.y);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void drawItem(RenderCtx ctx, int prevx, int x, OHLCDataItem prev, OHLCDataItem i) {
|
|
|
|
|
|
|
|
if (prev == null) {
|
|
|
|
prev = i;
|
2017-01-08 13:16:00 +01:00
|
|
|
}
|
2017-01-22 07:03:16 +01:00
|
|
|
Graphics2D g = ctx.g;
|
|
|
|
|
|
|
|
Rectangle r = ctx.rect;
|
2017-01-23 18:56:09 +01:00
|
|
|
// g.drawLine(prevx, (int) ctx.getYc(prev.close), x, (int) ctx.getYc(item.close));
|
2017-01-22 07:03:16 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
// g.drawLine(x,(int)ctx.getYc(i.high),x,(int)ctx.getYc(i.low));
|
2017-01-22 07:03:16 +01:00
|
|
|
if (i.open < i.close) {
|
2017-01-23 18:56:09 +01:00
|
|
|
int xl = (int) (x + ctx.iwidth / 2);
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
g.setColor(Color.BLACK);
|
2017-01-23 18:56:09 +01:00
|
|
|
g.drawLine(xl, (int) ctx.getYc(i.close), xl, (int) ctx.getYc(i.high));
|
|
|
|
g.drawLine(xl, (int) ctx.getYc(i.low), xl, (int) ctx.getYc(i.open));
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
float w = ctx.iwidth;
|
2017-01-23 18:56:09 +01:00
|
|
|
float h = (int) (ctx.getYc(i.open) - ctx.getYc(i.close));
|
2017-01-22 07:03:16 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
// System.out.printf("CLO: %f %f \n", w, h);
|
2017-01-22 07:03:16 +01:00
|
|
|
g.setColor(Color.GREEN);
|
2017-01-23 18:56:09 +01:00
|
|
|
g.fillRect((int) (x), (int) ctx.getYc(i.close), (int) w, (int) h);
|
2017-01-22 07:03:16 +01:00
|
|
|
g.setColor(Color.BLACK);
|
2017-01-23 18:56:09 +01:00
|
|
|
g.drawRect((int) (x), (int) ctx.getYc(i.close), (int) w, (int) h);
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
} else {
|
2017-01-23 18:56:09 +01:00
|
|
|
int xl = (int) (x + ctx.iwidth / 2);
|
2017-01-22 07:03:16 +01:00
|
|
|
g.setColor(Color.RED);
|
2017-01-23 18:56:09 +01:00
|
|
|
g.drawLine(xl, (int) ctx.getYc(i.high), xl, (int) ctx.getYc(i.close));
|
|
|
|
g.drawLine(xl, (int) ctx.getYc(i.open), xl, (int) ctx.getYc(i.low));
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
float w = ctx.iwidth;
|
2017-01-23 18:56:09 +01:00
|
|
|
float h = (int) (ctx.getYc(i.close) - ctx.getYc(i.open));
|
2017-01-22 07:03:16 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
g.fillRect((int) (x), (int) ctx.getYc(i.open), (int) w, (int) h);
|
2017-01-22 07:03:16 +01:00
|
|
|
g.setColor(Color.BLACK);
|
2017-01-23 18:56:09 +01:00
|
|
|
g.drawRect((int) (x), (int) ctx.getYc(i.open), (int) w, (int) h);
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-08 13:16:00 +01:00
|
|
|
}
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
// g.drawLine(r.x, r.height + r.y, r.x + r.width, r.height + r.y);
|
2017-01-08 13:16:00 +01:00
|
|
|
}
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
// float getYc(float y) {
|
|
|
|
// return c_rect.height - ((y - c_mm.min) * scaling);
|
|
|
|
// }
|
|
|
|
float c_yscaling;
|
|
|
|
|
|
|
|
private void drawYLegend(Graphics2D g) {
|
|
|
|
|
|
|
|
Dimension dim0 = this.getSize();
|
|
|
|
Rectangle dim = g.getClipBounds();
|
|
|
|
|
|
|
|
int yw = (int) (this.y_legend_width * this.em_size);
|
|
|
|
|
|
|
|
// System.out.printf("MinMax: %f %f\n", c_mm.min, c_mm.max);
|
|
|
|
|
|
|
|
g.drawLine(dim.width + dim.x - yw, 0, dim.width + dim.x - yw, dim.height);
|
|
|
|
|
2017-01-31 08:04:11 +01:00
|
|
|
// float yscale = gdim.height / c_mm.getDiff();
|
2017-01-23 18:56:09 +01:00
|
|
|
c_yscaling = c_rect.height / c_mm.getDiff();
|
|
|
|
|
|
|
|
// System.out.printf("yscale %f\n", c_yscaling);
|
|
|
|
|
|
|
|
for (float y = c_mm.min; y < c_mm.max; y += c_mm.getDiff() / 10.0) {
|
|
|
|
|
|
|
|
int my = (int) getY(y); //c_rect.height - (int) ((y - c_mm.min) * c_yscaling);
|
|
|
|
|
|
|
|
g.drawLine(dim.width + dim.x - yw, my, dim.width + dim.x - yw + em_size, my);
|
|
|
|
|
|
|
|
g.drawString(String.format("%.2f", y), dim.width + dim.x - yw + em_size * 1.5f, my + c_font_height / 3);
|
|
|
|
}
|
|
|
|
|
|
|
|
// g.setColor(Color.red);
|
|
|
|
// g.drawLine(0,(int)getYc(c_mm.min), 1000, (int)getYc(c_mm.min));
|
|
|
|
//g.setColor(Color.green);
|
|
|
|
//g.drawRect(c_rect.x, c_rect.y, c_rect.width, c_rect.height);
|
2017-01-31 08:04:11 +01:00
|
|
|
// System.out.printf("Size: %d %d\n",gdim.width,gdim.height);
|
2017-01-23 18:56:09 +01:00
|
|
|
// System.exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
private MinMax c_mm = null;
|
|
|
|
private Rectangle c_rect;
|
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
private void draw(Graphics2D g) {
|
2017-01-23 18:56:09 +01:00
|
|
|
|
|
|
|
if (data == null) {
|
2017-01-22 08:53:02 +01:00
|
|
|
return;
|
2017-01-23 18:56:09 +01:00
|
|
|
}
|
|
|
|
if (data.size() == 0) {
|
2017-01-22 08:53:02 +01:00
|
|
|
return;
|
2017-01-23 18:56:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
c_mm = data.getMinMax(first_bar, last_bar);
|
|
|
|
if (c_mm == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
c_mm.min /= 1.5; //-= c_mm.min/ 2.0f;
|
|
|
|
c_mm.max *= 1.2; //+= c_mm.max / 10.0f;
|
|
|
|
|
2017-01-22 07:03:16 +01:00
|
|
|
OHLCDataItem di0 = data.get(0);
|
|
|
|
XLegendDef xld = new XLegendDef();
|
|
|
|
this.drawXLegend(g, xld);
|
|
|
|
|
|
|
|
int em_height = g.getFontMetrics().getHeight();
|
|
|
|
int em_width = g.getFontMetrics().stringWidth("M");
|
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
//this.getSize();
|
|
|
|
int pwidth = em_width * num_bars;
|
2017-01-22 07:03:16 +01:00
|
|
|
int phight = 400;
|
2017-01-31 08:04:11 +01:00
|
|
|
// phight=this.getVisibleRect().height;
|
2017-01-22 07:03:16 +01:00
|
|
|
|
2017-01-31 08:04:11 +01:00
|
|
|
this.setPreferredSize(new Dimension(pwidth, gdim.height));
|
2017-01-23 18:56:09 +01:00
|
|
|
this.revalidate();
|
2017-01-22 07:03:16 +01:00
|
|
|
|
2017-01-31 08:04:11 +01:00
|
|
|
Rectangle r = new Rectangle(0, 0, pwidth, gdim.height - 6 * em_width);
|
2017-01-23 18:56:09 +01:00
|
|
|
c_rect = r;
|
|
|
|
this.drawYLegend(g);
|
2017-01-22 07:03:16 +01:00
|
|
|
|
2017-01-31 08:04:11 +01:00
|
|
|
// Dimension gdim = this.getSize();
|
2017-01-23 18:56:09 +01:00
|
|
|
// Iterator<OHLCDataItem> it = data.iterator();
|
2017-01-22 07:03:16 +01:00
|
|
|
OHLCDataItem prev = null;
|
2017-01-23 18:56:09 +01:00
|
|
|
// int myi = 0;
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
RenderCtx ctx = new RenderCtx();
|
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
// MinMax mm = data.getMinMax(first_bar, last_bar);
|
|
|
|
// if(mm==null)
|
|
|
|
// return ;
|
|
|
|
ctx.rect = c_rect;
|
|
|
|
ctx.scaling = (float) r.height / (c_mm.getMax() - c_mm.getMin());
|
|
|
|
ctx.min = c_mm.getMin();
|
2017-01-22 07:03:16 +01:00
|
|
|
ctx.g = g;
|
2017-01-23 18:56:09 +01:00
|
|
|
ctx.iwidth = (bar_width * em_size) * 0.9f; // em_width - em_width / 5f;
|
|
|
|
|
|
|
|
//g.setClip(clip_bounds.x, clip_bounds.y, (int)(clip_bounds.width-this.y_legend_width*this.em_size), clip_bounds.height);
|
|
|
|
for (int i = first_bar; i < last_bar && i < data.size(); i++) {
|
|
|
|
OHLCDataItem di = data.get(i);
|
|
|
|
int x = (int) (i * em_size * bar_width); //em_width;
|
|
|
|
this.drawItem(ctx, x - em_width, x, prev, di); //, ctx.scaling, data.getMin());
|
|
|
|
|
|
|
|
// myi++;
|
|
|
|
prev = di;
|
|
|
|
|
|
|
|
}
|
2017-01-22 07:03:16 +01:00
|
|
|
|
|
|
|
//System.out.printf("Scaling: %f %f %f %f %f\n",diff,(float)r.height,data.getMin(),data.getMax(),yscaling);
|
2017-01-23 18:56:09 +01:00
|
|
|
/* while (it.hasNext()) {
|
2017-01-22 07:03:16 +01:00
|
|
|
OHLCDataItem di = it.next();
|
|
|
|
|
|
|
|
int x = myi * em_width;
|
|
|
|
this.drawItem(ctx, x - em_width, x, prev, di); //, ctx.scaling, data.getMin());
|
|
|
|
|
|
|
|
myi++;
|
|
|
|
prev = di;
|
|
|
|
|
|
|
|
}
|
2017-01-23 18:56:09 +01:00
|
|
|
*/
|
2017-01-08 13:16:00 +01:00
|
|
|
}
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
protected void initEmSize(Graphics g) {
|
2017-01-08 03:14:27 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
em_size = g.getFontMetrics().stringWidth("M");
|
|
|
|
|
|
|
|
}
|
2017-01-09 08:25:29 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
private float c_font_height;
|
2017-01-08 08:48:31 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
@Override
|
|
|
|
public final void paintComponent(Graphics g) {
|
|
|
|
super.paintComponent(g);
|
2017-01-08 08:48:31 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
this.initEmSize(g);
|
2017-01-31 08:04:11 +01:00
|
|
|
this.gdim = this.getParent().getSize(gdim);
|
|
|
|
this.getParent().setPreferredSize(gdim);
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
this.clip_bounds = g.getClipBounds(this.clip_bounds);
|
2017-01-08 08:48:31 +01:00
|
|
|
|
2017-01-31 08:04:11 +01:00
|
|
|
// System.out.printf("X:%d %d\n",gdim.width,gdim.height);
|
2017-01-23 18:56:09 +01:00
|
|
|
first_bar = (int) (clip_bounds.x / (this.bar_width * this.em_size));
|
|
|
|
last_bar = 1 + (int) ((clip_bounds.x + clip_bounds.width - (this.y_legend_width * em_size)) / (this.bar_width * this.em_size));
|
2017-01-08 08:48:31 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
c_font_height = g.getFontMetrics().getHeight();
|
2017-01-08 08:48:31 +01:00
|
|
|
|
2017-01-23 18:56:09 +01:00
|
|
|
draw((Graphics2D) g);
|
2017-01-08 03:14:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This method is called from within the constructor to initialize the form.
|
|
|
|
* WARNING: Do NOT modify this code. The content of this method is always
|
|
|
|
* regenerated by the Form Editor.
|
|
|
|
*/
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
|
|
|
private void initComponents() {
|
|
|
|
|
2017-01-08 13:16:00 +01:00
|
|
|
setBackground(java.awt.Color.white);
|
2017-01-22 21:41:45 +01:00
|
|
|
setBorder(null);
|
|
|
|
setOpaque(false);
|
2017-01-08 13:16:00 +01:00
|
|
|
setPreferredSize(new java.awt.Dimension(300, 300));
|
2017-01-08 08:48:31 +01:00
|
|
|
setRequestFocusEnabled(false);
|
|
|
|
|
2017-01-08 03:14:27 +01:00
|
|
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
|
|
|
this.setLayout(layout);
|
|
|
|
layout.setHorizontalGroup(
|
|
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
2017-01-22 21:41:45 +01:00
|
|
|
.addGap(0, 300, Short.MAX_VALUE)
|
2017-01-08 03:14:27 +01:00
|
|
|
);
|
|
|
|
layout.setVerticalGroup(
|
|
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
2017-01-22 21:41:45 +01:00
|
|
|
.addGap(0, 300, Short.MAX_VALUE)
|
2017-01-08 03:14:27 +01:00
|
|
|
);
|
|
|
|
}// </editor-fold>//GEN-END:initComponents
|
|
|
|
|
2017-01-08 13:16:00 +01:00
|
|
|
@Override
|
|
|
|
public void UpdateQuote(Quote q) {
|
2017-01-13 01:55:43 +01:00
|
|
|
// System.out.print("Quote Received\n");
|
2017-01-12 23:16:37 +01:00
|
|
|
// this.realTimeAdd(q.time, (float) q.price, (float)q.volume);
|
2017-01-13 01:55:43 +01:00
|
|
|
|
|
|
|
data.realTimeAdd(q.time, (float) q.price, (float) q.volume);
|
|
|
|
// this.invalidate();
|
2017-01-09 08:25:29 +01:00
|
|
|
this.repaint();
|
2017-01-08 13:16:00 +01:00
|
|
|
}
|
|
|
|
|
2017-01-08 03:14:27 +01:00
|
|
|
|
|
|
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
|
|
// End of variables declaration//GEN-END:variables
|
|
|
|
}
|