diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index de08f81..e3442b8 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -5,6 +5,7 @@ file:/home/tube/NetBeansProjects/SeSim/additional/README.txt file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Trader.java + file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Locker.java file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Order.java file:/home/tube/NetBeansProjects/SeSim/src/Gui/ControlPanel.java file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Quote.java @@ -18,10 +19,10 @@ file:/home/tube/NetBeansProjects/SeSim/src/Gui/NewPanel.java file:/home/tube/NetBeansProjects/SeSim/src/Gui/Chart.java file:/home/tube/NetBeansProjects/SeSim/src/Traders/RandomTraderConfig.java - file:/home/tube/NetBeansProjects/SeSim/src/SeSim/TraderRunner.java file:/home/tube/NetBeansProjects/SeSim/src/Gui/AskBook.java file:/home/tube/NetBeansProjects/SeSim/src/SeSim/AutoTrader.java file:/home/tube/NetBeansProjects/SeSim/src/Gui/BidBook.java + file:/home/tube/NetBeansProjects/SeSim/src/Traders/SwitchingTrader.java file:/home/tube/NetBeansProjects/SeSim/build.xml file:/home/tube/NetBeansProjects/SeSim/src/Gui/OrderBookPanel.java file:/home/tube/NetBeansProjects/SeSim/src/Traders/RandomTrader.java @@ -31,6 +32,7 @@ file:/home/tube/NetBeansProjects/SeSim/README.md file:/home/tube/NetBeansProjects/SeSim/src/Gui/CandlestickDemo.java file:/home/tube/NetBeansProjects/SeSim/src/SeSim/Logger.java + file:/home/tube/NetBeansProjects/SeSim/src/Traders/SwitchingTraderConfig.java file:/home/tube/NetBeansProjects/SeSim/src/SeSim/SellOrder.java file:/home/tube/NetBeansProjects/SeSim/LICENSE diff --git a/src/Gui/Chart.java b/src/Gui/Chart.java index c086b5b..525fc0e 100644 --- a/src/Gui/Chart.java +++ b/src/Gui/Chart.java @@ -37,6 +37,8 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.StringTokenizer; +import java.util.Iterator; + import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; @@ -52,6 +54,7 @@ import org.jfree.data.xy.XYDataset; import SeSim.Exchange.*; import SeSim.Quote; import java.util.SortedSet; +import java.util.TreeSet; /** * @@ -65,7 +68,8 @@ public class Chart extends javax.swing.JPanel implements QuoteReceiver { public Chart() { initComponents(); - String stockSymbol = "Schliemanz Koch AG"; + // String stockSymbol = "Schliemanz Koch AG"; + String stockSymbol = "MSFT"; DateAxis domainAxis = new DateAxis("Date"); NumberAxis rangeAxis = new NumberAxis("Price"); @@ -111,9 +115,90 @@ public class Chart extends javax.swing.JPanel implements QuoteReceiver { return result; } + + + + protected OHLCDataItem getOhlcData(long first, long last, TreeSet quotes ){ + Quote e=new Quote(); + e.time=first; + e.id=0; + + + SortedSet l = quotes.tailSet(e); + + double open=0; + double high=0; + double low=0; + double close=0; + double volume; + + Iterator it = l.iterator(); + + + Quote q; + q = it.next(); + open=q.price; + + high=q.price; + low=q.price; + volume = q.volume; + + + while (it.hasNext() && q.timehigh) + high = q.price; + if (q.price data = new ArrayList<>(); + + TreeSet s = MainWin.se.getQuoteHistory(60); + Iterator i = s.iterator(); + + + this.getOhlcData(0, System.currentTimeMillis(), s); + + +// OHLCDataItem item = new OHLCDataItem(); + + + long t=0; + // if () + + + // Quote q = i.next(); + // OHLCDataItem item = new OHLCDataItem( + // date, open, high, low, close, volume); +/* double open = + double high = + double low = + double close = + double volume = Double.parseDouble(st.nextToken()); + double adjClose = Double.parseDouble(st.nextToken()); + */ + +// data.add(item); + + + //return data.toArray(new rdata[]); return data.toArray(new OHLCDataItem[data.size()]); @@ -121,7 +206,7 @@ public class Chart extends javax.swing.JPanel implements QuoteReceiver { //This method uses yahoo finance to get the OHLC data protected OHLCDataItem[] getData_old() { - String stockSymbol = "Schliemanz Koch AG"; + String stockSymbol = "MSFT"; List dataItems = new ArrayList(); try { String strUrl = "http://ichart.finance.yahoo.com/table.csv?s=" + stockSymbol + "&a=0&b=1&c=2008&d=3&e=30&f=2008&ignore=.csv"; @@ -154,6 +239,8 @@ public class Chart extends javax.swing.JPanel implements QuoteReceiver { //Convert the list into an array OHLCDataItem[] data = dataItems.toArray(new OHLCDataItem[dataItems.size()]); + + System.out.print("Return oghls old data items\n"); return data; } diff --git a/src/Gui/MainWin.java b/src/Gui/MainWin.java index e94da22..1cb1874 100644 --- a/src/Gui/MainWin.java +++ b/src/Gui/MainWin.java @@ -158,8 +158,8 @@ public class MainWin extends javax.swing.JFrame { RandomTraderConfig rcfg = new RandomTraderConfig(); at.add(1000, rcfg, se, 1000, 10000); - SwitchingTraderConfig scfg = new SwitchingTraderConfig(); - at.add(1, scfg, se, 1000000, 0); + //SwitchingTraderConfig scfg = new SwitchingTraderConfig(); + //at.add(1, scfg, se, 1000000, 0); // at.add(10, rcfg, se, 1000000, 0); diff --git a/src/SeSim/AutoTrader.java b/src/SeSim/AutoTrader.java index fdc0f3a..4405404 100644 --- a/src/SeSim/AutoTrader.java +++ b/src/SeSim/AutoTrader.java @@ -42,6 +42,22 @@ public abstract class AutoTrader extends Trader implements Runnable { sleep(seconds*1000); } catch (InterruptedException e) { } - } + + public void start(){ + System.out.print("Starting AutoTrader\n"); + class Runner extends Thread{ + AutoTrader trader; + @Override + public void run(){ + trader.run(); + } + } + Runner r = new Runner(); + r.trader=this; + r.start(); + + } + + } diff --git a/src/SeSim/AutoTraderLIst.java b/src/SeSim/AutoTraderLIst.java index 57ebf2e..53fc8af 100644 --- a/src/SeSim/AutoTraderLIst.java +++ b/src/SeSim/AutoTraderLIst.java @@ -35,8 +35,9 @@ public class AutoTraderLIst { for (int i = 0; i < n; i++) { AutoTrader trader = config.createTrader(se, shares, money); - TraderRunner tr = new TraderRunner(trader); - tr.start(); + // TraderRunner tr = new TraderRunner(trader); + + trader.start(); } } diff --git a/src/SeSim/Exchange.java b/src/SeSim/Exchange.java index 575f29e..6c786ee 100644 --- a/src/SeSim/Exchange.java +++ b/src/SeSim/Exchange.java @@ -27,14 +27,18 @@ public class Exchange extends Thread { } - public SortedSet getQuoteHistory(int seconds){ - long ct = System.currentTimeMillis() - seconds * 1000; + public TreeSet getQuoteHistory(int seconds){ + Quote last = quoteHistory.last(); + long ct = last.time - seconds * 1000; Quote e = new Quote(); e.time=ct; SortedSet l = quoteHistory.tailSet(e); - return l; + return (TreeSet)l; } + + + // Class to describe an executed order @@ -102,7 +106,7 @@ public class Exchange extends Thread { } // send updated quotes to all quote receivers - void UpdateQuoteReceivers(Quote q) { + private void updateQuoteReceivers(Quote q) { Iterator i = qrlist.iterator(); while (i.hasNext()) { i.next().UpdateQuote(q); @@ -197,13 +201,13 @@ public class Exchange extends Thread { } - public void TransferMoney(Account src, Account dst, double money) { + public void transferMoney(Account src, Account dst, double money) { src.money -= money; dst.money += money; } - public void CancelOrder(Order o) { + public void cancelOrder(Order o) { Lock(); TreeSet book = this.selectOrderBook(o.type); book.remove(o); @@ -229,6 +233,8 @@ public class Exchange extends Thread { src.money += price * volume; } + long nextQuoteId=0; + public void OrderMatching() { while (true) { @@ -300,11 +306,14 @@ public class Exchange extends Thread { q.price = price; q.time = System.currentTimeMillis(); + + q.ask=a.limit; q.bid=b.limit; + q.id = nextQuoteId++; - this.UpdateQuoteReceivers(q); + this.updateQuoteReceivers(q); this.updateBookReceivers(OrderType.bid); this.updateBookReceivers(OrderType.ask); diff --git a/src/SeSim/Locker.java b/src/SeSim/Locker.java new file mode 100644 index 0000000..78f2477 --- /dev/null +++ b/src/SeSim/Locker.java @@ -0,0 +1,51 @@ +/* + * 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 SeSim; + +import java.util.concurrent.Semaphore; + +/** + * + * @author 7u83 <7u83@mail.ru> + */ +public class Locker { + + private final Semaphore avail = new Semaphore(1, true); + + public boolean lock() { + try { + avail.acquire(); + } catch (InterruptedException e) { + return false; + } + return true; + } + + public void unlock() { + avail.release(); + } + +} diff --git a/src/SeSim/Quote.java b/src/SeSim/Quote.java index 33eb5e9..5099671 100644 --- a/src/SeSim/Quote.java +++ b/src/SeSim/Quote.java @@ -30,7 +30,7 @@ package SeSim; * @author 7u83 <7u83@mail.ru> */ public class Quote implements Comparable { - + public double bid; public double bid_volume; public double ask; @@ -39,6 +39,8 @@ public class Quote implements Comparable { public double price; public long volume; public long time; + + Locker lock = new Locker(); public void print() { System.out.print("Quote (" @@ -51,10 +53,23 @@ public class Quote implements Comparable { ); } + + public long id; @Override public int compareTo(Object o) { + int ret; Quote q = (Quote)o; - return (int)(this.time-q.time); + + ret = (int)(this.time-q.time); + if (ret !=0) + return ret; + return (int)(this.id-q.id); } + + /* Quote (){ + lock.lock(); + id=nextid++; + lock.unlock(); + }*/ } diff --git a/src/SeSim/TraderRunner.java b/src/SeSim/TraderRunner.java deleted file mode 100644 index fb7fc1c..0000000 --- a/src/SeSim/TraderRunner.java +++ /dev/null @@ -1,18 +0,0 @@ -package SeSim; - -public class TraderRunner extends Thread { - - protected long sleeptime = 1000; - - AutoTrader trader; - - public TraderRunner(AutoTrader trader){ - this.trader=trader; - } - - public void run() { - trader.run(); - - - } -} diff --git a/src/Traders/RandomTrader.java b/src/Traders/RandomTrader.java index e8b1585..afd3a17 100644 --- a/src/Traders/RandomTrader.java +++ b/src/Traders/RandomTrader.java @@ -87,7 +87,7 @@ public class RandomTrader extends AutoTrader { if (account.pending.size() != 0) { Order o = account.pending.get(0); - account.se.CancelOrder(o); + account.se.cancelOrder(o); return false; } return true; @@ -139,7 +139,7 @@ public class RandomTrader extends AutoTrader { // System.out.print("RT: age is: "+age+"\n"); if (age > myconfig.maxage) { // System.out.print("MaxAge is"+myconfig.maxage+"\n"); - account.se.CancelOrder(o); + account.se.cancelOrder(o); // System.out.print("Age reached - canel return false\n"); return false; } @@ -198,7 +198,7 @@ public class RandomTrader extends AutoTrader { @Override public void run() { -// System.out.print("Starting Random Trader\n"); + System.out.print("Starting Random Trader\n"); while (true) { // What next to do?