work on internal accounts
This commit is contained in:
parent
0952c7b591
commit
aae927ae82
1
.gitignore
vendored
1
.gitignore
vendored
@ -13,3 +13,4 @@ hs_err_pid*
|
|||||||
/dist/
|
/dist/
|
||||||
/build/
|
/build/
|
||||||
/target/
|
/target/
|
||||||
|
/nbproject/
|
12
pom.xml
12
pom.xml
@ -11,6 +11,18 @@
|
|||||||
<artifactId>jfreechart</artifactId>
|
<artifactId>jfreechart</artifactId>
|
||||||
<version>1.0.19</version>
|
<version>1.0.19</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hamcrest</groupId>
|
||||||
|
<artifactId>hamcrest-core</artifactId>
|
||||||
|
<version>1.3</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
@ -12,6 +12,36 @@ import sesim.Order.OrderType;
|
|||||||
*/
|
*/
|
||||||
public class Exchange extends Thread {
|
public class Exchange extends Thread {
|
||||||
|
|
||||||
|
private class iAccount implements Comparable {
|
||||||
|
|
||||||
|
protected double id;
|
||||||
|
protected double shares;
|
||||||
|
protected double money;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Object a) {
|
||||||
|
iAccount account = (iAccount) a;
|
||||||
|
return this.id - account.id < 0 ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
iAccount(double money, double shares) {
|
||||||
|
next_account_id_locker.lock();
|
||||||
|
id = (Math.random() + (next_account_id++));
|
||||||
|
next_account_id_locker.unlock();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int next_account_id;
|
||||||
|
Locker next_account_id_locker = new Locker();
|
||||||
|
TreeSet<iAccount> accounts;
|
||||||
|
|
||||||
|
double createAccount(double money, double shares) {
|
||||||
|
iAccount a = new iAccount(money, shares);
|
||||||
|
accounts.add(a);
|
||||||
|
return a.id;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Histrory of quotes
|
* Histrory of quotes
|
||||||
*/
|
*/
|
||||||
@ -221,6 +251,13 @@ public class Exchange extends Thread {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void transferMoneyAndShares(Account src, Account dst, double money, long shares) {
|
||||||
|
src.money -= money;
|
||||||
|
dst.money += money;
|
||||||
|
src.shares -= shares;
|
||||||
|
dst.shares += shares;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param o
|
* @param o
|
||||||
@ -268,10 +305,11 @@ public class Exchange extends Thread {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// There is a match, build price and volume
|
||||||
double price = b.id < a.id ? b.limit : a.limit;
|
double price = b.id < a.id ? b.limit : a.limit;
|
||||||
long volume = b.volume >= a.volume ? a.volume : b.volume;
|
long volume = b.volume >= a.volume ? a.volume : b.volume;
|
||||||
|
|
||||||
|
transferMoneyAndShares(b.account, a.account, volume * price, -volume);
|
||||||
|
|
||||||
if (a.volume == 0) {
|
if (a.volume == 0) {
|
||||||
// This order is fully executed, remove
|
// This order is fully executed, remove
|
||||||
@ -305,8 +343,6 @@ public class Exchange extends Thread {
|
|||||||
price = a.limit;
|
price = a.limit;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
if (b.volume >= a.volume) {
|
if (b.volume >= a.volume) {
|
||||||
volume = a.volume;
|
volume = a.volume;
|
||||||
} else {
|
} else {
|
||||||
@ -336,7 +372,6 @@ public class Exchange extends Thread {
|
|||||||
this.updateBookReceivers(OrderType.bid);
|
this.updateBookReceivers(OrderType.bid);
|
||||||
this.updateBookReceivers(OrderType.ask);
|
this.updateBookReceivers(OrderType.ask);
|
||||||
|
|
||||||
|
|
||||||
quoteHistory.add(q);
|
quoteHistory.add(q);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
300
src/test/java/sesim/ExchangeTest.java
Normal file
300
src/test/java/sesim/ExchangeTest.java
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, tobias
|
||||||
|
* 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 sesim;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.SortedSet;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author tobias
|
||||||
|
*/
|
||||||
|
public class ExchangeTest {
|
||||||
|
|
||||||
|
public ExchangeTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDownClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of createAccount method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testCreateAccount() {
|
||||||
|
System.out.println("createAccount");
|
||||||
|
double money = 0.0;
|
||||||
|
double shares = 0.0;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
double expResult = 0.0;
|
||||||
|
double result = instance.createAccount(money, shares);
|
||||||
|
assertEquals(expResult, result, 0.0);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of getCurrentTimeSeconds method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testGetCurrentTimeSeconds() {
|
||||||
|
System.out.println("getCurrentTimeSeconds");
|
||||||
|
long expResult = 0L;
|
||||||
|
long result = Exchange.getCurrentTimeSeconds();
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of getQuoteHistory method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testGetQuoteHistory() {
|
||||||
|
System.out.println("getQuoteHistory");
|
||||||
|
long start = 0L;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
SortedSet<Quote> expResult = null;
|
||||||
|
SortedSet<Quote> result = instance.getQuoteHistory(start);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of addBookReceiver method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testAddBookReceiver() {
|
||||||
|
System.out.println("addBookReceiver");
|
||||||
|
Order.OrderType t = null;
|
||||||
|
Exchange.BookReceiver br = null;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.addBookReceiver(t, br);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of updateBookReceivers method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testUpdateBookReceivers() {
|
||||||
|
System.out.println("updateBookReceivers");
|
||||||
|
Order.OrderType t = null;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.updateBookReceivers(t);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of addQuoteReceiver method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testAddQuoteReceiver() {
|
||||||
|
System.out.println("addQuoteReceiver");
|
||||||
|
Exchange.QuoteReceiver qr = null;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.addQuoteReceiver(qr);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of getOrderBook method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testGetOrderBook() {
|
||||||
|
System.out.println("getOrderBook");
|
||||||
|
Order.OrderType t = null;
|
||||||
|
int depth = 0;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
ArrayList<Order> expResult = null;
|
||||||
|
ArrayList<Order> result = instance.getOrderBook(t, depth);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of print_current method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testPrint_current() {
|
||||||
|
System.out.println("print_current");
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.print_current();
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of transferMoney method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testTransferMoney() {
|
||||||
|
System.out.println("transferMoney");
|
||||||
|
Account src = null;
|
||||||
|
Account dst = null;
|
||||||
|
double money = 0.0;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.transferMoney(src, dst, money);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of transferMoneyAndShares method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testTransferMoneyAndShares() {
|
||||||
|
System.out.println("transferMoneyAndShares");
|
||||||
|
Account src = null;
|
||||||
|
Account dst = null;
|
||||||
|
double money = 0.0;
|
||||||
|
long shares = 0L;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.transferMoneyAndShares(src, dst, money, shares);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of cancelOrder method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testCancelOrder() {
|
||||||
|
System.out.println("cancelOrder");
|
||||||
|
Order o = null;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.cancelOrder(o);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of transferShares method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testTransferShares() {
|
||||||
|
System.out.println("transferShares");
|
||||||
|
Account src = null;
|
||||||
|
Account dst = null;
|
||||||
|
long volume = 0L;
|
||||||
|
double price = 0.0;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.transferShares(src, dst, volume, price);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of executeOrders method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testExecuteOrders() {
|
||||||
|
System.out.println("executeOrders");
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.executeOrders();
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of ExecuteOrder method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testExecuteOrder() {
|
||||||
|
System.out.println("ExecuteOrder");
|
||||||
|
BuyOrder o = null;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.ExecuteOrder(o);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of SendOrder method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testSendOrder() {
|
||||||
|
System.out.println("SendOrder");
|
||||||
|
Order o = null;
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
Order expResult = null;
|
||||||
|
Order result = instance.SendOrder(o);
|
||||||
|
assertEquals(expResult, result);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of getlastprice method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testGetlastprice() {
|
||||||
|
System.out.println("getlastprice");
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
double expResult = 0.0;
|
||||||
|
double result = instance.getlastprice();
|
||||||
|
assertEquals(expResult, result, 0.0);
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test of run method, of class Exchange.
|
||||||
|
*/
|
||||||
|
@org.junit.Test
|
||||||
|
public void testRun() {
|
||||||
|
System.out.println("run");
|
||||||
|
Exchange instance = new Exchange();
|
||||||
|
instance.run();
|
||||||
|
// TODO review the generated test code and remove the default call to fail.
|
||||||
|
fail("The test case is a prototype.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
51
src/test/java/sesim/Test.java
Normal file
51
src/test/java/sesim/Test.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, tobias
|
||||||
|
* 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 sesim;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author tobias
|
||||||
|
*/
|
||||||
|
public class Test {
|
||||||
|
/**
|
||||||
|
* @param args the command line arguments
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Exchange se = new Exchange();
|
||||||
|
|
||||||
|
double aid;
|
||||||
|
aid = se.createAccount(100, 110);
|
||||||
|
System.out.print(aid);
|
||||||
|
System.out.print("\n");
|
||||||
|
|
||||||
|
aid = se.createAccount(100, 110);
|
||||||
|
System.out.print(aid);
|
||||||
|
System.out.print("\n");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user