OpenSeSim/src/main/java/chart/Chart.java

394 lines
10 KiB
Java
Raw Normal View History

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-08 03:14:27 +01:00
/**
*
* @author 7u83 <7u83@mail.ru>
*/
2017-01-09 08:25:29 +01:00
public class Chart extends javax.swing.JPanel implements QuoteReceiver {
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
//Graphics g = this.getGraphics();
//g.drawString("Hello world", 0, 0);
}
2017-01-09 08:25:29 +01:00
int item_width = 10;
int items = 350;
2017-01-12 23:16:37 +01:00
long ntime = 0;
2017-01-09 08:25:29 +01:00
2017-01-22 07:03:16 +01:00
OHLCData data = new OHLCData(2000);
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-22 07:03:16 +01:00
// int min;
// int max;
2017-01-20 17:03:50 +01:00
int getY(float Y) {
2017-01-13 21:49:09 +01:00
return 0;
}
2017-01-09 08:25:29 +01:00
2017-01-20 17:03:50 +01:00
void drawCandle(Graphics2D g, OHLCData d, int x, int y) {
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) {
Date date = new Date(sesim.Scheduler.timeStart + unit * 5000);
// 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-22 07:03:16 +01:00
float getY(float y) {
return rect.height - ((y - min) * scaling);
}
}
2017-01-13 08:16:09 +01:00
2017-01-22 07:03:16 +01:00
float getY(float y, float min, float s, Rectangle r) {
2017-01-13 08:16:09 +01:00
2017-01-22 07:03:16 +01:00
return r.height - ((y - min) * s);
2017-01-09 08:25:29 +01:00
}
2017-01-22 07:03:16 +01:00
private void old_drawItem(Graphics2D g, Rectangle r, int prevx, int x, OHLCDataItem prev, OHLCDataItem item, float s, float min) {
if (prev == null) {
prev = item;
}
g.drawLine(prevx, (int) getY(prev.close, min, s, r), x, (int) getY(item.close, min, s, r));
g.drawLine(r.x, r.height + r.y, r.x + r.width, r.height + r.y);
}
2017-01-09 08:25:29 +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;
g.drawLine(prevx, (int) ctx.getY(prev.close), x, (int) ctx.getY(item.close));
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;
// g.drawLine(prevx, (int) ctx.getY(prev.close), x, (int) ctx.getY(item.close));
// g.drawLine(x,(int)ctx.getY(i.high),x,(int)ctx.getY(i.low));
if (i.open < i.close) {
g.setColor(Color.BLACK);
g.drawLine(x, (int) ctx.getY(i.close), x, (int) ctx.getY(i.high));
g.drawLine(x, (int) ctx.getY(i.low), x, (int) ctx.getY(i.open));
float w = ctx.iwidth;
float h = (int) (ctx.getY(i.open) - ctx.getY(i.close));
2017-01-22 08:53:02 +01:00
// System.out.printf("CLO: %f %f \n", w, h);
2017-01-22 07:03:16 +01:00
g.setColor(Color.GREEN);
g.fillRect((int) (x - w / 2), (int) ctx.getY(i.close), (int) w, (int) h);
g.setColor(Color.BLACK);
g.drawRect((int) (x - w / 2), (int) ctx.getY(i.close), (int) w, (int) h);
} else {
g.setColor(Color.RED);
g.drawLine(x, (int) ctx.getY(i.high), x, (int) ctx.getY(i.close));
g.drawLine(x, (int) ctx.getY(i.open), x, (int) ctx.getY(i.low));
float w = ctx.iwidth;
float h = (int) (ctx.getY(i.close) - ctx.getY(i.open));
g.fillRect((int) (x - w / 2), (int) ctx.getY(i.open), (int) w, (int) h);
g.setColor(Color.BLACK);
g.drawRect((int) (x - w / 2), (int) ctx.getY(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-22 07:03:16 +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-22 07:03:16 +01:00
private void draw(Graphics2D g) {
2017-01-22 08:53:02 +01:00
if (data == null )
return;
if (data.size()==0)
return;
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");
this.getSize();
int pwidth = em_width * items;
int phight = 400;
this.setPreferredSize(new Dimension(pwidth, phight));
Dimension dim = this.getSize();
Iterator<OHLCDataItem> it = data.iterator();
OHLCDataItem prev = null;
int myi = 0;
RenderCtx ctx = new RenderCtx();
Rectangle r = new Rectangle(0, 2 * em_width, pwidth, dim.height - 6 *em_width );
ctx.rect = r;
ctx.scaling = (float) r.height / (data.getMax() - data.getMin());
ctx.min = data.getMin();
ctx.g = g;
ctx.iwidth = em_width - em_width / 5f;
//System.out.printf("Scaling: %f %f %f %f %f\n",diff,(float)r.height,data.getMin(),data.getMax(),yscaling);
while (it.hasNext()) {
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-09 08:25:29 +01:00
2017-01-08 13:16:00 +01:00
}
2017-01-09 08:25:29 +01:00
2017-01-22 07:03:16 +01:00
private void draw_old(Graphics2D g) {
2017-01-13 08:16:09 +01:00
2017-01-20 17:03:50 +01:00
OHLCDataItem di0 = data.data.get(0);
2017-01-22 07:03:16 +01:00
XLegendDef xld = new XLegendDef();
this.drawXLegend(g, xld);
2017-01-13 08:16:09 +01:00
2017-01-08 13:16:00 +01:00
this.getSize();
2017-01-09 08:25:29 +01:00
int pwidth = item_width * items;
2017-01-12 23:16:37 +01:00
int phight = 40;
2017-01-09 08:25:29 +01:00
2017-01-12 23:16:37 +01:00
this.setPreferredSize(new Dimension(pwidth, phight));
2017-01-09 08:25:29 +01:00
2017-01-13 01:55:43 +01:00
Dimension dim = this.getSize();
// System.out.print("Diemension "+dim.width+" "+dim.height+"\n");
g.setColor(Color.RED);
ArrayList<OHLCDataItem> od = data.data;
g.setColor(Color.BLUE);
g.setStroke(new BasicStroke(3));
Iterator<OHLCDataItem> it = od.iterator();
int myi = 0;
2017-01-13 08:16:09 +01:00
int lastx = 0;
int lasty = 0;
2017-01-13 01:55:43 +01:00
while (it.hasNext()) {
2017-01-12 23:16:37 +01:00
OHLCDataItem di = it.next();
2017-01-13 01:55:43 +01:00
float y = di.close;
2017-01-22 07:03:16 +01:00
float max = data.getMax();
float min = data.getMin();
2017-01-13 08:16:09 +01:00
max = max / 10.0f + max;
min = min - min / 10.0f;
2017-01-13 01:55:43 +01:00
if (min == max) {
min = y / 2;
max = y * 2;
}
y -= min;
2017-01-13 08:16:09 +01:00
y = dim.height - (dim.height * y / (max - min));
2017-01-12 23:16:37 +01:00
2017-01-13 01:55:43 +01:00
int x = myi * this.item_width;
myi++;
2017-01-13 08:16:09 +01:00
2017-01-13 01:55:43 +01:00
g.drawLine(lastx, lasty, x, (int) y);
2017-01-13 08:16:09 +01:00
lastx = x;
lasty = (int) y;
2017-01-12 23:16:37 +01:00
2017-01-13 01:55:43 +01:00
}
2017-01-08 13:16:00 +01:00
}
2017-01-08 03:14:27 +01:00
@Override
public void paintComponent(Graphics go) {
super.paintComponent(go);
2017-01-09 08:25:29 +01:00
2017-01-08 08:48:31 +01:00
Graphics2D g = (Graphics2D) go;
2017-01-08 13:16:00 +01:00
g.setColor(Color.GRAY);
2017-01-08 08:48:31 +01:00
2017-01-08 03:14:27 +01:00
g.setBackground(Color.BLACK);
2017-01-08 08:48:31 +01:00
// g.get
2017-01-08 03:14:27 +01:00
Rectangle bounds = g.getDeviceConfiguration().getBounds();
2017-01-13 01:55:43 +01:00
// System.out.print(bounds.width + "\n");
2017-01-08 08:48:31 +01:00
2017-01-08 03:14:27 +01:00
//g.fillRect(0, 0, 100, 100);
2017-01-08 08:48:31 +01:00
Dimension d = this.getSize();
2017-01-08 13:16:00 +01:00
//g.drawString("Hello world", 810, 10);
//g.drawLine(0, 0, d.width, d.height);
//this.setPreferredSize(new Dimension(2000,4000));
draw(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
}