From e699e376ac748f57b97212f62c67456d739b4d65 Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@maiol.ru> Date: Wed, 28 Dec 2016 02:21:24 +0100 Subject: [PATCH] Oderbook updates are now working. --- src/Gui/AskBook.java | 8 +- src/Gui/BidBook.java | 12 +- src/Gui/ControlPanel.java | 3 +- src/Gui/MainWin.java | 6 +- src/Gui/OrderBook.java | 106 +++++----- src/Gui/OrderBookCell.form | 389 ------------------------------------ src/Gui/OrderBookCell.java | 102 ---------- src/Gui/OrderBookPanel.java | 1 + src/SeSim/Account.java | 17 +- src/SeSim/BuyOrder.java | 2 +- src/SeSim/Exchange.java | 111 +++++++--- src/SeSim/MTrader.java | 2 +- src/SeSim/Order.java | 6 +- src/SeSim/RandomTrader.java | 2 +- src/SeSim/SellOrder.java | 2 +- src/SeSim/Trader.java | 4 + 16 files changed, 167 insertions(+), 606 deletions(-) delete mode 100644 src/Gui/OrderBookCell.form delete mode 100644 src/Gui/OrderBookCell.java diff --git a/src/Gui/AskBook.java b/src/Gui/AskBook.java index 8516e3f..982e4fe 100644 --- a/src/Gui/AskBook.java +++ b/src/Gui/AskBook.java @@ -25,6 +25,8 @@ */ package Gui; +import SeSim.Exchange.*; +import SeSim.Order.*; import java.util.ArrayList; /** @@ -34,8 +36,8 @@ import java.util.ArrayList; public class AskBook extends OrderBook { @Override - ArrayList getArrayList() { - return MainWin.se.getAskBook(10); + ArrayList getOrderBook() { + return MainWin.se.getOrderBook(OrderType.ask,10); } @Override @@ -44,7 +46,7 @@ public class AskBook extends OrderBook { } public AskBook(){ - System.out.print("init askbook\n"); + MainWin.se.addBookReceiver(OrderType.ask, this); } diff --git a/src/Gui/BidBook.java b/src/Gui/BidBook.java index 65829ef..e2e305e 100644 --- a/src/Gui/BidBook.java +++ b/src/Gui/BidBook.java @@ -25,17 +25,23 @@ */ package Gui; +import SeSim.Exchange.*; +import SeSim.Order.*; import java.util.ArrayList; /** * * @author 7u83 <7u83@mail.ru> */ -public class BidBook extends OrderBook{ +public class BidBook extends OrderBook { @Override - ArrayList getArrayList() { - return MainWin.se.getBidBook(10); + ArrayList getOrderBook() { + return MainWin.se.getOrderBook(OrderType.bid,40); } + + BidBook(){ + MainWin.se.addBookReceiver(OrderType.bid,this); + } } diff --git a/src/Gui/ControlPanel.java b/src/Gui/ControlPanel.java index de25182..143e597 100644 --- a/src/Gui/ControlPanel.java +++ b/src/Gui/ControlPanel.java @@ -86,12 +86,13 @@ public class ControlPanel extends javax.swing.JPanel { private void SellButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SellButtonActionPerformed System.out.print("SellPressed\n"); // MainWin.myAccount.Sell(100, 520.0, MainWin.se); + MainWin.myAccount.sell(100, 13.0); }//GEN-LAST:event_SellButtonActionPerformed private void BuyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BuyButtonActionPerformed System.out.print("Buy Pressed\n"); //MainWin.myAccount.Buy(100, 120.0, MainWin.se); - MainWin.myAccount.Buy(100, 1.0, MainWin.se); + MainWin.myAccount.buy(100, 1.0); }//GEN-LAST:event_BuyButtonActionPerformed diff --git a/src/Gui/MainWin.java b/src/Gui/MainWin.java index 9fbb31b..445eb85 100644 --- a/src/Gui/MainWin.java +++ b/src/Gui/MainWin.java @@ -47,6 +47,9 @@ public class MainWin extends javax.swing.JFrame { * Creates new form MainWin */ public MainWin() { + + myTrader.sell(100, 230); + myTrader.sell(10, 123.12); initComponents(); @@ -163,11 +166,12 @@ public class MainWin extends javax.swing.JFrame { - SeSim.SellOrder so = new SeSim.SellOrder(); + /* SeSim.SellOrder so = new SeSim.SellOrder(); so.limit = 20.0; so.volume = 12; so.timestamp = 12; se.SendOrder(so); + */ try { // Set cross-platform Java L&F (also called "Metal") diff --git a/src/Gui/OrderBook.java b/src/Gui/OrderBook.java index d017d0a..ab5b18c 100644 --- a/src/Gui/OrderBook.java +++ b/src/Gui/OrderBook.java @@ -25,6 +25,7 @@ */ package Gui; +import SeSim.Exchange; import java.util.ArrayList; import java.util.Formatter; import java.util.concurrent.Callable; @@ -35,53 +36,64 @@ import java.awt.*; import javax.swing.*; import javax.swing.table.*; - /** * * @author 7u83 <7u83@mail.ru> */ -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; +/** + * OderBook Class + */ +public abstract class OrderBook extends javax.swing.JPanel implements Exchange.BookReceiver{ + + abstract ArrayList getOrderBook(); + + private Color hdr_color = Color.LIGHT_GRAY; + private class OrderBookCellRenderer extends DefaultTableCellRenderer { + @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); + return renderer; + } } - - @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; + @Override + public void UpdateOrderBook() { + // System.out.print("I have got an update on bid\n"); + model.update(); } -} - Color hdr_color = Color.LIGHT_GRAY; + boolean getDesc() { return false; } + + protected OrderBookListModel model; - protected class SListModel extends AbstractTableModel { + protected class OrderBookListModel extends AbstractTableModel { - private ArrayList m; + private ArrayList list; private boolean desc = false; - public SListModel() { - - m = getArrayList(); - + public OrderBookListModel() { + update(); + } + + + public void update(){ + list = getOrderBook(); + this.fireTableDataChanged(); } @Override public String getColumnName(int c) { - switch(c){ + switch (c) { case 0: return "ID"; case 1: @@ -94,7 +106,7 @@ public abstract class OrderBook extends javax.swing.JPanel { @Override public int getRowCount() { - return m.size(); + return list.size(); } @Override @@ -106,9 +118,9 @@ public abstract class OrderBook extends javax.swing.JPanel { public Object getValueAt(int r, int c) { SeSim.Order o; if (!getDesc()) { - o = (SeSim.Order) m.get(r); + o = (SeSim.Order) list.get(r); } else { - o = (SeSim.Order) m.get(m.size() - r - 1); + o = (SeSim.Order) list.get(list.size() - r - 1); } Formatter f = new Formatter(); switch (c) { @@ -130,41 +142,23 @@ 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()); + + model = new OrderBookListModel(); + + this.orderBookList.setModel(model); 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; - } - }); - */ + h.setBackground(hdr_color); + h.setForeground(Color.green); + h.setDefaultRenderer(new OrderBookCellRenderer()); } diff --git a/src/Gui/OrderBookCell.form b/src/Gui/OrderBookCell.form deleted file mode 100644 index 3eb7d61..0000000 --- a/src/Gui/OrderBookCell.form +++ /dev/null @@ -1,389 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/Gui/OrderBookCell.java b/src/Gui/OrderBookCell.java deleted file mode 100644 index 82478fa..0000000 --- a/src/Gui/OrderBookCell.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2016, 7u83 <7u83@mail.ru> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -package Gui; - -/** - * - * @author 7u83 <7u83@mail.ru> - */ -public class OrderBookCell extends javax.swing.JPanel { - - /** - * Creates new form OrderBookCell - */ - public OrderBookCell() { - initComponents(); - } - - /** - * 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") - // //GEN-BEGIN:initComponents - private void initComponents() { - java.awt.GridBagConstraints gridBagConstraints; - - l_id = new javax.swing.JLabel(); - l_money = new javax.swing.JLabel(); - l_volume = new javax.swing.JLabel(); - - java.awt.GridBagLayout layout = new java.awt.GridBagLayout(); - layout.columnWidths = new int[] {0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0}; - layout.rowHeights = new int[] {0}; - setLayout(layout); - - l_id.setBackground(new java.awt.Color(245, 191, 137)); - l_id.setText("#09100"); - l_id.setVerticalAlignment(javax.swing.SwingConstants.TOP); - l_id.setBorder(new javax.swing.border.MatteBorder(null)); - l_id.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); - l_id.setFocusable(false); - l_id.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); - l_id.setMaximumSize(new java.awt.Dimension(6, 200)); - l_id.setMinimumSize(new java.awt.Dimension(6, 200)); - l_id.setName("NNN"); // NOI18N - l_id.setOpaque(true); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 0; - gridBagConstraints.gridy = 0; - gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; - gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; - gridBagConstraints.weightx = 5.0; - add(l_id, gridBagConstraints); - - l_money.setText("213.7"); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 2; - gridBagConstraints.gridy = 0; - gridBagConstraints.gridwidth = 5; - gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; - gridBagConstraints.weightx = 1.0; - add(l_money, gridBagConstraints); - - l_volume.setText("21"); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 12; - gridBagConstraints.gridy = 0; - gridBagConstraints.gridwidth = 5; - add(l_volume, gridBagConstraints); - }// //GEN-END:initComponents - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel l_id; - private javax.swing.JLabel l_money; - private javax.swing.JLabel l_volume; - // End of variables declaration//GEN-END:variables -} diff --git a/src/Gui/OrderBookPanel.java b/src/Gui/OrderBookPanel.java index c72cff3..405bcd2 100644 --- a/src/Gui/OrderBookPanel.java +++ b/src/Gui/OrderBookPanel.java @@ -31,6 +31,7 @@ import javax.swing.AbstractListModel; import javax.swing.table.AbstractTableModel; import java.util.ArrayList; import java.util.Formatter; +import static java.lang.Thread.sleep; /** * diff --git a/src/SeSim/Account.java b/src/SeSim/Account.java index a94161f..daf8492 100644 --- a/src/SeSim/Account.java +++ b/src/SeSim/Account.java @@ -50,30 +50,25 @@ final public class Account { TreeSet pending; - public SellOrder sell(long volume, double limit) { + public Order sell(long volume, double limit) { SellOrder o = new SellOrder(); o.account = this; o.limit = limit; o.volume = volume; orderpending = true; - se.SendOrder(o); - return o; - + return se.SendOrder(o); } - public BuyOrder Buy(long size, double limit, Exchange ex) { - if (size * limit > money) { + public Order buy(long volume, double limit) { + if (volume * limit > money) { return null; } - BuyOrder o = new BuyOrder(); o.limit = limit; - o.volume = size; + o.volume = volume; o.account = this; orderpending = true; - ex.SendOrder(o); - return o; - + return se.SendOrder(o); } /* diff --git a/src/SeSim/BuyOrder.java b/src/SeSim/BuyOrder.java index 20545de..849a1fe 100644 --- a/src/SeSim/BuyOrder.java +++ b/src/SeSim/BuyOrder.java @@ -3,7 +3,7 @@ package SeSim; public class BuyOrder extends Order implements Comparable { public BuyOrder(){ - type=OrderType.buy; + type=OrderType.bid; } } diff --git a/src/SeSim/Exchange.java b/src/SeSim/Exchange.java index 4a10582..9d2ede9 100644 --- a/src/SeSim/Exchange.java +++ b/src/SeSim/Exchange.java @@ -4,6 +4,7 @@ import java.util.*; import java.util.concurrent.*; import SeSim.Order.OrderStatus; +import SeSim.Order.OrderType; /** * @@ -47,12 +48,43 @@ public class Exchange extends Thread { } /** - * + * Bookreceiver Interface */ public interface BookReceiver { - void UpdateOrderBook(); } + + + + + private ArrayList ask_bookreceivers = new ArrayList<>(); + private ArrayList bid_bookreceivers = new ArrayList<>(); + + private ArrayList selectBookReceiver(OrderType t){ + switch (t){ + case ask: + return ask_bookreceivers; + case bid: + return bid_bookreceivers; + } + return null; + } + + public void addBookReceiver(OrderType t, BookReceiver br){ + ArrayList bookreceivers; + bookreceivers = selectBookReceiver(t); + bookreceivers.add(br); + } + + void UpdateBookReceivers(OrderType t) { + ArrayList bookreceivers; + bookreceivers = selectBookReceiver(t); + + Iterator i = bookreceivers.iterator(); + while (i.hasNext()) { + i.next().UpdateOrderBook(); + } + } // Here we store the list of quote receivers private final TreeSet qrlist; @@ -98,7 +130,25 @@ public class Exchange extends Thread { available.release(); } - private ArrayList getBook(TreeSet book, int depth) { + + private TreeSet selectOrderBook(OrderType t){ + + switch(t){ + case bid: + return this.bid; + case ask: + return this.ask; + } + return null; + + } + + public ArrayList getOrderBook(OrderType t, int depth) { + + TreeSet book = selectOrderBook(t); + if (book==null) + return null; + ArrayList ret = new ArrayList<>(); Iterator it = book.iterator(); for (int i = 0; i < depth && it.hasNext(); i++) { @@ -112,26 +162,7 @@ public class Exchange extends Thread { } - /** - * Get the "ask" orderbook - * - * @param depth Number oder Orders to retrieve from orderbook - * @return Orderbook - */ - public ArrayList getAskBook(int depth) { - return getBook(ask, depth); - - } - - /** - * Get the "bid" oderbook - * - * @param depth Number oder Orders to retrieve from orderbook - * @return Orderbook - */ - public ArrayList getBidBook(int depth) { - return getBook(bid, depth); - } + public void print_current() { @@ -282,29 +313,43 @@ public class Exchange extends Thread { return true; } + // Add an order to the orderbook private boolean addOrder(Order o) { + boolean ret=false; switch (o.type) { - case buy: - return bid.add(o); + case bid: + + System.out.print("Exchange adding bid oder \n"); + ret = bid.add(o); + break; - case sell: - return ask.add(o); + case ask: + System.out.print("Exchange adding ask oder \n"); + ret = ask.add(o); + break; } - - return false; + + if (ret) + this.UpdateBookReceivers(o.type); + + return ret; } - public void SendOrder(Order o) { - Lock(); - o.timestamp = System.currentTimeMillis(); + public Order SendOrder(Order o) { + boolean rc = InitOrder(o); + if (!rc) + return null; + + Lock(); + o.timestamp = System.currentTimeMillis(); System.out.print(o.timestamp + " TS:\n"); o.id = orderid++; addOrder(o); OrderMatching(); Unlock(); - + return o; } /* diff --git a/src/SeSim/MTrader.java b/src/SeSim/MTrader.java index 39828aa..1363530 100644 --- a/src/SeSim/MTrader.java +++ b/src/SeSim/MTrader.java @@ -36,7 +36,7 @@ public class MTrader extends Trader { // System.out.println("HW"); long size = (int) (account.money / limit); - account.Buy(size, limit, ex); + account.buy(size, limit); } diff --git a/src/SeSim/Order.java b/src/SeSim/Order.java index 89569e5..17ae102 100644 --- a/src/SeSim/Order.java +++ b/src/SeSim/Order.java @@ -41,7 +41,7 @@ public abstract class Order implements Comparable { if (r==0) return 0; - if (type==OrderType.sell) + if (type==OrderType.ask) return 1-r; return r; @@ -82,8 +82,8 @@ public abstract class Order implements Comparable { open, executed, canceled } - enum OrderType { - buy,sell + public enum OrderType { + bid,ask } OrderStatus status = OrderStatus.open; diff --git a/src/SeSim/RandomTrader.java b/src/SeSim/RandomTrader.java index 1997bcd..0e91f57 100644 --- a/src/SeSim/RandomTrader.java +++ b/src/SeSim/RandomTrader.java @@ -39,7 +39,7 @@ public class RandomTrader extends Trader { long size = (int) (account.money / (limit * 1)); - myorder = account.Buy(size, limit, ex); + myorder = account.buy(size, limit); return; } diff --git a/src/SeSim/SellOrder.java b/src/SeSim/SellOrder.java index c929fc2..d11f77a 100644 --- a/src/SeSim/SellOrder.java +++ b/src/SeSim/SellOrder.java @@ -3,6 +3,6 @@ package SeSim; public class SellOrder extends Order { public SellOrder(){ - type=OrderType.sell; + type=OrderType.ask; } } diff --git a/src/SeSim/Trader.java b/src/SeSim/Trader.java index f125f0e..af47803 100644 --- a/src/SeSim/Trader.java +++ b/src/SeSim/Trader.java @@ -32,6 +32,10 @@ public abstract class Trader { public abstract void trade(); public Account account; + public void sell(long shares, double limit){ + account.sell(shares, limit); + } + /** * Construct a Trader object */