Nice orderbook
This commit is contained in:
@ -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>
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user