Nice orderbook

This commit is contained in:
7u83
2016-12-27 20:16:56 +01:00
parent 7dde10a9f6
commit 1de297da36
13 changed files with 242 additions and 103 deletions

View File

@ -16,17 +16,17 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" alignment="1" pref="162" max="32767" attributes="0"/>
<Component id="orderBookScroller" alignment="1" pref="162" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" alignment="0" pref="300" max="32767" attributes="0"/>
<Component id="orderBookScroller" alignment="0" pref="300" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
<Container class="javax.swing.JScrollPane" name="orderBookScroller">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
@ -73,6 +73,7 @@
<Column editable="false" title="Title 3" type="java.lang.Object"/>
</Table>
</Property>
<Property name="focusable" type="boolean" value="false"/>
</Properties>
</Component>
</SubComponents>

View File

@ -29,6 +29,12 @@ import java.util.ArrayList;
import java.util.Formatter;
import java.util.concurrent.Callable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
/**
*
@ -37,6 +43,26 @@ import javax.swing.table.AbstractTableModel;
public abstract class OrderBook extends javax.swing.JPanel {
abstract ArrayList getArrayList();
public class DateCellRenderer extends DefaultTableCellRenderer {
String pattern;
public DateCellRenderer(String pattern){
this.pattern = pattern;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
DefaultTableCellRenderer renderer = (DefaultTableCellRenderer)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
renderer.setBackground(hdr_color);
//renderer.setBorder(BorderFactory.createLineBorder(Color.BLACK));
// renderer.setText("Halloe");
return renderer;
}
}
Color hdr_color = Color.LIGHT_GRAY;
boolean getDesc() {
return false;
@ -104,11 +130,42 @@ public abstract class OrderBook extends javax.swing.JPanel {
public OrderBook() {
System.out.print("init Orderbook]\n");
initComponents();
this.setBorder(BorderFactory.createEmptyBorder());
this.orderBookScroller.setBorder(BorderFactory.createBevelBorder(0));
if (MainWin.se == null) {
return;
}
this.orderBookList.setModel(new SListModel());
orderBookList.setBorder(BorderFactory.createEmptyBorder());
JTableHeader h = this.orderBookList.getTableHeader();
h.setBackground(hdr_color);
h.setForeground(Color.green);
// h.setDefaultRenderer(this.orderBookList.getCellRenderer(0, 0));
// h.setBorder(BorderFactory.createLineBorder(Color.yellow));
h.setDefaultRenderer(new DateCellRenderer("Hhu"));
/* h.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer(){
@Override
public Component getTableCellRendererComponent(
JTable x, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
JComponent component = (JComponent)orderBookList.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(orderBookList, value, false, false, -1, -2);
component.setBackground(new Color(250, 250, 250));
component.setBorder(BorderFactory.createEmptyBorder());
return component;
}
});
*/
}
/**
@ -120,7 +177,7 @@ public abstract class OrderBook extends javax.swing.JPanel {
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
orderBookScroller = new javax.swing.JScrollPane();
orderBookList = new javax.swing.JTable();
orderBookList.setModel(new javax.swing.table.DefaultTableModel(
@ -168,23 +225,24 @@ public abstract class OrderBook extends javax.swing.JPanel {
return canEdit [columnIndex];
}
});
jScrollPane1.setViewportView(orderBookList);
orderBookList.setFocusable(false);
orderBookScroller.setViewportView(orderBookList);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 162, Short.MAX_VALUE)
.addComponent(orderBookScroller, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 162, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
.addComponent(orderBookScroller, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable orderBookList;
private javax.swing.JScrollPane orderBookScroller;
// End of variables declaration//GEN-END:variables
}

View File

@ -3,7 +3,7 @@
<Form version="1.8" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[150, 262]"/>
<Dimension value="[220, 262]"/>
</Property>
</Properties>
<AuxValues>

View File

@ -26,6 +26,7 @@
package Gui;
//import SeSim.*;
import static java.lang.Thread.sleep;
import javax.swing.AbstractListModel;
import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;
@ -53,6 +54,14 @@ public class OrderBookPanel extends javax.swing.JPanel {
MainWin.myAccount.Sell(100, 19.3, MainWin.se);
try {
sleep(1000);
} catch (InterruptedException e) {
System.out.println("Interrupted");
return;
}
MainWin.myAccount.Sell(310, 6112.156, MainWin.se);
MainWin.myAccount.Sell(3, 7112.156, MainWin.se);
@ -86,7 +95,7 @@ public class OrderBookPanel extends javax.swing.JPanel {
jLabel4 = new javax.swing.JLabel();
bidBook1 = new Gui.BidBook();
setPreferredSize(new java.awt.Dimension(150, 262));
setPreferredSize(new java.awt.Dimension(220, 262));
setLayout(new java.awt.GridBagLayout());
askBook1.setPreferredSize(new java.awt.Dimension(200, 200));

View File

@ -2,18 +2,21 @@ package SeSim;
public class BuyOrder extends Order implements Comparable<Order> {
@Override
public int compareTo(Order o) {
/* @Override
public int compareLimit(Order o) {
if (o.limit < limit) {
//System.out.println("return 1");
return -1;
}
if (o.limit > limit) {
//System.out.println("return -1");
return +1;
}
// System.out.println("0000000000000000000000");
return 0;
}
*/
public BuyOrder(){
type=OrderType.buy;
}
}

