diff --git a/src/main/java/sesim/Exchange.java b/src/main/java/sesim/Exchange.java index f7d9b13..e2baa0d 100644 --- a/src/main/java/sesim/Exchange.java +++ b/src/main/java/sesim/Exchange.java @@ -449,12 +449,11 @@ public class Exchange { } - public Quote getCurrentPrice() { + public Double getBestPrice() { SortedSet bid = order_books.get(OrderType.BUYLIMIT); SortedSet ask = order_books.get(OrderType.SELLLIMIT); - tradelock.lock(); Quote lq = this.getLastQuoete(); Order b = null, a = null; if (!bid.isEmpty()) { @@ -463,18 +462,99 @@ public class Exchange { if (!ask.isEmpty()) { a = ask.first(); } - tradelock.unlock(); + // If there is neither bid nor ask and no last quote + // we can't return a quote if (lq == null && b == null && a == null) { return null; } + // there is bid and ask if (a != null && b != null) { Quote q = new Quote(); + + // if there is no last quote calculate from bid and ask + if (lq == null) { + return (bid.first().limit + ask.first().limit) / 2.0; + + } + + if (lq.price < b.limit) { + return b.limit; + + } + if (lq.price > a.limit) { + return a.limit; + + } + return lq.price; + } + + if (a != null) { + Quote q = new Quote(); + if (lq == null) { + + return a.limit; + + } + if (lq.price > a.limit) { + return a.limit; + + } + return lq.price; + } + + if (b != null) { + Quote q = new Quote(); + if (lq == null) { + return b.limit; + + } + if (lq.price < b.limit) { + return b.limit; + + } + + return lq.price; + } + + if (lq == null) { + return null; + } + + return lq.price; + } + + public Quote getBestPrice_0() { + + SortedSet bid = order_books.get(OrderType.BUYLIMIT); + SortedSet ask = order_books.get(OrderType.SELLLIMIT); + + Quote lq = this.getLastQuoete(); + Order b = null, a = null; + if (!bid.isEmpty()) { + b = bid.first(); + } + if (!ask.isEmpty()) { + a = ask.first(); + } + + // If there is neither bid nor ask and no last quote + // we can't return a quote + if (lq == null && b == null && a == null) { + return null; + } + + // there is bid and ask + if (a != null && b != null) { + Quote q = new Quote(); + + // if there is no last quote calculate from bid and ask if (lq == null) { q.price = (bid.first().limit + ask.first().limit) / 2.0; return q; } + if (lq.price < b.limit) { q.price = b.limit; return q; @@ -774,13 +854,38 @@ public class Exchange { double volume_total = 0; double money_total = 0; - while (true) { // Match unlimited sell orders against unlimited buy orders - while (!ul_sell.isEmpty() && !ul_buy.isEmpty()) { - System.out.printf("Cannot match two unlimited orders!\n"); - System.exit(0); + if (!ul_sell.isEmpty() && !ul_buy.isEmpty()) { + Order a = ul_sell.first(); + Order b = ul_buy.first(); + + Double price = getBestPrice(); + if (price == null) { + break; + } + + double volume = b.volume >= a.volume ? a.volume : b.volume; + finishTrade(b, a, price, volume); + volume_total += volume; + money_total += price * volume; + this.checkSLOrders(price); + + //System.out.printf("Cannot match two unlimited orders!\n"); + //System.exit(0); + + } + + while (!ul_buy.isEmpty() && !ask.isEmpty()) { + Order a = ask.first(); + Order b = ul_buy.first(); + double price = a.limit; + double volume = b.volume >= a.volume ? a.volume : b.volume; + finishTrade(b, a, price, volume); + volume_total += volume; + money_total += price * volume; + this.checkSLOrders(price); } @@ -830,7 +935,6 @@ public class Exchange { q.volume = volume_total; q.time = timer.currentTimeMillis(); -// System.out.print("There was a trade:"+q.price+"\n"); this.quoteHistory.add(q); this.updateOHLCData(q); diff --git a/src/main/java/traders/ManTrader/CreateOrderDialog.form b/src/main/java/traders/ManTrader/CreateOrderDialog.form index 8334395..6655085 100644 --- a/src/main/java/traders/ManTrader/CreateOrderDialog.form +++ b/src/main/java/traders/ManTrader/CreateOrderDialog.form @@ -91,10 +91,11 @@ - + + diff --git a/src/main/java/traders/ManTrader/CreateOrderDialog.java b/src/main/java/traders/ManTrader/CreateOrderDialog.java index 93e2e33..a8ae0d7 100644 --- a/src/main/java/traders/ManTrader/CreateOrderDialog.java +++ b/src/main/java/traders/ManTrader/CreateOrderDialog.java @@ -53,8 +53,8 @@ public class CreateOrderDialog extends javax.swing.JDialog { public CreateOrderDialog(java.awt.Frame parent, boolean modal, Account account, OrderType type) { this(parent, modal); this.account = account; - typeComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{"Buy Lim", "Sell Lim", "Sell"})); - typeList = new OrderType[]{OrderType.BUYLIMIT, OrderType.SELLLIMIT, OrderType.SELL}; + typeComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{"Buy Lim", "Sell Lim", "Buy", "Sell"})); + typeList = new OrderType[]{OrderType.BUYLIMIT, OrderType.SELLLIMIT, OrderType.BUY,OrderType.SELL}; for (int i = 0; i < typeList.length; i++) { if (typeList[i] == type) { this.typeComboBox.setSelectedIndex(i); @@ -72,7 +72,7 @@ public class CreateOrderDialog extends javax.swing.JDialog { public void initDialog() { OrderType t = getOrderType(); - Quote q = Globals.se.getCurrentPrice(); + Quote q = Globals.se.getBestPrice_0(); Double price = q == null ? 0.0 : q.price; if (t == OrderType.BUYLIMIT) { @@ -123,7 +123,7 @@ public class CreateOrderDialog extends javax.swing.JDialog { } }); - typeComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Buy Limit", "Sell Limit", "Sell" })); + typeComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Buy Limit", "Sell Limit", "Sell", "Buy" })); limitSpinner.setModel(new javax.swing.SpinnerNumberModel(0.0d, 0.0d, null, 0.1d)); diff --git a/src/main/java/traders/RandomTraderA.java b/src/main/java/traders/RandomTraderA.java index 2e2e1c9..31c65bb 100644 --- a/src/main/java/traders/RandomTraderA.java +++ b/src/main/java/traders/RandomTraderA.java @@ -283,7 +283,7 @@ public class RandomTraderA extends AutoTraderBase { // how much money we ant to invest? double money = getRandomAmmount(ad.getMoney(), buy_volume); - Quote q = se.getCurrentPrice(); + Quote q = se.getBestPrice_0(); //q=se.getLastQuoete(); double lp = q == null ? getStart() : q.price; @@ -323,7 +323,7 @@ public class RandomTraderA extends AutoTraderBase { // double lp = 100.0; //se.getBestLimit(type); - Quote q = se.getCurrentPrice(); + Quote q = se.getBestPrice_0(); // q=se.getLastQuoete(); double lp = q == null ? getStart() : q.price; diff --git a/src/main/java/traders/RandomTraderB.java b/src/main/java/traders/RandomTraderB.java index 48e6d4b..c7ea2f0 100644 --- a/src/main/java/traders/RandomTraderB.java +++ b/src/main/java/traders/RandomTraderB.java @@ -283,7 +283,7 @@ public class RandomTraderB extends AutoTraderBase { // how much money we ant to invest? double money = getRandomAmmount(ad.getMoney(), buy_volume); - Quote q = se.getCurrentPrice(); + Quote q = se.getBestPrice_0(); //q=se.getLastQuoete(); double lp = q == null ? getStart() : q.price; @@ -323,7 +323,7 @@ public class RandomTraderB extends AutoTraderBase { // double lp = 100.0; //se.getBestLimit(type); - Quote q = se.getCurrentPrice(); + Quote q = se.getBestPrice_0(); // q=se.getLastQuoete(); double lp = q == null ? getStart() : q.price;