From 974c1cb81ed335046308509ac01f92af8f626a80 Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@maiil.ru> Date: Wed, 26 Dec 2018 03:07:33 +0100 Subject: [PATCH] OrderBookPanel with callback. --- .../gui/AssetEditor/AssetEditorDialog.java | 8 +- src/opensesim/gui/SeSimApplication.java | 76 +++++++++---------- .../gui/orderbook/OrderBookDialog.java | 30 +++++++- .../gui/orderbook/OrderBookPanel.java | 30 +++++--- src/opensesim/trader/SimpleTrader.java | 9 +++ src/opensesim/world/AssetPair.java | 2 +- src/opensesim/world/GodWorld.java | 24 +++++- 7 files changed, 121 insertions(+), 58 deletions(-) diff --git a/src/opensesim/gui/AssetEditor/AssetEditorDialog.java b/src/opensesim/gui/AssetEditor/AssetEditorDialog.java index 7bdb444..04db947 100644 --- a/src/opensesim/gui/AssetEditor/AssetEditorDialog.java +++ b/src/opensesim/gui/AssetEditor/AssetEditorDialog.java @@ -41,7 +41,7 @@ import org.json.JSONObject; */ public class AssetEditorDialog extends EscDialog { - GodWorld worldadm; + GodWorld godworld; /** @@ -124,10 +124,10 @@ public class AssetEditorDialog extends EscDialog { private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed - if (assetEditorPanel.save(worldadm)){ + if (assetEditorPanel.save(godworld)){ dispose(); } - + godworld.notifyUpdateListeners(); return; @@ -198,7 +198,7 @@ public class AssetEditorDialog extends EscDialog { static public boolean runDialog(Window parent, GodWorld worldadm, JSONObject o, JSONObject old) { AssetEditorDialog d = new AssetEditorDialog(parent); - d.worldadm = worldadm; + d.godworld = worldadm; if (o!=null) diff --git a/src/opensesim/gui/SeSimApplication.java b/src/opensesim/gui/SeSimApplication.java index e266628..179f1be 100644 --- a/src/opensesim/gui/SeSimApplication.java +++ b/src/opensesim/gui/SeSimApplication.java @@ -65,6 +65,7 @@ import opensesim.world.Order; import opensesim.world.Trader; import opensesim.world.TradingAPI; import opensesim.world.World; +import opensesim.world.scheduler.Event; import opensesim.world.scheduler.FiringEvent; import opensesim.world.scheduler.EventListener; @@ -90,6 +91,7 @@ public class SeSimApplication extends javax.swing.JFrame { JSONObject cfg; cfg = new JSONObject(Globals.prefs.get("world", "{}")); godworld = new GodWorld(cfg); + godworld.addAssetPair("AAPL", "EUR"); // Get default screen and place our window // to the center of this screen @@ -597,36 +599,31 @@ public class SeSimApplication extends javax.swing.JFrame { } void startSim() { - - godworld.addAssetPair("AAPL", "EUR"); - + JSONObject cfg = new JSONObject("{" + "strategy: opensesim.trader.SimpleTrader" + "}"); Trader t = godworld.createTrader(cfg); t.start(); - + + updateGodWorld(godworld); AssetPair p = godworld.getDefaultAssetPair(); - + opensesim.world.Exchange ex = godworld.getDefaultExchange(); - TradingAPI api = ex.getAPI(p); - + TradingAPI api = ex.getAPI(p); + Set ob; - + ob = api.getOrderBook(Order.Type.BUY); - - for (Order o: ob){ + + for (Order o : ob) { double v = o.getVolume(); - System.out.printf("Volume: %f\n",o.getVolume()); + System.out.printf("Volume: %f\n", o.getVolume()); } - - - opensesim.world.scheduler.Scheduler s = godworld.getScheduler(); - class MyListener implements EventListener { World world; @@ -635,11 +632,9 @@ public class SeSimApplication extends javax.swing.JFrame { this.world = world; } - - @Override public long receive(opensesim.world.scheduler.Event task) { - + System.out.printf("Received an Event %d\n", Thread.currentThread().getId()); // e.count++; world.schedule(this, 1000); @@ -648,10 +643,9 @@ public class SeSimApplication extends javax.swing.JFrame { } - // MyListener listener = new MyListener(godworld.getWorld()); + // MyListener listener = new MyListener(godworld.getWorld()); // MyEvent arg = new MyEvent(); - - // s.startTimerTask(listener, 1000); + // s.startTimerTask(listener, 1000); /* @@ -909,29 +903,35 @@ public class SeSimApplication extends javax.swing.JFrame { stopSim(); }//GEN-LAST:event_stopButtonActionPerformed - public class GodWorldEvent extends FiringEvent{ - public GodWorld goworld; - public GodWorldEvent(EventListener listener) { - super(listener); - } - - } - - HashSet gwlisteners = new HashSet<>(); - - void updateGodWorld(GodWorld godworld){ - GodWorldEvent e = new GodWorldEvent(null); - for (EventListener el : gwlisteners){ + public class GodWorldEvent extends Event { + public GodWorld goworld; + + public GodWorldEvent(GodWorld world) { + this.goworld = world; + } + + } + + HashSet gwlisteners = new HashSet<>(); + + void updateGodWorld(GodWorld godworld) { + GodWorldEvent e = new GodWorldEvent(null); + for (EventListener el : gwlisteners) { + el.receive(e); } } - + private void jCheckBoxMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxMenuItem1ActionPerformed // JDialog jd = new opensesim.gui.orderbook.OrderBookDialog(this, false); // jd.setVisible(rootPaneCheckingEnabled); - EventListener e = opensesim.gui.orderbook.OrderBookDialog.runDialog(this, godworld); - gwlisteners.add(e); - + //EventListener e = opensesim.gui.orderbook.OrderBookDialog.runDialog(this, godworld); + //gwlisteners.add(e); + + AssetPair ap = godworld.getDefaultAssetPair(); + opensesim.world.Exchange ex = godworld.getDefaultExchange(); + opensesim.gui.orderbook.OrderBookDialog.runDialog(this, godworld, ex, ap); + }//GEN-LAST:event_jCheckBoxMenuItem1ActionPerformed diff --git a/src/opensesim/gui/orderbook/OrderBookDialog.java b/src/opensesim/gui/orderbook/OrderBookDialog.java index 3b8cfa9..151fb6a 100644 --- a/src/opensesim/gui/orderbook/OrderBookDialog.java +++ b/src/opensesim/gui/orderbook/OrderBookDialog.java @@ -26,9 +26,11 @@ package opensesim.gui.orderbook; import java.awt.Frame; + +import opensesim.world.AssetPair; +import opensesim.world.Exchange; import opensesim.world.GodWorld; import opensesim.world.scheduler.Event; -import opensesim.world.scheduler.FiringEvent; import opensesim.world.scheduler.EventListener; /** @@ -48,10 +50,24 @@ public class OrderBookDialog extends javax.swing.JDialog implements EventListene GodWorld godworld; + void init(){ + this.setTitle(asset_pair.getSymbol()+" on "+ex.getSymbol()); + this.orderBookPanel1.init(godworld, ex, asset_pair); + } - static public EventListener runDialog(Frame parent, GodWorld godworld){ + AssetPair asset_pair; + Exchange ex; + + + static public EventListener runDialog(Frame parent, GodWorld godworld, Exchange ex, AssetPair pair){ OrderBookDialog d = new OrderBookDialog(parent,false); + godworld.addUpdateListener(d); + d.godworld=godworld; + d.asset_pair = pair; + d.ex=ex; + d.init(); + d.setVisible(true); // d.dispose(); @@ -139,7 +155,15 @@ public class OrderBookDialog extends javax.swing.JDialog implements EventListene @Override public long receive(Event task) { - this.orderBookPanel1.setGodWorld(godworld); + + if (task.getClass() != GodWorld.UpdateEvent.class){ + return 0; + } + + // opensesim.gui.SeSimApplication.GodWorldEvent gwe = (opensesim.gui.SeSimApplication.GodWorldEvent) task; + + System.out.printf("Godworld updated\n"); + // this.orderBookPanel1.setGodWorld(gwe.goworld); return 0; } } diff --git a/src/opensesim/gui/orderbook/OrderBookPanel.java b/src/opensesim/gui/orderbook/OrderBookPanel.java index 31a81e7..09e016d 100644 --- a/src/opensesim/gui/orderbook/OrderBookPanel.java +++ b/src/opensesim/gui/orderbook/OrderBookPanel.java @@ -38,6 +38,7 @@ import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; +import opensesim.gui.SeSimApplication.GodWorldEvent; import opensesim.world.AssetPair; import opensesim.world.Exchange; import opensesim.world.GodWorld; @@ -61,6 +62,9 @@ public class OrderBookPanel extends javax.swing.JPanel implements EventListener @Override public long receive(Event task) { + + + System.out.printf("There is an o event \n"); synchronized (this) { @@ -138,14 +142,14 @@ public class OrderBookPanel extends javax.swing.JPanel implements EventListener Globals.se.addBookReceiver(type, this); } */ - public OrderBookPanel() { + /* public OrderBookPanel() { initComponents(); } - +*/ GodWorld godworld; public void setGodWorld(GodWorld godworld) { - // is our world alread the godworld to set? + // is our world already the godworld to set? if (this.godworld == godworld) { return; } @@ -157,11 +161,17 @@ public class OrderBookPanel extends javax.swing.JPanel implements EventListener api.addOrderBookListener(this); } + + + public void init(GodWorld godworld,Exchange ex, AssetPair pair){ + api = ex.getAPI(pair); + api.addOrderBookListener(this); + } /** * Creates new form OrderBookNew */ - public OrderBookPanel(GodWorld godworld) { + public OrderBookPanel() { initComponents(); @@ -169,12 +179,12 @@ public class OrderBookPanel extends javax.swing.JPanel implements EventListener // return; } - this.godworld = godworld; + // this.godworld = godworld; - Exchange ex = godworld.getDefaultExchange(); - AssetPair ap = godworld.getDefaultAssetPair(); - api = ex.getAPI(ap); - api.addOrderBookListener(this); + // Exchange ex = godworld.getDefaultExchange(); + // AssetPair ap = godworld.getDefaultAssetPair(); + // api = ex.getAPI(ap); + // api.addOrderBookListener(this); model = (DefaultTableModel) this.list.getModel(); trader_column = list.getColumnModel().getColumn(0); @@ -207,7 +217,7 @@ public class OrderBookPanel extends javax.swing.JPanel implements EventListener model.setRowCount(ob.size()); int row = 0; for (Order ob1 : ob) { - model.setValueAt(ob1.getAccount().getOwner().getName(), row, 0); +// model.setValueAt(ob1.getAccount().getOwner().getName(), row, 0); model.setValueAt(ob1.getLimit(), row, 1); model.setValueAt(ob1.getVolume(), row, 2); row++; diff --git a/src/opensesim/trader/SimpleTrader.java b/src/opensesim/trader/SimpleTrader.java index 2ba29da..49be553 100644 --- a/src/opensesim/trader/SimpleTrader.java +++ b/src/opensesim/trader/SimpleTrader.java @@ -118,6 +118,7 @@ public class SimpleTrader extends AbstractTrader implements EventListener { long last_time = 0; + double limit = 100; @Override public long receive(Event task) { // System.out.printf("Here we are !!! %f\n", getWorld().randNextFloat(12f, 27f)); @@ -127,6 +128,14 @@ public class SimpleTrader extends AbstractTrader implements EventListener { System.out.printf("Here we are: %d - [%d]\n", Thread.currentThread().getId(), diff); getWorld().schedule(this, 1000); + + AssetPair p = getWorld().getDefaultAssetPair(); + + ex = getWorld().getDefaultExchange(); + api = ex.getAPI(p); + Order o = api.createOrder(account, Order.Type.BUY, 100, limit); + limit += 12; + return -1; } diff --git a/src/opensesim/world/AssetPair.java b/src/opensesim/world/AssetPair.java index 32886af..404dcce 100644 --- a/src/opensesim/world/AssetPair.java +++ b/src/opensesim/world/AssetPair.java @@ -36,7 +36,7 @@ public class AssetPair { private final AbstractAsset currency; public static String buildSymbol(String asset,String currency){ - return currency+"/"+asset; + return asset+"/"+currency; } public AbstractAsset getAsset() { diff --git a/src/opensesim/world/GodWorld.java b/src/opensesim/world/GodWorld.java index 0a703f1..ef108cd 100644 --- a/src/opensesim/world/GodWorld.java +++ b/src/opensesim/world/GodWorld.java @@ -38,6 +38,7 @@ import opensesim.sesim.interfaces.GetJson; import opensesim.util.SeSimException; import opensesim.util.idgenerator.IDGenerator; +import opensesim.world.scheduler.Event; import opensesim.world.scheduler.EventListener; import opensesim.world.scheduler.Scheduler; @@ -262,8 +263,8 @@ public class GodWorld implements GetJson, World { } } - public AssetPair addAssetPair(String currency, String asset) { - AssetPair pair = new AssetPair(assets.get(currency), assets.get(asset)); + public AssetPair addAssetPair(String asset, String currency) { + AssetPair pair = new AssetPair(assets.get(asset), assets.get(currency)); add(pair); return pair; } @@ -418,4 +419,23 @@ public class GodWorld implements GetJson, World { return (max - min) * r + min; } + // -------------------------------------------------------------------- + // Update listeners + // -------------------------------------------------------------------- + private final HashSet update_listeners = new HashSet<>(); + + public class UpdateEvent extends Event { + } + + public void addUpdateListener(EventListener u) { + update_listeners.add(u); + } + + public void notifyUpdateListeners() { + Event e = new UpdateEvent(); + for (EventListener l : update_listeners) { + l.receive(e); + } + } + }