View File

@ -74,8 +74,8 @@ public class Exchange extends Thread {
double lastprice = 300.0;
long lastsize;
public TreeSet<BuyOrder> bid;
public TreeSet<SellOrder> ask;
public TreeSet<Order> bid;
public TreeSet<Order> ask;
private final Semaphore available = new Semaphore(1, true);
@ -93,7 +93,7 @@ public class Exchange extends Thread {
}
public ArrayList geAskBook(int n){
ArrayList ret = new ArrayList();
ArrayList <Order> ret= new ArrayList<>();
Iterator it=ask.iterator();
for(int i=0;i<n && it.hasNext();i++){
SellOrder o;
@ -106,7 +106,7 @@ public class Exchange extends Thread {
}
public ArrayList geBidBook(int n){
ArrayList ret = new ArrayList();
ArrayList <Order> ret = new ArrayList<>();
Iterator it=bid.iterator();
for(int i=0;i<n && it.hasNext();i++){
BuyOrder o;
@ -122,8 +122,8 @@ public class Exchange extends Thread {
public void print_current() {
BuyOrder b;
SellOrder a;
Order b;
Order a;
//String bid;
if (bid.isEmpty()) {
@ -176,8 +176,8 @@ public class Exchange extends Thread {
return;
}
BuyOrder b = bid.first();
SellOrder a = ask.first();
Order b = bid.first();
Order a = ask.first();
if (a.volume == 0) {
// This order is fully executed, remove
@ -251,6 +251,7 @@ public class Exchange extends Thread {
return true;
}
/*
public void SendOrder(SellOrder o) {
// System.out.println("EX Sellorder");
Lock();
@ -263,11 +264,42 @@ public class Exchange extends Thread {
Unlock();
Lock();
OrderMatching();
// OrderMatching();
Unlock();
}
*/
private void addOrder(Order o){
switch (o.type){
case buy:
bid.add(o);
break;
case sell:
ask.add(o);
break;
default:
return;
}
}
public void SendOrder(Order o){
Lock();
o.timestamp = System.currentTimeMillis();
boolean rc = InitOrder(o);
System.out.print(o.timestamp+" TS:\n");
o.id = orderid++;
addOrder(o);
Unlock();
}
/*
public void SendOrder(BuyOrder o) {
//System.out.println("EX Buyorder");
Lock();
@ -277,11 +309,11 @@ public class Exchange extends Thread {
Unlock();
Lock();
OrderMatching();
// OrderMatching();
Unlock();
}
*/
/*
* public void SendOrder(Order o){
*
@ -308,6 +340,10 @@ public class Exchange extends Thread {
return 0.7;
}
/**
*
*/
@Override
public void run() {
while (true) {
try {

View File

@ -17,14 +17,74 @@ public abstract class Order implements Comparable<Order> {
*/
public double limit;
// double money = 0;
/**
* Order ID
*/
public long id = 0;
/**
* Type of order
*/
public OrderType type;
public Account account = null;
protected int compareLimit(Order o){
int r=0;
if (o.limit < limit) {
r=-1;
}
if (o.limit > limit) {
r=1;
}
if (r==0)
return 0;
if (type==OrderType.sell)
return 1-r;
return r;
};
@Override
public int compareTo(Order o) {
if (o.type!=type){
System.out.print("OrderType Missmatch\n");
return -1;
}
int r = compareLimit(o);
if (r!=0)
return r;
if (o.timestamp< timestamp)
return -1;
if (o.timestamp>timestamp)
return 1;
if (o.id>id)
return -1;
if (o.id<id)
return 1;
return 0;
}
enum OrderStatus {
open, executed, canceled
}
enum OrderType {
buy,sell
}
OrderStatus status = OrderStatus.open;

View File

@ -1,16 +1,20 @@
package SeSim;
public class SellOrder extends Order {
/*
@Override
public int compareTo(Order o) {
if (o.limit < limit) {
return 1;
}
if (o.limit > limit) {
return -1;
}
return 0;
return super.compareTo(o);
}
public SellOrder(){
type=OrderType.buy;
}
*/
public SellOrder(){
type=OrderType.sell;
}
}