From c1e3e2162cf73302cb3fb62a840cb936886850f1 Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@maiol.ru> Date: Sun, 25 Dec 2016 18:11:23 +0100 Subject: [PATCH] Initial commit --- src/StockExchange/Account.java | 58 ++++++++++ src/StockExchange/BuyOrder.java | 21 ++++ src/StockExchange/Logger.java | 21 ++++ src/StockExchange/MTrader.java | 88 ++++++++++++++++ src/StockExchange/Order.java | 41 ++++++++ src/StockExchange/RandomTrader.java | 146 ++++++++++++++++++++++++++ src/StockExchange/SellOrder.java | 15 +++ src/StockExchange/ThreadedTrader.java | 26 +++++ src/StockExchange/Trader.java | 10 ++ src/StockExchange/TraderRun.java | 37 +++++++ 10 files changed, 463 insertions(+) create mode 100644 src/StockExchange/Account.java create mode 100644 src/StockExchange/BuyOrder.java create mode 100644 src/StockExchange/Logger.java create mode 100644 src/StockExchange/MTrader.java create mode 100644 src/StockExchange/Order.java create mode 100644 src/StockExchange/RandomTrader.java create mode 100644 src/StockExchange/SellOrder.java create mode 100644 src/StockExchange/ThreadedTrader.java create mode 100644 src/StockExchange/Trader.java create mode 100644 src/StockExchange/TraderRun.java diff --git a/src/StockExchange/Account.java b/src/StockExchange/Account.java new file mode 100644 index 0000000..48ce30c --- /dev/null +++ b/src/StockExchange/Account.java @@ -0,0 +1,58 @@ +package StockExchange; + +public class Account { + public long shares=0; // number of shares + public double money=0; // amount of money + public String name=""; + public boolean orderpending=false; + + private double bound_money; + + + + + public void print_current(){ + System.out.printf("%s shares: %d credit: %.2f\n", + name, shares,money + ); + + + } + + + public SellOrder Sell (long size, double limit, Exchange ex){ + SellOrder o = new SellOrder(); + o.account=this; + o.limit=limit; + o.size=size; + + orderpending=true; + ex.SendOrder(o); + return o; + + } + + public BuyOrder Buy (long size, double limit, Exchange ex ){ + if (size * limit > money) + return null; + + BuyOrder o = new BuyOrder(); + o.limit=limit; + o.size=size; + o.account=this; + orderpending=true; + ex.SendOrder(o); + return o; + + } + + public void Buy( Account a,long size, double price) + { + shares+=size; + money-= price * size; + a.shares-=size; + a.money+=price * size; + } + + +} diff --git a/src/StockExchange/BuyOrder.java b/src/StockExchange/BuyOrder.java new file mode 100644 index 0000000..266ec52 --- /dev/null +++ b/src/StockExchange/BuyOrder.java @@ -0,0 +1,21 @@ +package StockExchange; + +public class BuyOrder extends Order implements Comparable{ + + + + public int compareTo(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; + } +} diff --git a/src/StockExchange/Logger.java b/src/StockExchange/Logger.java new file mode 100644 index 0000000..c52c982 --- /dev/null +++ b/src/StockExchange/Logger.java @@ -0,0 +1,21 @@ +package StockExchange; + +public class Logger { + + static boolean dbg=true; + static boolean info=true; + + static void dbg(String s){ + if (!dbg) + return; + System.out.print("DBG: "); + System.out.println(s); + } + + static void info(String s){ + if (!info) + return; + System.out.print("INFO: "); + System.out.println(s); + } +} diff --git a/src/StockExchange/MTrader.java b/src/StockExchange/MTrader.java new file mode 100644 index 0000000..d5ee508 --- /dev/null +++ b/src/StockExchange/MTrader.java @@ -0,0 +1,88 @@ +package StockExchange; + +import java.util.Random; + +public class MTrader implements Trader { + Exchange ex; + Random rand; + + public MTrader (Exchange ex1, long shares, double money){ + account.money=money; + account.shares=shares; + this.ex=ex; + rand = new Random(); + } + + public void DoBuy() + { + // System.out.println("AAA"); + + if (account.orderpending) + return; + + if (account.money <= 0) + return; + + double perc = rand.nextDouble() * 1.0; + double lp = ex.lastprice; + double limit = lp/100 * perc + lp; + +// System.out.println("HW"); + long size = (int)(account.money/limit); + + + account.Buy(size, limit, ex); + return; + } + + public void DoSell() + { +// System.out.println("SoSell"); + + if (account.orderpending) + return; + + if (account.shares<=0) + return; + + double perc = rand.nextDouble() * 1.0; + double lp = ex.lastprice; + double limit = lp - lp/100 * perc; + + long size = (int)(account.shares); + + + account.Sell(size, limit, ex); + return; + } + + + + public void trade(){ + + + // What to do? + int action = rand.nextInt(3); + // System.out.print("Action"); + // System.out.println(action); + if (action==0) + return; + + if (action == 1) + { + DoBuy(); + return; + } + + if (action == 2) + { + DoSell(); + return; + } + + + //System.out.printf("MyPrice: %.2f\n",price); + + } + +} diff --git a/src/StockExchange/Order.java b/src/StockExchange/Order.java new file mode 100644 index 0000000..f772bcc --- /dev/null +++ b/src/StockExchange/Order.java @@ -0,0 +1,41 @@ +package StockExchange; + + +public abstract class Order implements Comparable{ + public long timestamp=0; + public long size; + public double limit; +// long time; + double money=0; +// public long shares=0; + public long id=0; + public Account account=null; + + + enum OrderStatus { + open,executed,canceled + } + + OrderStatus status=OrderStatus.open; + + public long getAge(){ + if (timestamp==0) + return 0; + return System.currentTimeMillis()-timestamp; + } + + String format_limit(){ + if (limit <0.0){ + return "n.a."; + } + return String.format("%.2f",limit); + } + + String format_size(){ + return String.format("%d", size); + } + + Order(){ + + } +} diff --git a/src/StockExchange/RandomTrader.java b/src/StockExchange/RandomTrader.java new file mode 100644 index 0000000..34e1ed6 --- /dev/null +++ b/src/StockExchange/RandomTrader.java @@ -0,0 +1,146 @@ +package StockExchange; + +import java.util.Random; +import StockExchange.Order.OrderStatus; + +public class RandomTrader extends ThreadedTrader{ + +// public Account account=new Account(); + Exchange ex=null; + Random rand = new Random(); + + public String name; + + // my current order + private Order myorder=null; + + + public RandomTrader (Exchange ex, long shares, double money){ + account.money=money; + account.shares=shares; + this.ex=ex; + } + + public void DoBuy() + { + + if (myorder!=null) + return; + + if (account.money <= 0) + return; + + double perc = rand.nextDouble() * 1.0; + double lp = ex.lastprice; + double limit = lp/100 * perc + lp; + + + long size = (int)(account.money/(limit*1)); + + + myorder = account.Buy(size, limit, ex); + return; + } + + public void DoSell() + { + if (myorder!=null) + return; + + if (account.shares<=0) + return; + + double perc = rand.nextDouble() * 1.0; + double lp = ex.lastprice; + double limit = lp - lp/100 * perc; + + long size = (int)(account.shares); + + + myorder= account.Sell(size, limit, ex); + } + + + + + public void trade(){ + + if (myorder != null) + { + long age = myorder.getAge(); + if (myorder.status == OrderStatus.executed) + { + myorder=null; + // System.out.println(name); + // System.out.println("----------------------"); + // account.print_current(); + return; + } + + + if (myorder.getAge()>10){ + //System.out.println("Shall cancel now"); + //System.out.println(myorder.status); + ex.CancelOrder(myorder); + myorder=null; + return; + } + + return; + } + + + + + + + // What to do? + int action = rand.nextInt(3); +/* System.out.print(name); + System.out.println("---------------------------"); + System.out.print("Action:"); + System.out.println(action); + */ +/* if (action==0) + { + DoSell(); + return; + } + */ + + if (action == 1) + { + DoBuy(); + return; + } + + if (action == 2) + { + DoSell(); + return; + } + + + } + +/* public void run(){ + while (true) + { + try{ + sleep(200); + } + catch(InterruptedException e) { + System.out.println("Interrupted"); + } + // System.out.println("Trader has slept"); + trade(); + + + + } + } + + */ + +} + diff --git a/src/StockExchange/SellOrder.java b/src/StockExchange/SellOrder.java new file mode 100644 index 0000000..1cb14eb --- /dev/null +++ b/src/StockExchange/SellOrder.java @@ -0,0 +1,15 @@ +package StockExchange; + +public class SellOrder extends Order { + + public int compareTo(Order o) { + + if (o.limit < limit) { + return 1; + } + if (o.limit > limit) { + return -1; + } + return 0; + } +} diff --git a/src/StockExchange/ThreadedTrader.java b/src/StockExchange/ThreadedTrader.java new file mode 100644 index 0000000..581e9f0 --- /dev/null +++ b/src/StockExchange/ThreadedTrader.java @@ -0,0 +1,26 @@ +package StockExchange; + +public abstract class ThreadedTrader extends Thread implements Trader { + + protected long sleeptime=100; + + public void RandomTrader (Exchange ex, long shares, double money){ + // this.ex=ex; + + } + + public void run(){ + while (true) + { + try{ + sleep(sleeptime); + } + catch(InterruptedException e) { + System.out.println("Interrupted"); + } + trade(); + } + } + + +} diff --git a/src/StockExchange/Trader.java b/src/StockExchange/Trader.java new file mode 100644 index 0000000..2fbbdb1 --- /dev/null +++ b/src/StockExchange/Trader.java @@ -0,0 +1,10 @@ +package StockExchange; + + +public interface Trader{ + String name = null; + public void trade(); + public Account account=new Account(); +// public Exchange ex=null; + +}; \ No newline at end of file diff --git a/src/StockExchange/TraderRun.java b/src/StockExchange/TraderRun.java new file mode 100644 index 0000000..8422429 --- /dev/null +++ b/src/StockExchange/TraderRun.java @@ -0,0 +1,37 @@ +package StockExchange; + +public class TraderRun extends Thread{ + public String tname = ""; + public Exchange ex; + + public void run(){ + while (true) + { + try{ + sleep(100); + } + catch(InterruptedException e) { + System.out.println("Interrupted"); + } + +/* + System.out.printf("%s locking\n", tname); + ex.Lock(); + System.out.printf("%s locked\n", tname); + + try{ + sleep(1000); + } + catch(InterruptedException e) { + System.out.println("Interrupted"); + } + + System.out.printf("%s unlocking\n", tname); +// ex.Free(); + System.out.printf("%s unlocked\n", tname); +*/ + + } + } + +}