Some reformatting.
This commit is contained in:
parent
c1e3e2162c
commit
c0676d5b03
@ -7,241 +7,221 @@ import StockExchange.Order.OrderStatus;
|
|||||||
|
|
||||||
public class Exchange extends Thread {
|
public class Exchange extends Thread {
|
||||||
|
|
||||||
// Class to describe an executed order
|
// Class to describe an executed order
|
||||||
public class Quote {
|
public class Quote {
|
||||||
double bid;
|
|
||||||
double bid_size;
|
|
||||||
double ask;
|
|
||||||
double ask_size;
|
|
||||||
|
|
||||||
public double price;
|
|
||||||
public long size;
|
|
||||||
public long time;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// QuoteReceiver has to be implemented by objects that wants
|
double bid;
|
||||||
// to receive quote updates
|
double bid_size;
|
||||||
public interface QuoteReceiver
|
double ask;
|
||||||
{
|
double ask_size;
|
||||||
void UpdateQuote(Quote q);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Here we store the list of quote receivers
|
|
||||||
TreeSet<QuoteReceiver> qrlist=new TreeSet<QuoteReceiver>();
|
|
||||||
public void AddQuoteReceiver(QuoteReceiver qr)
|
|
||||||
{
|
|
||||||
qrlist.add(qr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// send updated quotes to all quote receivers
|
|
||||||
void UpdateQuoteReceivers(Quote q)
|
|
||||||
{
|
|
||||||
Iterator<QuoteReceiver> i = qrlist.iterator();
|
|
||||||
while(i.hasNext()){
|
|
||||||
i.next().UpdateQuote(q);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
public double price;
|
||||||
|
public long size;
|
||||||
|
public long time;
|
||||||
|
}
|
||||||
|
|
||||||
public ArrayList<Quote> quoteHistory = new ArrayList<Quote>();
|
// QuoteReceiver has to be implemented by objects that wants
|
||||||
|
// to receive quote updates
|
||||||
|
public interface QuoteReceiver {
|
||||||
|
|
||||||
// long time = 0;
|
void UpdateQuote(Quote q);
|
||||||
double price = 12.9;
|
}
|
||||||
long orderid = 1;
|
|
||||||
|
|
||||||
double lastprice = 300.0;
|
// Here we store the list of quote receivers
|
||||||
long lastsize;
|
TreeSet<QuoteReceiver> qrlist = new TreeSet<QuoteReceiver>();
|
||||||
|
|
||||||
// Order orderlist[];
|
public void AddQuoteReceiver(QuoteReceiver qr) {
|
||||||
|
qrlist.add(qr);
|
||||||
|
}
|
||||||
|
|
||||||
TreeSet<BuyOrder> bid = new TreeSet<BuyOrder>();
|
// send updated quotes to all quote receivers
|
||||||
TreeSet<SellOrder> ask = new TreeSet<SellOrder>();
|
void UpdateQuoteReceivers(Quote q) {
|
||||||
|
Iterator<QuoteReceiver> i = qrlist.iterator();
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next().UpdateQuote(q);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final Semaphore available = new Semaphore(1, true);
|
public ArrayList<Quote> quoteHistory = new ArrayList();
|
||||||
|
|
||||||
private void Lock() {
|
// long time = 0;
|
||||||
try {
|
double price = 12.9;
|
||||||
available.acquire();
|
long orderid = 1;
|
||||||
} catch (InterruptedException e) {
|
|
||||||
System.out.println("Interrupted");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
double lastprice = 300.0;
|
||||||
|
long lastsize;
|
||||||
|
|
||||||
private void Unlock() {
|
// Order orderlist[];
|
||||||
available.release();
|
TreeSet<BuyOrder> bid = new TreeSet<BuyOrder>();
|
||||||
}
|
TreeSet<SellOrder> ask = new TreeSet<SellOrder>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void print_current() {
|
private final Semaphore available = new Semaphore(1, true);
|
||||||
|
|
||||||
|
|
||||||
BuyOrder b;
|
|
||||||
SellOrder a;
|
|
||||||
|
|
||||||
|
|
||||||
//String bid;
|
|
||||||
|
|
||||||
|
|
||||||
if (bid.isEmpty()) {
|
private void Lock() {
|
||||||
b = new BuyOrder();
|
try {
|
||||||
b.limit = -1;
|
available.acquire();
|
||||||
b.size = 0;
|
} catch (InterruptedException e) {
|
||||||
} else
|
System.out.println("Interrupted");
|
||||||
b = bid.first();
|
}
|
||||||
|
|
||||||
if (ask.isEmpty()) {
|
}
|
||||||
a = new SellOrder();
|
|
||||||
a.limit = -1;
|
|
||||||
a.size = 0;
|
|
||||||
|
|
||||||
} else
|
private void Unlock() {
|
||||||
a = ask.first();
|
available.release();
|
||||||
|
}
|
||||||
|
|
||||||
Logger.info(
|
|
||||||
String.format("BID: %s(%s) LAST: %.2f(%d) ASK: %s(%s)\n",
|
|
||||||
b.format_limit(), b.format_size(),
|
|
||||||
lastprice, lastsize,
|
|
||||||
a.format_limit(), a.format_size())
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
public void print_current() {
|
||||||
|
|
||||||
public void TransferMoney(Account src, Account dst, double money) {
|
BuyOrder b;
|
||||||
src.money -= money;
|
SellOrder a;
|
||||||
dst.money += money;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CancelOrder(Order o) {
|
//String bid;
|
||||||
Lock();
|
if (bid.isEmpty()) {
|
||||||
|
b = new BuyOrder();
|
||||||
|
b.limit = -1;
|
||||||
|
b.size = 0;
|
||||||
|
} else {
|
||||||
|
b = bid.first();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ask.isEmpty()) {
|
||||||
|
a = new SellOrder();
|
||||||
|
a.limit = -1;
|
||||||
|
a.size = 0;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
a = ask.first();
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.info(
|
||||||
|
String.format("BID: %s(%s) LAST: %.2f(%d) ASK: %s(%s)\n",
|
||||||
|
b.format_limit(), b.format_size(),
|
||||||
|
lastprice, lastsize,
|
||||||
|
a.format_limit(), a.format_size())
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void TransferMoney(Account src, Account dst, double money) {
|
||||||
|
src.money -= money;
|
||||||
|
dst.money += money;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CancelOrder(Order o) {
|
||||||
|
Lock();
|
||||||
// System.out.println("Cancel BuyOrder");
|
// System.out.println("Cancel BuyOrder");
|
||||||
bid.remove(o);
|
bid.remove(o);
|
||||||
ask.remove(o);
|
ask.remove(o);
|
||||||
o.status=OrderStatus.canceled;
|
o.status = OrderStatus.canceled;
|
||||||
Unlock();
|
Unlock();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OrderMatching() {
|
public void OrderMatching() {
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (bid.isEmpty() || ask.isEmpty()) {
|
if (bid.isEmpty() || ask.isEmpty()) {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BuyOrder b = bid.first();
|
BuyOrder b = bid.first();
|
||||||
SellOrder a = ask.first();
|
SellOrder a = ask.first();
|
||||||
|
|
||||||
if (a.size == 0) {
|
if (a.size == 0) {
|
||||||
// This order is fully executed, remove
|
// This order is fully executed, remove
|
||||||
a.account.orderpending = false;
|
a.account.orderpending = false;
|
||||||
a.status=OrderStatus.executed;
|
a.status = OrderStatus.executed;
|
||||||
ask.pollFirst();
|
ask.pollFirst();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (b.size == 0) {
|
if (b.size == 0) {
|
||||||
//
|
//
|
||||||
b.account.orderpending = false;
|
b.account.orderpending = false;
|
||||||
b.status=OrderStatus.executed;
|
b.status = OrderStatus.executed;
|
||||||
bid.pollFirst();
|
bid.pollFirst();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (b.limit < a.limit) {
|
if (b.limit < a.limit) {
|
||||||
// no match, nothing to do
|
// no match, nothing to do
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (b.limit >= a.limit) {
|
if (b.limit >= a.limit) {
|
||||||
double price;
|
double price;
|
||||||
|
|
||||||
|
if (b.id < a.id) {
|
||||||
|
price = b.limit;
|
||||||
|
} else {
|
||||||
|
price = a.limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
long size = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (b.id < a.id)
|
|
||||||
price = b.limit;
|
|
||||||
else
|
|
||||||
price = a.limit;
|
|
||||||
|
|
||||||
|
if (b.size >= a.size) {
|
||||||
|
size = a.size;
|
||||||
|
} else {
|
||||||
|
size = b.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
b.account.Buy(a.account, size, price);
|
||||||
|
b.size -= size;
|
||||||
|
a.size -= size;
|
||||||
|
|
||||||
long size = 0;
|
lastprice = price;
|
||||||
|
lastsize = size;
|
||||||
|
|
||||||
if (b.size >= a.size) {
|
Quote q = new Quote();
|
||||||
size = a.size;
|
|
||||||
} else {
|
|
||||||
size = b.size;
|
|
||||||
}
|
|
||||||
|
|
||||||
b.account.Buy(a.account, size, price);
|
q.size = size;
|
||||||
b.size -= size;
|
q.price = price;
|
||||||
a.size -= size;
|
q.time = System.currentTimeMillis();
|
||||||
|
|
||||||
lastprice = price;
|
this.UpdateQuoteReceivers(q);
|
||||||
lastsize = size;
|
|
||||||
|
|
||||||
Quote q = new Quote();
|
//quoteHistory.add(q);
|
||||||
|
continue;
|
||||||
|
|
||||||
q.size = size;
|
}
|
||||||
q.price = price;
|
|
||||||
q.time = System.currentTimeMillis();
|
|
||||||
|
|
||||||
this.UpdateQuoteReceivers(q);
|
|
||||||
|
|
||||||
//quoteHistory.add(q);
|
|
||||||
|
|
||||||
continue;
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
public void ExecuteOrder(BuyOrder o) {
|
||||||
|
// SellOrder op = ask.peek();
|
||||||
|
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ExecuteOrder(BuyOrder o) {
|
public void SendOrder(SellOrder o) {
|
||||||
// SellOrder op = ask.peek();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendOrder(SellOrder o) {
|
|
||||||
// System.out.println("EX Sellorder");
|
// System.out.println("EX Sellorder");
|
||||||
Lock();
|
Lock();
|
||||||
o.timestamp = System.currentTimeMillis();
|
o.timestamp = System.currentTimeMillis();
|
||||||
o.id = orderid++;
|
o.id = orderid++;
|
||||||
ask.add(o);
|
ask.add(o);
|
||||||
Unlock();
|
Unlock();
|
||||||
Lock();
|
Lock();
|
||||||
OrderMatching();
|
OrderMatching();
|
||||||
Unlock();
|
Unlock();
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendOrder(BuyOrder o) {
|
}
|
||||||
//System.out.println("EX Buyorder");
|
|
||||||
Lock();
|
|
||||||
o.timestamp = System.currentTimeMillis();
|
|
||||||
o.id = orderid++;
|
|
||||||
bid.add(o);
|
|
||||||
Unlock();
|
|
||||||
Lock();
|
|
||||||
OrderMatching();
|
|
||||||
Unlock();
|
|
||||||
|
|
||||||
}
|
public void SendOrder(BuyOrder o) {
|
||||||
|
//System.out.println("EX Buyorder");
|
||||||
|
Lock();
|
||||||
|
o.timestamp = System.currentTimeMillis();
|
||||||
|
o.id = orderid++;
|
||||||
|
bid.add(o);
|
||||||
|
Unlock();
|
||||||
|
Lock();
|
||||||
|
OrderMatching();
|
||||||
|
Unlock();
|
||||||
|
|
||||||
/*
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
* public void SendOrder(Order o){
|
* public void SendOrder(Order o){
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
@ -250,34 +230,33 @@ public class Exchange extends Thread {
|
|||||||
* if ( o.getClass() == SellOrder.class){ ask.add((SellOrder)o); }
|
* if ( o.getClass() == SellOrder.class){ ask.add((SellOrder)o); }
|
||||||
*
|
*
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
|
public double getlastprice() {
|
||||||
public double getlastprice() {
|
/*
|
||||||
/*
|
|
||||||
* SellOrder so = new SellOrder(); so.limit=1000.0; so.size=500;
|
* SellOrder so = new SellOrder(); so.limit=1000.0; so.size=500;
|
||||||
* SendOrder(so);
|
* SendOrder(so);
|
||||||
*
|
*
|
||||||
* BuyOrder bo = new BuyOrder(); bo.limit=1001.0; bo.size=300;
|
* BuyOrder bo = new BuyOrder(); bo.limit=1001.0; bo.size=300;
|
||||||
* SendOrder(bo);
|
* SendOrder(bo);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return price;
|
return price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double sendOrder(Account o) {
|
public double sendOrder(Account o) {
|
||||||
return 0.7;
|
return 0.7;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
sleep(1500);
|
sleep(1500);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
System.out.println("Interrupted");
|
System.out.println("Interrupted");
|
||||||
}
|
}
|
||||||
print_current();
|
print_current();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,23 @@
|
|||||||
package StockExchange;
|
package StockExchange;
|
||||||
|
|
||||||
public class Logger {
|
public class Logger {
|
||||||
|
|
||||||
static boolean dbg=true;
|
static boolean dbg = true;
|
||||||
static boolean info=true;
|
static boolean info = true;
|
||||||
|
|
||||||
static void dbg(String s){
|
static void dbg(String s) {
|
||||||
if (!dbg)
|
if (!dbg) {
|
||||||
return;
|
return;
|
||||||
System.out.print("DBG: ");
|
}
|
||||||
System.out.println(s);
|
System.out.print("DBG: ");
|
||||||
}
|
System.out.println(s);
|
||||||
|
}
|
||||||
static void info(String s){
|
|
||||||
if (!info)
|
static void info(String s) {
|
||||||
return;
|
if (!info) {
|
||||||
System.out.print("INFO: ");
|
return;
|
||||||
System.out.println(s);
|
}
|
||||||
}
|
System.out.print("INFO: ");
|
||||||
|
System.out.println(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package StockExchange;
|
|||||||
|
|
||||||
public class SellOrder extends Order {
|
public class SellOrder extends Order {
|
||||||
|
|
||||||
|
@Override
|
||||||
public int compareTo(Order o) {
|
public int compareTo(Order o) {
|
||||||
|
|
||||||
if (o.limit < limit) {
|
if (o.limit < limit) {
|
||||||
|
Loading…
Reference in New Issue
Block a user